You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2018/11/22 17:41:04 UTC

[sling-slingfeature-maven-plugin] branch master updated: SLING-8128 : Consistent ordering of sections when merging features

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 35eb3f4  SLING-8128 : Consistent ordering of sections when merging features
35eb3f4 is described below

commit 35eb3f428b3c00dbd5f9395289bffb7aa619bbe9
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Thu Nov 22 18:40:56 2018 +0100

    SLING-8128 : Consistent ordering of sections when merging features
---
 .../maven/mojos/AbstractIncludingFeatureMojo.java  | 116 +++++++++------------
 .../sling/feature/maven/mojos/Aggregate.java       |   3 +-
 .../maven/mojos/FeatureSelectionConfig.java        |  47 +++++----
 .../sling/feature/maven/mojos/Repository.java      |   3 +-
 .../org/apache/sling/feature/maven/mojos/Scan.java |   3 +-
 5 files changed, 81 insertions(+), 91 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/AbstractIncludingFeatureMojo.java b/src/main/java/org/apache/sling/feature/maven/mojos/AbstractIncludingFeatureMojo.java
index 33ae4cd..2b59435 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/AbstractIncludingFeatureMojo.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/AbstractIncludingFeatureMojo.java
@@ -26,7 +26,6 @@ import java.util.TreeMap;
 
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.sling.feature.ArtifactId;
@@ -44,15 +43,23 @@ public abstract class AbstractIncludingFeatureMojo extends AbstractFeatureMojo {
 
     protected Map<String, Feature> getSelectedFeatures(final FeatureSelectionConfig config)
             throws MojoExecutionException {
-        final Map<String, Feature> selection = new LinkedHashMap<>();
-
-        selectFeatureFiles(config, selection);
-
-        selectFeatureClassifiers(config, selection);
-
-        selectFeatureArtifacts(config, selection);
+        final Map<String, Feature> result = new LinkedHashMap<>();
+
+        for(final FeatureSelectionConfig.Selection selection : config.getSelections()) {
+            switch ( selection.type ) {
+            case FILE_INCLUDE:
+                selectFeatureFiles(selection.instruction, config.getFilesExcludes(), result);
+                break;
+            case AGGREGATE_CLASSIFIER:
+                selectFeatureClassifier(selection.instruction, result);
+                break;
+            case ARTIFACT:
+                selectFeatureArtifact(selection.instruction, result);
+                break;
+            }
+        }
 
-        return selection;
+        return result;
     }
 
     protected Map<String, Feature> selectAllFeatureFiles() throws MojoExecutionException {
@@ -69,76 +76,57 @@ public abstract class AbstractIncludingFeatureMojo extends AbstractFeatureMojo {
         return this.getSelectedFeatures(config);
     }
 
-    private void selectFeatureClassifiers(final FeatureSelectionConfig config, final Map<String, Feature> selection)
+    private void selectFeatureClassifier(final String selection, final Map<String, Feature> result)
             throws MojoExecutionException {
         final Map<String, Feature> projectFeatures = ProjectHelper.getAssembledFeatures(this.project);
-        boolean includeAll = false;
-        for (final String c : config.getIncludeClassifiers()) {
-            if ("*".equals(c)) {
-                includeAll = true;
-            }
-        }
-        if (includeAll && config.getIncludeClassifiers().size() > 1) {
-            throw new MojoExecutionException("Match all (*) and additional classifiers are specified.");
-        }
+        boolean includeAll = "*".equals(selection);
         for (final Map.Entry<String, Feature> entry : projectFeatures.entrySet()) {
             if (ProjectHelper.isAggregate(entry.getKey())) {
                 final String classifier = entry.getValue().getId().getClassifier();
                 boolean include = includeAll;
                 if (!include) {
-                    for (final String c : config.getIncludeClassifiers()) {
-                        if (c.trim().length() == 0 && classifier == null) {
-                            include = true;
-                        } else if (c.equals(classifier)) {
-                            include = true;
-                        }
+                    if (selection.trim().length() == 0 && classifier == null) {
+                        include = true;
+                    } else if (selection.equals(classifier)) {
+                        include = true;
                     }
                 }
                 if (include) {
-                    selection.put(entry.getKey(), entry.getValue());
+                    result.put(entry.getKey(), entry.getValue());
                 }
             }
         }
     }
 
-    private void selectFeatureFiles(final FeatureSelectionConfig config, final Map<String, Feature> selection)
+    private void selectFeatureFiles(final String include, final List<String> excludes,
+            final Map<String, Feature> result)
             throws MojoExecutionException {
-        // neither includes nor excludes - don't select any file
-        if (config.getFilesIncludes().isEmpty() && config.getFilesExcludes().isEmpty()) {
-            return;
-        }
         final Map<String, Feature> projectFeatures = ProjectHelper.getAssembledFeatures(this.project);
 
         final String prefix = this.features.toPath().normalize().toFile().getAbsolutePath().concat(File.separator);
-        if (config.getFilesIncludes().isEmpty()) {
-            final FeatureScanner scanner = new FeatureScanner(projectFeatures, prefix);
-            if (!config.getFilesExcludes().isEmpty()) {
-                scanner.setExcludes(config.getFilesExcludes().toArray(new String[config.getFilesExcludes().size()]));
-            }
-            scanner.scan();
-            selection.putAll(scanner.getIncluded());
-        } else {
-            for (final String include : config.getFilesIncludes()) {
-                final FeatureScanner scanner = new FeatureScanner(projectFeatures, prefix);
-                if (!config.getFilesExcludes().isEmpty()) {
-                    scanner.setExcludes(config.getFilesExcludes().toArray(new String[config.getFilesExcludes().size()]));
-                }
-                scanner.setIncludes(new String[] { include });
-                scanner.scan();
+        final FeatureScanner scanner = new FeatureScanner(projectFeatures, prefix);
+        if (!excludes.isEmpty()) {
+            scanner.setExcludes(excludes.toArray(new String[excludes.size()]));
+        }
+        scanner.setIncludes(new String[] { include });
+        scanner.scan();
 
-                if (!include.contains("*") && scanner.getIncluded().isEmpty()) {
-                    throw new MojoExecutionException("FeatureInclude " + include + " not found.");
-                }
-                selection.putAll(scanner.getIncluded());
+        if (!include.contains("*") && scanner.getIncluded().isEmpty()) {
+            throw new MojoExecutionException("FeatureInclude " + include + " not found.");
+        }
+        for (Map.Entry<String, Feature> entry : scanner.getIncluded().entrySet()) {
+            if (!result.containsKey(entry.getKey())) {
+                result.put(entry.getKey(), entry.getValue());
             }
         }
-        if (!config.getFilesExcludes().isEmpty()) {
-            for (final String exclude : config.getFilesExcludes()) {
+
+        if (!excludes.isEmpty()) {
+            for (final String exclude : excludes) {
                 if (!exclude.contains("*")) {
-                    final FeatureScanner scanner = new FeatureScanner(projectFeatures, prefix);
-                    scanner.setIncludes(new String[] { exclude });
-                    scanner.scan();
-                    if (scanner.getIncluded().isEmpty()) {
+                    final FeatureScanner excludeScanner = new FeatureScanner(projectFeatures, prefix);
+                    excludeScanner.setIncludes(new String[] { exclude });
+                    excludeScanner.scan();
+                    if (excludeScanner.getIncluded().isEmpty()) {
                         throw new MojoExecutionException("FeatureExclude " + exclude + " not found.");
                     }
                 }
@@ -146,18 +134,16 @@ public abstract class AbstractIncludingFeatureMojo extends AbstractFeatureMojo {
         }
     }
 
-    private void selectFeatureArtifacts(final FeatureSelectionConfig config, final Map<String, Feature> selection)
+    private void selectFeatureArtifact(final String artifactId, final Map<String, Feature> result)
             throws MojoExecutionException {
-        for (final Dependency dep : config.getIncludeArtifacts()) {
-            final ArtifactId id = ProjectHelper.toArtifactId(dep);
-            if (ProjectHelper.isLocalProjectArtifact(this.project, id)) {
-                throw new MojoExecutionException(
+        final ArtifactId id = ArtifactId.parse(artifactId);
+        if (ProjectHelper.isLocalProjectArtifact(this.project, id)) {
+            throw new MojoExecutionException(
                         "FeatureArtifact configuration is used to select a local feature: " + id.toMvnId());
-            }
-            final Feature feature = ProjectHelper.getOrResolveFeature(this.project, this.mavenSession,
-                    this.artifactHandlerManager, this.artifactResolver, id);
-            selection.put(id.toMvnUrl(), feature);
         }
+        final Feature feature = ProjectHelper.getOrResolveFeature(this.project, this.mavenSession,
+                this.artifactHandlerManager, this.artifactResolver, id);
+        result.put(id.toMvnUrl(), feature);
     }
 
     public static class FeatureScanner extends AbstractScanner {
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/Aggregate.java b/src/main/java/org/apache/sling/feature/maven/mojos/Aggregate.java
index 9fa2e0a..e012d24 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/Aggregate.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/Aggregate.java
@@ -60,8 +60,7 @@ public class Aggregate extends FeatureSelectionConfig {
 
     @Override
     public String toString() {
-        return "Aggregate [filesIncludes=" + getFilesIncludes() + ", filesExcludes=" + getFilesExcludes()
-                + ", includeArtifacts=" + getIncludeArtifacts() + ", includeClassifiers=" + getIncludeClassifiers()
+        return "Aggregate [selection=" + getSelections() + ", filesExcludes=" + getFilesExcludes()
                 + ", classifier=" + classifier
                 + ", markAsFinal=" + markAsFinal + ", markAsComplete=" + markAsComplete + ", title=" + title
                 + ", description=" + description + ", vendor=" + vendor + ", artifactsOverrides=" + artifactsOverrides
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/FeatureSelectionConfig.java b/src/main/java/org/apache/sling/feature/maven/mojos/FeatureSelectionConfig.java
index 2d860bb..253cc72 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/FeatureSelectionConfig.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/FeatureSelectionConfig.java
@@ -20,55 +20,62 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.maven.model.Dependency;
+import org.apache.sling.feature.maven.ProjectHelper;
 
 public class FeatureSelectionConfig {
 
-    private List<String> filesIncludes = new ArrayList<>();
+    enum SelectionType {
+        FILE_INCLUDE, AGGREGATE_CLASSIFIER, ARTIFACT
+    }
+
+    static class Selection {
+        public final SelectionType type;
+        public final String instruction;
 
-    private List<String> filesExcludes = new ArrayList<>();
+        public Selection(final SelectionType type, final String instruction) {
+            this.type = type;
+            this.instruction = instruction;
+        }
+
+        @Override
+        public String toString() {
+            return "Selection [type=" + type + ", instruction=" + instruction + "]";
+        }
+    }
 
-    private List<Dependency> includeArtifacts = new ArrayList<>();
+    private final List<Selection> selections = new ArrayList<>();
 
-    private List<String> includeClassifiers = new ArrayList<>();
+    private final List<String> filesExcludes = new ArrayList<>();
 
     public FeatureSelectionConfig() {
     }
 
     public void setFilesInclude(final String val) {
-        filesIncludes.add(val);
+        selections.add(new Selection(SelectionType.FILE_INCLUDE, val));
     }
 
     public void setFilesExclude(final String val) {
-        filesExcludes.add(val);
+        this.filesExcludes.add(val);
     }
 
     public void setIncludeArtifact(final Dependency a) {
-        includeArtifacts.add(a);
+        selections.add(new Selection(SelectionType.ARTIFACT, ProjectHelper.toArtifactId(a).toMvnId()));
     }
 
     public void setIncludeClassifier(final String classifier) {
-        includeClassifiers.add(classifier);
-    }
-
-    public List<String> getFilesIncludes() {
-        return this.filesIncludes;
+        selections.add(new Selection(SelectionType.AGGREGATE_CLASSIFIER, classifier));
     }
 
     public List<String> getFilesExcludes() {
         return this.filesExcludes;
     }
 
-    public List<String> getIncludeClassifiers() {
-        return this.includeClassifiers;
-    }
-
-    public List<Dependency> getIncludeArtifacts() {
-        return this.includeArtifacts;
+    public List<Selection> getSelections() {
+        return this.selections;
     }
 
     @Override
     public String toString() {
-        return "FeatureSelectionConfig [filesIncludes=" + filesIncludes + ", filesExcludes=" + filesExcludes
-                + ", includeArtifacts=" + includeArtifacts + ", includeClassifiers=" + includeClassifiers + "]";
+        return "FeatureSelectionConfig [selections=" + selections + ", filesExcludes=" + filesExcludes + "]";
     }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/Repository.java b/src/main/java/org/apache/sling/feature/maven/mojos/Repository.java
index c7ed966..74894f8 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/Repository.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/Repository.java
@@ -41,8 +41,7 @@ public class Repository extends FeatureSelectionConfig {
 
     @Override
     public String toString() {
-        return "Repository [filesIncludes=" + getFilesIncludes() + ", filesExcludes=" + getFilesExcludes()
-                + ", includeArtifacts=" + getIncludeArtifacts() + ", includeClassifiers=" + getIncludeClassifiers()
+        return "Repository [selections=" + getSelections() + ", filesExcludes=" + getFilesExcludes()
                 + ", embedArtifacts="
                 + embedArtifacts + ", repositoryDir="
                 + repositoryDir + "]";
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/Scan.java b/src/main/java/org/apache/sling/feature/maven/mojos/Scan.java
index 0936996..c73c9ee 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/Scan.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/Scan.java
@@ -69,8 +69,7 @@ public class Scan extends FeatureSelectionConfig {
 
     @Override
     public String toString() {
-        return "Scan [filesIncludes=" + getFilesIncludes() + ", filesExcludes=" + getFilesExcludes()
-                + ", includeArtifacts=" + getIncludeArtifacts() + ", includeClassifiers=" + getIncludeClassifiers()
+        return "Scan [selections=" + getSelections() + ", filesExcludes=" + getFilesExcludes()
                 + "includeTasks=" + includeTasks
                 + ", excludeTasks=" + excludeTasks + ", contextConfiguration=" + taskConfiguration + ", framework="
                 + ProjectHelper.toString(framework) + "]";