You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2018/08/15 08:30:22 UTC
[sling-org-apache-sling-feature-launcher] branch master updated:
SLING-7827 : Remove Application concept from feature model
This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git
The following commit(s) were added to refs/heads/master by this push:
new be1830a SLING-7827 : Remove Application concept from feature model
be1830a is described below
commit be1830a87a36d8d78b7d77a413b0bfb3b9c7cae8
Author: Carsten Ziegeler <cz...@adobe.com>
AuthorDate: Wed Aug 15 10:30:16 2018 +0200
SLING-7827 : Remove Application concept from feature model
---
.../feature/launcher/impl/FeatureProcessor.java | 61 +++++++++++++++-------
.../feature/launcher/impl/LauncherConfig.java | 13 +++--
.../apache/sling/feature/launcher/impl/Main.java | 27 +++++-----
.../launcher/impl/launchers/FrameworkLauncher.java | 27 ++++++----
.../sling/feature/launcher/spi/Launcher.java | 4 +-
5 files changed, 79 insertions(+), 53 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 cbdd069..e9e04ca 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
@@ -16,18 +16,6 @@
*/
package org.apache.sling.feature.launcher.impl;
-import org.apache.sling.feature.Application;
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.Configuration;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.ExtensionType;
-import org.apache.sling.feature.FeatureConstants;
-import org.apache.sling.feature.io.ArtifactHandler;
-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 java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
@@ -41,6 +29,21 @@ import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonReader;
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.Configuration;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.FeatureConstants;
+import org.apache.sling.feature.KeyValueMap;
+import org.apache.sling.feature.builder.FeatureBuilder;
+import org.apache.sling.feature.io.ArtifactHandler;
+import org.apache.sling.feature.io.ArtifactManager;
+import org.apache.sling.feature.io.IOUtils;
+import org.apache.sling.feature.io.json.FeatureJSONReader;
+import org.apache.sling.feature.io.json.FeatureJSONWriter;
+import org.apache.sling.feature.launcher.impl.LauncherConfig.StartupMode;
+
public class FeatureProcessor {
/**
@@ -49,10 +52,10 @@ public class FeatureProcessor {
* @param config The current configuration
* @param artifactManager The artifact manager
*/
- public static Application createApplication(final LauncherConfig config,
+ public static Feature createApplication(final LauncherConfig config,
final ArtifactManager artifactManager)
throws IOException {
- Application app = null;
+ Feature app = null;
if ( config.getApplicationFile() != null ) {
app = read(config.getApplicationFile(), artifactManager, config.getVariables());
// write application back
@@ -60,7 +63,7 @@ public class FeatureProcessor {
file.getParentFile().mkdirs();
try (final FileWriter writer = new FileWriter(file)) {
- ApplicationJSONWriter.write(writer, app);
+ FeatureJSONWriter.write(writer, app);
} catch ( final IOException ioe) {
Main.LOG().error("Error while writing application file: {}", ioe.getMessage(), ioe);
System.exit(1);
@@ -71,18 +74,36 @@ public class FeatureProcessor {
artifactManager, config.getVariables());
}
+ // check framework
+ if ( app.getExtensions().getByName(FeatureConstants.EXTENSION_NAME_FRAMEWORK) == null ) {
+
+ // use hard coded Apache Felix
+ final Extension fwk = new Extension(ExtensionType.JSON, FeatureConstants.EXTENSION_NAME_FRAMEWORK, false);
+ fwk.getArtifacts().add(new Artifact(IOUtils.getFelixFrameworkId(null)));
+ app.getExtensions().add(fwk);
+ }
+
+ for (Artifact bundle : app.getBundles()) {
+ if ( bundle.getStartOrder() == 0) {
+ final int so = bundle.getMetadata().get("start-level") != null ? Integer.parseInt(bundle.getMetadata().get("start-level")) : 1;
+ bundle.setStartOrder(so);
+ }
+ }
+
return app;
}
- private static Application read(String absoluteArg, ArtifactManager artifactManager,
- Map<String, String> overriddenVars) throws IOException {
+ private static Feature read(String absoluteArg, ArtifactManager artifactManager,
+ KeyValueMap overriddenVars) throws IOException {
if ( absoluteArg.indexOf(":") < 2 ) {
absoluteArg = new File(absoluteArg).getAbsolutePath();
}
final ArtifactHandler appArtifact = artifactManager.getArtifactHandler(absoluteArg);
try (final FileReader r = new FileReader(appArtifact.getFile())) {
- return ApplicationJSONReader.read(r, overriddenVars);
+ final Feature f = FeatureJSONReader.read(r, appArtifact.getUrl());
+ FeatureBuilder.resolveVariables(f, overriddenVars);
+ return f;
}
}
/**
@@ -93,7 +114,7 @@ public class FeatureProcessor {
*/
public static void prepareLauncher(final LauncherConfig config,
final ArtifactManager artifactManager,
- final Application app) throws Exception {
+ final Feature app) throws Exception {
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());
@@ -166,7 +187,7 @@ public class FeatureProcessor {
* - add all other artifacts (only if startup mode is INSTALL)
*/
public static Map<Artifact, File> calculateArtifacts(final ArtifactManager artifactManager,
- final Application app) throws Exception
+ final Feature app) throws Exception
{
Map<Artifact, File> result = new HashMap<>();
for (final Map.Entry<Integer, List<Artifact>> entry : app.getBundles().getBundlesByStartOrder().entrySet())
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java
index 1173148..191ecb6 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java
@@ -16,13 +16,12 @@
*/
package org.apache.sling.feature.launcher.impl;
-import org.apache.sling.feature.io.ArtifactManagerConfig;
-import org.apache.sling.feature.io.spi.ArtifactProviderContext;
-
import java.io.File;
import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
+
+import org.apache.sling.feature.KeyValueMap;
+import org.apache.sling.feature.io.ArtifactManagerConfig;
+import org.apache.sling.feature.io.spi.ArtifactProviderContext;
/**
* This class holds the configuration of the launcher.
@@ -52,7 +51,7 @@ public class LauncherConfig
private volatile File home = new File(HOME);
- private final Map<String, String> variables = new HashMap<>();
+ private final KeyValueMap variables = new KeyValueMap();
/**
* Create a new configuration object.
@@ -129,7 +128,7 @@ public class LauncherConfig
this.installation.clear();
}
- public Map<String, String> getVariables() {
+ public KeyValueMap getVariables() {
return this.variables;
}
}
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 86cb017..569a830 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
@@ -16,6 +16,16 @@
*/
package org.apache.sling.feature.launcher.impl;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
@@ -23,9 +33,9 @@ import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
-import org.apache.sling.feature.Application;
import org.apache.sling.feature.Artifact;
import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Feature;
import org.apache.sling.feature.io.ArtifactHandler;
import org.apache.sling.feature.io.ArtifactManager;
import org.apache.sling.feature.launcher.impl.launchers.FrameworkLauncher;
@@ -35,17 +45,6 @@ import org.osgi.framework.FrameworkEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
/**
* This is the launcher main class.
* It parses command line parameters and prepares the launcher.
@@ -168,7 +167,7 @@ public class Main {
parseArgs(launcherConfig, args);
launcherConfig.getVariables().put("sling.home", launcherConfig.getHomeDirectory().getAbsolutePath());
- if (!launcherConfig.getVariables().containsKey("repository.home")) {
+ if (launcherConfig.getVariables().get("repository.home") == null ) {
launcherConfig.getVariables().put("repository.home", launcherConfig.getHomeDirectory().getAbsolutePath() + File.separatorChar + "repository");
}
launcherConfig.getVariables().put("sling.launchpad", launcherConfig.getHomeDirectory().getAbsolutePath() + "/launchpad");
@@ -192,7 +191,7 @@ public class Main {
try {
final Launcher launcher = new FrameworkLauncher();
- final Application app = FeatureProcessor.createApplication(launcherConfig, artifactManager);
+ final Feature app = FeatureProcessor.createApplication(launcherConfig, artifactManager);
Main.LOG().info("");
Main.LOG().info("Assembling launcher...");
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..f93c149 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
@@ -16,24 +16,27 @@
*/
package org.apache.sling.feature.launcher.impl.launchers;
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
import org.apache.commons.lang.text.StrLookup;
import org.apache.commons.lang.text.StrSubstitutor;
-import org.apache.sling.feature.Application;
import org.apache.sling.feature.Artifact;
import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.FeatureConstants;
import org.apache.sling.feature.launcher.impl.Main;
import org.apache.sling.feature.launcher.spi.Launcher;
import org.apache.sling.feature.launcher.spi.LauncherPrepareContext;
import org.apache.sling.feature.launcher.spi.LauncherRunContext;
import org.osgi.framework.Constants;
-import java.io.File;
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
/**
* Launcher directly using the OSGi launcher API.
*/
@@ -41,8 +44,12 @@ public class FrameworkLauncher implements Launcher {
@Override
- public void prepare(final LauncherPrepareContext context, final Application app) throws Exception {
- context.addAppJar(context.getArtifactFile(app.getFramework()));
+ public void prepare(final LauncherPrepareContext context, final Feature app) throws Exception {
+ final Extension fwk = app.getExtensions().getByName(FeatureConstants.EXTENSION_NAME_FRAMEWORK);
+ if ( fwk == null || fwk.getType() != ExtensionType.ARTIFACTS || fwk.getArtifacts().size() != 1 ) {
+ throw new Exception("Framework definition is wrong!");
+ }
+ context.addAppJar(context.getArtifactFile(fwk.getArtifacts().get(0).getId()));
ArtifactId api = ArtifactId.fromMvnId("org.apache.sling:org.apache.sling.launchpad.api:1.2.0");
Artifact artifact = app.getBundles().getSame(api);
if (artifact != null)
diff --git a/src/main/java/org/apache/sling/feature/launcher/spi/Launcher.java b/src/main/java/org/apache/sling/feature/launcher/spi/Launcher.java
index 26819c4..8735a0c 100644
--- a/src/main/java/org/apache/sling/feature/launcher/spi/Launcher.java
+++ b/src/main/java/org/apache/sling/feature/launcher/spi/Launcher.java
@@ -16,11 +16,11 @@
*/
package org.apache.sling.feature.launcher.spi;
-import org.apache.sling.feature.Application;
+import org.apache.sling.feature.Feature;
public interface Launcher {
- void prepare(LauncherPrepareContext context, Application app) throws Exception;
+ void prepare(LauncherPrepareContext context, Feature app) throws Exception;
int run(LauncherRunContext context, ClassLoader cl) throws Exception;
}