diff --git a/variants/src/main/java/org/implab/gradle/variants/core/VariantsView.java b/variants/src/main/java/org/implab/gradle/variants/core/VariantsView.java --- a/variants/src/main/java/org/implab/gradle/variants/core/VariantsView.java +++ b/variants/src/main/java/org/implab/gradle/variants/core/VariantsView.java @@ -60,6 +60,25 @@ public class VariantsView { return roles; } + /** + * Requires the layer to be declared in this view. + * + * @param layer layer identity + * @throws InvalidUserDataException if the layer is not declared + */ + public void assertLayer(Layer layer) { + Objects.requireNonNull(layer, "The layer can't be null"); + + if (!layers.contains(layer)) + throw new InvalidUserDataException("The specified layer '" + layer.getName() + "' isn't declared"); + } + + /** + * Requires the role to be declared in this view. + * + * @param role role identity + * @throws InvalidUserDataException if the role is not declared + */ public void assertRole(Role role) { Objects.requireNonNull(role, "The role can't be null"); @@ -75,6 +94,19 @@ public class VariantsView { } /** + * Requires the variant to be declared in this view. + * + * @param variant variant identity + * @throws InvalidUserDataException if the variant is not declared + */ + public void assertVariant(Variant variant) { + Objects.requireNonNull(variant, "The variant can't be null"); + + if (!variants.contains(variant)) + throw new InvalidUserDataException("The specified variant '" + variant.getName() + "' isn't declared"); + } + + /** * Returns all resolved variant-role-layer bindings. */ public Set getEntries() { diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/CompileUnitsView.java b/variants/src/main/java/org/implab/gradle/variants/sources/CompileUnitsView.java --- a/variants/src/main/java/org/implab/gradle/variants/sources/CompileUnitsView.java +++ b/variants/src/main/java/org/implab/gradle/variants/sources/CompileUnitsView.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.gradle.api.InvalidUserDataException; import org.implab.gradle.variants.core.Layer; import org.implab.gradle.variants.core.Role; import org.implab.gradle.variants.core.Variant; @@ -66,7 +67,7 @@ public final class CompileUnitsView { public CompileUnit requireUnit(Variant variant, Layer layer) { return findUnit(variant, layer) - .orElseThrow(() -> new IllegalArgumentException( + .orElseThrow(() -> new InvalidUserDataException( "Compile unit for variant '" + variant.getName() + "' and layer '" + layer.getName() + "' not found")); } diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/RoleProjectionsView.java b/variants/src/main/java/org/implab/gradle/variants/sources/RoleProjectionsView.java --- a/variants/src/main/java/org/implab/gradle/variants/sources/RoleProjectionsView.java +++ b/variants/src/main/java/org/implab/gradle/variants/sources/RoleProjectionsView.java @@ -7,6 +7,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import org.gradle.api.InvalidUserDataException; import org.implab.gradle.variants.core.Layer; import org.implab.gradle.variants.core.Role; import org.implab.gradle.variants.core.Variant; @@ -66,7 +67,7 @@ public final class RoleProjectionsView { public RoleProjection requireProjection(Variant variant, Role role) { return findProjection(variant, role) - .orElseThrow(() -> new IllegalArgumentException( + .orElseThrow(() -> new InvalidUserDataException( "Role projection for variant '" + variant.getName() + "' and role '" + role.getName() + "' not found")); } @@ -78,6 +79,7 @@ public final class RoleProjectionsView { } public static RoleProjectionsView of(VariantsView variantsView) { + Objects.requireNonNull(variantsView, "variantsView can't be null"); return new RoleProjectionsView(variantsView); } } diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/SourceSetMaterializer.java b/variants/src/main/java/org/implab/gradle/variants/sources/SourceSetMaterializer.java --- a/variants/src/main/java/org/implab/gradle/variants/sources/SourceSetMaterializer.java +++ b/variants/src/main/java/org/implab/gradle/variants/sources/SourceSetMaterializer.java @@ -15,6 +15,9 @@ public interface SourceSetMaterializer { * Returns a lazy provider for the source set corresponding to the compile unit. * *

The provider is stable and cached per compile unit. + * + * @throws org.gradle.api.InvalidUserDataException if the compile unit is not + * part of the finalized variant model */ NamedDomainObjectProvider getSourceSet(CompileUnit unit); } diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesContext.java b/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesContext.java --- a/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesContext.java +++ b/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesContext.java @@ -48,6 +48,9 @@ public interface VariantSourcesContext { * {@link VariantSourcesExtension#lateConfigurationPolicy(org.gradle.api.Action)}. * In warn/allow modes the action is applied as a late imperative step and does * not retroactively restore selector precedence. + * + * @throws org.gradle.api.InvalidUserDataException if the layer is not part of + * the finalized variant model */ void configureLayer(Layer layer, Action action); @@ -57,6 +60,9 @@ public interface VariantSourcesContext { *

Late application semantics for already materialized source sets are * governed by * {@link VariantSourcesExtension#lateConfigurationPolicy(org.gradle.api.Action)}. + * + * @throws org.gradle.api.InvalidUserDataException if the variant is not part + * of the finalized variant model */ void configureVariant(Variant variant, Action action); @@ -66,6 +72,9 @@ public interface VariantSourcesContext { *

Late application semantics for already materialized source sets are * governed by * {@link VariantSourcesExtension#lateConfigurationPolicy(org.gradle.api.Action)}. + * + * @throws org.gradle.api.InvalidUserDataException if the compile unit is not + * part of the finalized variant model */ void configureUnit(CompileUnit unit, Action action); diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java b/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java --- a/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java +++ b/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java @@ -39,7 +39,7 @@ public interface VariantSourcesExtension * *

This policy is single-valued: *