package com.prezi.spaghetti.gradle; import com.prezi.spaghetti.gradle.internal.AbstractLanguageAwareSpaghettiTask; import com.prezi.spaghetti.gradle.internal.AbstractSpaghettiTask; import com.prezi.spaghetti.gradle.internal.SpaghettiExtension; import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.internal.reflect.Instantiator; import javax.inject.Inject; import java.util.concurrent.Callable; public class SpaghettiBasePlugin implements Plugin<Project> { public static final String CONFIGURATION_NAME = "modules"; public static final String TEST_CONFIGURATION_NAME = "testModules"; public static final String OBFUSCATED_CONFIGURATION_NAME = "modulesObf"; public static final String TEST_OBFUSCATED_CONFIGURATION_NAME = "testModulesObf"; private final Instantiator instantiator; @Inject public SpaghettiBasePlugin(Instantiator instantiator) { this.instantiator = instantiator; } @Override public void apply(final Project project) { Configuration defaultConfiguration = project.getConfigurations().maybeCreate(CONFIGURATION_NAME); Configuration defaultTestConfiguration = project.getConfigurations().maybeCreate(TEST_CONFIGURATION_NAME); defaultTestConfiguration.extendsFrom(defaultConfiguration); Configuration defaultObfuscatedConfiguration = project.getConfigurations().maybeCreate(OBFUSCATED_CONFIGURATION_NAME); Configuration defaultTestObfuscatedConfiguration = project.getConfigurations().maybeCreate(TEST_OBFUSCATED_CONFIGURATION_NAME); defaultTestObfuscatedConfiguration.extendsFrom(defaultObfuscatedConfiguration); final SpaghettiExtension extension = project.getExtensions().create("spaghetti", SpaghettiExtension.class, project, instantiator, defaultConfiguration, defaultTestConfiguration, defaultObfuscatedConfiguration, defaultTestObfuscatedConfiguration); project.getTasks().withType(AbstractSpaghettiTask.class).all(new Action<AbstractSpaghettiTask>() { @Override public void execute(AbstractSpaghettiTask task) { withDefaultConfiguration(project, task); } }); project.getTasks().withType(AbstractLanguageAwareSpaghettiTask.class).all(new Action<AbstractLanguageAwareSpaghettiTask>() { @Override public void execute(AbstractLanguageAwareSpaghettiTask task) { task.getConventionMapping().map("language", new Callable<String>() { @Override public String call() throws Exception { return extension.getLanguage(); } }); } }); } /** * Override fallback configuration with the main configuration. */ public static void withDefaultConfiguration(final Project project, AbstractSpaghettiTask task) { task.getConventionMapping().map("dependentModules", new Callable<ConfigurableFileCollection>() { @Override public ConfigurableFileCollection call() throws Exception { return project.files(project.getExtensions().getByType(SpaghettiExtension.class).getConfiguration()); } }); } /** * Override fallback configuration with the test configuration. */ public static void withDefaultTestConfiguration(final Project project, AbstractSpaghettiTask task) { task.getConventionMapping().map("dependentModules", new Callable<ConfigurableFileCollection>() { @Override public ConfigurableFileCollection call() throws Exception { return project.files(project.getExtensions().getByType(SpaghettiExtension.class).getTestConfiguration()); } }); } }