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

Reply via email to