You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:26:23 UTC
[sling-slingstart-maven-plugin] 12/18: Refactor slingstart maven
plugin: resolve slingstart/slingfeature projects during setup of maven
(reactor) project
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag slingstart-maven-plugin-1.1.0
in repository https://gitbox.apache.org/repos/asf/sling-slingstart-maven-plugin.git
commit e2fb05194d2e41419efa49fbdcf8da1b3cc37478
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Sun Apr 12 16:34:40 2015 +0000
Refactor slingstart maven plugin: resolve slingstart/slingfeature projects during setup of maven (reactor) project
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/tooling/maven/slingstart-maven-plugin@1673028 13f79535-47bb-0310-9956-ffa450edef68
---
.../maven/slingstart/AbstractSlingStartMojo.java | 3 +
.../maven/slingstart/AttachSlingStartModel.java | 13 +-
.../sling/maven/slingstart/BuildConstants.java | 2 +
.../slingstart/DependencyLifecycleParticipant.java | 346 ++++++++++++++++-----
.../apache/sling/maven/slingstart/ModelUtils.java | 335 ++------------------
.../sling/maven/slingstart/PreparePackageMojo.java | 37 +--
.../maven/slingstart/PrepareSlingStartMojo.java | 68 ----
.../sling/maven/slingstart/ProjectHelper.java | 98 ++++++
src/main/resources/META-INF/plexus/components.xml | 2 -
9 files changed, 426 insertions(+), 478 deletions(-)
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 4aa4aab..f2024f8 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
@@ -25,6 +25,9 @@ import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
+/**
+ * Base class for all slingstart mojos.
+ */
public abstract class AbstractSlingStartMojo extends AbstractMojo {
@Parameter(defaultValue="${basedir}/src/main/provisioning")
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 77ef6ce..acfc7ed 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java
@@ -31,8 +31,7 @@ import org.apache.sling.provisioning.model.Model;
import org.apache.sling.provisioning.model.io.ModelWriter;
/**
- * Attaches the subsystem as a project artifact.
- *
+ * Attaches the model as a project artifact.
*/
@Mojo(
name = "attach-slingfeature",
@@ -44,13 +43,16 @@ public class AttachSlingStartModel extends AbstractSlingStartMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- final Model model = ModelUtils.getRawModel(this.project);
+ final Model model = ProjectHelper.getRawModel(this.project);
- final File outputFile = new File(this.project.getBuild().getDirectory() + File.separatorChar + "slingstart.txt");
+ // write the model
+ final File outputFile = new File(this.project.getBuild().getDirectory() + File.separatorChar + BuildConstants.MODEL_ARTIFACT_NAME);
outputFile.getParentFile().mkdirs();
+
Writer writer = null;
try {
+
writer = new FileWriter(outputFile);
ModelWriter.write(writer, model);
} catch (IOException e) {
@@ -64,7 +66,8 @@ public class AttachSlingStartModel extends AbstractSlingStartMojo {
project.getArtifact().setFile(outputFile);
} else {
// otherwise attach it as an additional artifact
- projectHelper.attachArtifact(project, BuildConstants.PACKAGING_PARTIAL_SYSTEM, BuildConstants.CLASSIFIER_PARTIAL_SYSTEM, outputFile);
+ projectHelper.attachArtifact(project, BuildConstants.PACKAGING_PARTIAL_SYSTEM,
+ BuildConstants.CLASSIFIER_PARTIAL_SYSTEM, outputFile);
}
}
}
diff --git a/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java b/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java
index cc6b3af..07885fd 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java
@@ -28,6 +28,8 @@ public abstract class BuildConstants {
public static final String CONTEXT_STANDALONE = "slingstart" + ModelConstants.RUN_MODE_STANDALONE;
public static final String CONTEXT_WEBAPP = "slingstart" + ModelConstants.RUN_MODE_WEBAPP;
+ // Model artifact name
+ public static final String MODEL_ARTIFACT_NAME = "slingstart.txt";
// Types
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 c65f427..895248a 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
@@ -17,11 +17,15 @@
package org.apache.sling.maven.slingstart;
import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.commons.io.IOUtils;
import org.apache.maven.AbstractMavenLifecycleParticipant;
import org.apache.maven.MavenExecutionException;
import org.apache.maven.artifact.Artifact;
@@ -41,6 +45,8 @@ import org.apache.sling.provisioning.model.Model;
import org.apache.sling.provisioning.model.ModelConstants;
import org.apache.sling.provisioning.model.ModelUtility;
import org.apache.sling.provisioning.model.RunMode;
+import org.apache.sling.provisioning.model.Traceable;
+import org.apache.sling.provisioning.model.io.ModelReader;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
@@ -55,7 +61,7 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
private static final String PLUGIN_ID = "slingstart-maven-plugin";
@Requirement
- private Logger log;
+ private Logger logger;
@Requirement
private ArtifactHandlerManager artifactHandlerManager;
@@ -67,90 +73,102 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
@Requirement
private ArtifactResolver resolver;
+ public static final class ProjectInfo {
+ public MavenProject project;
+ public Plugin plugin;
+ public Model localModel;
+ public boolean done = false;
+ public Model model;
+ }
+
+ public static final class Environment {
+ public ArtifactHandlerManager artifactHandlerManager;
+ public ArtifactResolver resolver;
+ public MavenSession session;
+ public Logger logger;
+ public final Map<String, ProjectInfo> modelProjects = new HashMap<String, ProjectInfo>();
+ }
+
@Override
public void afterProjectsRead(final MavenSession session) throws MavenExecutionException {
- log.debug("Searching for slingstart projects...");
+ final Environment env = new Environment();
+ env.artifactHandlerManager = artifactHandlerManager;
+ env.resolver = resolver;
+ env.logger = logger;
+ env.session = session;
+
+ logger.debug("Searching for " + BuildConstants.PACKAGING_SLINGSTART + "/" + BuildConstants.PACKAGING_PARTIAL_SYSTEM + " projects...");
+
for (final MavenProject project : session.getProjects()) {
- for (Plugin plugin : project.getBuild().getPlugins()) {
- if (plugin.getArtifactId().equals(PLUGIN_ID)) {
- log.debug("Found potential slingstart project: " + project);
- try {
- addDependencies(artifactHandlerManager, resolver, log,
- session, project, plugin);
- } catch (final Exception e) {
- throw new MavenExecutionException("Unable to determine plugin-based dependencies for project " + project, e);
+ if ( project.getPackaging().equals(BuildConstants.PACKAGING_SLINGSTART)
+ || project.getPackaging().equals(BuildConstants.PACKAGING_PARTIAL_SYSTEM)) {
+ logger.debug("Found " + project.getPackaging() + " project: " + project);
+ // search plugin configuration (optional)
+ final ProjectInfo info = new ProjectInfo();
+ for (Plugin plugin : project.getBuild().getPlugins()) {
+ if (plugin.getArtifactId().equals(PLUGIN_ID)) {
+ info.plugin = plugin;
+ break;
}
}
+ info.project = project;
+ env.modelProjects.put(project.getGroupId() + ":" + project.getArtifactId(), info);
}
}
+
+ addDependencies(env);
}
- public static void addDependencies(final ArtifactHandlerManager artifactHandlerManager,
- final ArtifactResolver resolver,
- final Logger log,
- final MavenSession session,
- final MavenProject project,
- final Plugin plugin)
- throws Exception {
- // get all projects of the current build
- final Map<String, MavenProject> projectMap = new HashMap<String, MavenProject>();
- for (final MavenProject p : session.getProjects()) {
- projectMap.put(p.getGroupId() + ":" + p.getArtifactId() + ":" + p.getVersion(), p);
- }
-
- // check dependent projects first: slingstart or partial system
- final List<Object> allDependencies = new ArrayList<Object>();
- final List<File> resolvedModelDependencies = new ArrayList<File>();
- for(final Dependency d : project.getDependencies() ) {
- if ( d.getType().equals(BuildConstants.PACKAGING_SLINGSTART)
- || d.getType().equals(BuildConstants.PACKAGING_PARTIAL_SYSTEM)) {
- // if it's a project from the current reactor build, we can't resolve it right now
- final String key = d.getGroupId() + ":" + d.getArtifactId() + ":" + d.getVersion();
- if ( projectMap.containsKey(key) ) {
- allDependencies.add(key + ":" + (d.getClassifier() != null ? d.getClassifier() : "")
- + ":" + (d.getType() != null ? d.getType() : ""));
- } else {
- // "external" dependency, we can already resolve it
- final File modelFile = getSlingstartArtifact(artifactHandlerManager, resolver, project, session, d);
- resolvedModelDependencies.add(modelFile);
- allDependencies.add(modelFile);
- }
- }
+ public static void addDependencies(final Environment env) throws MavenExecutionException {
+ for(final ProjectInfo info : env.modelProjects.values()) {
+ addDependencies(env, info);
}
+ }
- // read local model
- final String directory = nodeValue((Xpp3Dom) plugin.getConfiguration(),
- "modelDirectory", new File(project.getBasedir(), "src/main/provisioning").getAbsolutePath());
- final Model model = ModelUtils.readFullModel(new File(directory), resolvedModelDependencies, project, session, log);
+ private static Model addDependencies(final Environment env, final ProjectInfo info)
+ throws MavenExecutionException {
+ if ( info.done == true ) {
+ env.logger.debug("Return prepared model for " + info.project);
+ return info.model;
+ }
+ // prevent recursion and multiple processing
+ info.done = true;
+ env.logger.debug("Processing project " + info.project);
- ModelUtils.storeModelInfo(project, model, allDependencies);
+ // read local model
+ final String directory = nodeValue(info.plugin,
+ "modelDirectory",
+ new File(info.project.getBasedir(), "src/main/provisioning").getAbsolutePath());
+ try {
+ info.localModel = readLocalModel(info.project, new File(directory), env.logger);
+ } catch ( final IOException ioe) {
+ throw new MavenExecutionException(ioe.getMessage(), ioe);
+ }
// we have to create an effective model to add the dependencies
- final Model effectiveModel = ModelUtility.getEffectiveModel(model, null);
-
- if ( project.getPackaging().equals(BuildConstants.PACKAGING_SLINGSTART ) ) {
- // start with base artifact
- final ModelUtils.SearchResult result = ModelUtils.findBaseArtifact(effectiveModel);
- if ( result.artifact != null ) {
- final String[] classifiers = new String[] {null, BuildConstants.CLASSIFIER_APP, BuildConstants.CLASSIFIER_WEBAPP};
- for(final String c : classifiers) {
- final Dependency dep = new Dependency();
- dep.setGroupId(result.artifact.getGroupId());
- dep.setArtifactId(result.artifact.getArtifactId());
- dep.setVersion(result.artifact.getVersion());
- dep.setType(result.artifact.getType());
- dep.setClassifier(c);
- if ( BuildConstants.CLASSIFIER_WEBAPP.equals(c) ) {
- dep.setType(BuildConstants.TYPE_WAR);
- }
- dep.setScope(Artifact.SCOPE_PROVIDED);
+ final Model effectiveModel = ModelUtility.getEffectiveModel(info.localModel, null);
- log.debug("- adding dependency " + dep);
- project.getDependencies().add(dep);
- }
- }
+ final List<Model> dependencies = searchSlingstartDependencies(env, info, effectiveModel);
+ info.model = new Model();
+ for(final Model d : dependencies) {
+ ModelUtility.merge(info.model, d);
}
- addDependenciesFromModel(project, effectiveModel, log);
+ ModelUtility.merge(info.model, effectiveModel);
+ info.model = ModelUtility.getEffectiveModel(info.model, null);
+
+ final Map<Traceable, String> errors = ModelUtility.validate(info.model);
+ if ( errors != null ) {
+ throw new MavenExecutionException("Unable to create model file for " + info.project + " : " + errors, (File)null);
+ }
+
+ addDependenciesFromModel(env, info);
+
+ try {
+ ProjectHelper.storeProjectInfo(info);
+ } catch ( final IOException ioe) {
+ throw new MavenExecutionException(ioe.getMessage(), ioe);
+ }
+ return info.model;
}
/**
@@ -158,10 +176,36 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
* @param project The project
* @param model The model
* @param log The logger
+ * @throws MavenExecutionException
*/
- private static void addDependenciesFromModel(final MavenProject project, final Model model, final Logger log) {
- for(final Feature feature : model.getFeatures()) {
- // skip base
+ private static void addDependenciesFromModel(
+ final Environment env,
+ final ProjectInfo info)
+ throws MavenExecutionException {
+ if ( info.project.getPackaging().equals(BuildConstants.PACKAGING_SLINGSTART ) ) {
+ // add base artifact if defined in current model
+ final org.apache.sling.provisioning.model.Artifact baseArtifact = ModelUtils.findBaseArtifact(info.model);
+
+ final String[] classifiers = new String[] {null, BuildConstants.CLASSIFIER_APP, BuildConstants.CLASSIFIER_WEBAPP};
+ for(final String c : classifiers) {
+ final Dependency dep = new Dependency();
+ dep.setGroupId(baseArtifact.getGroupId());
+ dep.setArtifactId(baseArtifact.getArtifactId());
+ dep.setVersion(baseArtifact.getVersion());
+ dep.setType(baseArtifact.getType());
+ dep.setClassifier(c);
+ if ( BuildConstants.CLASSIFIER_WEBAPP.equals(c) ) {
+ dep.setType(BuildConstants.TYPE_WAR);
+ }
+ dep.setScope(Artifact.SCOPE_PROVIDED);
+
+ info.project.getDependencies().add(dep);
+ env.logger.debug("- adding base dependency " + ModelUtils.toString(dep));
+ }
+ }
+
+ for(final Feature feature : info.model.getFeatures()) {
+ // skip launchpad feature
if ( feature.getName().equals(ModelConstants.FEATURE_LAUNCHPAD) ) {
continue;
}
@@ -174,17 +218,105 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
dep.setVersion(a.getVersion());
dep.setType(a.getType());
dep.setClassifier(a.getClassifier());
+
dep.setScope(Artifact.SCOPE_PROVIDED);
- log.debug("- adding dependency " + dep);
- project.getDependencies().add(dep);
+ env.logger.debug("- adding dependency " + ModelUtils.toString(dep));
+ info.project.getDependencies().add(dep);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Search for dependent slingstart/slingfeature artifacts and remove them from the effective model.
+ * @throws MavenExecutionException
+ */
+ private static List<Model> searchSlingstartDependencies(
+ final Environment env,
+ final ProjectInfo info,
+ final Model effectiveModel)
+ throws MavenExecutionException {
+ // slingstart or slingfeature
+ final List<Model> dependencies = new ArrayList<Model>();
+
+ for(final Feature feature : effectiveModel.getFeatures()) {
+ for(final RunMode runMode : feature.getRunModes()) {
+ for(final ArtifactGroup group : runMode.getArtifactGroups()) {
+ final List<org.apache.sling.provisioning.model.Artifact> removeList = new ArrayList<org.apache.sling.provisioning.model.Artifact>();
+ for(final org.apache.sling.provisioning.model.Artifact a : group) {
+ if ( a.getType().equals(BuildConstants.PACKAGING_SLINGSTART)
+ || a.getType().equals(BuildConstants.PACKAGING_PARTIAL_SYSTEM)) {
+
+ final Dependency dep = new Dependency();
+ dep.setGroupId(a.getGroupId());
+ dep.setArtifactId(a.getArtifactId());
+ dep.setVersion(a.getVersion());
+ dep.setType(BuildConstants.PACKAGING_PARTIAL_SYSTEM);
+ if ( a.getType().equals(BuildConstants.PACKAGING_SLINGSTART) ) {
+ dep.setClassifier(BuildConstants.PACKAGING_PARTIAL_SYSTEM);
+ } else {
+ dep.setClassifier(a.getClassifier());
+ }
+ dep.setScope(Artifact.SCOPE_PROVIDED);
+
+ env.logger.debug("- adding dependency " + ModelUtils.toString(dep));
+ info.project.getDependencies().add(dep);
+
+ // if it's a project from the current reactor build, we can't resolve it right now
+ final String key = a.getGroupId() + ":" + a.getArtifactId();
+ if ( env.modelProjects.containsKey(key) ) {
+ env.logger.debug("Found reactor " + a.getType() + " dependency : " + a);
+ final Model model = addDependencies(env, env.modelProjects.get(key));
+ if ( model == null ) {
+ throw new MavenExecutionException("Recursive model dependency list including project " + info.project, (File)null);
+ }
+ dependencies.add(model);
+ } else {
+ env.logger.debug("Found external " + a.getType() + " dependency: " + a);
+ // "external" dependency, we can already resolve it
+ final File modelFile = resolveSlingstartArtifact(env, info.project, dep);
+ FileReader r = null;
+ try {
+ r = new FileReader(modelFile);
+ final Model m = ModelReader.read(r, modelFile.getAbsolutePath());
+
+ final Map<Traceable, String> errors = ModelUtility.validate(m);
+ if ( errors != null ) {
+ throw new MavenExecutionException("Unable to read model file from " + modelFile + " : " + errors, modelFile);
+ }
+ dependencies.add(m);
+ } catch ( final IOException ioe) {
+ throw new MavenExecutionException("Unable to read model file from " + modelFile, ioe);
+ } finally {
+ try {
+ if ( r != null ) {
+ r.close();
+ }
+ } catch ( final IOException io) {
+ // ignore
+ }
+ }
+ }
+ env.logger.debug("- adding dependency " + ModelUtils.toString(dep));
+ info.project.getDependencies().add(dep);
+
+ removeList.add(a);
+ }
+ }
+ for(final org.apache.sling.provisioning.model.Artifact r : removeList) {
+ group.remove(r);
}
}
}
}
+
+ return dependencies;
}
- private static String nodeValue(final Xpp3Dom config, final String name, final String defaultValue) {
+ private static String nodeValue(final Plugin plugin, final String name, final String defaultValue) {
+ final Xpp3Dom config = plugin == null ? null : (Xpp3Dom)plugin.getConfiguration();
final Xpp3Dom node = (config == null ? null : config.getChild(name));
if (node != null) {
return node.getValue();
@@ -193,10 +325,8 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
}
}
- private static File getSlingstartArtifact(final ArtifactHandlerManager artifactHandlerManager,
- final ArtifactResolver resolver,
+ private static File resolveSlingstartArtifact(final Environment env,
final MavenProject project,
- final MavenSession session,
final Dependency d)
throws MavenExecutionException {
final Artifact prjArtifact = new DefaultArtifact(d.getGroupId(),
@@ -205,9 +335,9 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
Artifact.SCOPE_PROVIDED,
d.getType(),
d.getClassifier(),
- artifactHandlerManager.getArtifactHandler(d.getType()));
+ env.artifactHandlerManager.getArtifactHandler(d.getType()));
try {
- resolver.resolve(prjArtifact, project.getRemoteArtifactRepositories(), session.getLocalRepository());
+ env.resolver.resolve(prjArtifact, project.getRemoteArtifactRepositories(), env.session.getLocalRepository());
} catch (final ArtifactResolutionException e) {
throw new MavenExecutionException("Unable to get artifact for " + d, e);
} catch (final ArtifactNotFoundException e) {
@@ -215,4 +345,60 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic
}
return prjArtifact.getFile();
}
+
+ /**
+ * Read all model files from the directory in alphabetical order.
+ * Only files ending with .txt or .model are read.
+ *
+ * @param project The current maven project
+ * @param modelDirectory The directory to scan for models
+ * @param logger The logger
+ */
+ private static Model readLocalModel(
+ final MavenProject project,
+ final File modelDirectory,
+ final Logger logger)
+ throws MavenExecutionException, IOException {
+ final List<String> candidates = new ArrayList<String>();
+ if ( modelDirectory != null && modelDirectory.exists() ) {
+ for(final File f : modelDirectory.listFiles() ) {
+ if ( f.isFile() && !f.getName().startsWith(".") ) {
+ if ( f.getName().endsWith(".txt") || f.getName().endsWith(".model") ) {
+ candidates.add(f.getName());
+ }
+ }
+ }
+ Collections.sort(candidates);
+ }
+ if ( candidates.size() == 0 ) {
+ throw new MavenExecutionException("No model files found in " + modelDirectory, (File)null);
+ }
+ final Model result = new Model();
+ for(final String name : candidates) {
+ logger.debug("Reading model " + name + " in project " + project.getId());
+ try {
+ final File f = new File(modelDirectory, name);
+ final FileReader reader = new FileReader(f);
+ try {
+ final Model current = ModelReader.read(reader, f.getAbsolutePath());
+ final Map<Traceable, String> errors = ModelUtility.validate(current);
+ if (errors != null ) {
+ throw new MavenExecutionException("Invalid model at " + name + " : " + errors, (File)null);
+ }
+ ModelUtility.merge(result, current);
+ } finally {
+ IOUtils.closeQuietly(reader);
+ }
+ } catch ( final IOException io) {
+ throw new MavenExecutionException("Unable to read model at " + name, io);
+ }
+ }
+
+ final Map<Traceable, String> errors = ModelUtility.validate(result);
+ if (errors != null ) {
+ throw new MavenExecutionException("Invalid assembled model : " + errors, (File)null);
+ }
+
+ return result;
+ }
}
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 098d1ca..ccde9e4 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
@@ -17,17 +17,9 @@
package org.apache.sling.maven.slingstart;
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;
-import java.util.Map;
import java.util.Set;
-import org.apache.commons.io.IOUtils;
+import org.apache.maven.MavenExecutionException;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
@@ -42,164 +34,10 @@ import org.apache.maven.project.MavenProject;
import org.apache.sling.provisioning.model.Feature;
import org.apache.sling.provisioning.model.Model;
import org.apache.sling.provisioning.model.ModelConstants;
-import org.apache.sling.provisioning.model.ModelUtility;
import org.apache.sling.provisioning.model.RunMode;
-import org.apache.sling.provisioning.model.Traceable;
-import org.apache.sling.provisioning.model.io.ModelReader;
-import org.apache.sling.provisioning.model.io.ModelWriter;
-import org.codehaus.plexus.logging.Logger;
public abstract class ModelUtils {
- private static final String EXT_TXT = ".txt";
- private static final String EXT_MODEL = ".model";
-
- /**
- * Read all model files from the directory in alphabetical order.
- * Only files ending with .txt or .model are read.
- *
- * @param startingModel The model into which the read models are merged or {@code null}
- * @param modelDirectory The directory to scan for models
- * @param project The current maven project
- * @param session The current maven session
- * @param logger The logger
- */
- private static Model readLocalModel(final Model startingModel,
- final File modelDirectory,
- final MavenProject project,
- final MavenSession session,
- final Logger logger)
- throws MojoExecutionException {
- final Model result = (startingModel != null ? startingModel : new Model());
- final List<String> candidates = new ArrayList<String>();
- if ( modelDirectory != null && modelDirectory.exists() ) {
- for(final File f : modelDirectory.listFiles() ) {
- if ( f.isFile() && !f.getName().startsWith(".") ) {
- if ( f.getName().endsWith(EXT_TXT) || f.getName().endsWith(EXT_MODEL) ) {
- candidates.add(f.getName());
- }
- }
- }
- Collections.sort(candidates);
- }
- if ( candidates.size() == 0 ) {
- throw new MojoExecutionException("No model files found in " + modelDirectory);
- }
- for(final String name : candidates) {
- logger.debug("Reading model " + name + " in project " + project.getId());
- try {
- final File f = new File(modelDirectory, name);
- final FileReader reader = new FileReader(f);
- try {
- final Model current = ModelReader.read(reader, f.getAbsolutePath());
- final Map<Traceable, String> errors = ModelUtility.validate(current);
- if (errors != null ) {
- throw new MojoExecutionException("Invalid model at " + name + " : " + errors);
- }
- ModelUtility.merge(result, current);
- } finally {
- IOUtils.closeQuietly(reader);
- }
- } catch ( final IOException io) {
- throw new MojoExecutionException("Unable to read model at " + name, io);
- }
- }
-
- final Map<Traceable, String> errors = ModelUtility.validate(result);
- if (errors != null ) {
- throw new MojoExecutionException("Invalid assembled model : " + errors);
- }
-
- return result;
- }
-
- /**
- * Read the full model
- */
- public static Model readFullModel(final File modelDirectory,
- final List<File> dependentModels,
- final MavenProject project,
- final MavenSession session,
- final Logger logger)
- throws MojoExecutionException {
- try {
- // read dependent models
- Model depModel = null;
- if ( dependentModels != null ) {
- for(final File file : dependentModels) {
- FileReader r = null;
- try {
- r = new FileReader(file);
- if ( depModel == null ) {
- depModel = new Model();
- }
- final Model readModel = ModelReader.read(r, file.getAbsolutePath());
- final Map<Traceable, String> errors = ModelUtility.validate(readModel);
- if (errors != null ) {
- throw new MojoExecutionException("Invalid model at " + file + " : " + errors);
- }
- ModelUtility.merge(depModel, readModel);
- } finally {
- IOUtils.closeQuietly(r);
- }
- }
- }
- if ( depModel != null ) {
- final Map<Traceable, String> errors = ModelUtility.validate(depModel);
- if (errors != null ) {
- throw new MojoExecutionException("Invalid model : " + errors);
- }
- }
-
- final Model result = readLocalModel(depModel, modelDirectory, project, session, logger);
-
- return result;
- } catch ( final IOException ioe) {
- throw new MojoExecutionException("Unable to cache model", ioe);
- }
- }
-
- public static final class SearchResult {
- public org.apache.sling.provisioning.model.Artifact artifact;
- public String errorMessage;
- }
-
- public static SearchResult findBaseArtifact(final Model model) throws MojoExecutionException {
- final SearchResult result = new SearchResult();
- final Feature base = model.getFeature(ModelConstants.FEATURE_LAUNCHPAD);
- if ( base == null ) {
- result.errorMessage = "No launchpad feature found.";
- } else {
- // get global run mode
- final RunMode runMode = base.getRunMode();
- if ( runMode == null ) {
- result.errorMessage = "No global run mode found in launchpad feature.";
- } else {
- if ( runMode.getArtifactGroups().isEmpty() ) {
- result.errorMessage = "No base artifacts defined.";
- } else if ( runMode.getArtifactGroups().size() > 1 ) {
- result.errorMessage = "Base run mode should only have a single start level.";
- } else {
- org.apache.sling.provisioning.model.Artifact firstArtifact = null;
- for(final org.apache.sling.provisioning.model.Artifact a : runMode.getArtifactGroups().get(0)) {
- if ( firstArtifact == null ) {
- firstArtifact = a;
- } else {
- result.errorMessage = "Base run mode should contain exactly one artifact.";
- break;
- }
- }
- if ( firstArtifact == null ) {
- result.errorMessage = "No base artifacts defined.";
- }
- if ( result.errorMessage == null ) {
- result.artifact = firstArtifact;
- }
- }
- }
- }
- return result;
- }
/**
* Get a resolved Artifact from the coordinates provided
@@ -240,155 +78,42 @@ public abstract class ModelUtils {
return prjArtifact;
}
- private static final String RAW_MODEL_TXT = Model.class.getName() + "/raw.txt";
- private static final String RAW_MODEL_DEPS = Model.class.getName() + "/raw.deps";
-
- private static final String EFFECTIVE_MODEL = Model.class.getName() + "/effective";
- private static final String RAW_MODEL = Model.class.getName() + "/raw";
-
- /**
- * Store the model info from the dependency lifecycle participant
- * @param project The maven project
- * @param model The local model
- * @param dependencies The dependencies (either String or File objects)
- * @throws IOException If writing fails
- */
- public static void storeModelInfo(final MavenProject project, final Model model, final List<Object> dependencies)
- throws IOException {
- // we have to serialize as the dependency lifecycle participant uses a different class loader (!)
- final StringWriter w = new StringWriter();
- ModelWriter.write(w, model);
- project.setContextValue(RAW_MODEL_TXT, w.toString());
- project.setContextValue(RAW_MODEL_DEPS, dependencies);
- }
-
- public static void prepareModel(final MavenProject project,
- final MavenSession session)
- throws MojoExecutionException {
- final String contents = (String)project.getContextValue(RAW_MODEL_TXT);
- final Model localModel;
- try {
- localModel = ModelReader.read(new StringReader(contents), null);
- } catch ( final IOException ioe) {
- throw new MojoExecutionException("Unable to read cached model.", ioe);
- }
- final List<File> modelDependencies = new ArrayList<File>();
- @SuppressWarnings("unchecked")
- final List<Object> localDeps = (List<Object>)project.getContextValue(RAW_MODEL_DEPS);
- for(final Object o : localDeps) {
- if ( o instanceof String ) {
- final String[] info = ((String)o).split(":");
-
- final Dependency dep = new Dependency();
- dep.setGroupId(info[0]);
- dep.setArtifactId(info[1]);
- dep.setVersion(info[2]);
- if ( info[3] != null && info[3].length() > 0 ) {
- dep.setClassifier(info[3]);
- }
- if ( info[4] != null && info[4].length() > 0 ) {
- dep.setType(info[4]);
- }
- modelDependencies.add(getSlingstartArtifact(project, session, dep));
- } else {
- modelDependencies.add((File)o);
- }
- }
- // read dependent models
- Model depModel = null;
- for(final File file : modelDependencies) {
- FileReader r = null;
- try {
- r = new FileReader(file);
- if ( depModel == null ) {
- depModel = new Model();
- }
- final Model readModel = ModelReader.read(r, file.getAbsolutePath());
- final Map<Traceable, String> errors = ModelUtility.validate(readModel);
- if (errors != null ) {
- throw new MojoExecutionException("Invalid model at " + file + " : " + errors);
- }
- ModelUtility.merge(depModel, readModel);
- } catch ( final IOException ioe) {
- throw new MojoExecutionException("Unable to read model from " + file, ioe);
- } finally {
- IOUtils.closeQuietly(r);
- }
- }
-
- final Model rawModel;
- if ( depModel != null ) {
- ModelUtility.merge(depModel, localModel);
- final Map<Traceable, String> errors = ModelUtility.validate(depModel);
- if (errors != null ) {
- throw new MojoExecutionException("Invalid model : " + errors);
- }
- rawModel = depModel;
+ public static org.apache.sling.provisioning.model.Artifact findBaseArtifact(final Model model)
+ throws MavenExecutionException {
+ final Feature base = model.getFeature(ModelConstants.FEATURE_LAUNCHPAD);
+ if ( base == null ) {
+ throw new MavenExecutionException("No launchpad feature found.", (File)null);
} else {
- rawModel = localModel;
- }
-
- // store raw model
- project.setContextValue(RAW_MODEL, rawModel);
- // create and store effective model
- final Model effectiveModel = ModelUtility.getEffectiveModel(rawModel, null);
- project.setContextValue(EFFECTIVE_MODEL, effectiveModel);
- }
-
- private static File getSlingstartArtifact(final MavenProject project,
- final MavenSession session,
- final Dependency dep)
- throws MojoExecutionException {
- for (final MavenProject p : session.getProjects()) {
- // we only need to find the group id / artifact id, version is correct anyway
- if ( p.getGroupId().equals(dep.getGroupId())
- && p.getArtifactId().equals(dep.getArtifactId()) ) {
-
- // check main artifact first
- if ( dep.getClassifier() == null && p.getPackaging().equals(dep.getType()) ) {
- if ( p.getArtifact() != null && p.getArtifact().getFile() != null ) {
- return p.getArtifact().getFile();
- }
- }
- // followed by attached artifacts
- for(final Artifact a : p.getAttachedArtifacts()) {
- if ( equals(a.getType(), dep.getType() ) && equals(a.getClassifier(), dep.getClassifier())) {
- if ( a.getFile() != null ) {
- return a.getFile();
+ // get global run mode
+ final RunMode runMode = base.getRunMode();
+ if ( runMode == null ) {
+ throw new MavenExecutionException("No global run mode found in launchpad feature.", (File)null);
+ } else {
+ if ( runMode.getArtifactGroups().isEmpty() ) {
+ throw new MavenExecutionException("No base artifacts defined.", (File)null);
+ } else if ( runMode.getArtifactGroups().size() > 1 ) {
+ throw new MavenExecutionException("Base run mode should only have a single start level.", (File)null);
+ } else {
+ org.apache.sling.provisioning.model.Artifact firstArtifact = null;
+ for(final org.apache.sling.provisioning.model.Artifact a : runMode.getArtifactGroups().get(0)) {
+ if ( firstArtifact == null ) {
+ firstArtifact = a;
+ } else {
+ throw new MavenExecutionException("Base run mode should contain exactly one artifact.", (File)null);
}
}
+ if ( firstArtifact == null ) {
+ throw new MavenExecutionException("No base artifacts defined.", (File)null);
+ }
+ return firstArtifact;
}
- break;
}
}
- throw new MojoExecutionException("Unable to find dependency build artifact " + dep);
- }
-
- private final static boolean equals(final String a, final String b) {
- if ( a == null && b == null ) {
- return true;
- }
- if ( a == null ) {
- return false;
- }
- return a.equals(b);
}
- /**
- * Get the effective model from the project
- * @param project The maven projet
- * @return The effective model
- */
- public static Model getEffectiveModel(final MavenProject project) {
- return (Model)project.getContextValue(EFFECTIVE_MODEL);
- }
-
- /**
- * Get the raw model from the project
- * @param project The maven projet
- * @return The raw model
- */
- public static Model getRawModel(final MavenProject project) {
- return (Model)project.getContextValue(RAW_MODEL);
+ public static String toString(final Dependency d) {
+ return "Dependency {groupId=" + d.getGroupId() + ", artifactId=" + d.getArtifactId() + ", version=" + d.getVersion() +
+ (d.getClassifier() != null ? ", classifier=" + d.getClassifier() : "") +
+ ", type=" + d.getType() + "}";
}
}
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 90eb778..28c14d2 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
@@ -28,6 +28,7 @@ import java.util.TreeSet;
import org.apache.commons.io.IOUtils;
import org.apache.felix.cm.file.ConfigurationHandler;
+import org.apache.maven.MavenExecutionException;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.resolver.ArtifactResolver;
@@ -90,7 +91,7 @@ public class PreparePackageMojo extends AbstractSlingStartMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- final Model model = ModelUtils.getEffectiveModel(this.project);
+ final Model model = ProjectHelper.getEffectiveModel(this.project);
this.prepareGlobal(model);
this.prepareStandaloneApp(model);
@@ -323,24 +324,24 @@ public class PreparePackageMojo extends AbstractSlingStartMojo {
* Return the base artifact
*/
private Artifact getBaseArtifact(final Model model, final String classifier, final String type) throws MojoExecutionException {
- final ModelUtils.SearchResult result = ModelUtils.findBaseArtifact(model);
- if ( result.errorMessage != null ) {
- throw new MojoExecutionException(result.errorMessage);
- }
- final org.apache.sling.provisioning.model.Artifact baseArtifact = result.artifact;
-
- final Artifact a = ModelUtils.getArtifact(this.project, this.mavenSession, this.artifactHandlerManager, this.resolver,
- baseArtifact.getGroupId(),
- baseArtifact.getArtifactId(),
- baseArtifact.getVersion(),
- type,
- classifier);
- if (a == null) {
- throw new MojoExecutionException(
- String.format("Project doesn't have a base dependency of groupId %s and artifactId %s",
- baseArtifact.getGroupId(), baseArtifact.getArtifactId()));
+ try {
+ final org.apache.sling.provisioning.model.Artifact baseArtifact = ModelUtils.findBaseArtifact(model);
+
+ final Artifact a = ModelUtils.getArtifact(this.project, this.mavenSession, this.artifactHandlerManager, this.resolver,
+ baseArtifact.getGroupId(),
+ baseArtifact.getArtifactId(),
+ baseArtifact.getVersion(),
+ type,
+ classifier);
+ if (a == null) {
+ throw new MojoExecutionException(
+ String.format("Project doesn't have a base dependency of groupId %s and artifactId %s",
+ baseArtifact.getGroupId(), baseArtifact.getArtifactId()));
+ }
+ return a;
+ } catch ( final MavenExecutionException mee) {
+ throw new MojoExecutionException(mee.getMessage(), mee.getCause());
}
- return a;
}
/**
diff --git a/src/main/java/org/apache/sling/maven/slingstart/PrepareSlingStartMojo.java b/src/main/java/org/apache/sling/maven/slingstart/PrepareSlingStartMojo.java
deleted file mode 100644
index d7a1184..0000000
--- a/src/main/java/org/apache/sling/maven/slingstart/PrepareSlingStartMojo.java
+++ /dev/null
@@ -1,68 +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.maven.slingstart;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-
-/**
- * Prepares the project
- *
- */
-@Mojo(
- name = "prepare",
- defaultPhase = LifecyclePhase.VALIDATE,
- requiresDependencyResolution = ResolutionScope.TEST,
- threadSafe = true
- )
-public class PrepareSlingStartMojo extends AbstractSlingStartMojo {
-
- @Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- ModelUtils.prepareModel(this.project, this.mavenSession);
-
- if ( project.getPackaging().equals(BuildConstants.PACKAGING_SLINGSTART ) ) {
- // add dependencies for base artifact
- final ModelUtils.SearchResult result = ModelUtils.findBaseArtifact(ModelUtils.getEffectiveModel(project));
- if ( result.artifact != null ) {
- final String[] classifiers = new String[] {null, BuildConstants.CLASSIFIER_APP, BuildConstants.CLASSIFIER_WEBAPP};
- for(final String c : classifiers) {
- final Dependency dep = new Dependency();
- dep.setGroupId(result.artifact.getGroupId());
- dep.setArtifactId(result.artifact.getArtifactId());
- dep.setVersion(result.artifact.getVersion());
- dep.setType(result.artifact.getType());
- dep.setClassifier(c);
- if ( BuildConstants.CLASSIFIER_WEBAPP.equals(c) ) {
- dep.setType(BuildConstants.TYPE_WAR);
- }
- dep.setScope(Artifact.SCOPE_PROVIDED);
-
- getLog().debug("Adding base dependency " + dep);
- project.getDependencies().add(dep);
- }
- } else {
- throw new MojoExecutionException(result.errorMessage);
- }
- }
- }
-}
diff --git a/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java b/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java
new file mode 100644
index 0000000..bf13b00
--- /dev/null
+++ b/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java
@@ -0,0 +1,98 @@
+/*
+ * 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.maven.slingstart;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.sling.provisioning.model.Model;
+import org.apache.sling.provisioning.model.ModelUtility;
+import org.apache.sling.provisioning.model.io.ModelReader;
+import org.apache.sling.provisioning.model.io.ModelWriter;
+
+public abstract class ProjectHelper {
+
+ /** The raw local model. */
+ private static final String RAW_MODEL_TXT = Model.class.getName() + "/raw.txt";
+ private static final String RAW_MODEL_CACHE = Model.class.getName() + "/raw.cache";
+
+ private static final String EFFECTIVE_MODEL_TXT = Model.class.getName() + "/effective.txt";
+ private static final String EFFECTIVE_MODEL_CACHE = Model.class.getName() + "/effective.cache";
+
+ /**
+ *
+ * @param info The project info
+ * @throws IOException If writing fails
+ */
+ public static void storeProjectInfo(final DependencyLifecycleParticipant.ProjectInfo info)
+ throws IOException {
+ // we have to serialize as the dependency lifecycle participant uses a different class loader (!)
+ final StringWriter w1 = new StringWriter();
+ ModelWriter.write(w1, info.localModel);
+ info.project.setContextValue(RAW_MODEL_TXT, w1.toString());
+
+ final StringWriter w2 = new StringWriter();
+ ModelWriter.write(w2, info.model);
+ info.project.setContextValue(EFFECTIVE_MODEL_TXT, w2.toString());
+ }
+
+ /**
+ * Get the effective model from the project
+ * @param project The maven projet
+ * @return The effective model
+ * @throws MojoExecutionException If reading fails
+ */
+ public static Model getEffectiveModel(final MavenProject project)
+ throws MojoExecutionException {
+ Model result = (Model) project.getContextValue(EFFECTIVE_MODEL_CACHE);
+ if ( result == null ) {
+ try {
+ final StringReader r = new StringReader((String)project.getContextValue(EFFECTIVE_MODEL_TXT));
+ result = ModelReader.read(r, project.getId());
+ result = ModelUtility.getEffectiveModel(result, null);
+ project.setContextValue(EFFECTIVE_MODEL_CACHE, result);
+ } catch ( final IOException ioe) {
+ throw new MojoExecutionException(ioe.getMessage(), ioe);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get the raw model from the project
+ * @param project The maven projet
+ * @return The raw local model
+ * @throws MojoExecutionException If reading fails
+ */
+ public static Model getRawModel(final MavenProject project)
+ throws MojoExecutionException {
+ Model result = (Model) project.getContextValue(RAW_MODEL_CACHE);
+ if ( result == null ) {
+ try {
+ final StringReader r = new StringReader((String)project.getContextValue(RAW_MODEL_TXT));
+ result = ModelReader.read(r, project.getId());
+ project.setContextValue(RAW_MODEL_CACHE, result);
+ } catch ( final IOException ioe) {
+ throw new MojoExecutionException(ioe.getMessage(), ioe);
+ }
+ }
+ return result;
+ }
+}
diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml
index 323d663..21f4ced 100644
--- a/src/main/resources/META-INF/plexus/components.xml
+++ b/src/main/resources/META-INF/plexus/components.xml
@@ -27,7 +27,6 @@
<lifecycle>
<id>default</id>
<phases>
- <validate>org.apache.sling:slingstart-maven-plugin:prepare</validate>
<package>org.apache.sling:slingstart-maven-plugin:attach-slingfeature</package>
<install>org.apache.maven.plugins:maven-install-plugin:install</install>
<deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
@@ -45,7 +44,6 @@
<lifecycle>
<id>default</id>
<phases>
- <validate>org.apache.sling:slingstart-maven-plugin:prepare</validate>
<process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
<compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
<process-test-resources>
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.