diff --git a/common/src/main/java/org/implab/gradle/common/sources/BuildVariant.java b/common/src/main/java/org/implab/gradle/common/sources/BuildVariant.java new file mode 100644 --- /dev/null +++ b/common/src/main/java/org/implab/gradle/common/sources/BuildVariant.java @@ -0,0 +1,32 @@ +package org.implab.gradle.common.sources; + +import java.util.HashMap; +import java.util.Map; + +import org.gradle.api.Action; +import org.gradle.api.Named; +import org.gradle.api.NamedDomainObjectProvider; + +import org.gradle.api.artifacts.ConfigurationPublications; + +public abstract class BuildVariant implements Named { + + private final Map variantSourceSets = new HashMap<>(); + + private final SourceSetsSpec sourceSetsSpec = new SourceSetsSpec(); + + public void sourceSets(Action action) { + action.execute(sourceSetsSpec); + } + + public void outgoing(Action action) { + + } + + public class SourceSetsSpec { + void add(NamedDomainObjectProvider sourceSet) { + var variantSourceSet = new VariantSourceSet(sourceSet); + variantSourceSets.put(sourceSet.getName(), variantSourceSet); + } + } +} diff --git a/common/src/main/java/org/implab/gradle/common/sources/SourcesPlugin.java b/common/src/main/java/org/implab/gradle/common/sources/SourcesPlugin.java --- a/common/src/main/java/org/implab/gradle/common/sources/SourcesPlugin.java +++ b/common/src/main/java/org/implab/gradle/common/sources/SourcesPlugin.java @@ -1,16 +1,11 @@ package org.implab.gradle.common.sources; -import org.gradle.api.Action; +import org.gradle.api.GradleException; +import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; -import org.gradle.api.tasks.Copy; -import org.gradle.api.tasks.Delete; -import org.gradle.api.tasks.TaskContainer; -import org.gradle.api.tasks.TaskProvider; -import org.gradle.language.base.plugins.LifecycleBasePlugin; -import org.implab.gradle.common.core.lang.Strings; /** * This plugin creates a {@code sources} extension which is @@ -18,42 +13,24 @@ import org.implab.gradle.common.core.lan * */ public abstract class SourcesPlugin implements Plugin { - private final Logger logger = Logging.getLogger(SourcesPlugin.class); + private static final Logger logger = Logging.getLogger(SourcesPlugin.class); - private final String POLICY_NAME = "SourcesPolicy"; - - private final String EXTENSION_NAME = "sources"; + private static final String SOURCES_EXTENSION_NAME = "sources"; @Override public void apply(Project target) { - target.getPlugins().apply(LifecycleBasePlugin.class); - var sources = target.getObjects().domainObjectContainer(GenericSourceSet.class); - var tasks = target.getTasks(); - var clean = tasks.named(LifecycleBasePlugin.CLEAN_TASK_NAME); - - target.getExtensions().add(EXTENSION_NAME, sources); - - sources.configureEach(configureSourceSet(tasks, clean)); + target.getExtensions().add(SOURCES_EXTENSION_NAME, sources); } - private Action configureSourceSet(TaskContainer tasks, TaskProvider clean) { - return sourceSet -> { - var name = sourceSet.getName(); - - logger.info("{}: Processing source set '{}'", POLICY_NAME, name); - - var taskName = "clean" + Strings.capitalize(sourceSet.getName()); + public static NamedDomainObjectContainer getSourcesExtension(Project target) { + var extensions = target.getExtensions(); - logger.info("{}: Register task '{}' of type [{}]", POLICY_NAME, taskName, Copy.class.getTypeName()); + @SuppressWarnings("unchecked") + var extension = (NamedDomainObjectContainer)extensions.getByName(SOURCES_EXTENSION_NAME); - var task = tasks.register(taskName, Delete.class, self -> { - self.delete(sourceSet.getOutputsDir()); - }); - - clean.configure(self -> { - self.dependsOn(task); - }); - }; + if (extension == null) + throw new GradleException("Sources extension isn't found"); + return extension; } } diff --git a/common/src/main/java/org/implab/gradle/common/sources/VariantSourceSet.java b/common/src/main/java/org/implab/gradle/common/sources/VariantSourceSet.java new file mode 100644 --- /dev/null +++ b/common/src/main/java/org/implab/gradle/common/sources/VariantSourceSet.java @@ -0,0 +1,19 @@ +package org.implab.gradle.common.sources; + +import org.gradle.api.NamedDomainObjectProvider; + +public class VariantSourceSet { + private final NamedDomainObjectProvider sourceSet; + + String getName() { + return sourceSet.getName(); + } + + public VariantSourceSet(NamedDomainObjectProvider sourceSet) { + this.sourceSet = sourceSet; + } + + public NamedDomainObjectProvider getSourceSet() { + return sourceSet; + } +} diff --git a/common/src/main/java/org/implab/gradle/common/sources/VariantsPlugin.java b/common/src/main/java/org/implab/gradle/common/sources/VariantsPlugin.java new file mode 100644 --- /dev/null +++ b/common/src/main/java/org/implab/gradle/common/sources/VariantsPlugin.java @@ -0,0 +1,29 @@ +package org.implab.gradle.common.sources; + +import org.gradle.api.GradleException; +import org.gradle.api.NamedDomainObjectContainer; +import org.gradle.api.Plugin; +import org.gradle.api.Project; + +public abstract class VariantsPlugin implements Plugin { + public static final String VARIANTS_EXTENSION_NAME = "variants"; + public static final String OUTGOING_VARIANTS_EXTENSION_NAME = "outgoingVariants"; + + @Override + public void apply(Project target) { + var variants = target.getObjects().domainObjectContainer(BuildVariant.class); + target.getExtensions().add(VARIANTS_EXTENSION_NAME, variants); + } + + public static NamedDomainObjectContainer getVariantsExtension(Project target) { + var extensions = target.getExtensions(); + + @SuppressWarnings("unchecked") + var extension = (NamedDomainObjectContainer)extensions.getByName(VARIANTS_EXTENSION_NAME); + + if (extension == null) + throw new GradleException("Variants extension isn't found"); + return extension; + } + +}