You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2018/06/15 12:27:16 UTC

[sling-slingstart-maven-plugin] branch master updated: SLING-7738 Slingstart Maven Plugin should allow substitution of project coordinates in feature model files

This is an automated email from the ASF dual-hosted git repository.

davidb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-slingstart-maven-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new f76b8bd  SLING-7738 Slingstart Maven Plugin should allow substitution of project coordinates in feature model files
f76b8bd is described below

commit f76b8bd213ee2c2c1131c0d41880f157e134c3e6
Author: David Bosschaert <da...@gmail.com>
AuthorDate: Fri Jun 15 13:26:55 2018 +0100

    SLING-7738 Slingstart Maven Plugin should allow substitution of project coordinates in feature model files
---
 .../maven/slingstart/FeatureModelConverter.java    | 72 +++++++++++++++++-----
 .../maven/slingstart/GenerateResourcesMojo.java    | 23 ++-----
 .../slingstart/FeatureModelConverterTest.java      | 22 +++++--
 .../src/main/features/simple_inherits.json         |  2 +-
 4 files changed, 83 insertions(+), 36 deletions(-)

diff --git a/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
index 26c4b5a..01887cb 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
@@ -27,55 +27,99 @@ import org.apache.sling.maven.slingstart.ModelPreprocessor.Environment;
 import org.apache.sling.maven.slingstart.ModelPreprocessor.ProjectInfo;
 
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
 public class FeatureModelConverter {
     static final String BUILD_DIR = "provisioning/converted";
 
-    public void convert(MavenSession session, Environment env) throws MavenExecutionException {
+    public static void convert(MavenSession session, Environment env) throws MavenExecutionException {
         Map<String, ProjectInfo> projs = env.modelProjects;
         for (ProjectInfo pi : projs.values()) {
             convert(session, pi.project);
         }
     }
 
-    private void convert(MavenSession session, MavenProject project) throws MavenExecutionException {
+    private static void convert(MavenSession session, MavenProject project) throws MavenExecutionException {
         File featuresDir = new File(project.getBasedir(), "src/main/features");
 
         File[] files = featuresDir.listFiles();
-        List<File> featureFiles;
-        if (files != null) {
-            featureFiles = Arrays.asList(files);
-        } else {
-            featureFiles = Collections.emptyList();
+        if (files == null || files.length == 0)
+            return;
+
+        ArtifactManager am;
+        try {
+            am = getArtifactManager(project, session);
+        } catch (IOException ex) {
+            throw new MavenExecutionException("Unable to obtain artifactManager", ex);
         }
 
-        if (featureFiles.size() == 0)
-            return;
+        convert(files, project, am);
+    }
+
+    static void convert(File[] files, MavenProject project, ArtifactManager am) throws MavenExecutionException {
+        File processedFeaturesDir = new File(project.getBuild().getDirectory(), "features/processed");
+        processedFeaturesDir.mkdirs();
+
+        List<File> substedFiles = new ArrayList<>();
+        for (File f : files) {
+            if (!f.getName().endsWith(".json")) {
+                continue;
+            }
+
+            try {
+                substedFiles.add(substituteVars(project, f, processedFeaturesDir));
+            } catch (IOException e) {
+                throw new MavenExecutionException("Problem processing feature file " + f.getAbsolutePath(), e);
+            }
+        }
 
         File targetDir = new File(project.getBuild().getDirectory(), BUILD_DIR);
         targetDir.mkdirs();
 
         try {
-            ArtifactManager am = getArtifactManager(project, session);
             for (File f : files) {
                 if (!f.getName().endsWith(".json")) {
                     continue;
                 }
                 File genFile = new File(targetDir, f.getName() + ".txt");
-                FeatureToProvisioning.convert(f, genFile, am, files);
+                FeatureToProvisioning.convert(f, genFile, am, substedFiles.toArray(new File[] {}));
             }
         } catch (Exception e) {
             throw new MavenExecutionException("Cannot convert feature files to provisioning model", e);
         }
     }
 
-    private ArtifactManager getArtifactManager(MavenProject project, MavenSession session)
+    private static File substituteVars(MavenProject project, File f, File processedFeaturesDir) throws IOException {
+        File file = new File(processedFeaturesDir, f.getName());
+
+        if (file.exists() && file.lastModified() > f.lastModified()) {
+            // The file already exists, so we don't need to write it again
+            return file;
+        }
+
+        try (FileWriter fw = new FileWriter(file)) {
+            for (String s : Files.readAllLines(f.toPath())) {
+                fw.write(replaceVars(project, s));
+                fw.write(System.getProperty("line.separator"));
+            }
+        }
+        return file;
+    }
+
+    static String replaceVars(MavenProject project, String s) {
+        // There must be a better way than enumerating all these?
+        s = s.replaceAll("\\Q${project.groupId}\\E", project.getGroupId());
+        s = s.replaceAll("\\Q${project.artifactId}\\E", project.getArtifactId());
+        s = s.replaceAll("\\Q${project.version}\\E", project.getVersion());
+        return s;
+    }
+
+    private static ArtifactManager getArtifactManager(MavenProject project, MavenSession session)
             throws IOException {
         List<String> repos = new ArrayList<>();
         repos.add(session.getLocalRepository().getUrl());
diff --git a/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java b/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
index 273d119..195883c 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.maven.slingstart;
 
+import org.apache.maven.MavenExecutionException;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
@@ -29,13 +30,11 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.sling.feature.io.ArtifactManager;
 import org.apache.sling.feature.io.ArtifactManagerConfig;
-import org.apache.sling.feature.modelconverter.FeatureToProvisioning;
 import org.codehaus.plexus.archiver.manager.ArchiverManager;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 @Mojo(
@@ -72,22 +71,12 @@ public class GenerateResourcesMojo extends AbstractSlingStartMojo {
         if (featureFiles == null)
             return;
 
-        File targetDir = new File(project.getBuild().getDirectory(), FeatureModelConverter.BUILD_DIR);
-        targetDir.mkdirs();
-
         try {
-            ArtifactManager am = getArtifactManager();
-            List<File> files = Arrays.asList(featureFiles);
-            for (File f : files) {
-                if (!f.getName().endsWith(".json")) {
-                    continue;
-                }
-
-                File genFile = new File(targetDir, f.getName() + ".txt");
-                FeatureToProvisioning.convert(f, genFile, am, files.toArray(new File[] {}));
-            }
-        } catch (Exception e) {
-            throw new MojoExecutionException("Cannot convert feature files to provisioning model", e);
+            FeatureModelConverter.convert(featureFiles, project, getArtifactManager());
+        } catch (MavenExecutionException e) {
+            throw new MojoExecutionException("Cannot convert feature files to provisioning model.", e);
+        } catch (IOException e) {
+            throw new MojoExecutionException("Problem obtaining artifact manager.", e);
         }
     }
 
diff --git a/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java b/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java
index fa1d507..55590eb 100644
--- a/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java
@@ -33,6 +33,7 @@ import java.io.IOException;
 import java.net.URL;
 import java.nio.file.Files;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -87,8 +88,7 @@ public class FeatureModelConverterTest {
         Environment env = new Environment();
         env.modelProjects.put("xyz", pi);
 
-        FeatureModelConverter fmc = new FeatureModelConverter();
-        fmc.convert(session, env);
+        FeatureModelConverter.convert(session, env);
 
         File expectedFile = new File(tempDir, "/provisioning/converted/boot_gav.json.txt");
         assertTrue(expectedFile.exists());
@@ -113,6 +113,7 @@ public class FeatureModelConverterTest {
         MavenProject proj = Mockito.mock(MavenProject.class);
         Mockito.when(proj.getBasedir()).thenReturn(projBaseDir);
         Mockito.when(proj.getBuild()).thenReturn(build);
+        Mockito.when(proj.getGroupId()).thenReturn("generated");
 
         ProjectInfo pi = new ProjectInfo();
         pi.project = proj;
@@ -120,8 +121,7 @@ public class FeatureModelConverterTest {
         Environment env = new Environment();
         env.modelProjects.put("xyz", pi);
 
-        FeatureModelConverter fmc = new FeatureModelConverter();
-        fmc.convert(session, env);
+        FeatureModelConverter.convert(session, env);
 
         File simpleProvFile = new File(tempDir, "/provisioning/converted/simple.json.txt");
         String simpleProv = new String(Files.readAllBytes(simpleProvFile.toPath()));
@@ -133,4 +133,18 @@ public class FeatureModelConverterTest {
         assertTrue(inheritsProv.contains("org.apache.aries/org.apache.aries.util/1.1.3"));
         assertTrue(inheritsProv.contains("org.apache.sling/org.apache.sling.commons.log/5.1.0"));
     }
+
+    @Test
+    public void testReplaceVars() {
+        MavenProject mp = Mockito.mock(MavenProject.class);
+
+        Mockito.when(mp.getGroupId()).thenReturn("abc");
+        Mockito.when(mp.getArtifactId()).thenReturn("a.b.c");
+        Mockito.when(mp.getVersion()).thenReturn("1.2.3-SNAPSHOT");
+
+        assertEquals("xxxabcyyy", FeatureModelConverter.replaceVars(mp,
+                "xxx${project.groupId}yyy"));
+        assertEquals("xxxabcyyya.b.c1.2.3-SNAPSHOT", FeatureModelConverter.replaceVars(mp,
+                "xxx${project.groupId}yyy${project.artifactId}${project.version}"));
+    }
 }
diff --git a/src/test/resources/features3/src/main/features/simple_inherits.json b/src/test/resources/features3/src/main/features/simple_inherits.json
index 02c4e20..04a3734 100644
--- a/src/test/resources/features3/src/main/features/simple_inherits.json
+++ b/src/test/resources/features3/src/main/features/simple_inherits.json
@@ -1,5 +1,5 @@
 {
-  "id":"generated:simple-inherits:1.0.0",
+  "id":"${project.groupId}:simple-inherits:1.0.0",
   "includes": [
        {
            "id": "generated:simple:1.0.0"

-- 
To stop receiving notification emails like this one, please contact
davidb@apache.org.