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