All Downloads are FREE. Search and download functionalities are using the official Maven repository.

flair.gradle.plugins.BasePlugin.groovy Maven / Gradle / Ivy

package flair.gradle.plugins

import flair.gradle.dependencies.Config
import flair.gradle.dependencies.Sdk
import flair.gradle.extensions.Extension
import flair.gradle.extensions.FlairProperty
import flair.gradle.extensions.IExtensionManager
import flair.gradle.extensions.factories.FlairExtensionFactory
import flair.gradle.extensions.factories.IExtensionFactory
import flair.gradle.structures.CommonStructure
import flair.gradle.structures.IStructure
import flair.gradle.structures.VariantStructure
import flair.gradle.tasks.GenerateFontsClass
import flair.gradle.tasks.GenerateResourcesClass
import flair.gradle.tasks.TaskDefinition
import flair.gradle.utils.Platform
import flair.gradle.utils.Variant
import flair.gradle.utils.Variant.NamingType
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.plugins.ExtensionAware
import org.gradle.tooling.BuildLauncher
import org.gradle.tooling.GradleConnector
import org.gradle.tooling.ProjectConnection

/**
 * @author SamYStudiO ( [email protected] )
 */
class BasePlugin extends AbstractPlugin implements IExtensionPlugin , IStructurePlugin , IConfigurationPlugin
{
	private IExtensionManager flair

	public BasePlugin()
	{
	}

	@Override
	public void apply( Project project )
	{
		super.apply( project )

		project.plugins.whenPluginAdded {

			if( it instanceof IExtensionPlugin )
			{
				it.extensionFactory.create( it == this ? project : project.extensions.getByName( Extension.FLAIR.name ) as ExtensionAware , project )

				if( it == this )
				{
					flair = project.extensions.getByName( Extension.FLAIR.name ) as IExtensionManager
				}
			}

			if( it instanceof IConfigurationPlugin )
			{
				// can't do after evaluation since evaluation may need them for dependencies
				createConfigurations( it.configurations )
			}
		}

		checkLocalProperties( )

		project.afterEvaluate {

			if( isReady( ) )
			{
				if( project.gradle.startParameter.taskRequests.isEmpty( ) ) createStructures( )
				createVariantTasks( )
				String assembleAll = createHandlerTasks( )
				createGeneratedTasks( )

				if( assembleAll != null && project.gradle.startParameter.taskRequests.isEmpty( ) && flair.getFlairProperty( FlairProperty.AUTO_ASSEMBLE_ON_BUILD_REFRESH ) )
				{
					ProjectConnection connection = GradleConnector.newConnector( ).forProjectDirectory( project.rootDir ).connect( )

					try
					{
						BuildLauncher build = connection.newBuild( )
						build.forTasks( assembleAll )
						build.run( )
					}
					finally
					{
						connection.close( )
					}
				}
			}
		}
	}

	@Override
	public IExtensionFactory getExtensionFactory()
	{
		return new FlairExtensionFactory( )
	}

	@Override
	public List getConfigurations()
	{
		return Config.DEFAULTS
	}

	@Override
	public List getStructures()
	{
		List list = new ArrayList( )

		list.add( new CommonStructure( ) )
		list.add( new VariantStructure( ) )

		return list
	}

	@Override
	protected void addTasks()
	{
		project.tasks.create( TaskDefinition.CLEAN.name , TaskDefinition.CLEAN.type )
		project.tasks.create( TaskDefinition.AS_DOC.name , TaskDefinition.AS_DOC.type )
	}

	private boolean isReady()
	{
		String packageName = flair.getFlairProperty( FlairProperty.PACKAGE_NAME )
		Platform platform = null
		int invalidCount = 0

		PluginManager.getCurrentPlatforms( project ).each {

			if( !new Sdk( project , it ).isAirSdk( ) )
			{
				platform = it
				invalidCount++
			}
		}

		if( invalidCount > 0 )
		{
			if( invalidCount > 1 ) throw new Exception( "Cannot find AIR SDK home, set a valid AIR SDK home from your local.properties file under project root" ) else throw new Exception( "Cannot find AIR SDK home for ${ platform.name }, set a valid AIR SDK home from your local.properties file under project root" )
		}
		if( !packageName || packageName.length( ) == 0 )
		{
			throw new Exception( String.format( "Missing flair property packageName, add it to your build.gradle file :%nflair {%npackageName \"com.hello.world\"%n}" ) )
		}

		return true
	}

	private void checkLocalProperties()
	{
		File file = project.file( "${ project.rootDir.path }/local.properties" )

		if( !file.exists( ) )
		{
			file.createNewFile( )
			file.write( String.format( "## This file should *NOT* be checked into Version Control Systems,%n# as it contains information specific to your local configuration.%n#%n# Location of the Adobe AIR SDK. Use sdk.dir for common SDK, if you need%n# different SDK for each platforms you may use {platform}.sdk.dir.%nsdk.dir=%n# ios.sdk.dir=%n# android.sdk.dir=%n# desktop.sdk.dir=" ) )
		}
	}

	private void createConfigurations( List list )
	{
		list.each { conf ->

			project.configurations.create( conf.name ) {

				if( conf.files )
				{
					conf.files.each {
						project.dependencies.add( conf.name , project.files( "${ flair.getFlairProperty( FlairProperty.MODULE_NAME ) }/${ it }" ) )
					}
				}

				if( conf.fileTree )
				{
					Map map = conf.fileTree.clone( ) as Map

					map.each {

						if( it.key == "dir" ) it.value = "${ flair.getFlairProperty( FlairProperty.MODULE_NAME ) }/${ it.value }"
					}

					project.dependencies.add( conf.name , project.fileTree( map ) )
				}
			}
		}
	}

	private void createStructures()
	{
		String moduleName = flair.getFlairProperty( FlairProperty.MODULE_NAME )
		String packageName = flair.getFlairProperty( FlairProperty.PACKAGE_NAME )

		if( !moduleName || !packageName ) return

		String tempDir = System.getProperty( "java.io.tmpdir" )
		String scaffoldTempDir = "${ tempDir }/scaffold_${ project.name }"

		project.copy {
			from project.zipTree( getClass( ).getProtectionDomain( ).getCodeSource( ).getLocation( ).getPath( ) )
			into scaffoldTempDir

			include "scaffold/**"
			exclude "**/.gitkeep"
		}

		project.plugins.each {
			if( it instanceof IStructurePlugin )
			{
				it.structures.each { structure -> structure.create( project , project.file( "${ scaffoldTempDir }/scaffold" ) ) }
			}
		}

		project.file( scaffoldTempDir ).deleteDir( )
	}

	private void createVariantTasks()
	{
		project.plugins.each { plugin ->
			if( plugin instanceof IVariantTaskPlugin )
			{
				plugin.variantTaskFactories.each { factory ->

					boolean hasVariant = false

					flair.getPlatformVariants( plugin instanceof IPlatformPlugin ? plugin.platform : null ).each { variant ->

						factory.create( project , variant )

						hasVariant = true
					}

					if( !hasVariant && plugin instanceof IPlatformPlugin )
					{
						factory.create( project , new Variant( project , plugin.platform ) )
					}
				}
			}
		}
	}

	private String createHandlerTasks()
	{
		List listAssemble = new ArrayList( )
		List listCompile = new ArrayList( )
		List listPackage = new ArrayList( )

		String assemble
		String compile
		String pack
		String assembleAll

		Task t

		flair.allActivePlatformVariants.each {

			assemble = TaskDefinition.ASSEMBLE.name + it.getName( NamingType.CAPITALIZE )
			compile = TaskDefinition.COMPILE.name + it.getName( NamingType.CAPITALIZE )
			pack = TaskDefinition.PACKAGE.name + it.getName( NamingType.CAPITALIZE )

			if( project.tasks.findByName( assemble ) ) listAssemble.add( assemble )
			if( project.tasks.findByName( compile ) ) listCompile.add( compile )
			if( project.tasks.findByName( pack ) ) listPackage.add( pack )
		}

		if( listAssemble.size( ) > 1 && PluginManager.getCurrentPlatforms( project ).size( ) > 1 )
		{
			t = project.tasks.findByName( TaskDefinition.ASSEMBLE.name + "All" )
			if( !t )
			{
				t = project.tasks.create( TaskDefinition.ASSEMBLE.name + "All" )
				t.group = TaskDefinition.ASSEMBLE.group.name
				t.description = "Handler to assemble all variants"
				t.dependsOn listAssemble
			}

			assembleAll = "assembleAll"
		}
		else assembleAll = listAssemble.size(  ) == 1 ? listAssemble.get( 0 ) : null

		if( listCompile.size( ) > 1 && PluginManager.getCurrentPlatforms( project ).size( ) > 1 )
		{
			t = project.tasks.findByName( TaskDefinition.COMPILE.name + "All" )
			if( !t )
			{
				t = project.tasks.create( TaskDefinition.COMPILE.name + "All" )
				t.group = TaskDefinition.COMPILE.group.name
				t.description = "Handler to compile all variants"
				t.dependsOn listCompile
			}
		}

		if( listPackage.size( ) > 1 && PluginManager.getCurrentPlatforms( project ).size( ) > 1 )
		{
			t = project.tasks.findByName( TaskDefinition.PACKAGE.name + "All" )
			if( !t )
			{
				t = project.tasks.create( TaskDefinition.PACKAGE.name + "All" )
				t.group = TaskDefinition.PACKAGE.group.name
				t.description = "Handler to package all variants"
				t.dependsOn listPackage
			}
		}

		PluginManager.getCurrentPlatforms( project ).each {

			listAssemble = new ArrayList( )
			listCompile = new ArrayList( )
			listPackage = new ArrayList( )

			flair.getPlatformVariants( it ).each {
				assemble = TaskDefinition.ASSEMBLE.name + it.getName( NamingType.CAPITALIZE )
				compile = TaskDefinition.COMPILE.name + it.getName( NamingType.CAPITALIZE )
				pack = TaskDefinition.PACKAGE.name + it.getName( NamingType.CAPITALIZE )

				if( project.tasks.findByName( assemble ) ) listAssemble.add( assemble )
				if( project.tasks.findByName( compile ) ) listCompile.add( compile )
				if( project.tasks.findByName( pack ) ) listPackage.add( pack )
			}

			if( listAssemble.size( ) > 1 )
			{
				t = project.tasks.findByName( TaskDefinition.ASSEMBLE.name + "All" + it.name.capitalize( ) )
				if( !t )
				{
					t = project.tasks.create( TaskDefinition.ASSEMBLE.name + "All" + it.name.capitalize( ) )
					t.group = TaskDefinition.ASSEMBLE.group.name
					t.description = "Handler to assemble all ${ it.name } variants"
					t.dependsOn listAssemble
				}

				if( assembleAll == null ) assembleAll = TaskDefinition.ASSEMBLE.name + "All" + it.name.capitalize( )
			}

			if( listCompile.size( ) > 1 )
			{

				t = project.tasks.findByName( TaskDefinition.COMPILE.name + "All" + it.name.capitalize( ) )
				if( !t )
				{
					t = project.tasks.create( TaskDefinition.COMPILE.name + "All" + it.name.capitalize( ) )
					t.group = TaskDefinition.COMPILE.group.name
					t.description = "Handler to compile all ${ it.name } variants"
					t.dependsOn listCompile
				}
			}

			if( listPackage.size( ) > 1 )
			{

				t = project.tasks.findByName( TaskDefinition.PACKAGE.name + "All" + it.name.capitalize( ) )
				if( !t )
				{
					t = project.tasks.create( TaskDefinition.PACKAGE.name + "All" + it.name.capitalize( ) )
					t.group = TaskDefinition.PACKAGE.group.name
					t.description = "Handler to package all ${ it.name } variants"
					t.dependsOn listPackage
				}
			}
		}

		List buildTypes = flair.allActivePlatformBuildTypes

		if( buildTypes.size( ) > 1 )
		{
			buildTypes.each { type ->

				listAssemble = new ArrayList( )
				listCompile = new ArrayList( )
				listPackage = new ArrayList( )

				flair.allActivePlatformVariants.each {
					assemble = TaskDefinition.ASSEMBLE.name + it.getName( NamingType.CAPITALIZE )
					compile = TaskDefinition.COMPILE.name + it.getName( NamingType.CAPITALIZE )
					pack = TaskDefinition.PACKAGE.name + it.getName( NamingType.CAPITALIZE )

					if( it.buildType == type && project.tasks.findByName( assemble ) ) listAssemble.add( assemble )
					if( it.buildType == type && project.tasks.findByName( compile ) ) listCompile.add( compile )
					if( it.buildType == type && project.tasks.findByName( pack ) ) listPackage.add( pack )
				}

				if( listAssemble.size( ) > 1 )
				{

					t = project.tasks.findByName( TaskDefinition.ASSEMBLE.name + "All" + type.capitalize( ) )
					if( !t )
					{
						t = project.tasks.create( TaskDefinition.ASSEMBLE.name + "All" + type.capitalize( ) )
						t.group = TaskDefinition.ASSEMBLE.group.name
						t.description = "Handler to assemble all ${ type } variants"
						t.dependsOn listAssemble
					}
				}

				if( listCompile.size( ) > 1 )
				{

					t = project.tasks.findByName( TaskDefinition.COMPILE.name + "All" + type.capitalize( ) )
					if( !t )
					{
						t = project.tasks.create( TaskDefinition.COMPILE.name + "All" + type.capitalize( ) )
						t.group = TaskDefinition.COMPILE.group.name
						t.description = "Handler to compile all ${ type } variants"
						t.dependsOn listCompile
					}
				}

				if( listPackage.size( ) > 1 )
				{

					t = project.tasks.findByName( TaskDefinition.PACKAGE.name + "All" + type.capitalize( ) )
					if( !t )
					{
						t = project.tasks.create( TaskDefinition.PACKAGE.name + "All" + type.capitalize( ) )
						t.group = TaskDefinition.PACKAGE.group.name
						t.description = "Handler to package all ${ type } variants"
						t.dependsOn listPackage
					}
				}
			}
		}

		return assembleAll
	}

	private createGeneratedTasks()
	{
		GenerateResourcesClass resourcesTask = project.tasks.create( TaskDefinition.GENERATE_RESOURCES_CLASS.name , TaskDefinition.GENERATE_RESOURCES_CLASS.type ) as GenerateResourcesClass
		resourcesTask.findInputAndOutputFiles( )

		GenerateFontsClass fontsTask = project.tasks.create( TaskDefinition.GENERATE_FONTS_CLASS.name , TaskDefinition.GENERATE_FONTS_CLASS.type ) as GenerateFontsClass
		fontsTask.findInputAndOutputFiles( )
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy