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