# HG changeset patch # User cin # Date 2025-12-07 13:08:29 # Node ID 0045f97cbd4fc46370df9c387d0089b60e580689 # Parent 9c68b239d162b3ae599a28f62a294d910b19513f WIP variants 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 --- a/common/src/main/java/org/implab/gradle/common/sources/BuildVariant.java +++ b/common/src/main/java/org/implab/gradle/common/sources/BuildVariant.java @@ -8,8 +8,9 @@ import org.gradle.api.Named; import org.gradle.api.NamedDomainObjectProvider; import org.gradle.api.artifacts.ConfigurationPublications; +import org.gradle.api.plugins.ExtensionAware; -public abstract class BuildVariant implements Named { +public abstract class BuildVariant implements Named, ExtensionAware { private final Map variantSourceSets = new HashMap<>(); @@ -19,10 +20,6 @@ public abstract class BuildVariant imple action.execute(sourceSetsSpec); } - public void outgoing(Action action) { - - } - public class SourceSetsSpec { void add(NamedDomainObjectProvider sourceSet) { var variantSourceSet = new VariantSourceSet(sourceSet); diff --git a/common/src/main/java/org/implab/gradle/common/sources/BuildVariantsExtension.java b/common/src/main/java/org/implab/gradle/common/sources/BuildVariantsExtension.java new file mode 100644 --- /dev/null +++ b/common/src/main/java/org/implab/gradle/common/sources/BuildVariantsExtension.java @@ -0,0 +1,51 @@ +package org.implab.gradle.common.sources; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import org.gradle.api.Action; +import org.gradle.api.model.ObjectFactory; + +public abstract class BuildVariantsExtension { + private final ObjectFactory objects; + private final Map variants = new HashMap<>(); + private final List> listeners = new ArrayList<>(); + + @Inject + public BuildVariantsExtension(ObjectFactory objects) { + this.objects = objects; + } + + private BuildVariant newVariant(String name) { + return objects.newInstance(BuildVariant.class, name); + } + + public BuildVariant variant(String name, Action configure) { + BuildVariant v = variants.computeIfAbsent(name, this::newVariant); + configure.execute(v); + for (Action l : listeners) { + l.execute(v); + } + return v; + } + + public void all(Action action) { + variants.values().forEach(action::execute); + listeners.add(action); + } + + public Collection getAll() { + return Collections.unmodifiableCollection(variants.values()); + } + + public BuildVariant getByName(String name) { + return variants.get(name); + } + +} 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 --- a/common/src/main/java/org/implab/gradle/common/sources/VariantsPlugin.java +++ b/common/src/main/java/org/implab/gradle/common/sources/VariantsPlugin.java @@ -1,25 +1,22 @@ 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); + var variants = target.getObjects().newInstance(BuildVariantsExtension.class); target.getExtensions().add(VARIANTS_EXTENSION_NAME, variants); } - public static NamedDomainObjectContainer getVariantsExtension(Project target) { + public static BuildVariantsExtension getVariantsExtension(Project target) { var extensions = target.getExtensions(); - @SuppressWarnings("unchecked") - var extension = (NamedDomainObjectContainer)extensions.getByName(VARIANTS_EXTENSION_NAME); + var extension = extensions.getByType(BuildVariantsExtension.class); if (extension == null) throw new GradleException("Variants extension isn't found");