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