This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag slingstart-maven-plugin-1.3.2 in repository https://gitbox.apache.org/repos/asf/sling-slingstart-maven-plugin.git
commit 0acafe1069831affebe5265bceb336ea61c1d221 Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Aug 14 08:22:40 2015 +0000 SLING-4945 : Model files are missing from created repository SLING-4946 : Model dependencies are not followed transitively git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/tooling/maven/slingstart-maven-plugin@1695835 13f79535-47bb-0310-9956-ffa450edef68 --- .../maven/slingstart/AttachSlingStartModel.java | 2 - .../slingstart/DependencyLifecycleParticipant.java | 46 +++++++++++-- .../sling/maven/slingstart/ProjectHelper.java | 29 +++++++- .../sling/maven/slingstart/RepositoryMojo.java | 79 ++++++++++++++++++++-- 4 files changed, 140 insertions(+), 16 deletions(-) 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 331adf8..f4131be 100644 --- a/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java +++ b/src/main/java/org/apache/sling/maven/slingstart/AttachSlingStartModel.java @@ -58,8 +58,6 @@ public class AttachSlingStartModel extends AbstractSlingStartMojo { Writer writer = null; try { - - writer = new FileWriter(outputFile); ModelWriter.write(writer, model); } catch (IOException e) { 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 15b71c7..31e2d93 100644 --- a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java +++ b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java @@ -77,11 +77,14 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic 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 final Map<org.apache.sling.provisioning.model.Artifact, Model> includedModels = new HashMap<org.apache.sling.provisioning.model.Artifact, Model>(); + } public static final class Environment { @@ -281,27 +284,35 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic // 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) ) { + final ProjectInfo depInfo = env.modelProjects.get(key); + if ( depInfo != null ) { env.logger.debug("Found reactor " + a.getType() + " dependency : " + a); - final Model model = addDependencies(env, env.modelProjects.get(key)); + final Model model = addDependencies(env, depInfo); if ( model == null ) { throw new MavenExecutionException("Recursive model dependency list including project " + info.project, (File)null); } dependencies.add(model); + info.includedModels.put(a, depInfo.localModel); + } 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 Model model = ModelReader.read(r, modelFile.getAbsolutePath()); + + info.includedModels.put(a, model); - final Map<Traceable, String> errors = ModelUtility.validate(m); + final Map<Traceable, String> errors = ModelUtility.validate(model); if ( errors != null ) { throw new MavenExecutionException("Unable to read model file from " + modelFile + " : " + errors, modelFile); } - dependencies.add(m); + final Model fullModel = processSlingstartDependencies(env, info, dep, model); + + dependencies.add(fullModel); } catch ( final IOException ioe) { throw new MavenExecutionException("Unable to read model file from " + modelFile, ioe); } finally { @@ -314,8 +325,6 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic } } } - env.logger.debug("- adding dependency " + ModelUtils.toString(dep)); - info.project.getDependencies().add(dep); removeList.add(a); } @@ -330,6 +339,29 @@ public class DependencyLifecycleParticipant extends AbstractMavenLifecyclePartic return dependencies; } + private static Model processSlingstartDependencies(final Environment env, final ProjectInfo info, final Dependency dep, final Model rawModel) + throws MavenExecutionException { + env.logger.debug("Processing dependency " + dep); + + // we have to create an effective model to add the dependencies + final Model effectiveModel = ModelUtility.getEffectiveModel(rawModel, new ResolverOptions()); + + final List<Model> dependencies = searchSlingstartDependencies(env, info, effectiveModel); + Model mergingModel = new Model(); + for(final Model d : dependencies) { + ModelUtility.merge(mergingModel, d); + } + ModelUtility.merge(mergingModel, effectiveModel); + mergingModel = ModelUtility.getEffectiveModel(mergingModel, new ResolverOptions()); + + final Map<Traceable, String> errors = ModelUtility.validate(mergingModel); + if ( errors != null ) { + throw new MavenExecutionException("Unable to create model file for " + dep + " : " + errors, (File)null); + } + + return mergingModel; + } + /** * Gets plugins configuration from POM (string parameter). * @param plugin Plugin diff --git a/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java b/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java index af6785c..35ec739 100644 --- a/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java +++ b/src/main/java/org/apache/sling/maven/slingstart/ProjectHelper.java @@ -19,9 +19,12 @@ package org.apache.sling.maven.slingstart; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; +import org.apache.sling.provisioning.model.Artifact; import org.apache.sling.provisioning.model.Model; import org.apache.sling.provisioning.model.ModelUtility; import org.apache.sling.provisioning.model.ModelUtility.ResolverOptions; @@ -37,8 +40,11 @@ public abstract class ProjectHelper { private static final String EFFECTIVE_MODEL_TXT = Model.class.getName() + "/effective.txt"; private static final String EFFECTIVE_MODEL_CACHE = Model.class.getName() + "/effective.cache"; + private static final String DEPENDENCY_MODEL = Model.class.getName() + "/dependency"; + /** - * + * Store all relevant information about the project for plugins to be + * retrieved * @param info The project info * @throws IOException If writing fails */ @@ -52,6 +58,15 @@ public abstract class ProjectHelper { final StringWriter w2 = new StringWriter(); ModelWriter.write(w2, info.model); info.project.setContextValue(EFFECTIVE_MODEL_TXT, w2.toString()); + + // create map with model dependencies + final Map<String, String> map = new HashMap<String, String>(); + for(final Map.Entry<Artifact, Model> entry : info.includedModels.entrySet()) { + final StringWriter w3 = new StringWriter(); + ModelWriter.write(w3, entry.getValue()); + map.put(entry.getKey().toMvnUrl(), w3.toString()); + } + info.project.setContextValue(DEPENDENCY_MODEL, map); } /** @@ -96,4 +111,16 @@ public abstract class ProjectHelper { } return result; } + + /** + * Get the dependency model from the project + * @param project The maven projet + * @return The dependency model + * @throws MojoExecutionException If reading fails + */ + @SuppressWarnings("unchecked") + public static Map<String, String> getDependencyModel(final MavenProject project) + throws MojoExecutionException { + return (Map<String, String>) project.getContextValue(DEPENDENCY_MODEL); + } } diff --git a/src/main/java/org/apache/sling/maven/slingstart/RepositoryMojo.java b/src/main/java/org/apache/sling/maven/slingstart/RepositoryMojo.java index fa7301a..6f4f1f5 100644 --- a/src/main/java/org/apache/sling/maven/slingstart/RepositoryMojo.java +++ b/src/main/java/org/apache/sling/maven/slingstart/RepositoryMojo.java @@ -17,9 +17,13 @@ package org.apache.sling.maven.slingstart; import java.io.File; +import java.io.FileWriter; import java.io.IOException; +import java.io.Writer; +import java.util.Map; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.apache.maven.MavenExecutionException; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; @@ -32,7 +36,9 @@ import org.apache.maven.plugins.annotations.ResolutionScope; 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.ModelUtility; import org.apache.sling.provisioning.model.RunMode; +import org.apache.sling.provisioning.model.io.ModelWriter; /** * Create a mvn repository structure from the artifacts @@ -61,6 +67,7 @@ public class RepositoryMojo extends AbstractSlingStartMojo { this.getLog().info("Creating repository..."); final File artifactDir = new File(this.project.getBuild().getDirectory(), DIR_NAME); + // artifacts final Model model = ProjectHelper.getEffectiveModel(this.project, getResolverOptions()); for(final Feature feature : model.getFeatures()) { @@ -72,6 +79,7 @@ public class RepositoryMojo extends AbstractSlingStartMojo { } } } + // base artifact try { final org.apache.sling.provisioning.model.Artifact baseArtifact = ModelUtils.findBaseArtifact(model); final org.apache.sling.provisioning.model.Artifact appArtifact = @@ -84,17 +92,64 @@ public class RepositoryMojo extends AbstractSlingStartMojo { } catch ( final MavenExecutionException mee) { throw new MojoExecutionException(mee.getMessage(), mee.getCause()); } + // models + Model rawModel = ProjectHelper.getRawModel(this.project); + if (usePomVariables) { + rawModel = ModelUtility.applyVariables(rawModel, new PomVariableResolver(project)); + } + if (usePomDependencies) { + rawModel = ModelUtility.applyArtifactVersions(rawModel, new PomArtifactVersionResolver(project, allowUnresolvedPomDependencies)); + } + + final String classifier = (project.getPackaging().equals(BuildConstants.PACKAGING_PARTIAL_SYSTEM) ? null : BuildConstants.PACKAGING_PARTIAL_SYSTEM); + final org.apache.sling.provisioning.model.Artifact rawModelArtifact = + new org.apache.sling.provisioning.model.Artifact( + this.project.getGroupId(), + this.project.getArtifactId(), + this.project.getVersion(), + classifier, + BuildConstants.TYPE_TXT); + final File rawModelFile = getRepositoryFile(artifactDir, rawModelArtifact); + + Writer writer = null; + try { + writer = new FileWriter(rawModelFile); + ModelWriter.write(writer, rawModel); + } catch (IOException e) { + throw new MojoExecutionException("Unable to write model to " + rawModelFile, e); + } finally { + IOUtils.closeQuietly(writer); + } + for(final Map.Entry<String, String> entry : ProjectHelper.getDependencyModel(this.project).entrySet()) { + final org.apache.sling.provisioning.model.Artifact modelDepArtifact = org.apache.sling.provisioning.model.Artifact.fromMvnUrl(entry.getKey()); + final String modelClassifier = (modelDepArtifact.getType().equals(BuildConstants.PACKAGING_SLINGSTART) ? BuildConstants.PACKAGING_PARTIAL_SYSTEM : modelDepArtifact.getClassifier()); + final org.apache.sling.provisioning.model.Artifact modelArtifact = new org.apache.sling.provisioning.model.Artifact( + modelDepArtifact.getGroupId(), + modelDepArtifact.getArtifactId(), + modelDepArtifact.getVersion(), + modelClassifier, + BuildConstants.TYPE_TXT); + final File modelFile = getRepositoryFile(artifactDir, modelArtifact); + Writer modelWriter = null; + try { + modelWriter = new FileWriter(modelFile); + modelWriter.write(entry.getValue()); + } catch (IOException e) { + throw new MojoExecutionException("Unable to write model to " + modelFile, e); + } finally { + IOUtils.closeQuietly(modelWriter); + } + } } /** - * Copy a single artifact to the repository - * @throws MojoExecutionException + * Get the file in the repository directory + * @param artifactDir The base artifact directory + * @param artifact The artifact + * @return The file */ - private void copyArtifactToRepository(final org.apache.sling.provisioning.model.Artifact artifact, - final File artifactDir) - throws MojoExecutionException { - + private File getRepositoryFile(final File artifactDir, final org.apache.sling.provisioning.model.Artifact artifact) { final StringBuilder artifactNameBuilder = new StringBuilder(); artifactNameBuilder.append(artifact.getArtifactId()); artifactNameBuilder.append('-'); @@ -120,6 +175,18 @@ public class RepositoryMojo extends AbstractSlingStartMojo { final File artifactFile = new File(artifactDir, destPath); artifactFile.getParentFile().mkdirs(); + return artifactFile; + } + + /** + * Copy a single artifact to the repository + * @throws MojoExecutionException + */ + private void copyArtifactToRepository(final org.apache.sling.provisioning.model.Artifact artifact, + final File artifactDir) + throws MojoExecutionException { + final File artifactFile = getRepositoryFile(artifactDir, artifact); + final Artifact source = ModelUtils.getArtifact(this.project, this.mavenSession, this.artifactHandlerManager, this.resolver, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType(), artifact.getClassifier()); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
