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);