You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2018/09/17 11:44:06 UTC

[sling-org-apache-sling-feature] 01/01: SLING-7829: Change the includes to be include and from a list to a single (optional) field

This is an automated email from the ASF dual-hosted git repository.

pauls pushed a commit to branch issues/SLING-7829
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git

commit e1d4f99af0ba6ffc201efc196e761ed12ddc4df6
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Mon Sep 17 13:43:50 2018 +0200

    SLING-7829: Change the includes to be include and from a list to a single (optional) field
---
 .../java/org/apache/sling/feature/Feature.java     | 30 ++++++++++++++--------
 .../sling/feature/builder/FeatureBuilder.java      | 30 ++++++++++------------
 .../sling/feature/builder/FeatureBuilderTest.java  | 23 +++++++++--------
 3 files changed, 46 insertions(+), 37 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/Feature.java b/src/main/java/org/apache/sling/feature/Feature.java
index d9c7627..a25eac7 100644
--- a/src/main/java/org/apache/sling/feature/Feature.java
+++ b/src/main/java/org/apache/sling/feature/Feature.java
@@ -51,8 +51,6 @@ public class Feature implements Comparable<Feature> {
 
     private final List<Capability> capabilities = new ArrayList<>();
 
-    private final List<Include> includes = new ArrayList<>();
-
     private final Extensions extensions = new Extensions();
 
     private final KeyValueMap variables = new KeyValueMap();
@@ -75,6 +73,10 @@ public class Feature implements Comparable<Feature> {
     /** Flag indicating whether this is an assembled feature */
     private volatile boolean assembled = false;
 
+
+    /** The optional include. */
+    private volatile Include include;
+
     /**
      * Construct a new feature.
      * @param id The id of the feature.
@@ -158,12 +160,19 @@ public class Feature implements Comparable<Feature> {
     }
 
     /**
-     * Get the list of includes.
-     * The returned object is modifiable.
-     * @return The list of includes
+     * Get the optionally included feature.
+     * @return The included feature or {@code null} if none.
+     */
+    public Include getInclude() {
+        return include;
+    }
+
+    /**
+     * Set the optionally included feature.
+     * @param include The included feature or {@code null} if none.
      */
-    public List<Include> getIncludes() {
-        return includes;
+    public void setInclude(Include include) {
+        this.include = include;
     }
 
     /**
@@ -324,8 +333,9 @@ public class Feature implements Comparable<Feature> {
             result.getCapabilities().add(c);
         }
 
-        // includes
-        for(final Include i : this.getIncludes()) {
+        // include
+        final Include i = this.getInclude();
+        if (i != null) {
             final Include c = new Include(i.getId());
 
             c.getBundleRemovals().addAll(i.getBundleRemovals());
@@ -334,7 +344,7 @@ public class Feature implements Comparable<Feature> {
             c.getFrameworkPropertiesRemovals().addAll(i.getFrameworkPropertiesRemovals());
             c.getArtifactExtensionRemovals().putAll(i.getArtifactExtensionRemovals());
 
-            result.getIncludes().add(c);
+            result.setInclude(c);
         }
 
         // extensions
diff --git a/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java b/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
index 0835e73..f400ff1 100644
--- a/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
+++ b/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
@@ -285,10 +285,7 @@ public abstract class FeatureBuilder {
         // we copy the feature as we set the assembled flag on the result
         final Feature result = feature.copy();
 
-        if ( !result.getIncludes().isEmpty() ) {
-
-            final List<Include> includes = new ArrayList<>(result.getIncludes());
-
+        if ( result.getInclude() != null) {
             // clear everything in the result, will be added in the process
             result.getVariables().clear();
             result.getBundles().clear();
@@ -296,22 +293,23 @@ public abstract class FeatureBuilder {
             result.getConfigurations().clear();
             result.getRequirements().clear();
             result.getCapabilities().clear();
-            result.getIncludes().clear();
+            result.setInclude(null);
             result.getExtensions().clear();
 
-            for(final Include i : includes) {
-                final Feature f = context.getFeatureProvider().provide(i.getId());
-                if ( f == null ) {
-                    throw new IllegalStateException("Unable to find included feature " + i.getId());
-                }
-                final Feature af = internalAssemble(processedFeatures, f, context);
-
-                // process include instructions
-                include(af, i);
+            final Include i = feature.getInclude();
 
-                // and now merge
-                merge(result, af, context, BuilderUtil.ArtifactMerge.LATEST);
+            final Feature f = context.getFeatureProvider().provide(i.getId());
+            if ( f == null ) {
+                throw new IllegalStateException("Unable to find included feature " + i.getId());
             }
+            final Feature af = internalAssemble(processedFeatures, f, context);
+
+            // process include instructions
+            include(af, i);
+
+            // and now merge
+            merge(result, af, context, BuilderUtil.ArtifactMerge.LATEST);
+
             merge(result, feature, context, BuilderUtil.ArtifactMerge.LATEST);
         }
         processedFeatures.remove(feature.getId().toMvnId());
diff --git a/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java b/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
index 9c48567..f0bad33 100644
--- a/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
+++ b/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
@@ -19,6 +19,7 @@ package org.apache.sling.feature.builder;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -200,7 +201,7 @@ public class FeatureBuilderTest {
         }
 
         // includes should always be empty
-        assertTrue(actuals.getIncludes().isEmpty());
+        assertNull(actuals.getInclude());
     }
 
     @Test public void testNoIncludesNoUpgrade() throws Exception {
@@ -254,7 +255,7 @@ public class FeatureBuilderTest {
     @Test public void testSingleInclude() throws Exception {
         final Feature base = new Feature(ArtifactId.parse("org.apache.sling/test-feature/1.1"));
         final Include i1 = new Include(ArtifactId.parse("g/a/1"));
-        base.getIncludes().add(i1);
+        base.setInclude(i1);
 
         final Requirement r1 = new RequirementImpl(null, "osgi.contract",
                 Collections.singletonMap("filter", "(&(osgi.contract=JavaServlet)(version=3.1))"), null);
@@ -300,7 +301,7 @@ public class FeatureBuilderTest {
         // create the expected result
         final Feature result = base.copy();
         result.getVariables().put("varx", "myvalx");
-        result.getIncludes().remove(0);
+        result.setInclude(null);
         result.getFrameworkProperties().put("bar", "X");
         result.getBundles().add(BuilderUtilTest.createBundle("org.apache.sling/foo-bar/4.5.6", 3));
         final Configuration co3 = new Configuration("org.apache.sling.foo");
@@ -322,7 +323,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(idB);
         // feature b includes feature a
         final Include inc = new Include(idA);
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         // assemble application, it should only contain feature b as a is included by b
         Feature[] features = FeatureBuilder.deduplicate(new BuilderContext(new FeatureProvider() {
@@ -367,7 +368,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(ArtifactId.fromMvnId("g:a-include:1"));
         final Include inc = new Include(a.getId());
         inc.getBundleRemovals().add(bundleA2);
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         // assemble feature include
         Feature feature = FeatureBuilder.assemble(b, new BuilderContext(new FeatureProvider() {
@@ -401,7 +402,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(ArtifactId.fromMvnId("g:a-include:1"));
         final Include inc = new Include(a.getId());
         inc.getBundleRemovals().add(ArtifactId.fromMvnId("g:a:0.0.0"));
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         // assemble feature include
         Feature feature = FeatureBuilder.assemble(b, new BuilderContext(new FeatureProvider() {
@@ -433,7 +434,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(ArtifactId.fromMvnId("g:a-include:1"));
         final Include inc = new Include(a.getId());
         inc.getBundleRemovals().add(bundleA2);
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         try {
             FeatureBuilder.assemble(b, new BuilderContext(new FeatureProvider() {
@@ -466,7 +467,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(ArtifactId.fromMvnId("g:a-include:1"));
         final Include inc = new Include(a.getId());
         inc.getArtifactExtensionRemovals().put("foo", Arrays.asList(bundleA2));
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         // assemble feature include
         Feature feature = FeatureBuilder.assemble(b, new BuilderContext(new FeatureProvider() {
@@ -502,7 +503,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(ArtifactId.fromMvnId("g:a-include:1"));
         final Include inc = new Include(a.getId());
         inc.getArtifactExtensionRemovals().put("foo", Arrays.asList(ArtifactId.fromMvnId("g:a:0.0.0")));
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         // assemble feature include
         Feature feature = FeatureBuilder.assemble(b, new BuilderContext(new FeatureProvider() {
@@ -536,7 +537,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(ArtifactId.fromMvnId("g:a-include:1"));
         final Include inc = new Include(a.getId());
         inc.getArtifactExtensionRemovals().put("foo", Arrays.asList(bundleA2));
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         try {
             FeatureBuilder.assemble(b, new BuilderContext(new FeatureProvider() {
@@ -563,7 +564,7 @@ public class FeatureBuilderTest {
         final Feature b = new Feature(idB);
         // feature b includes feature a
         final Include inc = new Include(idA);
-        b.getIncludes().add(inc);
+        b.setInclude(inc);
 
         // assemble feature, it should only contain feature b as a is included by b
         final Feature target = FeatureBuilder.assemble(ArtifactId.fromMvnId("g:F:1.0.0"), new BuilderContext(new FeatureProvider() {