This is an automated email from the ASF dual-hosted git repository.
davidb 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 975da48 SLING-8096 Make it possible to configure Merge Handlers and
Post Processors
975da48 is described below
commit 975da485457cbc8a85a4d3f4cdd00ae6403633cd
Author: David Bosschaert <[email protected]>
AuthorDate: Mon Nov 12 15:12:19 2018 +0000
SLING-8096 Make it possible to configure Merge Handlers and Post Processors
---
.../sling/feature/builder/BuilderContext.java | 19 +++++-
.../apache/sling/feature/builder/BuilderUtil.java | 70 +++++++++++++++++-----
.../sling/feature/builder/HandlerContext.java | 9 +++
.../sling/feature/builder/BuilderUtilTest.java | 19 +++++-
4 files changed, 101 insertions(+), 16 deletions(-)
diff --git a/src/main/java/org/apache/sling/feature/builder/BuilderContext.java
b/src/main/java/org/apache/sling/feature/builder/BuilderContext.java
index 70c0eee..a907c0f 100644
--- a/src/main/java/org/apache/sling/feature/builder/BuilderContext.java
+++ b/src/main/java/org/apache/sling/feature/builder/BuilderContext.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -31,6 +32,7 @@ public class BuilderContext {
private final ArtifactProvider artifactProvider;
private final FeatureProvider provider;
+ private final Map<String, Map<String, String>> extensionConfiguration =
new ConcurrentHashMap<>();
private final List<MergeHandler> mergeExtensions = new
CopyOnWriteArrayList<>();
private final List<PostProcessHandler> postProcessExtensions = new
CopyOnWriteArrayList<>();
private final KeyValueMap variables = new KeyValueMap();
@@ -80,6 +82,16 @@ public class BuilderContext {
return this;
}
+ /**
+ * Obtain the handler configuration. The object returned can be modified
to provide
+ * additional handler configurations.
+ * @return The current handler configuration object. The key is the
handler name
+ * and the value is a map of configuration values.
+ */
+ public Map<String, Map<String, String>> getHandlerConfiguration() {
+ return this.extensionConfiguration;
+ }
+
ArtifactProvider getArtifactProvider() {
return this.artifactProvider;
}
@@ -91,6 +103,7 @@ public class BuilderContext {
Map<String, String> getProperties() {
return this.properties;
}
+
/**
* Get the feature provider.
* @return The feature provider
@@ -101,12 +114,16 @@ public class BuilderContext {
/**
* Get the list of merge extensions
- * @return The list of extenion
+ * @return The list of merge extensions
*/
List<MergeHandler> getMergeExtensions() {
return this.mergeExtensions;
}
+ /**
+ * Get the list of extension post processors
+ * @return The list of post processors
+ */
List<PostProcessHandler> getPostProcessExtensions() {
return this.postProcessExtensions;
}
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 dbd1ce8..7cc6748 100644
--- a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
+++ b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
@@ -16,9 +16,21 @@
*/
package org.apache.sling.feature.builder;
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.Bundles;
+import org.apache.sling.feature.Configuration;
+import org.apache.sling.feature.Configurations;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.FeatureConstants;
+import org.apache.sling.feature.KeyValueMap;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
@@ -34,17 +46,6 @@ import javax.json.JsonValue;
import javax.json.JsonValue.ValueType;
import javax.json.JsonWriter;
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.Bundles;
-import org.apache.sling.feature.Configuration;
-import org.apache.sling.feature.Configurations;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.FeatureConstants;
-import org.apache.sling.feature.KeyValueMap;
-import org.osgi.resource.Capability;
-import org.osgi.resource.Requirement;
-
/**
* Utility methods for the builders
*/
@@ -265,7 +266,7 @@ class BuilderUtil {
boolean handled = false;
for(final MergeHandler me : context.getMergeExtensions()) {
if ( me.canMerge(current) ) {
- me.merge(() -> context.getArtifactProvider(),
target, source, current, ext);
+ me.merge(new HandlerContextImpl(context, me),
target, source, current, ext);
handled = true;
break;
}
@@ -282,7 +283,7 @@ class BuilderUtil {
boolean handled = false;
for (final MergeHandler mh : context.getMergeExtensions()) {
if (mh.canMerge(ext)) {
- mh.merge(() -> context.getArtifactProvider(), target,
source, null, ext);
+ mh.merge(new HandlerContextImpl(context, mh), target,
source, null, ext);
handled = true;
break;
}
@@ -296,7 +297,7 @@ class BuilderUtil {
// post processing
for(final Extension ext : target.getExtensions()) {
for(final PostProcessHandler ppe :
context.getPostProcessExtensions()) {
- ppe.postProcess(() -> context.getArtifactProvider(), target,
ext);
+ ppe.postProcess(new HandlerContextImpl(context, ppe), target,
ext);
}
}
}
@@ -332,4 +333,45 @@ class BuilderUtil {
}
return builder.build();
}
+
+ private static class HandlerContextImpl implements HandlerContext {
+ private final ArtifactProvider artifactProvider;
+ private final Map<String, String> configuration;
+
+ public HandlerContextImpl(BuilderContext bc, MergeHandler handler) {
+ artifactProvider = bc.getArtifactProvider();
+ configuration = getHandlerConfiguration(bc, handler);
+ }
+
+ public HandlerContextImpl(BuilderContext bc, PostProcessHandler
handler) {
+ artifactProvider = bc.getArtifactProvider();
+ configuration = getHandlerConfiguration(bc, handler);
+ }
+
+ private Map<String, String> getHandlerConfiguration(BuilderContext bc,
Object handler) {
+ String name = getHandlerName(handler);
+ Map<String, String> cfg = null;
+ if (name != null) {
+ cfg = bc.getHandlerConfiguration().get(name);
+ }
+ if (cfg != null)
+ return cfg;
+ else
+ return Collections.emptyMap();
+ }
+
+ private static String getHandlerName(Object handler) {
+ return handler.getClass().getSimpleName();
+ }
+
+ @Override
+ public ArtifactProvider getArtifactProvider() {
+ return artifactProvider;
+ }
+
+ @Override
+ public Map<String, String> getConfiguration() {
+ return configuration;
+ }
+ }
}
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 fc18057..d89f6f3 100644
--- a/src/main/java/org/apache/sling/feature/builder/HandlerContext.java
+++ b/src/main/java/org/apache/sling/feature/builder/HandlerContext.java
@@ -17,6 +17,8 @@
*/
package org.apache.sling.feature.builder;
+import java.util.Map;
+
/**
* Context for an extension handler.
*/
@@ -26,4 +28,11 @@ public interface HandlerContext {
* @return The artifact provider.
*/
ArtifactProvider getArtifactProvider();
+
+ /**
+ * Configuration for the handler
+ * @return Map of provided configuration, or an empty map if there is no
configuration.
+ * Never {@code null}.
+ */
+ Map<String, String> getConfiguration();
}
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 cafed54..ed02f1f 100644
--- a/src/test/java/org/apache/sling/feature/builder/BuilderUtilTest.java
+++ b/src/test/java/org/apache/sling/feature/builder/BuilderUtilTest.java
@@ -31,6 +31,7 @@ import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -39,6 +40,7 @@ import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;
import javax.json.JsonString;
import javax.json.JsonValue;
@@ -265,6 +267,16 @@ public class BuilderUtilTest {
gen.writeStartObject();
copyJsonObject(sobj, gen);
gen.write("org", ja.build());
+
+ JsonObjectBuilder jo = Json.createObjectBuilder();
+ boolean hasCfg = false;
+ for (Map.Entry<String,String> entry :
context.getConfiguration().entrySet()) {
+ jo.add(entry.getKey(), entry.getValue());
+ hasCfg = true;
+ }
+ if (hasCfg)
+ gen.write("cfg", jo.build());
+
gen.writeEnd();
gen.close();
@@ -331,8 +343,13 @@ public class BuilderUtilTest {
}
@Test public void testMergeCustomExtensionsFirst() {
+ Map<String, String> m = new HashMap<>();
+ m.put("abc", "def");
+ m.put("hij", "klm");
+
FeatureProvider fp = Mockito.mock(FeatureProvider.class);
BuilderContext ctx = new BuilderContext(fp, null);
+ ctx.getHandlerConfiguration().put("TestMergeHandler", m);
ctx.addMergeExtensions(new TestMergeHandler());
Feature fs = new Feature(ArtifactId.fromMvnId("g:s:1"));
Extension e = new Extension(ExtensionType.JSON, "foo", false);
@@ -345,7 +362,7 @@ public class BuilderUtilTest {
assertEquals(1, ft.getExtensions().size());
Extension actual = ft.getExtensions().get(0);
- String expected = "{\"a\": 123, \"org\": [\"g:s:1\"]}";
+ String expected = "{\"a\": 123, \"org\": [\"g:s:1\"],
\"cfg\":{\"abc\":\"def\",\"hij\":\"klm\"}}";
JsonReader ar = Json.createReader(new StringReader(actual.getJSON()));
JsonReader er = Json.createReader(new StringReader(expected));