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