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

com.github.goldin.plugins.gradle.common.BasePlugin.groovy Maven / Gradle / Ivy

The newest version!
package com.github.goldin.plugins.gradle.common

import com.github.goldin.plugins.gradle.common.extensions.BaseExtension
import org.gcontracts.annotations.Ensures
import org.gcontracts.annotations.Requires
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.lang.reflect.Method


/**
 * Base class for all Gradle plugins
 */
abstract class BasePlugin implements Plugin
{
    @Ensures({ result })
    abstract Map> tasks( Project project )


    @Ensures({ result.size() == 1 })
    abstract Map> extensions( Project project )


    @Requires({ project })
    @Override
    void apply ( Project project )
    {
        final tasks = tasks( project )

        for ( String taskName in tasks.keySet())
        {
            addTask( project, taskName, tasks[ taskName ] )
        }

        project.logger.info(
            "Groovy [$GroovySystem.version], $project, plugin [${ this.class.name }] is applied, " +
            "added task${ tasks.size() == 1 ? '' : 's' } '${ tasks.keySet().sort().join( '\', \'' )}'." )
    }


    @Requires({ project && taskName && taskType })
     T addTask( Project project, String taskName, Class taskType )
    {
        final  extensions = extensions( project )
        assert extensions.size() == 1

        final  extensionName  = extensions.keySet().toList().first()
        final  extensionClass = extensions[ extensionName ]
        assert extensionName && extensionClass && BaseExtension.isAssignableFrom( extensionClass )

        final isCreate     = project.tasks.class.methods.any { Method m -> ( m.name == 'create' ) && ( m.parameterTypes == [ String, Class ] )}
        final task         = ( T ) project.tasks."${ isCreate ? 'create' : 'add' }"( taskName, taskType )
        task.ext           = extension( project, extensionName, extensionClass )
        task.extensionName = extensionName

        assert task && task.ext && task.extensionName && project.tasks[ taskName ]
        task
    }


    @Requires({ project && extensionName && extensionClass })
     T extension ( Project project, String extensionName, Class extensionClass )
    {
        final extension = project.extensions.findByName( extensionName ) ?:
                          project.extensions.create    ( extensionName, extensionClass )

        assert extensionClass.isInstance( extension )
        ( T ) extension
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy