Cache raw and effective model and provide separate methods

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1628121 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java b/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
index c7b541d..0a48c1c 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
@@ -18,7 +18,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.StringReader;
 
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.AbstractMojo;
@@ -28,7 +27,6 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.apache.sling.slingstart.model.SSMDeliverable;
-import org.apache.sling.slingstart.model.txt.TXTSSMModelReader;
 
 public abstract class AbstractSlingStartMojo extends AbstractMojo {
 
@@ -47,18 +45,38 @@
     @Parameter(defaultValue="false")
     protected boolean createWebapp;
 
+    private static final String CTX_RAW = SSMDeliverable.class.getName() + "/r";
+    private static final String CTX_EFFECTIVE = SSMDeliverable.class.getName() + "/e";
+
     /**
      * Read the model prepared by the lifecycle plugin
      */
-    protected SSMDeliverable readModel()
+    protected SSMDeliverable readRawModel()
     throws MojoExecutionException {
-        SSMDeliverable result = (SSMDeliverable)this.project.getContextValue(SSMDeliverable.class.getName());
+        SSMDeliverable result = (SSMDeliverable)this.project.getContextValue(CTX_RAW);
         if ( result == null ) {
             try {
-                final String contents = (String)this.project.getContextValue(SSMDeliverable.class.getName() + "/text");
-                result = TXTSSMModelReader.read(new StringReader(contents), null);
+                result = ModelUtils.getRawModel(this.project);
 
-                this.project.setContextValue(SSMDeliverable.class.getName(), result);
+                this.project.setContextValue(CTX_RAW, result);
+            } catch ( final IOException ioe) {
+                throw new MojoExecutionException("Unable to cache model", ioe);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Read the model prepared by the lifecycle plugin
+     */
+    protected SSMDeliverable readEffectiveModel()
+    throws MojoExecutionException {
+        SSMDeliverable result = (SSMDeliverable)this.project.getContextValue(CTX_EFFECTIVE);
+        if ( result == null ) {
+            try {
+                result = ModelUtils.getEffectiveModel(this.project);
+
+                this.project.setContextValue(CTX_EFFECTIVE, result);
             } catch ( final IOException ioe) {
                 throw new MojoExecutionException("Unable to cache model", ioe);
             }
diff --git a/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java b/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java
index 97f4dc6..be35ad5 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java
@@ -44,7 +44,7 @@
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
-        final SSMDeliverable model = this.readModel();
+        final SSMDeliverable model = this.readRawModel();
 
         final File outputFile = new File(this.project.getBuild().getDirectory() + File.separatorChar + "slingstart.txt");
         outputFile.getParentFile().mkdirs();
diff --git a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
index 8e5d811..09140c6 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
@@ -17,7 +17,6 @@
 package org.apache.sling.maven.slingstart;
 
 import java.io.File;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -42,7 +41,6 @@
 import org.apache.sling.slingstart.model.SSMFeature;
 import org.apache.sling.slingstart.model.SSMStartLevel;
 import org.apache.sling.slingstart.model.SSMUtil;
-import org.apache.sling.slingstart.model.txt.TXTSSMModelWriter;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.Logger;
@@ -113,11 +111,11 @@
                 "systemsDirectory", new File(project.getBasedir(), "src/main/systems").getAbsolutePath());
         final SSMDeliverable model = ModelUtils.readFullModel(new File(directory), dependencies, project, session, log);
 
-        final StringWriter w = new StringWriter();
-        TXTSSMModelWriter.write(w, model);
-        project.setContextValue(SSMDeliverable.class.getName() + "/text", w.toString());
+        ModelUtils.storeRawModel(project, model);
 
-        final SSMDeliverable effectiveModel = SSMUtil.getEffectiveModel(model);
+        final SSMDeliverable effectiveModel = SSMUtil.getEffectiveModel(model, null);
+
+        ModelUtils.storeEffectiveModel(project, effectiveModel);
 
         // start with base artifact
         final SSMArtifact base = ModelUtils.getBaseArtifact(effectiveModel);
diff --git a/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java b/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
index 0b79a9e..7fa192c 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
@@ -19,6 +19,8 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -38,6 +40,7 @@
 import org.apache.sling.slingstart.model.SSMTraceable;
 import org.apache.sling.slingstart.model.SSMValidator;
 import org.apache.sling.slingstart.model.txt.TXTSSMModelReader;
+import org.apache.sling.slingstart.model.txt.TXTSSMModelWriter;
 import org.codehaus.plexus.logging.Logger;
 
 public abstract class ModelUtils {
@@ -182,4 +185,55 @@
         }
         return null;
     }
+
+    private static final String RAW_MODEL = SSMDeliverable.class.getName() + "/raw";
+    private static final String EFFECTIVE_MODEL = SSMDeliverable.class.getName() + "/effective";
+
+    /**
+     * Store the raw model in the project.
+     * @param project The maven project
+     * @param model The model
+     * @throws IOException If writing fails
+     */
+    public static void storeRawModel(final MavenProject project, final SSMDeliverable model)
+    throws IOException {
+        final StringWriter w = new StringWriter();
+        TXTSSMModelWriter.write(w, model);
+        project.setContextValue(RAW_MODEL, w.toString());
+    }
+
+    /**
+     * Get the raw model from the project
+     * @param project The maven projet
+     * @return The raw model
+     * @throws IOException If reading fails
+     */
+    public static SSMDeliverable getRawModel(final MavenProject project) throws IOException {
+        final String contents = (String)project.getContextValue(RAW_MODEL);
+        return TXTSSMModelReader.read(new StringReader(contents), null);
+    }
+
+    /**
+     * Store the effective model in the project.
+     * @param project The maven project
+     * @param model The model
+     * @throws IOException If writing fails
+     */
+    public static void storeEffectiveModel(final MavenProject project, final SSMDeliverable model)
+    throws IOException {
+        final StringWriter w = new StringWriter();
+        TXTSSMModelWriter.write(w, model);
+        project.setContextValue(EFFECTIVE_MODEL, w.toString());
+    }
+
+    /**
+     * Get the effective model from the project
+     * @param project The maven projet
+     * @return The raw model
+     * @throws IOException If reading fails
+     */
+    public static SSMDeliverable getEffectiveModel(final MavenProject project) throws IOException {
+        final String contents = (String)project.getContextValue(EFFECTIVE_MODEL);
+        return TXTSSMModelReader.read(new StringReader(contents), null);
+    }
 }
diff --git a/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java b/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
index 9b7cc6b..e9b5277 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
@@ -41,7 +41,6 @@
 import org.apache.sling.slingstart.model.SSMDeliverable;
 import org.apache.sling.slingstart.model.SSMFeature;
 import org.apache.sling.slingstart.model.SSMStartLevel;
-import org.apache.sling.slingstart.model.SSMUtil;
 import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.UnArchiver;
 import org.codehaus.plexus.archiver.manager.ArchiverManager;
@@ -79,7 +78,7 @@
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
-        final SSMDeliverable model = SSMUtil.getEffectiveModel(this.readModel());
+        final SSMDeliverable model = this.readEffectiveModel();
 
         this.prepareGlobal(model);
         this.prepareStandaloneApp(model);