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 f592083  SLING-9904 : Provide an option to globally set metadata to 
bundles and artifacts
f592083 is described below

commit f5920836e94ecdfeeb53e54bff545cc7aeea4220
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Fri Nov 13 13:53:09 2020 +0100

    SLING-9904 : Provide an option to globally set metadata to bundles and 
artifacts
---
 .../sling/feature/maven/FeatureProjectConfig.java  | 28 +++++++++++++
 .../apache/sling/feature/maven/JSONFeatures.java   | 26 ++++++++++++
 .../apache/sling/feature/maven/Preprocessor.java   |  8 +++-
 .../apache/sling/feature/maven/ProjectHelper.java  | 46 ++++++++++++++++++++++
 .../feature/maven/mojos/AbstractFeatureMojo.java   |  3 ++
 5 files changed, 110 insertions(+), 1 deletion(-)

diff --git 
a/src/main/java/org/apache/sling/feature/maven/FeatureProjectConfig.java 
b/src/main/java/org/apache/sling/feature/maven/FeatureProjectConfig.java
index 2032d14..4d410aa 100644
--- a/src/main/java/org/apache/sling/feature/maven/FeatureProjectConfig.java
+++ b/src/main/java/org/apache/sling/feature/maven/FeatureProjectConfig.java
@@ -16,7 +16,11 @@
  */
 package org.apache.sling.feature.maven;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.maven.artifact.Artifact;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 public class FeatureProjectConfig {
 
@@ -56,6 +60,8 @@ public class FeatureProjectConfig {
 
     public static final String CFG_LEGACY_REPLACE = 
"enableLegacyVariableReplacement";
 
+    public static final String CFG_DEFAULT_METADATA = "defaultMetadata";
+
 
     private final String featuresDirName;
 
@@ -83,6 +89,8 @@ public class FeatureProjectConfig {
 
     private final boolean enableLegacyVariableReplacement;
 
+    private final Map<String, Map<String, String>> defaultMetadata = new 
HashMap<>();
+    
     public static FeatureProjectConfig getMainConfig(final FeatureProjectInfo 
info) {
         return new FeatureProjectConfig(info, false);
     }
@@ -135,6 +143,22 @@ public class FeatureProjectConfig {
             this.replacePropertyVariables = vars.split(",");
         }
         this.enableLegacyVariableReplacement = 
"true".equals(ProjectHelper.getConfigValue(info.plugin, CFG_LEGACY_REPLACE, 
"false"));
+
+        // process metadata
+        if ( !test ) {
+            final Xpp3Dom metadataRoot = ProjectHelper.getConfig(info.plugin, 
CFG_DEFAULT_METADATA);
+            if ( metadataRoot != null ) {
+                for(final Xpp3Dom extension : metadataRoot.getChildren()) {
+                    final String name = extension.getName();
+                    final Map<String, String> map = 
this.defaultMetadata.computeIfAbsent(name, id -> new HashMap<>());
+                    for(final Xpp3Dom key : extension.getChildren()) {
+                        if ( key.getValue() != null ) {
+                            map.put(key.getName(), key.getValue());
+                        }
+                    }
+                }
+            }    
+        }
     }
 
     public String getName() {
@@ -188,5 +212,9 @@ public class FeatureProjectConfig {
     public boolean isEnableLegacyVariableReplacement() {
         return enableLegacyVariableReplacement;
     }
+
+    public Map<String, Map<String, String>> getDefaultMetadata() {
+        return this.defaultMetadata;
+    }
 }
 
diff --git a/src/main/java/org/apache/sling/feature/maven/JSONFeatures.java 
b/src/main/java/org/apache/sling/feature/maven/JSONFeatures.java
index babe4b3..f32b1be 100644
--- a/src/main/java/org/apache/sling/feature/maven/JSONFeatures.java
+++ b/src/main/java/org/apache/sling/feature/maven/JSONFeatures.java
@@ -38,7 +38,9 @@ import javax.json.stream.JsonGeneratorFactory;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.felix.cm.json.Configurations;
+import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Artifacts;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Feature;
@@ -146,4 +148,28 @@ public class JSONFeatures {
             }
         }
        }
+
+    private static final String FEATURE_BUNDLES = "bundles";
+
+    public static void handleDefaultMetadata(final Feature feature, final 
Map<String, Map<String, String>> defaultMetadata) {
+        for(final Map.Entry<String, Map<String, String>> entry : 
defaultMetadata.entrySet()) {
+            final String extensionName = entry.getKey();
+            final Artifacts artifacts;
+            if ( FEATURE_BUNDLES.equals(extensionName) ) {
+                artifacts = feature.getBundles();
+            } else {
+                final Extension ext = 
feature.getExtensions().getByName(extensionName);
+                artifacts = ext == null || ext.getType() != 
ExtensionType.ARTIFACTS ? null : ext.getArtifacts();
+            }
+            if ( artifacts != null ) {
+                for(final Map.Entry<String, String> propEntry : 
entry.getValue().entrySet()) {
+                    for(final Artifact artifact : artifacts) {
+                        if ( 
!artifact.getMetadata().containsKey(propEntry.getKey()) ) {
+                            artifact.getMetadata().put(propEntry.getKey(), 
propEntry.getValue());
+                        }
+                    }
+                }
+            }
+        }
+       }
 }
diff --git a/src/main/java/org/apache/sling/feature/maven/Preprocessor.java 
b/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
index bc077ec..a1dda28 100644
--- a/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
+++ b/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
@@ -104,7 +104,10 @@ public class Preprocessor {
      */
     public void process(final Environment env) {
         for(final FeatureProjectInfo finfo : env.modelProjects.values()) {
-            process(env, finfo, FeatureProjectConfig.getMainConfig(finfo));
+            final FeatureProjectConfig cfg = 
FeatureProjectConfig.getMainConfig(finfo);
+            ProjectHelper.setDefaultMetadata(finfo.project, 
cfg.getDefaultMetadata());
+
+            process(env, finfo, cfg);
             process(env, finfo, FeatureProjectConfig.getTestConfig(finfo));
 
             ProjectHelper.storeProjectInfo(finfo);
@@ -315,6 +318,9 @@ public class Preprocessor {
                     // Extension handling
                     JSONFeatures.handleExtensions(feature, file);
 
+                    // Default metadata
+                    JSONFeatures.handleDefaultMetadata(feature, 
ProjectHelper.getDefaultMetadata(info.project));
+                    
                     ProjectHelper.setFeatureInfo(info.project, feature);
 
                     this.postProcessReadFeature(feature);
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 3cc6e7c..b710190 100644
--- a/src/main/java/org/apache/sling/feature/maven/ProjectHelper.java
+++ b/src/main/java/org/apache/sling/feature/maven/ProjectHelper.java
@@ -26,6 +26,7 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -69,6 +70,9 @@ public abstract class ProjectHelper {
     private static final String ASSEMBLED_FEATURE_JSON = 
Feature.class.getName() + "/assembledmain.json";
     private static final String ASSEMBLED_TEST_FEATURE_JSON = 
Feature.class.getName() + "/assembledtest.json";
 
+    /** Default metadata */
+    private static final String METADATA_KEY = Feature.class.getName() + 
"/metadata";
+
     private static void store(final MavenProject project, final String key, 
final Map<String, Feature> features) {
         if ( features != null && !features.isEmpty()) {
             project.setContextValue(key, features.size());
@@ -229,6 +233,36 @@ public abstract class ProjectHelper {
         return values.isEmpty() ? defaultValue : values.iterator().next();
     }
 
+    /**
+     * Gets a configuration value for a plugin if it is set in the 
configuration for
+     * the plugin or any configuration for an execution of the plugin.
+     * @param plugin Plugin
+     * @param name Configuration parameter.
+     * @return {@code null} if nothing is configured, the value otherwise.
+     * @throws RuntimeException If more than one value is configured
+     */
+    public static Xpp3Dom getConfig(final Plugin plugin,
+            final String name) {
+        final Set<Xpp3Dom> values = new HashSet<>();
+        final Xpp3Dom config = plugin == null ? null : 
(Xpp3Dom)plugin.getConfiguration();
+        final Xpp3Dom globalNode = (config == null ? null : 
config.getChild(name));
+        if ( globalNode != null && globalNode.getChildCount() > 0 ) {
+            values.add(globalNode);
+        }
+        for(final PluginExecution exec : plugin.getExecutions()) {
+            final Xpp3Dom cfg = (Xpp3Dom)exec.getConfiguration();
+            final Xpp3Dom pluginNode = (cfg == null ? null : 
cfg.getChild(name));
+            if ( pluginNode != null && pluginNode.getChildCount() > 0 ) {
+                values.add(pluginNode);
+            }
+        }
+        if ( values.size() > 1 ) {
+            throw new RuntimeException("More than one value configured in 
plugin (executions) of "
+                    + plugin.getKey() + " for " + name + " : " + values);
+        }
+        return values.isEmpty() ? null : values.iterator().next();
+    }
+    
     private static Artifact findArtifact(final ArtifactId id, final 
Collection<Artifact> artifacts) {
         if (artifacts != null) {
             for(final Artifact artifact : artifacts) {
@@ -567,4 +601,16 @@ public abstract class ProjectHelper {
         }
     }
 
+    public static void setDefaultMetadata(final MavenProject project, final 
Map<String, Map<String, String>> data) {
+        project.setContextValue(METADATA_KEY, data);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static final Map<String, Map<String, String>> 
getDefaultMetadata(final MavenProject project) {
+        Map<String, Map<String, String>> map = (Map<String, Map<String, 
String>>) project.getContextValue(METADATA_KEY);
+        if ( map == null ) {
+            map = Collections.emptyMap();
+        }
+        return map;
+    }
 }
diff --git 
a/src/main/java/org/apache/sling/feature/maven/mojos/AbstractFeatureMojo.java 
b/src/main/java/org/apache/sling/feature/maven/mojos/AbstractFeatureMojo.java
index 7f8bb33..79aad7c 100644
--- 
a/src/main/java/org/apache/sling/feature/maven/mojos/AbstractFeatureMojo.java
+++ 
b/src/main/java/org/apache/sling/feature/maven/mojos/AbstractFeatureMojo.java
@@ -280,6 +280,9 @@ public abstract class AbstractFeatureMojo extends 
AbstractMojo {
                         // Extension handling
                         JSONFeatures.handleExtensions(feature, file);
 
+                        // Default metadata
+                        JSONFeatures.handleDefaultMetadata(feature, 
ProjectHelper.getDefaultMetadata(project));
+        
                         ProjectHelper.setFeatureInfo(project, feature);
 
                         // Add feature to map of features

Reply via email to