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 2019/06/24 13:59:33 UTC

[sling-slingfeature-maven-plugin] branch master updated: SLING-8530 : Provide more control for attaching 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 de0f7e3  SLING-8530 : Provide more control for attaching features
de0f7e3 is described below

commit de0f7e365c9c06ea689e13cee8d73d75bafca2f2
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Mon Jun 24 15:58:35 2019 +0200

    SLING-8530 : Provide more control for attaching features
---
 .../apache/sling/feature/maven/ProjectHelper.java  | 56 +++++++++++----------
 .../sling/feature/maven/mojos/Aggregate.java       |  9 +++-
 .../feature/maven/mojos/AggregateFeaturesMojo.java |  4 +-
 .../feature/maven/mojos/AttachFeaturesMojo.java    | 39 ++++++++++-----
 .../maven/mojos/AggregateFeaturesMojoTest.java     | 58 +++++++++++-----------
 .../maven/mojos/AttachFeaturesMojoTest.java        | 11 ++--
 6 files changed, 103 insertions(+), 74 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/maven/ProjectHelper.java b/src/main/java/org/apache/sling/feature/maven/ProjectHelper.java
index c491b0f..901b6d8 100644
--- a/src/main/java/org/apache/sling/feature/maven/ProjectHelper.java
+++ b/src/main/java/org/apache/sling/feature/maven/ProjectHelper.java
@@ -16,6 +16,23 @@
  */
 package org.apache.sling.feature.maven;
 
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
@@ -34,23 +51,6 @@ import org.apache.sling.feature.io.json.FeatureJSONReader;
 import org.apache.sling.feature.io.json.FeatureJSONWriter;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
-
 /**
  * The project helper contains utility functions and provides access
  * to the already read and processed features and test features.
@@ -332,13 +332,14 @@ public abstract class ProjectHelper {
     		sb.append('[');
     	}
         boolean first = true;
-        for(final String key : featureKeys) {
+        for (String key : featureKeys) {
         	if ( first ) {
         		first = false;
         	} else {
         		sb.append(", ");
         	}
         	if ( key.startsWith(AGGREGATE_PREFIX) ) {
+                key = key.substring(0, key.length() - 2);
         		sb.append("aggregate ");
                 if (key.length() == AGGREGATE_PREFIX.length()) {
                     sb.append("main artifact (no classifier)");
@@ -359,8 +360,13 @@ public abstract class ProjectHelper {
     	return featureKey.startsWith(AGGREGATE_PREFIX);
     }
 
-    public static String generateAggregateFeatureKey(final String classifier) {
-        return classifier != null ? AGGREGATE_PREFIX.concat(classifier) : AGGREGATE_PREFIX;
+    public static boolean isAttachAggregate(final String featureKey) {
+        return isAggregate(featureKey) && featureKey.endsWith(":T");
+    }
+
+    public static String generateAggregateFeatureKey(final String classifier, final boolean attach) {
+        return (classifier != null ? AGGREGATE_PREFIX.concat(classifier) : AGGREGATE_PREFIX).concat(":")
+                .concat(attach ? "T" : "F");
     }
 
     private static final String NULL_KEY = ":";
@@ -380,7 +386,7 @@ public abstract class ProjectHelper {
      * @param project The maven project
      */
     public static void validateFeatureClassifiers(final MavenProject project) {
-        validateFeatureClassifiers(project, false, null);
+        validateFeatureClassifiers(project, false, null, false);
     }
 
     /**
@@ -389,8 +395,8 @@ public abstract class ProjectHelper {
      * @param additionalClassifier Optional additional classifier
      */
     public static void validateFeatureClassifiers(final MavenProject project,
-    		final String additionalClassifier) {
-        validateFeatureClassifiers(project, true, additionalClassifier);
+            final String additionalClassifier, final boolean attachFeature) {
+        validateFeatureClassifiers(project, true, additionalClassifier, attachFeature);
     }
 
     /**
@@ -400,7 +406,7 @@ public abstract class ProjectHelper {
      * @param additionalClassifier Optional additional classifier
      */
     private static void validateFeatureClassifiers(final MavenProject project, final boolean classifierProvided,
-            final String additionalClassifier) {
+            final String additionalClassifier, final boolean attachFeature) {
 
         final Map<String, List<String>> classifiers = new HashMap<>();
         for(final Map.Entry<String, Feature> entry : getFeatures(project).entrySet()) {
@@ -413,7 +419,7 @@ public abstract class ProjectHelper {
         	addClassifier(classifiers, entry.getValue().getId().getClassifier(), entry.getKey());
         }
         if (classifierProvided) {
-        	final String key = ProjectHelper.generateAggregateFeatureKey(additionalClassifier);
+            final String key = ProjectHelper.generateAggregateFeatureKey(additionalClassifier, attachFeature);
         	addClassifier(classifiers, additionalClassifier, key);
         }
         for(final Map.Entry<String, List<String>> entry : classifiers.entrySet()) {
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 91c0d47..dbdf75f 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
@@ -33,6 +33,12 @@ public class Aggregate extends FeatureSelectionConfig {
     public String classifier;
 
     /**
+     * If this is set to {@code false} the feature is not added to the project
+     * artifacts.
+     */
+    public boolean attach = true;
+
+    /**
      * If this is set to {@code true} the feature is marked as final.
      */
     public boolean markAsFinal = false;
@@ -66,12 +72,13 @@ public class Aggregate extends FeatureSelectionConfig {
     @Override
     public String toString() {
         return "Aggregate [selection=" + getSelections() + ", filesExcludes=" + getFilesExcludes()
-                + ", classifier=" + classifier
+                + ", classifier=" + classifier + ", attach=" + attach
                 + ", markAsFinal=" + markAsFinal + ", markAsComplete=" + markAsComplete + ", title=" + title
                 + ", description=" + description + ", vendor=" + vendor + ", artifactsOverrides=" + artifactsOverrides
                 + ", variablesOverrides=" + variablesOverrides + ", frameworkPropertiesOverrides=" + frameworkPropertiesOverrides + "]";
     }
 
+    @SuppressWarnings("unchecked")
     public List<ArtifactId> getArtifactOverrideRules() {
         if (artifactsOverrides == null) {
             return Collections.emptyList();
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojo.java b/src/main/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojo.java
index f112e8a..e6f83e0 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojo.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojo.java
@@ -71,7 +71,7 @@ public class AggregateFeaturesMojo extends AbstractIncludingFeatureMojo {
         ProjectHelper.checkPreprocessorRun(this.project);
         for (final Aggregate aggregate : aggregates) {
             // check classifier
-            ProjectHelper.validateFeatureClassifiers(this.project, aggregate.classifier);
+            ProjectHelper.validateFeatureClassifiers(this.project, aggregate.classifier, aggregate.attach);
 
             final Map<String, Feature> selection = this.getSelectedFeatures(aggregate);
             if (selection.isEmpty()) {
@@ -192,7 +192,7 @@ public class AggregateFeaturesMojo extends AbstractIncludingFeatureMojo {
             ProjectHelper.setFeatureInfo(project, result);
 
             // Add feature to map of features
-            final String key = ProjectHelper.generateAggregateFeatureKey(aggregate.classifier);
+            final String key = ProjectHelper.generateAggregateFeatureKey(aggregate.classifier, aggregate.attach);
             ProjectHelper.getAssembledFeatures(project).put(key, result);
             ProjectHelper.getFeatures(this.project).put(key, result);
         }
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojo.java b/src/main/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojo.java
index 2296bda..85040a0 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojo.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojo.java
@@ -21,8 +21,8 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -46,7 +46,13 @@ import org.apache.sling.feature.maven.ProjectHelper;
     )
 public class AttachFeaturesMojo extends AbstractFeatureMojo {
     /**
-     * Attach test features
+     * Attach main features (source)
+     */
+    @Parameter(name = "attachMainFeatures", defaultValue = "true")
+    private boolean attachMainFeatures;
+
+    /**
+     * Attach test features (source)
      */
     @Parameter(name = "attachTestFeatures",
             defaultValue = "false")
@@ -64,9 +70,9 @@ public class AttachFeaturesMojo extends AbstractFeatureMojo {
     @Parameter(name = "referenceFileClassifier")
     private String referenceFileClassifier;
 
-    private void attach(final Feature feature,
-            final String classifier)
+    private void attach(final Feature feature)
     throws MojoExecutionException {
+        final String classifier = feature.getId().getClassifier();
         // write the feature
         final File outputFile = new File(this.getTmpDir(), classifier == null ? "feature.json" : "feature-" + classifier + ".json");
         outputFile.getParentFile().mkdirs();
@@ -92,11 +98,10 @@ public class AttachFeaturesMojo extends AbstractFeatureMojo {
     public void execute() throws MojoExecutionException, MojoFailureException {
         ProjectHelper.checkPreprocessorRun(this.project);
         final List<String> featureUrls = new ArrayList<>();
-        this.attachClassifierFeatures(ProjectHelper.getFeatures(this.project).values(), featureUrls);
+        this.attachClassifierFeatures(ProjectHelper.getFeatures(this.project), featureUrls, this.attachMainFeatures);
+        this.attachClassifierFeatures(ProjectHelper.getTestFeatures(this.project), featureUrls,
+                this.attachTestFeatures);
 
-        if ( this.attachTestFeatures ) {
-            this.attachClassifierFeatures(ProjectHelper.getTestFeatures(this.project).values(), featureUrls);
-        }
         if (this.createReferenceFile) {
             this.createReferenceFile(featureUrls);
         }
@@ -131,11 +136,21 @@ public class AttachFeaturesMojo extends AbstractFeatureMojo {
      * Attach all features
      * @throws MojoExecutionException
      */
-    void attachClassifierFeatures(final Collection<Feature> features, final List<String> featureUrls)
+    void attachClassifierFeatures(final Map<String, Feature> features, final List<String> featureUrls,
+            final boolean addSourceFeatures)
             throws MojoExecutionException {
-        for (final Feature f : features) {
-            attach(f, f.getId().getClassifier());
-            featureUrls.add(f.getId().toMvnUrl());
+        for (final Map.Entry<String, Feature> entry : features.entrySet()) {
+            final boolean add;
+            if (ProjectHelper.isAggregate(entry.getKey())) {
+                add = ProjectHelper.isAttachAggregate(entry.getKey());
+            } else {
+                add = addSourceFeatures;
+            }
+
+            if (add) {
+                attach(entry.getValue());
+                featureUrls.add(entry.getValue().getId().toMvnUrl());
+            }
         }
     }
 }
diff --git a/src/test/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojoTest.java b/src/test/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojoTest.java
index 5893a56..1c34127 100644
--- a/src/test/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojoTest.java
+++ b/src/test/java/org/apache/sling/feature/maven/mojos/AggregateFeaturesMojoTest.java
@@ -16,6 +16,29 @@
  */
 package org.apache.sling.feature.maven.mojos;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileReader;
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -42,29 +65,6 @@ import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-import java.io.File;
-import java.io.FileReader;
-import java.lang.reflect.Method;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 @SuppressWarnings("deprecation")
 public class AggregateFeaturesMojoTest {
     private Path tempDir;
@@ -129,7 +129,7 @@ public class AggregateFeaturesMojoTest {
         af.features = featuresDir;
         af.execute();
 
-        Feature genFeat = featureMap.get(":aggregate:aggregated");
+        Feature genFeat = featureMap.get(":aggregate:aggregated:T");
         assertNotNull(genFeat);
         ArtifactId id = genFeat.getId();
 
@@ -206,7 +206,7 @@ public class AggregateFeaturesMojoTest {
 
         af.execute();
 
-        Feature genFeat = featureMap.get(":aggregate:aggregated");
+        Feature genFeat = featureMap.get(":aggregate:aggregated:T");
         assertNotNull(genFeat);
         ArtifactId id = genFeat.getId();
 
@@ -377,7 +377,7 @@ public class AggregateFeaturesMojoTest {
 
         af.execute();
 
-        Feature genFeat = featureMap.get(":aggregate:agg");
+        Feature genFeat = featureMap.get(":aggregate:agg:T");
         ArtifactId id = genFeat.getId();
 
         assertEquals("g", id.getGroupId());
@@ -464,7 +464,7 @@ public class AggregateFeaturesMojoTest {
         }).when(af.artifactResolver).resolve(Mockito.any(Artifact.class), Mockito.anyList(), Mockito.any(ArtifactRepository.class));
         af.execute();
 
-        Feature genFeat = featureMap.get(":aggregate:mynewfeature");
+        Feature genFeat = featureMap.get(":aggregate:mynewfeature:T");
         ArtifactId id = genFeat.getId();
         assertEquals("mygroup", id.getGroupId());
         assertEquals("myart", id.getArtifactId());
@@ -769,7 +769,7 @@ public class AggregateFeaturesMojoTest {
         af.handlerConfiguration = new HashMap<>();
 
         af.execute();
-        Feature genFeat = featureMap.get(":aggregate:myagg");
+        Feature genFeat = featureMap.get(":aggregate:myagg:T");
         Bundles bundles = genFeat.getBundles();
         assertEquals(3, bundles.size());
         assertTrue(bundles.contains(new org.apache.sling.feature.Artifact(
@@ -872,7 +872,7 @@ public class AggregateFeaturesMojoTest {
 
         af.execute();
 
-        Feature genFeat = featureMap.get(":aggregate:myagg");
+        Feature genFeat = featureMap.get(":aggregate:myagg:T");
         Bundles bundles = genFeat.getBundles();
         assertEquals(1, bundles.size());
         assertTrue(bundles.contains(new org.apache.sling.feature.Artifact(
diff --git a/src/test/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojoTest.java b/src/test/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojoTest.java
index b6f8017..ceee51d 100644
--- a/src/test/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojoTest.java
+++ b/src/test/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojoTest.java
@@ -19,7 +19,8 @@ package org.apache.sling.feature.maven.mojos;
 import java.io.File;
 import java.io.FileReader;
 import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.maven.model.Build;
 import org.apache.maven.project.MavenProject;
@@ -36,12 +37,12 @@ public class AttachFeaturesMojoTest {
         File feat_a = new File(getClass().getResource("/attach-resources/features/processed/test_a.json").toURI());
         File feat_d = new File(getClass().getResource("/attach-resources/features/processed/test_d.json").toURI());
 
-        final List<Feature> features = new ArrayList<>();
+        final Map<String, Feature> features = new HashMap<>();
         try ( final FileReader r = new FileReader(feat_a) ) {
-            features.add(FeatureJSONReader.read(r, feat_a.getAbsolutePath()));
+            features.put(feat_a.getAbsolutePath(), FeatureJSONReader.read(r, feat_a.getAbsolutePath()));
         }
         try ( final FileReader r = new FileReader(feat_d) ) {
-            features.add(FeatureJSONReader.read(r, feat_d.getAbsolutePath()));
+            features.put(feat_d.getAbsolutePath(), FeatureJSONReader.read(r, feat_d.getAbsolutePath()));
         }
 
         File featuresDir = feat_a.getParentFile().getParentFile().getParentFile();
@@ -61,7 +62,7 @@ public class AttachFeaturesMojoTest {
         MavenProjectHelper helper = Mockito.mock(MavenProjectHelper.class);
         af.projectHelper = helper;
 
-        af.attachClassifierFeatures(features, new ArrayList<>());
+        af.attachClassifierFeatures(features, new ArrayList<>(), true);
         Mockito.verify(helper).attachArtifact(project, FeatureConstants.PACKAGING_FEATURE, "testa", new File(featuresDir, "slingfeature-tmp" + File.separatorChar + "feature-testa.json"));
         Mockito.verify(helper).attachArtifact(project, FeatureConstants.PACKAGING_FEATURE, "testd", new File(featuresDir, "slingfeature-tmp" + File.separatorChar + "feature-testd.json"));
         Mockito.verifyNoMoreInteractions(helper);