This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-applicationbuilder.git
The following commit(s) were added to refs/heads/master by this push:
new 9dc3cc9 Remove resolver for now - we might need to revisit this at a
later point
9dc3cc9 is described below
commit 9dc3cc96dfbd34ea6a7533a497dfb48e9e6ad06b
Author: Karl Pauls <[email protected]>
AuthorDate: Thu Jun 28 15:12:49 2018 +0200
Remove resolver for now - we might need to revisit this at a later point
---
pom.xml | 20 +--
.../feature/applicationbuilder/impl/Main.java | 85 +++++++---
.../impl/ApplicationBuilderTest.java | 180 ---------------------
3 files changed, 66 insertions(+), 219 deletions(-)
diff --git a/pom.xml b/pom.xml
index 8aea192..2bd5cd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,7 +56,7 @@
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
-
<includeArtifactIds>org.apache.felix.framework,org.apache.felix.utils,commons-cli,org.apache.sling.feature,org.apache.sling.feature.io,org.apache.sling.feature.analyser,org.apache.sling.commons.johnzon,slf4j-api,slf4j-simple,org.apache.felix.converter,org.osgi.service.resolver,org.apache.sling.feature.resolver,osgi.core</includeArtifactIds>
+
<includeArtifactIds>org.apache.felix.utils,commons-cli,org.apache.sling.feature,org.apache.sling.feature.io,org.apache.sling.commons.johnzon,slf4j-api,slf4j-simple,org.apache.felix.converter,org.apache.felix.configurator,osgi.core</includeArtifactIds>
</configuration>
</execution>
</executions>
@@ -115,24 +115,12 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.feature.analyser</artifactId>
- <version>0.1.3-SNAPSHOT</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.feature.io</artifactId>
<version>0.1.3-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.feature.resolver</artifactId>
- <version>0.1.0-SNAPSHOT</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.johnzon</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
@@ -155,12 +143,6 @@
<version>1.11.0</version>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.service.resolver</artifactId>
- <version>1.0.1</version>
- <scope>provided</scope>
- </dependency>
<!-- Testing -->
<dependency>
diff --git
a/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
b/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
index f17bbce..a340868 100644
--- a/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
+++ b/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
@@ -24,20 +24,26 @@ import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.sling.feature.Application;
import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.builder.ApplicationBuilder;
+import org.apache.sling.feature.builder.BuilderContext;
+import org.apache.sling.feature.builder.FeatureProvider;
+import org.apache.sling.feature.io.ArtifactHandler;
import org.apache.sling.feature.io.ArtifactManager;
import org.apache.sling.feature.io.ArtifactManagerConfig;
import org.apache.sling.feature.io.IOUtils;
import org.apache.sling.feature.io.json.ApplicationJSONWriter;
-import org.apache.sling.feature.resolver.ApplicationResolverAssembler;
-import org.apache.sling.feature.resolver.FeatureResolver;
-import org.apache.sling.feature.resolver.FrameworkResolver;
+import org.apache.sling.feature.io.json.FeatureJSONReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
+import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
import java.util.stream.Stream;
public class Main {
@@ -54,8 +60,6 @@ public class Main {
private static String propsFile;
- private static Boolean useResolver = false;
-
private static String frameworkVersion;
/**
@@ -69,7 +73,6 @@ public class Main {
final Option filesOption = new Option("f", true, "Set feature files
(comma separated)");
final Option dirsOption = new Option("d", true, "Set feature file dirs
(comma separated)");
final Option propsOption = new Option("p", true, "sling.properties
file");
- final Option useResolverOption = new Option("r", false, "If enabled
uses the resolver");
final Option frameworkOption = new Option("fv", true, "Set felix
framework version");
final Option outputOption = Option.builder("o").hasArg().argName("Set
output file")
.desc("output file").build();
@@ -80,7 +83,6 @@ public class Main {
options.addOption(dirsOption);
options.addOption(outputOption);
options.addOption(propsOption);
- options.addOption(useResolverOption);
options.addOption(frameworkOption);
final CommandLineParser parser = new DefaultParser();
@@ -102,9 +104,6 @@ public class Main {
if ( cl.hasOption(propsOption.getOpt()) ) {
propsFile = cl.getOptionValue(propsOption.getOpt());
}
- if ( cl.hasOption(useResolverOption.getOpt()) ) {
- useResolver = true;
- }
if (cl.hasOption(frameworkOption.getOpt())) {
frameworkVersion = cl.getOptionValue(frameworkOption.getOpt());
}
@@ -133,14 +132,6 @@ public class Main {
return null;
}
- private static FeatureResolver getFeatureResolver(ArtifactManager am) {
- if (useResolver) {
- return new FrameworkResolver(am, Collections.emptyMap());
- } else {
- return null;
- }
- }
-
public static void main(final String[] args) {
// setup logging
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "info");
@@ -178,8 +169,9 @@ public class Main {
System.exit(1);
}
- try (FeatureResolver fr = getFeatureResolver(am)) {
-
writeApplication(buildApplication(ApplicationResolverAssembler.assembleApplication(null,
am, fr, files)), output == null ? "application.json" : output);
+ try {
+
+ writeApplication(buildApplication(assembleApplication(null, am,
files)), output == null ? "application.json" : output);
} catch ( final IOException ioe) {
LOGGER.error("Unable to read feature/application files " +
ioe.getMessage(), ioe);
@@ -190,6 +182,59 @@ public class Main {
}
}
+ private static Application assembleApplication(
+ Application app,
+ final ArtifactManager artifactManager,
+ final String... featureFiles)
+ throws IOException {
+ if ( featureFiles == null || featureFiles.length == 0 ) {
+ throw new IOException("No features found.");
+ }
+
+ List<Feature> features = new ArrayList<>();
+
+ for (final String initFile : featureFiles)
+ {
+ try
+ {
+ final Feature f = IOUtils.getFeature(initFile,
artifactManager, FeatureJSONReader.SubstituteVariables.RESOLVE);
+ features.add(f);
+ }
+ catch (Exception ex)
+ {
+ throw new IOException("Error reading feature: " + initFile,
ex);
+ }
+ }
+
+ Collections.sort(features);
+
+ app = ApplicationBuilder.assemble(app, new BuilderContext(new
FeatureProvider() {
+
+ @Override
+ public Feature provide(final ArtifactId id) {
+ try {
+ final ArtifactHandler handler =
artifactManager.getArtifactHandler("mvn:" + id.toMvnPath());
+ try (final FileReader r = new
FileReader(handler.getFile())) {
+ final Feature f = FeatureJSONReader.read(r,
handler.getUrl(), FeatureJSONReader.SubstituteVariables.RESOLVE);
+ return f;
+ }
+
+ } catch (final IOException e) {
+ // ignore
+ }
+ return null;
+ }
+ }), features.toArray(new Feature[0]));
+
+ // check framework
+ if ( app.getFramework() == null ) {
+ // use hard coded Apache Felix
+ app.setFramework(IOUtils.getFelixFrameworkId(null));
+ }
+
+ return app;
+ }
+
private static Application buildApplication(final Application app) {
final org.apache.sling.feature.Artifact a = new
org.apache.sling.feature.Artifact(ArtifactId.parse("org.apache.sling/org.apache.sling.launchpad.api/1.2.0"));
a.getMetadata().put(org.apache.sling.feature.Artifact.KEY_START_ORDER,
"1");
diff --git
a/src/test/java/org/apache/sling/feature/applicationbuilder/impl/ApplicationBuilderTest.java
b/src/test/java/org/apache/sling/feature/applicationbuilder/impl/ApplicationBuilderTest.java
deleted file mode 100644
index 0d37e16..0000000
---
a/src/test/java/org/apache/sling/feature/applicationbuilder/impl/ApplicationBuilderTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.applicationbuilder.impl;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Map;
-
-import javax.json.Json;
-import javax.json.JsonStructure;
-import javax.json.JsonWriter;
-import javax.json.JsonWriterFactory;
-import javax.json.stream.JsonGenerator;
-
-import org.apache.sling.feature.Application;
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.builder.ApplicationBuilder;
-import org.apache.sling.feature.builder.BuilderContext;
-import org.apache.sling.feature.builder.FeatureProvider;
-import org.apache.sling.feature.io.ArtifactHandler;
-import org.apache.sling.feature.io.ArtifactManager;
-import org.apache.sling.feature.io.ArtifactManagerConfig;
-import org.apache.sling.feature.io.json.ApplicationJSONWriter;
-import org.apache.sling.feature.io.json.FeatureJSONReader;
-import org.apache.sling.feature.io.json.FeatureJSONReader.SubstituteVariables;
-import org.apache.sling.feature.resolver.ApplicationResolverAssembler;
-import org.apache.sling.feature.resolver.FeatureResolver;
-import org.apache.sling.feature.resolver.FrameworkResolver;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.osgi.framework.Constants;
-
-public class ApplicationBuilderTest {
- private Path tempDir;
-
- @Before
- public void setup() throws Exception {
- tempDir = Files.createTempDirectory(getClass().getSimpleName());
- }
-
- @After
- public void tearDown() throws Exception {
- // Delete the temp dir again
- Files.walk(tempDir)
- .sorted(Comparator.reverseOrder())
- .map(Path::toFile)
- .forEach(File::delete);
- }
-
- private Map<String, String> getFrameworkProps() {
- return Collections.singletonMap(Constants.FRAMEWORK_STORAGE,
tempDir.toFile().getAbsolutePath());
- }
-
- @Test
- @Ignore
- public void testBundleOrdering() throws Exception {
- FeatureProvider fp = new TestFeatureProvider();
- BuilderContext bc = new BuilderContext(fp);
- ArtifactManager am = ArtifactManager.getArtifactManager(new
ArtifactManagerConfig());
-
- Feature fa = readFeature("/featureA.json", am);
- Feature fb = readFeature("/featureB.json", am);
- Feature[] features = {fa, fb};
-
- try (FeatureResolver fr = new FrameworkResolver(am,
getFrameworkProps())) {
- Application app = ApplicationBuilder.assemble(null, bc,
ApplicationResolverAssembler.sortFeatures(fr, features));
- String actualJSON = writeApplication(app);
-
- String expectedJSON = "{\"features\":["
- + "\"org.apache.sling.test.features:featureB:1.0.0\","
- + "\"org.apache.sling.test.features:featureA:1.0.0\"],"
- + "\"bundles\":["
- +
"{\"id\":\"commons-io:commons-io:2.6\",\"start-level\":\"10\",\"start-order\":\"10\"},"
- +
"{\"id\":\"org.apache.felix:org.apache.felix.http.servlet-api:1.1.2\",\"start-level\":\"15\",\"start-order\":\"15\"},"
- +
"{\"id\":\"commons-fileupload:commons-fileupload:1.3.3\",\"start-level\":\"16\",\"start-order\":\"16\"}]}";
-
- StringWriter expectedWriter = new StringWriter();
- StringWriter actualWriter = new StringWriter();
-
- canonicalize(expectedJSON, expectedWriter, actualJSON,
actualWriter);
- assertEquals(expectedWriter.toString(), actualWriter.toString());
- }
- }
-
- @Test
- @Ignore
- public void testFeatureDependency() throws Exception {
- FeatureProvider fp = new TestFeatureProvider();
- BuilderContext bc = new BuilderContext(fp);
- ArtifactManager am = ArtifactManager.getArtifactManager(new
ArtifactManagerConfig());
-
- // Feature D has a bundle (slf4j-api) with a dependency on feature C,
- // which provides a package for slf4j
- Feature fc = readFeature("/featureC.json", am);
- Feature fd = readFeature("/featureD.json", am);
- Feature[] features = {fd, fc};
-
- try (FeatureResolver fr = new FrameworkResolver(am,
getFrameworkProps())) {
- Application app = ApplicationBuilder.assemble(null, bc,
ApplicationResolverAssembler.sortFeatures(fr, features));
- String genApp = writeApplication(app);
-
- String expected = "{\"features\":["
- + "\"org.apache.sling.test.features:featureC:1.0.0\","
- + "\"org.apache.sling.test.features:featureD:1.0.0\"],"
- +
"\"bundles\":[{\"id\":\"org.slf4j:slf4j-api:1.7.25\",\"start-level\":\"6\",\"start-order\":\"6\"}]}";
-
- StringWriter expectedWriter = new StringWriter();
- StringWriter actualWriter = new StringWriter();
- canonicalize(expected, expectedWriter, genApp, actualWriter);
-
- assertEquals(expectedWriter.toString(), actualWriter.toString());
- }
- }
-
- // Turn JSON into pretty-formatted canoncical JSON that should be
comparable using String compare
- private void canonicalize(String expected, StringWriter expectedWriter,
String actual, StringWriter actualWriter) {
- JsonStructure es = Json.createReader(new
StringReader(expected)).read();
- JsonStructure ea = Json.createReader(new StringReader(actual)).read();
-
- JsonWriterFactory writerFactory = Json.createWriterFactory(
- Collections.singletonMap(JsonGenerator.PRETTY_PRINTING, true));
- JsonWriter w = writerFactory.createWriter(expectedWriter);
- w.write(es);
-
- JsonWriter w2 = writerFactory.createWriter(actualWriter);
- w2.write(ea);
- }
-
- private Feature readFeature(final String res,
- final ArtifactManager artifactManager) throws Exception {
- URL url = getClass().getResource(res);
- String file = new File(url.toURI()).getAbsolutePath();
- final ArtifactHandler featureArtifact =
artifactManager.getArtifactHandler(file);
-
- try (final FileReader r = new FileReader(featureArtifact.getFile())) {
- final Feature f = FeatureJSONReader.read(r,
featureArtifact.getUrl(), SubstituteVariables.RESOLVE);
- return f;
- }
- }
-
- private static String writeApplication(Application app) throws Exception {
- Writer writer = new StringWriter();
- ApplicationJSONWriter.write(writer, app);
- return writer.toString();
- }
-
- private static class TestFeatureProvider implements FeatureProvider {
- @Override
- public Feature provide(ArtifactId id) {
- return null;
- }
- }
-}