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

[sling-org-apache-sling-feature-launcher] 01/01: Make the Launcher register the Features service.

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

commit 0af3c18d2865047caa2abd319abe48525dee2036
Author: David Bosschaert <bo...@adobe.com>
AuthorDate: Mon Jul 9 16:15:51 2018 +0100

    Make the Launcher register the Features service.
---
 .../feature/launcher/impl/FeatureProcessor.java      | 19 +++++++++++++++++++
 .../sling/feature/launcher/impl/Installation.java    |  9 +++++++++
 .../org/apache/sling/feature/launcher/impl/Main.java |  1 +
 .../launcher/impl/launchers/AbstractRunner.java      | 20 +++++++++++++++++++-
 .../launcher/impl/launchers/FrameworkLauncher.java   |  5 +++--
 .../launcher/impl/launchers/FrameworkRunner.java     |  5 +++--
 .../feature/launcher/spi/LauncherRunContext.java     |  7 +++++++
 7 files changed, 61 insertions(+), 5 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 1ca2107..f7ba5c2 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
@@ -27,14 +27,17 @@ import org.apache.sling.feature.io.ArtifactManager;
 import org.apache.sling.feature.io.json.ApplicationJSONReader;
 import org.apache.sling.feature.io.json.ApplicationJSONWriter;
 import org.apache.sling.feature.launcher.impl.LauncherConfig.StartupMode;
+import org.osgi.util.converter.Converters;
 
 import java.io.File;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringReader;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.json.Json;
 import javax.json.JsonArray;
@@ -93,14 +96,30 @@ public class FeatureProcessor {
     public static void prepareLauncher(final LauncherConfig config,
             final ArtifactManager artifactManager,
             final Application app) throws Exception {
+        Map<String, String> bundleFeatureMap = new HashMap<>();
+
+        List<String> fids =
+                app.getFeatureIds().stream().map(i -> i.toMvnId()).collect(Collectors.toList());
+
         for(final Map.Entry<Integer, List<Artifact>> entry : app.getBundles().getBundlesByStartOrder().entrySet()) {
             for(final Artifact a : entry.getValue()) {
                 final ArtifactHandler handler = artifactManager.getArtifactHandler(":" + a.getId().toMvnPath());
                 final File artifactFile = handler.getFile();
 
                 config.getInstallation().addBundle(entry.getKey(), artifactFile);
+
+                String ff = a.getMetadata().get("from-feature");
+                if (ff != null) {
+                    String[] fl = ff.split(",");
+                    int fidx = Converters.standardConverter().convert(fl[0]).to(int.class);
+                    if(fids.size() > fidx) {
+                        bundleFeatureMap.put(a.getId().toMvnId(), fids.get(fidx));
+                    }
+                }
             }
         }
+        config.getInstallation().getBundleFeatureMap().putAll(bundleFeatureMap);
+
         int index = 1;
         for(final Extension ext : app.getExtensions()) {
             if ( ext.getType() == ExtensionType.ARTIFACTS ) {
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..05071f6 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
@@ -45,6 +45,9 @@ public class Installation implements LauncherRunContext {
     /** The list of app jars. */
     private final List<File> appJars = new ArrayList<>();
 
+    /** Map of bundle Artifact ID to feature ID */
+    private Map<String, String> bundleFeatureMap = new HashMap<>();
+
     /**
      * Add an application jar.
      * @param jar The application jar
@@ -125,6 +128,11 @@ public class Installation implements LauncherRunContext {
         return this.installables;
     }
 
+    @Override
+    public Map<String, String> getBundleFeatureMap() {
+        return this.bundleFeatureMap;
+    }
+
     /**
      * Clear all in-memory objects
      */
@@ -133,5 +141,6 @@ public class Installation implements LauncherRunContext {
         this.fwkProperties.clear();
         this.bundleMap.clear();
         this.installables.clear();
+        this.bundleFeatureMap.clear();
     }
 }
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
index 7b2c7ca..cbefa0e 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
@@ -216,6 +216,7 @@ public class Main {
             launcherConfig.getInstallation().getBundleMap().clear();
             launcherConfig.getInstallation().getConfigurations().clear();
             launcherConfig.getInstallation().getInstallableArtifacts().clear();
+            launcherConfig.getInstallation().getBundleFeatureMap().clear();
         }
         try {
             run(launcherConfig);
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/launchers/AbstractRunner.java b/src/main/java/org/apache/sling/feature/launcher/impl/launchers/AbstractRunner.java
index 064b632..f4cc522 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/launchers/AbstractRunner.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/launchers/AbstractRunner.java
@@ -67,6 +67,8 @@ import java.util.regex.Pattern;
  * Common functionality for the framework start.
  */
 public abstract class AbstractRunner implements Callable<Integer> {
+    private static final String FEATURES_SERVICE_CLASS = "org.apache.sling.feature.service.Features";
+    private static final String FEATURES_SERVICE_IMPL_CLASS = "org.apache.sling.feature.service.impl.FeatureServiceImpl";
 
     private volatile ServiceTracker<Object, Object> configAdminTracker;
 
@@ -82,9 +84,14 @@ public abstract class AbstractRunner implements Callable<Integer> {
 
     private volatile boolean install;
 
-    public AbstractRunner(final Map<String, String> frameworkProperties, final List<Object[]> configurations, final List<File> installables) {
+    private Map<String, String> bundleFeatureMap;
+
+    public AbstractRunner(final Map<String, String> frameworkProperties, final List<Object[]> configurations,
+            final List<File> installables, final Map<String, String> bundleFeatureMap) {
         this.configurations = new ArrayList<>(configurations);
         this.installables = installables;
+        this.bundleFeatureMap = bundleFeatureMap;
+
         String target = frameworkProperties.get(Constants.FRAMEWORK_BEGINNING_STARTLEVEL);
         if (target != null) {
             targetStartlevel = Integer.parseInt(target);
@@ -407,6 +414,17 @@ public abstract class AbstractRunner implements Callable<Integer> {
                         bundle.adapt(BundleStartLevel.class).setStartLevel(startLevel);
                     }
                     bundle.start();
+
+                    try {
+                        Class<?> featuresServiceImplClass = bundle.loadClass(FEATURES_SERVICE_IMPL_CLASS);
+                        Constructor<?> ctor = featuresServiceImplClass.getConstructor(Map.class);
+                        Object fs = ctor.newInstance(bundleFeatureMap);
+                        bc.registerService(FEATURES_SERVICE_CLASS, fs, null);
+                    } catch (ClassNotFoundException e) {
+                        // Ignore
+                    } catch (Exception e) {
+                        Main.LOG().error("Unable to register Feature Service", e);
+                    }
                 }
             }
         }
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkLauncher.java b/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkLauncher.java
index d5790ee..9bc413a 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkLauncher.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkLauncher.java
@@ -109,12 +109,13 @@ public class FrameworkLauncher implements Launcher {
         }
 
         final Class<?> runnerClass = cl.loadClass(FrameworkRunner.class.getName());
-        final Constructor<?> constructor = runnerClass.getDeclaredConstructor(Map.class, Map.class, List.class, List.class);
+        final Constructor<?> constructor = runnerClass.getDeclaredConstructor(Map.class, Map.class, List.class, List.class, Map.class);
         constructor.setAccessible(true);
         Callable<Integer> restart = (Callable<Integer>) constructor.newInstance(properties,
                 context.getBundleMap(),
                 context.getConfigurations(),
-                context.getInstallableArtifacts());
+                context.getInstallableArtifacts(),
+                context.getBundleFeatureMap());
 
         return restart.call();
         // nothing else to do, constructor starts everything
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkRunner.java b/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkRunner.java
index 25ce117..ae43a59 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkRunner.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/launchers/FrameworkRunner.java
@@ -39,8 +39,9 @@ public class FrameworkRunner extends AbstractRunner {
     public FrameworkRunner(final Map<String, String> frameworkProperties,
             final Map<Integer, List<File>> bundlesMap,
             final List<Object[]> configurations,
-            final List<File> installables) throws Exception {
-        super(frameworkProperties, configurations, installables);
+            final List<File> installables,
+            final Map<String, String> bundleFeatureMap) throws Exception {
+        super(frameworkProperties, configurations, installables, bundleFeatureMap);
 
         final ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class);
         FrameworkFactory factory = null;
diff --git a/src/main/java/org/apache/sling/feature/launcher/spi/LauncherRunContext.java b/src/main/java/org/apache/sling/feature/launcher/spi/LauncherRunContext.java
index 20c95a9..a3caf38 100644
--- a/src/main/java/org/apache/sling/feature/launcher/spi/LauncherRunContext.java
+++ b/src/main/java/org/apache/sling/feature/launcher/spi/LauncherRunContext.java
@@ -55,4 +55,11 @@ public interface LauncherRunContext {
      * @return The list of files. The list might be empty.
      */
     List<File> getInstallableArtifacts();
+
+    /**
+     * This map maps bundle artifact IDs to feature Artifact IDs.
+     * It is used to initialize the Features service.
+     * @return The Bundle Feature map.
+     */
+    Map<String, String> getBundleFeatureMap();
 }