Author: cziegeler
Date: Fri Sep  1 15:14:31 2017
New Revision: 1806975

URL: http://svn.apache.org/viewvc?rev=1806975&view=rev
Log:
Introduce builder context

Modified:
    
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/ApplicationBuilder.java
    
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
    
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
    
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java

Modified: 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/ApplicationBuilder.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/ApplicationBuilder.java?rev=1806975&r1=1806974&r2=1806975&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/ApplicationBuilder.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/ApplicationBuilder.java
 Fri Sep  1 15:14:31 2017
@@ -39,29 +39,29 @@ public class ApplicationBuilder {
      * is ignored.
      *
      * @param app The optional application to use as a base.
-     * @param provider The provider to resolve features.
+     * @param context The builder context
      * @param featureIds The feature ids
      * @return The application
-     * throws IllegalArgumentException If provider or featureIds is {@code 
null}
+     * throws IllegalArgumentException If context or featureIds is {@code null}
      * throws IllegalStateException If the provided ids are invalid, or the 
feature can't be provided
      */
     public static Application assemble(final Application app,
-            final FeatureProvider provider,
+            final BuilderContext context,
             final String... featureIds) {
-        if ( featureIds == null || provider == null ) {
-            throw new IllegalArgumentException("Features and/or provider must 
not be null");
+        if ( featureIds == null || context == null ) {
+            throw new IllegalArgumentException("Features and/or context must 
not be null");
         }
 
         final Feature[] features = new Feature[featureIds.length];
         int index = 0;
         for(final String id : featureIds) {
-            features[index] = provider.provide(ArtifactId.fromMvnId(id));
+            features[index] = 
context.getFeatureProvider().provide(ArtifactId.fromMvnId(id));
             if ( features[index] == null ) {
                 throw new IllegalStateException("Unable to find included 
feature " + id);
             }
             index++;
         }
-        return assemble(app, provider, features);
+        return assemble(app, context, features);
     }
 
     /**
@@ -72,18 +72,18 @@ public class ApplicationBuilder {
      * is ignored.
      *
      * @param app The optional application to use as a base.
-     * @param provider The provider to resolve features.
+     * @param context The builder context
      * @param features The features
      * @return The application
-     * throws IllegalArgumentException If provider or featureIds is {@code 
null}
+     * throws IllegalArgumentException If context or featureIds is {@code null}
      * throws IllegalStateException If a feature can't be provided
      */
     public static Application assemble(
             Application app,
-            final FeatureProvider provider,
+            final BuilderContext context,
             final Feature... features) {
-        if ( features == null || provider == null ) {
-            throw new IllegalArgumentException("Features and/or provider must 
not be null");
+        if ( features == null || context == null ) {
+            throw new IllegalArgumentException("Features and/or context must 
not be null");
         }
 
         if ( app == null ) {
@@ -117,7 +117,7 @@ public class ApplicationBuilder {
         for(final Map.Entry<Feature, List<Feature>> entry : 
upgrades.entrySet()) {
             final Feature assembled = FeatureBuilder.assemble(entry.getKey(),
                     entry.getValue(),
-                    provider);
+                    context);
             // update feature to assembled feature
             sortedFeatureList.remove(entry.getKey());
             sortedFeatureList.add(assembled);
@@ -128,7 +128,7 @@ public class ApplicationBuilder {
 
         // assemble
         for(final Feature f : sortedFeatureList) {
-            final Feature assembled = FeatureBuilder.assemble(f, new 
FeatureProvider() {
+            final Feature assembled = FeatureBuilder.assemble(f, 
context.clone(new FeatureProvider() {
 
                 @Override
                 public Feature provide(final ArtifactId id) {
@@ -142,9 +142,9 @@ public class ApplicationBuilder {
                             return f;
                         }
                     }
-                    return provider.provide(id);
+                    return context.getFeatureProvider().provide(id);
                 }
-            });
+            }));
 
             merge(app, assembled);
         }

Modified: 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java?rev=1806975&r1=1806974&r2=1806975&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
 Fri Sep  1 15:14:31 2017
@@ -182,7 +182,7 @@ class BuilderUtil {
     static void mergeExtensions(final Feature target,
             final Feature source,
             final ArtifactMerge artifactMergeAlg,
-            final FeatureExtensionHandler... extensionMergers) {
+            final BuilderContext context) {
         for(final Extension ext : source.getExtensions()) {
             boolean found = false;
             for(final Extension current : target.getExtensions()) {
@@ -192,13 +192,15 @@ class BuilderUtil {
                         throw new IllegalStateException("Found different types 
for extension " + current.getName()
                         + " : " + current.getType() + " and " + ext.getType());
                     }
-                    if ( extensionMergers != null ) {
-                        for(final FeatureExtensionHandler fem : 
extensionMergers) {
-                            if ( fem.canMerge(current.getName()) ) {
-                                fem.merge(target, source, current.getName());
-                            }
+                    boolean handled = false;
+                    for(final FeatureExtensionHandler fem : 
context.getFeatureExtensionHandlers()) {
+                        if ( fem.canMerge(current.getName()) ) {
+                            fem.merge(target, source, current.getName());
+                            handled = true;
+                            break;
                         }
-                    } else {
+                    }
+                    if ( !handled ) {
                         // default merge
                         mergeExtensions(current, ext, artifactMergeAlg);
                     }

Modified: 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java?rev=1806975&r1=1806974&r2=1806975&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
 Fri Sep  1 15:14:31 2017
@@ -35,19 +35,17 @@ public class FeatureBuilder {
      * Assemble the full feature by processing all includes.
      *
      * @param feature The feature to start
-     * @param provider A provider providing the included features
-     * @param extensionMergers Optional feature mergers
+     * @param context The builder context
      * @return The assembled feature.
-     * @throws IllegalArgumentException If feature or provider is {@code null}
+     * @throws IllegalArgumentException If feature or context is {@code null}
      * @throws IllegalStateException If an included feature can't be provided 
or merged.
      */
     public static Feature assemble(final Feature feature,
-            final FeatureProvider provider,
-            final FeatureExtensionHandler... extensionMergers) {
-        if ( feature == null || provider == null ) {
-            throw new IllegalArgumentException("Feature and/or provider must 
not be null");
+            final BuilderContext context) {
+        if ( feature == null || context == null ) {
+            throw new IllegalArgumentException("Feature and/or context must 
not be null");
         }
-        return internalAssemble(new ArrayList<>(), feature, provider, 
extensionMergers);
+        return internalAssemble(new ArrayList<>(), feature, context);
     }
 
     /**
@@ -60,17 +58,16 @@ public class FeatureBuilder {
      * @param feature The feature to start
      * @param upgrades The list of upgrades. If this is {@code null} or empty, 
this method
      *     behaves like {@link #assemble(Feature, FeatureProvider)}.
-     * @param provider A provider providing the included features
+     * @param context The builder context
      * @return The assembled feature.
-     * @throws IllegalArgumentException If feature or provider is {@code null}
+     * @throws IllegalArgumentException If feature or context is {@code null}
      * @throws IllegalStateException If an included feature can't be provided
      */
     public static Feature assemble(final Feature feature,
             final List<Feature> upgrades,
-            final FeatureProvider provider,
-            final FeatureExtensionHandler... extensionMergers) {
-        if ( feature == null || provider == null ) {
-            throw new IllegalArgumentException("Feature and/or provider must 
not be null");
+            final BuilderContext context) {
+        if ( feature == null || context == null ) {
+            throw new IllegalArgumentException("Feature and/or context must 
not be null");
         }
 
         // check upgrades
@@ -104,7 +101,7 @@ public class FeatureBuilder {
         }
 
         // assemble feature without upgrades
-        final Feature assembledFeature = internalAssemble(new ArrayList<>(), 
feature, provider, extensionMergers);
+        final Feature assembledFeature = internalAssemble(new ArrayList<>(), 
feature, context);
 
         // handle upgrades
         if ( useUpdates != null ) {
@@ -126,10 +123,10 @@ public class FeatureBuilder {
                 // now assemble upgrade, but without considering the base
                 uf.setUpgradeOf(null);
                 assembledFeature.getUpgrades().add(uf.getId());
-                final Feature auf = assemble(uf, provider);
+                final Feature auf = assemble(uf, context);
 
                 // merge
-                merge(assembledFeature, auf, extensionMergers);
+                merge(assembledFeature, auf, context);
             }
         }
 
@@ -138,8 +135,7 @@ public class FeatureBuilder {
 
     private static Feature internalAssemble(final List<String> 
processedFeatures,
             final Feature feature,
-            final FeatureProvider provider,
-            final FeatureExtensionHandler... extensionMergers) {
+            final BuilderContext context) {
         if ( feature.isAssembled() ) {
             return feature;
         }
@@ -188,19 +184,19 @@ public class FeatureBuilder {
             result.getExtensions().clear();
 
             for(final Include i : includes) {
-                final Feature f = provider.provide(i.getId());
+                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, 
provider, extensionMergers);
+                final Feature af = internalAssemble(processedFeatures, f, 
context);
 
                 // process include instructions
                 include(af, i);
 
                 // and now merge
-                merge(result, af, extensionMergers);
+                merge(result, af, context);
             }
-            merge(result, feature, extensionMergers);
+            merge(result, feature, context);
         }
         processedFeatures.remove(feature.getId().toMvnId());
 
@@ -208,8 +204,9 @@ public class FeatureBuilder {
         return result;
     }
 
-    private static void merge(final Feature target, final Feature source,
-            final FeatureExtensionHandler... extensionMergers) {
+    private static void merge(final Feature target,
+            final Feature source,
+            final BuilderContext context) {
         BuilderUtil.mergeBundles(target.getBundles(), source.getBundles(), 
BuilderUtil.ArtifactMerge.LATEST);
         BuilderUtil.mergeConfigurations(target.getConfigurations(), 
source.getConfigurations());
         BuilderUtil.mergeFrameworkProperties(target.getFrameworkProperties(), 
source.getFrameworkProperties());
@@ -218,7 +215,7 @@ public class FeatureBuilder {
         BuilderUtil.mergeExtensions(target,
                 source,
                 BuilderUtil.ArtifactMerge.LATEST,
-                extensionMergers);
+                context);
     }
 
     private static void include(final Feature base, final Include i) {

Modified: 
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java?rev=1806975&r1=1806974&r2=1806975&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
 Fri Sep  1 15:14:31 2017
@@ -16,6 +16,16 @@
  */
 package org.apache.sling.feature.process;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Capability;
@@ -26,16 +36,6 @@ import org.apache.sling.feature.Include;
 import org.apache.sling.feature.Requirement;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 public class FeatureBuilderTest {
 
     private static final Map<String, Feature> FEATURES = new HashMap<>();
@@ -212,7 +212,7 @@ public class FeatureBuilderTest {
 
         assertFalse(base.isAssembled());
 
-        final Feature assembled = FeatureBuilder.assemble(base, provider);
+        final Feature assembled = FeatureBuilder.assemble(base, new 
BuilderContext(provider));
 
         equals(base, assembled);
     }
@@ -269,7 +269,7 @@ public class FeatureBuilderTest {
         result.getConfigurations().add(co3);
 
         // assemble
-        final Feature assembled = FeatureBuilder.assemble(base, provider);
+        final Feature assembled = FeatureBuilder.assemble(base, new 
BuilderContext(provider));
 
         // and test
         equals(result, assembled);


Reply via email to