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


Reply via email to