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:05 UTC

[sling-org-apache-sling-feature] branch issues/SLING-7829 created (now e1d4f99)

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

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


      at e1d4f99  SLING-7829: Change the includes to be include and from a list to a single (optional) field

This branch includes the following new commits:

     new e1d4f99  SLING-7829: Change the includes to be include and from a list to a single (optional) field

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by pa...@apache.org.
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() {