SLING-4728 - nested models work, but using nested.models variable so far

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1685741 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java b/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
index cedc244..79df437 100644
--- a/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
+++ b/src/main/java/org/apache/sling/crankstart/launcher/Launcher.java
@@ -108,12 +108,11 @@
             mergeModel(f);
         }
         
-        // And merge nested models (supporting one level of nesting only so far)
-        new NestedModelsMerger(model).visit();
         computeEffectiveModel();
     }
     
-    public void computeEffectiveModel() {
+    public void computeEffectiveModel() throws Exception {
+        new NestedModelsMerger(model).visit();
         model = ModelUtility.getEffectiveModel(model, overridingVariableResolver);
     }
     
diff --git a/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java b/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
index dec9f2c..6bc285a 100644
--- a/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
+++ b/src/main/java/org/apache/sling/crankstart/launcher/NestedModelsMerger.java
@@ -37,6 +37,10 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     private List<Artifact> toMerge;
     
+    public static final String SLINGSTART = "slingstart";
+    public static final String SLINGFEATURE = "slingfeature";
+    public static final String NESTED_MODELS = "nested.models";
+    
     public NestedModelsMerger(Model m) {
         super(m);
     }
@@ -70,9 +74,18 @@
     
     @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);
+        // TODO how to identify a nested model when it's the main artifact of a module,
+        // so doesn't have a slingfeature/slingstart type or classifier in its artifact URL?
+        final String str = f.getVariables().get(NESTED_MODELS);
+        if(str == null || str.length() == 0) {
+            return;
+        }
+        final String [] nm = str.split(",");
+        for(String nested : nm) {
+            if(nested.equals(a.getArtifactId())) {
+                log.info("{} feature variable identifies artifact as a nested model , will be merged: {}", f.getName() + "/" + NESTED_MODELS, a);
+                toMerge.add(a);
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java b/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
index c70a737..167accd 100644
--- a/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
+++ b/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
@@ -17,7 +17,6 @@
 import org.apache.sling.testing.tools.osgi.WebconsoleClient;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -119,11 +118,10 @@
     }
     
     @Test
-    @Ignore("until test-model is deployed with classifier=slingfeature")
     public void testBundlesFromNestedModel() throws Exception {
         final String [] addBundles = {
                 "org.apache.sling.commons.threads",
-                "org.apache.sling.commons.testing"
+                "org.apache.sling/org.apache.sling.discovery.api"
         };
         
         for(String name : addBundles) {
diff --git a/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java b/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
index 4b8f3af..7548be7 100644
--- a/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
+++ b/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
@@ -108,6 +108,7 @@
         for(String path : MODEL_PATHS) {
             mergeModelResource(launcher, path);
         }
+        launcher.computeEffectiveModel();
         
         crankstartThread = new Thread() {
             public void run() {
diff --git a/src/test/resources/provisioning-model/crankstart-tests.txt b/src/test/resources/provisioning-model/crankstart-tests.txt
index 0f0926c..f6df842 100644
--- a/src/test/resources/provisioning-model/crankstart-tests.txt
+++ b/src/test/resources/provisioning-model/crankstart-tests.txt
@@ -19,6 +19,9 @@
 
 [feature name=crankstart.tests]
 
+[variables]
+  nested.models=org.apache.sling.cransktart.test.model
+
 [artifacts]
   org.apache.sling/org.apache.sling.crankstart.test.services/1.9.9-SNAPSHOT
   org.apache.sling/org.apache.sling.junit.core/1.0.10
@@ -26,7 +29,7 @@
   org.apache.sling/org.apache.sling.settings/1.3.6
   
   # Test a nested model file
-  org.apache.sling/org.apache.sling.crankstart.test.model/1.9.9-SNAPSHOT/txt
+  org.apache.sling/org.apache.sling.cransktart.test.model/1.9.9-SNAPSHOT/txt
 
 [artifacts runModes=A]
   org.apache.sling/org.apache.sling.api/2.9.0