You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2020/11/11 09:16:51 UTC

[sling-org-apache-sling-feature] branch master updated: SLING-9895 : Provide more information to extension handlers

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

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git


The following commit(s) were added to refs/heads/master by this push:
     new 5c446a0  SLING-9895 : Provide more information to extension handlers
5c446a0 is described below

commit 5c446a04d85dfc2407665749e5f0bf900dc02efe
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Wed Nov 11 10:16:30 2020 +0100

    SLING-9895 : Provide more information to extension handlers
---
 .../apache/sling/feature/builder/BuilderUtil.java  | 38 +++++++++++++++++-----
 .../sling/feature/builder/FeatureBuilder.java      | 14 +++++---
 .../sling/feature/builder/HandlerContext.java      | 19 +++++++++--
 .../apache/sling/feature/builder/package-info.java |  2 +-
 .../sling/feature/builder/BuilderUtilTest.java     | 14 ++++----
 5 files changed, 64 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
index 1be3bbd..efbc1ad 100644
--- a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
+++ b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
@@ -637,10 +637,12 @@ class BuilderUtil {
 
     // extensions (add/merge)
     static void mergeExtensions(final Feature target,
-        final Feature source,
-        final BuilderContext context,
+            final Feature source,
+            final BuilderContext context,
             final List<ArtifactId> artifactOverrides,
-        final String originKey) {
+            final String originKey,
+            final boolean prototypeMerge,
+            final boolean initialMerge) {
         for(final Extension ext : source.getExtensions()) {
             boolean found = false;
 
@@ -655,7 +657,7 @@ class BuilderUtil {
                     boolean handled = false;
                     for(final MergeHandler me : context.getMergeExtensions()) {
                         if ( me.canMerge(current) ) {
-                            me.merge(new HandlerContextImpl(context, me), target, source, current, ext);
+                            me.merge(new HandlerContextImpl(context, me, prototypeMerge, initialMerge), target, source, current, ext);
                             handled = true;
                             break;
                         }
@@ -672,7 +674,7 @@ class BuilderUtil {
                 boolean handled = false;
                 for (final MergeHandler mh : context.getMergeExtensions()) {
                     if (mh.canMerge(ext)) {
-                        mh.merge(new HandlerContextImpl(context, mh), target, source, null, ext);
+                        mh.merge(new HandlerContextImpl(context, mh, prototypeMerge, initialMerge), target, source, null, ext);
                         handled = true;
                         break;
                     }
@@ -688,7 +690,7 @@ class BuilderUtil {
         // Make a defensive copy of the extensions, as the handlers may modify the extensions on the target
         for(final Extension ext : new ArrayList<>(target.getExtensions())) {
             for(final PostProcessHandler ppe : context.getPostProcessExtensions()) {
-                ppe.postProcess(new HandlerContextImpl(context, ppe), target, ext);
+                ppe.postProcess(new HandlerContextImpl(context, ppe, prototypeMerge, initialMerge), target, ext);
             }
         }
     }
@@ -726,17 +728,27 @@ class BuilderUtil {
     }
 
     static class HandlerContextImpl implements HandlerContext {
+
         private final ArtifactProvider artifactProvider;
+        
         private final Map<String,String> configuration;
 
-        HandlerContextImpl(BuilderContext bc, MergeHandler handler) {
+        private final boolean prototypeMerge;
+
+        private final boolean initialMerge;
+
+        HandlerContextImpl(BuilderContext bc, MergeHandler handler, final boolean prototype, final boolean initial) {
             artifactProvider = bc.getArtifactProvider();
             configuration = getHandlerConfiguration(bc, handler);
+            this.prototypeMerge = prototype;
+            this.initialMerge = initial;
         }
 
-        HandlerContextImpl(BuilderContext bc, PostProcessHandler handler) {
+        HandlerContextImpl(BuilderContext bc, PostProcessHandler handler, final boolean prototype, final boolean initial) {
             artifactProvider = bc.getArtifactProvider();
             configuration = getHandlerConfiguration(bc, handler);
+            this.prototypeMerge = prototype;
+            this.initialMerge = initial;
         }
 
         private Map<String,String> getHandlerConfiguration(BuilderContext bc, Object handler) {
@@ -768,5 +780,15 @@ class BuilderUtil {
         public Map<String,String> getConfiguration() {
             return configuration;
         }
+
+		@Override
+		public boolean isInitialMerge() {
+			return this.initialMerge;
+		}
+
+		@Override
+		public boolean isPrototypeMerge() {
+			return this.prototypeMerge;
+		}
     }
 }
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 f582a64..6c1bd91 100644
--- a/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
+++ b/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
@@ -201,12 +201,14 @@ public abstract class FeatureBuilder {
 
         // assemble feature
         boolean targetIsComplete = true;
+        boolean firstMerge = true;
         for(final Feature assembled : assembledFeatures) {
             if (!assembled.isComplete()) {
                 targetIsComplete = false;
             }
 
-            merge(target, assembled, context, context.getArtifactOverrides(), context.getConfigOverrides(),null);
+            merge(target, assembled, context, context.getArtifactOverrides(), context.getConfigOverrides(), null, false, firstMerge);
+            firstMerge = false;
         }
 
         // check complete flag
@@ -334,13 +336,13 @@ public abstract class FeatureBuilder {
             processPrototype(prototypeFeature, i);
 
             // and now merge the prototype feature into the result. No overrides should be needed since the result is empty before
-            merge(result, prototypeFeature, context, Collections.emptyList(), Collections.emptyMap(), TRACKING_KEY);
+            merge(result, prototypeFeature, context, Collections.emptyList(), Collections.emptyMap(), TRACKING_KEY, true, true);
 
             // and merge the current feature over the prototype feature into the result
             merge(result, feature, context, Collections.singletonList(
                     ArtifactId.parse(BuilderUtil.CATCHALL_OVERRIDE + BuilderContext.VERSION_OVERRIDE_ALL)),
                     Collections.singletonMap("*", BuilderContext.CONFIG_MERGE_LATEST),
-                    TRACKING_KEY);
+                    TRACKING_KEY, true, false);
 
             for (Artifact a : result.getBundles()) {
                 a.getMetadata().remove(TRACKING_KEY);
@@ -377,14 +379,16 @@ public abstract class FeatureBuilder {
             final BuilderContext context,
             final List<ArtifactId> artifactOverrides,
             final Map<String, String> configOverrides,
-            final String originKey) {
+            final String originKey,            
+            final boolean prototypeMerge,
+            final boolean initialMerge) {
         BuilderUtil.mergeVariables(target.getVariables(), source.getVariables(), context);
         BuilderUtil.mergeArtifacts(target.getBundles(), source.getBundles(), source, artifactOverrides, originKey);
         BuilderUtil.mergeConfigurations(target.getConfigurations(), source.getConfigurations(), configOverrides, source.getId());
         BuilderUtil.mergeFrameworkProperties(target.getFrameworkProperties(), source.getFrameworkProperties(), context);
         BuilderUtil.mergeRequirements(target.getRequirements(), source.getRequirements());
         BuilderUtil.mergeCapabilities(target.getCapabilities(), source.getCapabilities());
-        BuilderUtil.mergeExtensions(target, source, context, artifactOverrides, originKey);
+        BuilderUtil.mergeExtensions(target, source, context, artifactOverrides, originKey, prototypeMerge, initialMerge);
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/feature/builder/HandlerContext.java b/src/main/java/org/apache/sling/feature/builder/HandlerContext.java
index 5a1b4aa..1a99052 100644
--- a/src/main/java/org/apache/sling/feature/builder/HandlerContext.java
+++ b/src/main/java/org/apache/sling/feature/builder/HandlerContext.java
@@ -26,9 +26,10 @@ import org.osgi.annotation.versioning.ProviderType;
  */
 @ProviderType
 public interface HandlerContext {
+
     /**
-     * Provide the artifact provider.
-     * @return The artifact provider.
+     * Provide the optional artifact provider.
+     * @return The artifact provider or {@code null}
      */
     ArtifactProvider getArtifactProvider();
 
@@ -38,4 +39,18 @@ public interface HandlerContext {
      * Never {@code null}.
      */
     Map<String,String> getConfiguration();
+
+    /**
+     * Is this merging a prototype into the defining feature?
+     * @return {@code true} if it is prototype processing
+     * @since 1.3.0
+     */
+    boolean isPrototypeMerge();
+
+    /**
+     * Is this the first feature being merged in?
+     * @return {@code true} if it is the first feature
+     * @since 1.3.0
+     */
+    boolean isInitialMerge();
 }
diff --git a/src/main/java/org/apache/sling/feature/builder/package-info.java b/src/main/java/org/apache/sling/feature/builder/package-info.java
index d2e0aad..686594b 100644
--- a/src/main/java/org/apache/sling/feature/builder/package-info.java
+++ b/src/main/java/org/apache/sling/feature/builder/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.2.1")
+@org.osgi.annotation.versioning.Version("1.3.0")
 package org.apache.sling.feature.builder;
 
 
diff --git a/src/test/java/org/apache/sling/feature/builder/BuilderUtilTest.java b/src/test/java/org/apache/sling/feature/builder/BuilderUtilTest.java
index 06a06bf..c66d523 100644
--- a/src/test/java/org/apache/sling/feature/builder/BuilderUtilTest.java
+++ b/src/test/java/org/apache/sling/feature/builder/BuilderUtilTest.java
@@ -289,7 +289,7 @@ public class BuilderUtilTest {
 
         BuilderContext bc = Mockito.mock(BuilderContext.class);
         Mockito.when(bc.getPostProcessExtensions()).thenReturn(Collections.singletonList(pph));
-        BuilderUtil.mergeExtensions(f2, f, bc, Collections.emptyList(), "abc");
+        BuilderUtil.mergeExtensions(f2, f, bc, Collections.emptyList(), "abc", false, false);
 
         assertEquals(Collections.singleton("foo"),
                 f2.getExtensions().stream().map(Extension::getName).collect(Collectors.toSet()));
@@ -381,7 +381,7 @@ public class BuilderUtilTest {
         Feature ft = new Feature(ArtifactId.fromMvnId("g:t:1"));
 
         assertEquals("Precondition", 0, ft.getExtensions().size());
-        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null);
+        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null, false, false);
         assertEquals(1, ft.getExtensions().size());
 
         Extension actual = ft.getExtensions().get(0);
@@ -405,7 +405,7 @@ public class BuilderUtilTest {
         ft.getExtensions().add(et);
 
         assertEquals("Precondition", 1, ft.getExtensions().size());
-        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null);
+        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null, false, false);
         assertEquals(1, ft.getExtensions().size());
 
         Extension actual = ft.getExtensions().get(0);
@@ -432,7 +432,7 @@ public class BuilderUtilTest {
         Feature ft = new Feature(ArtifactId.fromMvnId("g:t:1"));
 
         assertEquals("Precondition", 0, ft.getExtensions().size());
-        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null);
+        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null, false, false);
         assertEquals(1, ft.getExtensions().size());
 
         Extension actual = ft.getExtensions().get(0);
@@ -457,7 +457,7 @@ public class BuilderUtilTest {
         ft.getExtensions().add(et);
 
         assertEquals("Precondition", 1, ft.getExtensions().size());
-        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null);
+        BuilderUtil.mergeExtensions(ft, fs, ctx, new ArrayList<>(), null, false, false);
         assertEquals(1, ft.getExtensions().size());
 
         Extension actual = ft.getExtensions().get(0);
@@ -574,7 +574,7 @@ public class BuilderUtilTest {
         BuilderContext bc = Mockito.mock(BuilderContext.class);
         Mockito.when(bc.getHandlerConfigurations()).thenReturn(cm);
         TestMergeHandler mh = new TestMergeHandler();
-        HandlerContextImpl hc = new BuilderUtil.HandlerContextImpl(bc, mh);
+        HandlerContextImpl hc = new BuilderUtil.HandlerContextImpl(bc, mh, false, false);
         Map<String, String> cfg = hc.getConfiguration();
         assertEquals(2, cfg.size());
         assertEquals("d", cfg.get("c"));
@@ -592,7 +592,7 @@ public class BuilderUtilTest {
         BuilderContext bc = Mockito.mock(BuilderContext.class);
         Mockito.when(bc.getHandlerConfigurations()).thenReturn(cm);
         PostProcessHandler pph = Mockito.mock(PostProcessHandler.class);
-        HandlerContextImpl hc = new BuilderUtil.HandlerContextImpl(bc, pph);
+        HandlerContextImpl hc = new BuilderUtil.HandlerContextImpl(bc, pph, false, false);
         Map<String, String> cfg = hc.getConfiguration();
         assertEquals(0, cfg.size());
     }