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

davidb pushed a commit to branch features-service
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git


The following commit(s) were added to refs/heads/features-service by this push:
     new e5c116d  Make launcher write whitelist enforcer configuration.
e5c116d is described below

commit e5c116d33ba6b44ff5b95fdb30b8cab9d5871448
Author: David Bosschaert <[email protected]>
AuthorDate: Tue Jul 10 15:22:17 2018 +0100

    Make launcher write whitelist enforcer configuration.
---
 .../feature/launcher/impl/FeatureProcessor.java    | 59 +++++++++++++++++++---
 .../sling/feature/launcher/impl/Installation.java  |  2 +-
 2 files changed, 53 insertions(+), 8 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
index fcc89de..123f957 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
@@ -47,9 +47,14 @@ import java.util.stream.Collectors;
 
 import javax.json.Json;
 import javax.json.JsonArray;
+import javax.json.JsonObject;
 import javax.json.JsonReader;
+import javax.json.JsonValue;
+import javax.json.JsonValue.ValueType;
 
 public class FeatureProcessor {
+    private static final String FEATURES_SERVICE_PID = 
"org.apache.sling.feature.service.impl.FeaturesServiceImpl";
+    private static final String WHITELIST_ENFORCER_PID = 
"org.apache.sling.feature.whitelist.impl.WhitelistEnforcer";
 
     /**
      * Initialize the launcher
@@ -103,6 +108,7 @@ public class FeatureProcessor {
             final ArtifactManager artifactManager,
             final Application app) throws Exception {
         Dictionary<String, Object> bundleFeatureMap = new Hashtable<>();
+        Converter converter = Converters.standardConverter();
 
         List<String> featureIDs =
                 app.getFeatureIds().stream().map(i -> 
i.toMvnId()).collect(Collectors.toList());
@@ -117,7 +123,6 @@ public class FeatureProcessor {
 
                 String ff = a.getMetadata().get("from-feature");
                 if (ff != null) {
-                    Converter converter = Converters.standardConverter();
                     String[] fl = ff.split(",");
                     Object cfg = null;
                     if (fl.length != 1) {
@@ -139,12 +144,7 @@ public class FeatureProcessor {
                 }
             }
         }
-
-        Object[] featuresServiceConfig = new Object[3];
-        featuresServiceConfig[0] = 
"org.apache.sling.feature.service.impl.FeatureServiceImpl";
-        featuresServiceConfig[1] = null;
-        featuresServiceConfig[2] = bundleFeatureMap;
-        
config.getInstallation().getConfigurations().add(featuresServiceConfig);
+        config.getInstallation().addConfiguration(FEATURES_SERVICE_PID, null, 
bundleFeatureMap);
 
         int index = 1;
         for(final Extension ext : app.getExtensions()) {
@@ -182,6 +182,51 @@ public class FeatureProcessor {
                     index++;
                     cfg.getProperties().put("scripts", text);
                     config.getInstallation().addConfiguration(cfg.getName(), 
cfg.getFactoryPid(), cfg.getProperties());
+            } else if ( 
ext.getName().equals(FeatureConstants.EXTENSION_NAME_API_REGION) ) {
+                Dictionary<String, List<String>> whitelistConfiguration = new 
Hashtable<>();
+                try (JsonReader reader = Json.createReader(new 
StringReader(ext.getJSON()))) {
+                    JsonArray array = reader.readArray();
+                    for (JsonValue jv : array) {
+                        if (jv instanceof JsonObject) {
+                            JsonObject jo = (JsonObject) jv;
+                            String name = jo.getString("name");
+                            String featureIdx = jo.getString("from-feature");
+                            JsonArray exports = jo.getJsonArray("exports");
+
+                            int fidx = 
converter.convert(featureIdx).to(int.class);
+                            if (featureIDs.size() > fidx) {
+                                String featureID = featureIDs.get(fidx);
+                                if (featureID != null) {
+                                    String featureKey = "whitelist.feature." + 
featureID;
+                                    List<String> regions = 
whitelistConfiguration.get(featureKey);
+                                    if (regions == null) {
+                                        regions = new ArrayList<>();
+                                        whitelistConfiguration.put(featureKey, 
regions);
+                                    }
+                                    if (!regions.contains(name)) {
+                                        regions.add(name);
+                                    }
+                                }
+                            }
+
+                            String packagesKey = "whitelist.region." + name;
+                            List<String> packages = 
whitelistConfiguration.get(packagesKey);
+                            if (packages == null) {
+                                packages = new ArrayList<>();
+                                whitelistConfiguration.put(packagesKey, 
packages);
+                            }
+                            for (JsonValue pkg : exports) {
+                                if (pkg.getValueType() == ValueType.STRING) {
+                                    String p = pkg.toString();
+                                    if (!packages.contains(p)) {
+                                        packages.add(p);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                
config.getInstallation().addConfiguration(WHITELIST_ENFORCER_PID, null, 
whitelistConfiguration);
             } else {
                 if ( ext.isRequired() ) {
                     throw new Exception("Unknown required extension " + 
ext.getName());
diff --git 
a/src/main/java/org/apache/sling/feature/launcher/impl/Installation.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/Installation.java
index 2dff508..1f9eafc 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Installation.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Installation.java
@@ -89,7 +89,7 @@ public class Installation implements LauncherRunContext {
      * @param factoryPid The factory pid
      * @param properties The propertis
      */
-    public void addConfiguration(final String pid, final String factoryPid, 
final Dictionary<String, Object> properties) {
+    public void addConfiguration(final String pid, final String factoryPid, 
final Dictionary<String, ?> properties) {
         this.configurations.add(new Object[] {pid, factoryPid, properties});
     }
 

Reply via email to