This is an automated email from the ASF dual-hosted git repository. pauls pushed a commit to branch extensions in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git
commit 8c2c612f997e2d9ccae6342f9848de4d5223a4c2 Merge: fdc440b e253419 Author: Karl Pauls <[email protected]> AuthorDate: Tue Aug 28 22:58:34 2018 +0200 Merge master .../feature/launcher/impl/FeatureProcessor.java | 96 ++++++++------ .../feature/launcher/impl/LauncherConfig.java | 26 +--- .../apache/sling/feature/launcher/impl/Main.java | 147 +++++++++++++-------- .../extensions/handlers/ContentPackageHandler.java | 4 +- 4 files changed, 155 insertions(+), 118 deletions(-) diff --cc src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java index 03dd923,8fe6874..bdacc49 --- a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java @@@ -18,31 -18,37 +18,32 @@@ package org.apache.sling.feature.launch import java.io.File; import java.io.FileReader; - import java.io.FileWriter; import java.io.IOException; --import java.io.StringReader; + import java.util.ArrayList; -import java.util.Arrays; + import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; - - import javax.json.Json; - import javax.json.JsonArray; - import javax.json.JsonReader; + import java.util.Spliterator; + import java.util.Spliterators; + import java.util.stream.StreamSupport; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonReader; 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.KeyValueMap; -import org.apache.sling.feature.FeatureConstants; + import org.apache.sling.feature.builder.BuilderContext; import org.apache.sling.feature.builder.FeatureBuilder; + import org.apache.sling.feature.builder.FeatureExtensionHandler; 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; +import org.apache.sling.feature.launcher.spi.LauncherPrepareContext; +import org.apache.sling.feature.launcher.spi.extensions.ExtensionHandler; public class FeatureProcessor { @@@ -112,20 -132,50 +125,19 @@@ config.getInstallation().addBundle(entry.getKey(), artifactFile); } } - - int index = 1; - for(final Extension ext : app.getExtensions()) { - if ( ext.getType() == ExtensionType.ARTIFACTS && !ext.getName().equals(FeatureConstants.EXTENSION_NAME_ASSEMBLED_FEATURES)) { - for(final Artifact a : ext.getArtifacts() ) { - if ( config.getStartupMode() == StartupMode.PURE ) { - throw new Exception("Artifacts other than bundle are not supported by framework launcher."); - } - final ArtifactHandler handler = artifactManager.getArtifactHandler(":" + a.getId().toMvnPath()); - config.getInstallation().addInstallableArtifact(handler.getFile()); - } - } else if ( ext.getName().equals(FeatureConstants.EXTENSION_NAME_REPOINIT) ) { - String text; - if ( ext.getType() == ExtensionType.TEXT ) { - text = ext.getText(); - } - else if (ext.getType() == ExtensionType.JSON) { - try (JsonReader reader = Json.createReader(new StringReader(ext.getJSON()))){ - JsonArray array = reader.readArray(); - if (array.size() > 0) { - text = array.getString(0); - for (int i = 1; i < array.size(); i++) { - text += "\n" + array.getString(i); - } - } - else { - text = ""; - } - } - } - else { - throw new Exception(FeatureConstants.EXTENSION_NAME_REPOINIT + " extension must be of type text or json"); - } - final Configuration cfg = new Configuration("org.apache.sling.jcr.repoinit.RepositoryInitializer", "repoinit" + String.valueOf(index)); - index++; - cfg.getProperties().put("scripts", text); - config.getInstallation().addConfiguration(cfg.getName(), cfg.getFactoryPid(), cfg.getProperties()); - } else { - if ( ext.isRequired() ) { - throw new Exception("Unknown required extension " + ext.getName()); + extensions: for(final Extension ext : app.getExtensions()) { + for (ExtensionHandler handler : ServiceLoader.load(ExtensionHandler.class, FeatureProcessor.class.getClassLoader())) + { + if (handler.handle(ext, ctx, config.getInstallation())) { + continue extensions; } } + if ( ext.isRequired() ) { + throw new Exception("Unknown required extension " + ext.getName()); + } } -- for(final Configuration cfg : app.getConfigurations()) { ++ for (final Configuration cfg : app.getConfigurations()) { if ( cfg.isFactoryConfiguration() ) { config.getInstallation().addConfiguration(cfg.getName(), cfg.getFactoryPid(), cfg.getProperties()); } else { @@@ -133,7 -183,7 +145,7 @@@ } } -- for(final Map.Entry<String, String> prop : app.getFrameworkProperties()) { ++ for (final Map.Entry<String, String> prop : app.getFrameworkProperties()) { if ( !config.getInstallation().getFrameworkProperties().containsKey(prop.getKey()) ) { config.getInstallation().getFrameworkProperties().put(prop.getKey(), prop.getValue()); } diff --cc src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java index 7b9ca76,a6272a2..53b3c4b --- a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java @@@ -35,11 -42,10 +37,8 @@@ public class LauncherConfi private static final String CACHE_DIR = "cache"; /** The feature files or directories. */ - private volatile String[] featureFiles; - - /** The application file. */ - private volatile String appFile; + private final LinkedHashSet<String> featureFiles = new LinkedHashSet<>(); - private volatile StartupMode startupMode = StartupMode.PURE; - private final Installation installation = new Installation(); private volatile File home = new File(HOME); diff --cc src/main/java/org/apache/sling/feature/launcher/impl/Main.java index 5f93435,5a2f335..2d36ca4 --- a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java @@@ -17,7 -17,9 +17,8 @@@ package org.apache.sling.feature.launcher.impl; import java.io.File; + import java.io.FileWriter; import java.io.IOException; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Files; @@@ -129,8 -135,13 +131,11 @@@ public class Main if ( cl.hasOption(debugOption.getOpt()) ) { System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug"); } - if ( cl.hasOption(appOption.getOpt()) ) { - config.setApplicationFile(cl.getOptionValue(appOption.getOpt())); - if ( cl.hasOption(installerOption.getOpt()) ) { - config.setUseInstaller(); - } ++ + if ( cl.hasOption(featureOption.getOpt()) ) { + for(final String optVal : cl.getOptionValues(featureOption.getOpt())) { + config.addFeatureFiles(optVal.split(",")); + } } if (cl.hasOption(cacheOption.getOpt())) { config.setCacheDirectory(new File(cl.getOptionValue(cacheOption.getOpt()))); @@@ -225,10 -228,9 +222,9 @@@ } }; - // use hard coded Apache Felix launcher.prepare(ctx, IOUtils.getFelixFrameworkId(m_frameworkVersion), app); - FeatureProcessor.prepareLauncher(launcherConfig, artifactManager, app); + FeatureProcessor.prepareLauncher(ctx, launcherConfig, app); Main.LOG().info("Using {} local artifacts, {} cached artifacts, and {} downloaded artifacts", launcherConfig.getLocalArtifacts(), launcherConfig.getCachedArtifacts(), launcherConfig.getDownloadedArtifacts()); diff --cc src/main/java/org/apache/sling/feature/launcher/impl/extensions/handlers/ContentPackageHandler.java index 2f58d6b,0000000..bfcd083 mode 100644,000000..100644 --- a/src/main/java/org/apache/sling/feature/launcher/impl/extensions/handlers/ContentPackageHandler.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/extensions/handlers/ContentPackageHandler.java @@@ -1,43 -1,0 +1,45 @@@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.sling.feature.launcher.impl.extensions.handlers; + +import java.io.IOException; + +import org.apache.sling.feature.Artifact; +import org.apache.sling.feature.Extension; +import org.apache.sling.feature.ExtensionType; ++import org.apache.sling.feature.FeatureConstants; ++import org.apache.sling.feature.launcher.impl.FeatureProcessor; +import org.apache.sling.feature.launcher.spi.LauncherPrepareContext; +import org.apache.sling.feature.launcher.spi.extensions.ExtensionHandler; +import org.apache.sling.feature.launcher.spi.extensions.ExtensionInstallationContext; + +public class ContentPackageHandler implements ExtensionHandler +{ + @Override + public boolean handle(Extension extension, LauncherPrepareContext prepareContext, ExtensionInstallationContext installationContext) throws IOException + { - if ( extension.getType() == ExtensionType.ARTIFACTS ) { ++ if ( extension.getType() == ExtensionType.ARTIFACTS && extension.getName().equals(FeatureConstants.EXTENSION_NAME_CONTENT_PACKAGES) ) { + for(final Artifact a : extension.getArtifacts() ) { + installationContext.addInstallableArtifact(prepareContext.getArtifactFile(a.getId())); + } + return true; + } + else { + return false; + } + } +}
