SLING-8664 - Sling Starter dependency import for projects built on top of it

Add a new 'attach-dependencies-pom' goal which generates a pom to be
imported into other projects.
diff --git a/src/main/java/org/apache/sling/maven/slingstart/AttachDependenciesPom.java b/src/main/java/org/apache/sling/maven/slingstart/AttachDependenciesPom.java
new file mode 100644
index 0000000..a47488f
--- /dev/null
+++ b/src/main/java/org/apache/sling/maven/slingstart/AttachDependenciesPom.java
@@ -0,0 +1,100 @@
+/*
+ * 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.File;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.stream.StreamSupport;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+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;
+import org.apache.maven.shared.utils.WriterFactory;
+import org.apache.sling.provisioning.model.Artifact;
+import org.apache.sling.provisioning.model.Model;
+import org.apache.sling.provisioning.model.ModelUtility;
+
+/**
+ * Attaches a dependencies pom as project artifact 
+ */
+@Mojo(
+        name = "attach-dependencies-pom",
+        defaultPhase = LifecyclePhase.PACKAGE,
+        requiresDependencyResolution = ResolutionScope.COMPILE,
+        threadSafe = true
+    )
+public class AttachDependenciesPom extends AbstractSlingStartMojo {
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+
+        Model model = ProjectHelper.getRawModel(this.project);
+        if (usePomVariables) {
+            model = ModelUtility.applyVariables(model, new PomVariableResolver(project));
+        }
+        if (usePomDependencies) {
+            model = ModelUtility.applyArtifactVersions(model, new PomArtifactVersionResolver(project, allowUnresolvedPomDependencies));
+        }
+
+        // write the model archive
+        final File outputFile = new File(this.project.getBuild().getDirectory(), project.getBuild().getFinalName() + "-" + BuildConstants.CLASSIFIER_DEPENDENCIES + "." + BuildConstants.TYPE_POM);
+        outputFile.getParentFile().mkdirs();
+        
+        try {
+            try ( Writer wf = WriterFactory.newXmlWriter(outputFile) ) {
+                org.apache.maven.model.Model mavenModel = new org.apache.maven.model.Model();
+                mavenModel.setName(project.getName() + " (Dependencies)");
+                mavenModel.setGroupId(project.getGroupId());
+                mavenModel.setArtifactId(project.getArtifactId());
+                mavenModel.setVersion(project.getVersion());
+                mavenModel.setDependencyManagement(new DependencyManagement());
+
+                model.getFeatures().stream()
+                    .flatMap( d -> d.getRunModes().stream() )
+                    .flatMap( r -> r.getArtifactGroups().stream() )
+                    .flatMap( ag -> StreamSupport.stream(ag.spliterator(), false))
+                    .forEach( a -> addDependency(a, mavenModel) );
+                
+                new MavenXpp3Writer().write( wf, mavenModel );
+            }
+                
+        } catch (IOException e) {
+            throw new MojoExecutionException("Failed writing dependencies POM", e);
+        }
+
+        // attach it as an additional artifact
+        projectHelper.attachArtifact(project, BuildConstants.TYPE_POM,
+                    BuildConstants.CLASSIFIER_DEPENDENCIES, outputFile);
+    }
+
+    private void addDependency(Artifact a, org.apache.maven.model.Model model) {
+        Dependency dep = new Dependency();
+        dep.setScope("provided");
+        dep.setGroupId(a.getGroupId());
+        dep.setArtifactId(a.getArtifactId());
+        dep.setVersion(a.getVersion());
+
+        model.getDependencyManagement().addDependency(dep);
+    }
+
+}
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 3da52da..71907ab 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java
@@ -57,6 +57,8 @@
     public static final String CLASSIFIER_WEBAPP = "webapp";
 
     public static final String CLASSIFIER_MAR = ModelArchiveWriter.DEFAULT_EXTENSION;
+    
+    public static final String CLASSIFIER_DEPENDENCIES = "dependencies";
 
     // Manifest attributes
 
diff --git a/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml b/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
index 4aea0a2..ca2260e 100644
--- a/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
+++ b/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
@@ -23,6 +23,7 @@
                 <goals>
                     <goal>attach-slingfeature</goal>
                     <goal>attach-modelarchive</goal>
+                    <goal>attach-dependencies-pom</goal>
                     <goal>repository</goal>
                     <goal>package</goal>
                     <goal>prepare-package</goal>
diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml
index c05d45e..cf8bce6 100644
--- a/src/main/resources/META-INF/plexus/components.xml
+++ b/src/main/resources/META-INF/plexus/components.xml
@@ -55,6 +55,7 @@
               <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
               <prepare-package>org.apache.sling:slingstart-maven-plugin:prepare-package</prepare-package>              
               <package>
+                  org.apache.sling:slingstart-maven-plugin:attach-dependencies-pom,
                   org.apache.sling:slingstart-maven-plugin:attach-slingfeature,
                   org.apache.sling:slingstart-maven-plugin:package
               </package>