You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2019/05/16 13:14:17 UTC
[sling-org-apache-sling-feature-launcher] 01/01: SLING-8421: Allow
artifact providers that work with URLs instead of Files.
This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch issues/SLING-8421
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git
commit 8aed5f519691a268eed55444e54df60685bf63d0
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Thu May 16 15:14:03 2019 +0200
SLING-8421: Allow artifact providers that work with URLs instead of Files.
---
.../sling/feature/launcher/impl/Bootstrap.java | 6 +
.../launcher/impl/ExtensionContextImpl.java | 19 ++
.../feature/launcher/impl/FeatureProcessor.java | 48 +-----
.../sling/feature/launcher/impl/Installation.java | 192 ++++++++++++++++++++-
.../launcher/impl/launchers/AbstractRunner.java | 2 -
.../sling/feature/launcher/spi/Launcher.java | 2 +-
.../launcher/spi/LauncherPrepareContext.java | 3 +
.../feature/launcher/spi/LauncherRunContext.java | 14 ++
8 files changed, 235 insertions(+), 51 deletions(-)
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
index d950a6b..288dbed 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
@@ -147,6 +147,12 @@ public class Bootstrap {
}
@Override
+ public ArtifactHandler getArtifactHandler(ArtifactId artifactId) throws IOException
+ {
+ return artifactManager.getArtifactHandler(":" + artifactId.toMvnPath());
+ }
+
+ @Override
public void addAppJar(final File jar) {
try {
config.getInstallation().addAppJar(jar.toURI().toURL());
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/ExtensionContextImpl.java b/src/main/java/org/apache/sling/feature/launcher/impl/ExtensionContextImpl.java
index 8f3bb6d..6315da8 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/ExtensionContextImpl.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/ExtensionContextImpl.java
@@ -26,6 +26,7 @@ import java.util.Map;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.io.file.ArtifactHandler;
import org.apache.sling.feature.io.json.FeatureJSONReader;
import org.apache.sling.feature.launcher.spi.LauncherPrepareContext;
import org.apache.sling.feature.launcher.spi.extensions.ExtensionContext;
@@ -80,6 +81,12 @@ class ExtensionContextImpl implements ExtensionContext {
}
@Override
+ public Map<Integer, List<ArtifactHandler>> getBundleArtifactMap()
+ {
+ return installation.getBundleArtifactMap();
+ }
+
+ @Override
public List<Object[]> getConfigurations() {
return installation.getConfigurations();
}
@@ -90,6 +97,12 @@ class ExtensionContextImpl implements ExtensionContext {
}
@Override
+ public List<ArtifactHandler> getInstallableArtifactHandlers()
+ {
+ return installation.getInstallableArtifactHandlers();
+ }
+
+ @Override
public void addAppJar(File jar) {
prepareContext.addAppJar(jar);
}
@@ -105,6 +118,12 @@ class ExtensionContextImpl implements ExtensionContext {
}
@Override
+ public ArtifactHandler getArtifactHandler(ArtifactId artifactId) throws IOException
+ {
+ return prepareContext.getArtifactHandler(artifactId);
+ }
+
+ @Override
public Feature getFeature(ArtifactId artifact) throws IOException {
Feature f = loadedFeatures.get(artifact);
if (f != null)
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 175d209..092424a 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,10 +16,10 @@
*/
package org.apache.sling.feature.launcher.impl;
-import java.io.File;
import java.io.FileReader;
import java.io.IOException;
-import java.util.HashMap;
+import java.io.InputStreamReader;
+import java.io.Reader;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
@@ -31,7 +31,6 @@ import org.apache.sling.feature.Artifact;
import org.apache.sling.feature.ArtifactId;
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.builder.BuilderContext;
import org.apache.sling.feature.builder.FeatureBuilder;
@@ -62,7 +61,7 @@ public class FeatureProcessor {
final BuilderContext builderContext = new BuilderContext(id -> {
try {
final ArtifactHandler handler = artifactManager.getArtifactHandler(id.toMvnUrl());
- try (final FileReader r = new FileReader(handler.getFile())) {
+ try (final Reader r = new InputStreamReader(handler.getLocalURL().openStream(), "UTF-8")) {
final Feature f = FeatureJSONReader.read(r, handler.getUrl());
return f;
}
@@ -134,8 +133,7 @@ public class FeatureProcessor {
final Feature app, Map<ArtifactId, Feature> loadedFeatures) throws Exception {
for(final Map.Entry<Integer, List<Artifact>> entry : app.getBundles().getBundlesByStartOrder().entrySet()) {
for(final Artifact a : entry.getValue()) {
- final File artifactFile = ctx.getArtifactFile(a.getId());
-
+ final ArtifactHandler artifactFile = ctx.getArtifactHandler(a.getId());
config.getInstallation().addBundle(entry.getKey(), artifactFile);
}
}
@@ -167,42 +165,4 @@ public class FeatureProcessor {
}
}
}
-
- /**
- * Prepare the cache
- * - add all bundles
- * - add all other artifacts (only if startup mode is INSTALL)
- * @param artifactManager The artifact manager
- * @param app the feature with the artifacts
- * @return An Artifact to File mapping.
- * @throws Exception when something goes wrong.
- */
- public static Map<Artifact, File> calculateArtifacts(final ArtifactManager artifactManager,
- final Feature app) throws Exception
- {
- Map<Artifact, File> result = new HashMap<>();
- 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();
-
- result.put(a, artifactFile);
- }
- }
- for (final Extension ext : app.getExtensions())
- {
- if (ext.getType() == ExtensionType.ARTIFACTS
- && ext.getName().equals(Extension.EXTENSION_NAME_CONTENT_PACKAGES))
- {
- for (final Artifact a : ext.getArtifacts())
- {
- final ArtifactHandler handler = artifactManager.getArtifactHandler(":" + a.getId().toMvnPath());
- result.put(a, handler.getFile());
- }
- }
- }
- return result;
- }
}
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 483359e..f9f6e0b 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
@@ -17,13 +17,20 @@
package org.apache.sling.feature.launcher.impl;
import java.io.File;
+import java.net.MalformedURLException;
import java.net.URL;
+import java.util.AbstractList;
+import java.util.AbstractMap;
+import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import org.apache.sling.feature.io.file.ArtifactHandler;
import org.apache.sling.feature.launcher.spi.LauncherRunContext;
import org.slf4j.Logger;
@@ -36,10 +43,10 @@ public class Installation implements LauncherRunContext {
private final Map<String, String> fwkProperties = new HashMap<>();
/** Bundle map */
- private final Map<Integer, List<File>> bundleMap = new HashMap<>();
+ private final Map<Integer, List<ArtifactHandler>> bundleMap = new HashMap<>();
/** Artifacts to be installed */
- private final List<File> installables = new ArrayList<>();
+ private final List<ArtifactHandler> installables = new ArrayList<>();
/** Configurations, they are installed on first start. */
private final List<Object[]> configurations = new ArrayList<>();
@@ -71,7 +78,21 @@ public class Installation implements LauncherRunContext {
* @param file The bundle file
*/
public void addBundle(final Integer startLevel, final File file) {
- List<File> files = bundleMap.get(startLevel);
+ List<ArtifactHandler> files = bundleMap.get(startLevel);
+ if ( files == null ) {
+ files = new ArrayList<>();
+ bundleMap.put(startLevel, files);
+ }
+ files.add(convert(file));
+ }
+
+ /**
+ * Add a bundle with the given start level
+ * @param startLevel The start level
+ * @param file The bundle file
+ */
+ public void addBundle(final Integer startLevel, final ArtifactHandler file) {
+ List<ArtifactHandler> files = bundleMap.get(startLevel);
if ( files == null ) {
files = new ArrayList<>();
bundleMap.put(startLevel, files);
@@ -84,7 +105,7 @@ public class Installation implements LauncherRunContext {
* @param file The file
*/
public void addInstallableArtifact(final File file) {
- this.installables.add(file);
+ this.installables.add(convert(file));
}
/**
@@ -115,6 +136,12 @@ public class Installation implements LauncherRunContext {
*/
@Override
public Map<Integer, List<File>> getBundleMap() {
+ return convert(this.bundleMap);
+ }
+
+ @Override
+ public Map<Integer, List<ArtifactHandler>> getBundleArtifactMap()
+ {
return this.bundleMap;
}
@@ -131,6 +158,12 @@ public class Installation implements LauncherRunContext {
*/
@Override
public List<File> getInstallableArtifacts() {
+ return convertHandlers(this.installables);
+ }
+
+ @Override
+ public List<ArtifactHandler> getInstallableArtifactHandlers()
+ {
return this.installables;
}
@@ -152,4 +185,155 @@ public class Installation implements LauncherRunContext {
public Logger getLogger() {
return this.logger;
}
+
+ private ArtifactHandler convert(File file) {
+ if (file == null) {
+ return null;
+ }
+ try
+ {
+ return new ArtifactHandler(file.toURI().toURL().toExternalForm(), file);
+ }
+ catch (MalformedURLException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private List<File> convertHandlers(List<ArtifactHandler> list) {
+ if (list == null) {
+ return null;
+ }
+ return new AbstractList<File>()
+ {
+ @Override
+ public File get(int index)
+ {
+ return list.get(index).getFile();
+ }
+
+ @Override
+ public int size()
+ {
+ return list.size();
+ }
+
+ @Override
+ public File remove(int index)
+ {
+ ArtifactHandler handler = list.remove(index);
+ return handler != null ? handler.getFile() : null;
+ }
+
+ @Override
+ public File set(int index, File element)
+ {
+ ArtifactHandler handler = list.set(index, convert(element));
+ return handler != null ? handler.getFile() : null;
+ }
+
+ @Override
+ public void add(int index, File element)
+ {
+ list.add(index, convert(element));
+ }
+ };
+ }
+
+ private List<ArtifactHandler> convertFiles(List<File> list) {
+ if (list == null) {
+ return null;
+ }
+ return new AbstractList<ArtifactHandler>()
+ {
+ @Override
+ public ArtifactHandler get(int index)
+ {
+ return convert(list.get(index));
+ }
+
+ @Override
+ public int size()
+ {
+ return list.size();
+ }
+
+ @Override
+ public ArtifactHandler remove(int index)
+ {
+ return convert(list.remove(index));
+ }
+
+ @Override
+ public ArtifactHandler set(int index, ArtifactHandler element)
+ {
+ return convert(list.set(index, element != null ? element.getFile() : null));
+ }
+
+ @Override
+ public void add(int index, ArtifactHandler element)
+ {
+ list.add(index, element != null ? element.getFile() : null);
+ }
+ };
+ }
+
+ private Map<Integer, List<File>> convert(Map<Integer, List<ArtifactHandler>> map) {
+ return new AbstractMap<Integer, List<File>>()
+ {
+ @Override
+ public Set<Entry<Integer, List<File>>> entrySet()
+ {
+ Set<Map.Entry<Integer, List<ArtifactHandler>>> set = map.entrySet();
+ return new AbstractSet<Entry<Integer, List<File>>>()
+ {
+ @Override
+ public Iterator<Entry<Integer, List<File>>> iterator()
+ {
+ Iterator<Map.Entry<Integer, List<ArtifactHandler>>> iter = set.iterator();
+ return new Iterator<Entry<Integer, List<File>>>()
+ {
+ @Override
+ public boolean hasNext()
+ {
+ return iter.hasNext();
+ }
+
+ @Override
+ public Entry<Integer, List<File>> next()
+ {
+ Entry<Integer, List<ArtifactHandler>> entry = iter.next();
+ return new AbstractMap.SimpleEntry<Integer, List<File>>(entry.getKey(), convertHandlers(entry.getValue())) {
+ @Override
+ public List<File> setValue(List<File> value)
+ {
+ entry.setValue(convertFiles(value));
+ return super.setValue(value);
+ }
+ };
+ }
+
+ @Override
+ public void remove()
+ {
+ iter.remove();
+ }
+ };
+ }
+
+ @Override
+ public int size()
+ {
+ return set.size();
+ }
+ };
+ }
+
+ @Override
+ public List<File> put(Integer key, List<File> value)
+ {
+ return convertHandlers(map.put(key, convertFiles(value)));
+ }
+ };
+ }
}
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 b4d4275..b81a152 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
@@ -44,8 +44,6 @@ import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.startlevel.BundleStartLevel;
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 79aa1dc..9452f8f 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
@@ -38,7 +38,7 @@ public interface Launcher {
}
@Override
- public final void addURL(URL url) {
+ public void addURL(URL url) {
super.addURL(url);
}
diff --git a/src/main/java/org/apache/sling/feature/launcher/spi/LauncherPrepareContext.java b/src/main/java/org/apache/sling/feature/launcher/spi/LauncherPrepareContext.java
index 624b9fd..79333c0 100644
--- a/src/main/java/org/apache/sling/feature/launcher/spi/LauncherPrepareContext.java
+++ b/src/main/java/org/apache/sling/feature/launcher/spi/LauncherPrepareContext.java
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.net.URL;
import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.io.file.ArtifactHandler;
import org.slf4j.Logger;
/**
@@ -40,4 +41,6 @@ public interface LauncherPrepareContext {
void addAppJar(URL url);
File getArtifactFile(ArtifactId artifact) throws IOException;
+
+ ArtifactHandler getArtifactHandler(ArtifactId artifactId) throws IOException;
}
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 c2ec088..89e6fc9 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
@@ -20,6 +20,8 @@ import java.io.File;
import java.util.List;
import java.util.Map;
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.io.file.ArtifactHandler;
import org.slf4j.Logger;
/**
@@ -40,6 +42,12 @@ public interface LauncherRunContext {
Map<Integer, List<File>> getBundleMap();
/**
+ * Bundle map, key is the start level, value is a list of handlers.
+ * @return The bundle map, might be empty
+ */
+ Map<Integer, List<ArtifactHandler>> getBundleArtifactMap();
+
+ /**
* List of configurations.
* The value in each is an object array with three values
* <ol>
@@ -59,6 +67,12 @@ public interface LauncherRunContext {
List<File> getInstallableArtifacts();
/**
+ * List of installable artifacts.
+ * @return The list of files. The list might be empty.
+ */
+ List<ArtifactHandler> getInstallableArtifactHandlers();
+
+ /**
* Get the central logger
*
* @return The logger