Author: bdelacretaz
Date: Mon Jun 15 12:11:21 2015
New Revision: 1685564
URL: http://svn.apache.org/r1685564
Log:
SLING-4728 - support nested provisioning models (not fully tested yet)
Added:
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/MavenResolver.java
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
sling/trunk/contrib/crankstart/launcher/src/test/resources/sling-launchpad.txt
- copied, changed from r1685525,
sling/trunk/contrib/crankstart/launcher/src/test/resources/launchpad-addons.txt
Removed:
sling/trunk/contrib/crankstart/launcher/src/test/resources/launchpad-addons.txt
Modified:
sling/trunk/contrib/crankstart/launcher/pom.xml
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/ArtifactsVisitor.java
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java
sling/trunk/contrib/crankstart/launcher/src/test/resources/provisioning-model/crankstart-tests.txt
Modified: sling/trunk/contrib/crankstart/launcher/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/pom.xml?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/pom.xml (original)
+++ sling/trunk/contrib/crankstart/launcher/pom.xml Mon Jun 15 12:11:21 2015
@@ -135,7 +135,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.provisioning.model</artifactId>
- <version>1.1.0</version>
+ <version>1.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
Modified:
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/ArtifactsVisitor.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/ArtifactsVisitor.java?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/ArtifactsVisitor.java
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/ArtifactsVisitor.java
Mon Jun 15 12:11:21 2015
@@ -24,7 +24,7 @@ import org.apache.sling.provisioning.mod
/** Visit the Artifacts of a Model */
public abstract class ArtifactsVisitor {
- private final Model model;
+ protected final Model model;
public ArtifactsVisitor(Model m) {
model = m;
Modified:
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
Mon Jun 15 12:11:21 2015
@@ -38,16 +38,16 @@ import org.apache.sling.provisioning.mod
import org.apache.sling.provisioning.model.Feature;
import org.apache.sling.provisioning.model.Model;
import org.apache.sling.provisioning.model.ModelUtility;
-import org.apache.sling.provisioning.model.RunMode;
import org.apache.sling.provisioning.model.ModelUtility.VariableResolver;
+import org.apache.sling.provisioning.model.RunMode;
import org.apache.sling.provisioning.model.io.ModelReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** Launch an OSGi app instance using the Sling provisioning model */
public class Launcher {
- private final Model model = new Model();
- private final Logger log = LoggerFactory.getLogger(getClass());
+ private Model model = new Model();
+ private static final Logger log = LoggerFactory.getLogger(Launcher.class);
public static final String CRANKSTART_FEATURE = ":crankstart";
public static final String MODEL_KEY = "model";
@@ -85,7 +85,9 @@ public class Launcher {
}
};
- public Launcher(String ... args) throws IOException {
+ public Launcher(String ... args) throws Exception {
+ MavenResolver.setup();
+
// Find all files to read and sort the list, to be deterministic
final SortedSet<File> toRead = new TreeSet<File>();
@@ -100,19 +102,32 @@ public class Launcher {
toRead.add(f);
}
}
-
+
+ // Merge all model files
for(File f : toRead) {
mergeModel(f);
}
+
+ // And merge nested models (supporting one level of nesting only so
far)
+ new NestedModelsMerger(model).visit();
+ computeEffectiveModel();
+ }
+
+ public void computeEffectiveModel() {
+ model = ModelUtility.getEffectiveModel(model,
overridingVariableResolver);
+ }
+
+ public Model getModel() {
+ return model;
}
/** Can be called before launch() to read and merge additional models.
* @param r provisioning model to read, closed by this method after
reading */
- public void mergeModel(Reader r, String sourceInfo) throws IOException {
+ public static void mergeModel(Model mergeInto, Reader r, String
sourceInfo) throws IOException {
+ log.info("Merging provisioning model {}", sourceInfo);
try {
- log.info("Merging provisioning model {}", sourceInfo);
final Model m = ModelReader.read(r, sourceInfo);
- ModelUtility.merge(model, ModelUtility.getEffectiveModel(m,
overridingVariableResolver));
+ ModelUtility.merge(mergeInto, m);
} finally {
r.close();
}
@@ -120,13 +135,10 @@ public class Launcher {
/** Can be called before launch() to read and merge additional models */
public void mergeModel(File f) throws IOException {
- mergeModel(new BufferedReader(new FileReader(f)), f.getAbsolutePath());
+ mergeModel(model, new BufferedReader(new FileReader(f)),
f.getAbsolutePath());
}
public void launch() throws Exception {
- // Enable pax URL for mvn: protocol
- System.setProperty( "java.protocol.handler.pkgs", "org.ops4j.pax.url"
);
-
// Setup initial classpath to launch the OSGi framework
for(URL u : getClasspathURLs(model, CRANKSTART_FEATURE)) {
addToClasspath(u);
@@ -165,7 +177,7 @@ public class Launcher {
for(RunMode rm : f.getRunModes()) {
for(ArtifactGroup g : rm.getArtifactGroups()) {
for(Artifact a : g) {
- final String url = mvnUrl(a);
+ final String url = MavenResolver.mvnUrl(a);
try {
result.add(new URL(url));
} catch(MalformedURLException e) {
@@ -180,10 +192,6 @@ public class Launcher {
return result;
}
- public static String mvnUrl(Artifact a) {
- return "mvn:" + a.getGroupId() + "/" + a.getArtifactId() + "/" +
a.getVersion();
- }
-
public static void main(String [] args) throws Exception {
if(args.length < 1) {
System.err.println("Usage: " + Launcher.class.getSimpleName() + "
provisioning-model [provisioning-model ...]");
Added:
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/MavenResolver.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/MavenResolver.java?rev=1685564&view=auto
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/MavenResolver.java
(added)
+++
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/MavenResolver.java
Mon Jun 15 12:11:21 2015
@@ -0,0 +1,57 @@
+/*
+ * 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.crankstart.launcher;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.sling.provisioning.model.Artifact;
+
+/** Resolve artifacts using Maven URLs - assumes Pax URL is installed */
+public class MavenResolver {
+ public static void setup() {
+ // Enable pax URL for mvn: protocol
+ System.setProperty( "java.protocol.handler.pkgs", "org.ops4j.pax.url"
);
+ }
+
+ public static String mvnUrl(Artifact a) {
+ final StringBuilder sb = new StringBuilder();
+ sb
+ .append("mvn:")
+ .append(a.getGroupId())
+ .append("/")
+ .append(a.getArtifactId())
+ .append("/")
+ .append(a.getVersion());
+
+ if(a.getType() != null) {
+ sb.append("/").append(a.getType());
+ }
+
+ if(a.getClassifier() != null) {
+ sb.append("/").append(a.getClassifier());
+ }
+
+ return sb.toString();
+ }
+
+ public static InputStream resolve(Artifact a) throws
MalformedURLException, IOException {
+ return new URL(mvnUrl(a)).openStream();
+ }
+}
\ No newline at end of file
Added:
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java?rev=1685564&view=auto
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
(added)
+++
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
Mon Jun 15 12:11:21 2015
@@ -0,0 +1,78 @@
+/*
+ * 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.crankstart.launcher;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.sling.provisioning.model.Artifact;
+import org.apache.sling.provisioning.model.ArtifactGroup;
+import org.apache.sling.provisioning.model.Feature;
+import org.apache.sling.provisioning.model.Model;
+import org.apache.sling.provisioning.model.RunMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/** Merge nested models, provided by slingfeature/slingstart artifacts */
+public class NestedModelsMerger extends ArtifactsVisitor {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private List<Artifact> toMerge;
+
+ public NestedModelsMerger(Model m) {
+ super(m);
+ }
+
+ @Override
+ public synchronized void visit() throws Exception {
+ toMerge = new ArrayList<Artifact>();
+ super.visit();
+ log.info("{} nested models found in provisioning model",
toMerge.size());
+
+ for(Artifact a : toMerge) {
+ log.info("Resolving and merging nested model {}", a);
+ InputStream is = null;
+ Reader r = null;
+ try {
+ is = MavenResolver.resolve(a);
+ r = new InputStreamReader(is);
+ Launcher.mergeModel(model, r, a.toString());
+ } catch(Exception e) {
+ log.error("Failed to read nested model " + a, e);
+ } finally {
+ if(r != null) {
+ r.close();
+ }
+ if(is != null) {
+ is.close();
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void visitArtifact(Feature f, RunMode rm, ArtifactGroup g,
Artifact a) throws Exception {
+ final String classifier = a.getClassifier();
+ if("slingstart".equals(classifier ) ||
"slingfeature".equals(classifier)) {
+ toMerge.add(a);
+ }
+ }
+}
\ No newline at end of file
Modified:
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
Mon Jun 15 12:11:21 2015
@@ -34,7 +34,7 @@ public class BasicLauncherIT {
public final RetryRule retryRule = new RetryRule();
@BeforeClass
- public static void setupClass() throws IOException {
+ public static void setupClass() throws Exception {
C = new CrankstartSetup();
C.setup();
osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
Modified:
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
Mon Jun 15 12:11:21 2015
@@ -61,12 +61,13 @@ public class CrankstartSetup {
return result;
}
- private static void mergeModelResource(Launcher launcher, String path)
throws IOException {
+ private static void mergeModelResource(Launcher launcher, String path)
throws Exception {
final InputStream is = CrankstartSetup.class.getResourceAsStream(path);
assertNotNull("Expecting test resource to be found:" + path, is);
final Reader input = new InputStreamReader(is);
try {
- launcher.mergeModel(input, path);
+ Launcher.mergeModel(launcher.getModel(), input, path);
+ launcher.computeEffectiveModel();
} finally {
input.close();
}
@@ -76,7 +77,7 @@ public class CrankstartSetup {
return baseUrl;
}
- synchronized void setup() throws IOException {
+ synchronized void setup() throws Exception {
if(crankstartThread != null) {
return;
}
Modified:
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java
Mon Jun 15 12:11:21 2015
@@ -26,7 +26,7 @@ public class RunModeAIT {
public final RetryRule retryRule = new RetryRule();
@BeforeClass
- public static void setupClass() throws IOException {
+ public static void setupClass() throws Exception {
System.setProperty(RunModeFilter.SLING_RUN_MODES, RUN_MODES);
C.setup();
osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
Modified:
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java
Mon Jun 15 12:11:21 2015
@@ -26,7 +26,7 @@ public class RunModeBIT {
public final RetryRule retryRule = new RetryRule();
@BeforeClass
- public static void setupClass() throws IOException {
+ public static void setupClass() throws Exception {
System.setProperty(RunModeFilter.SLING_RUN_MODES, RUN_MODES);
C.setup();
osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
Modified:
sling/trunk/contrib/crankstart/launcher/src/test/resources/provisioning-model/crankstart-tests.txt
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/resources/provisioning-model/crankstart-tests.txt?rev=1685564&r1=1685563&r2=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/test/resources/provisioning-model/crankstart-tests.txt
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/test/resources/provisioning-model/crankstart-tests.txt
Mon Jun 15 12:11:21 2015
@@ -24,6 +24,9 @@
org.apache.sling/org.apache.sling.junit.core/1.0.10
org.apache.sling/org.apache.sling.commons.mime/2.1.8
org.apache.sling/org.apache.sling.settings/1.3.6
+
+ # TODO: Test a nested model file
+ # org.apache.sling/org.apache.sling.launchpad/8-SNAPSHOT/slingstart
[artifacts runModes=A]
org.apache.sling/org.apache.sling.api/2.9.0
Copied:
sling/trunk/contrib/crankstart/launcher/src/test/resources/sling-launchpad.txt
(from r1685525,
sling/trunk/contrib/crankstart/launcher/src/test/resources/launchpad-addons.txt)
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/resources/sling-launchpad.txt?p2=sling/trunk/contrib/crankstart/launcher/src/test/resources/sling-launchpad.txt&p1=sling/trunk/contrib/crankstart/launcher/src/test/resources/launchpad-addons.txt&r1=1685525&r2=1685564&rev=1685564&view=diff
==============================================================================
---
sling/trunk/contrib/crankstart/launcher/src/test/resources/launchpad-addons.txt
(original)
+++
sling/trunk/contrib/crankstart/launcher/src/test/resources/sling-launchpad.txt
Mon Jun 15 12:11:21 2015
@@ -17,39 +17,29 @@
# under the License.
#
-# Additional items needed to be able to start the Sling Launchpad
-# using the :crankstart feature found in this folder + this file +
-# the standard model from launchpad/builder so that it passes
-# the Sling integration tests. As of June 11th, 2015 this is
-# not fully working, some integration tests fail. Probably due,
-# at least in part, to run modes not being implemented yet, which
-# means we possibly get conflicting bundles.
-#
-# Using this, currently 11 Sling tests from launchpad/integration-tests
-# fail, out of 528, when starting Sling with the following commands:
-# rm -rf CRANKSTART derby.log jackrabbit
-# java -Dcrankstart.model.http.port=8080 \
-# -Dsling.run.modes=:standalone,jackrabbit -jar \
-# target/org.apache.sling.crankstart.launcher-1.9.9-SNAPSHOT.jar \
-# src/test/resources/crankstart-model.txt \
-# src/test/resources/launchpad-addons.txt \
-# ../../..//launchpad/builder/src/main/provisioning
-
-[feature name=crankstart.launchpad.addons]
+# Start the Sling Launchpad including whatever is required to
+# run the Sling integration tests.
+# This model is meant to be used in addition to the base
+# crankstart-model
+[feature name=sling.launchpad]
+[settings]
+ org.apache.sling.commons.log.julenabled=true
+
[artifacts]
- org.apache.sling/org.apache.sling.launchpad.api/1.1.0
+ # karaf bunde provides Sling Launchpad startup services
org.apache.sling/org.apache.sling.launchpad.karaf/0.1.1-SNAPSHOT
- org.apache.sling/org.apache.sling.launchpad.test-services/2.0.9-SNAPSHOT
- org.apache.sling/org.apache.sling.junit.core/1.0.10
- org.apache.sling/org.apache.sling.junit.scriptable/1.0.10
- org.apache.sling/org.apache.sling.launchpad.test-fragment/2.0.9-SNAPSHOT
- org.apache.sling/org.apache.sling.servlets.compat/1.0.2
-
+
+ # The launchpad itself
+ org.apache.sling/org.apache.sling.launchpad/8-SNAPSHOT/txt/slingfeature
+
+ # Sling integration tests support
+
org.apache.sling/org.apache.sling.launchpad.test-bundles/0.0.1-SNAPSHOT/txt/slingstart
+
[configurations]
integrationTestsConfig
message="This test config should be loaded at startup"
org.apache.sling.servlets.resolver.SlingServletResolver
# Set the servlet resolver's cache size to zero for testing
- servletresolver.cacheSize=I"0"
+ servletresolver.cacheSize=I"0"
\ No newline at end of file