You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2008/09/23 20:43:19 UTC
svn commit: r698277 -
/servicemix/maven-plugins/features-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/features/GenerateFeaturesFileMojo.java
Author: gertv
Date: Tue Sep 23 11:43:19 2008
New Revision: 698277
URL: http://svn.apache.org/viewvc?rev=698277&view=rev
Log:
SMX4-49: Improve code generator to support replacing artifacts with a substitution file
Modified:
servicemix/maven-plugins/features-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/features/GenerateFeaturesFileMojo.java
Modified: servicemix/maven-plugins/features-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/features/GenerateFeaturesFileMojo.java
URL: http://svn.apache.org/viewvc/servicemix/maven-plugins/features-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/features/GenerateFeaturesFileMojo.java?rev=698277&r1=698276&r2=698277&view=diff
==============================================================================
--- servicemix/maven-plugins/features-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/features/GenerateFeaturesFileMojo.java (original)
+++ servicemix/maven-plugins/features-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/features/GenerateFeaturesFileMojo.java Tue Sep 23 11:43:19 2008
@@ -17,17 +17,25 @@
*/
package org.apache.servicemix.tooling.features;
+import java.io.BufferedInputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
+import java.util.Properties;
import java.util.Set;
+import java.util.TreeSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
@@ -39,6 +47,9 @@
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
+import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
@@ -77,31 +88,58 @@
/**
* The artifact type for attaching the generated file to the project
*
- * @parameter default-value="features.xml"
+ * @parameter default-value="xml"
*/
- private String attachmentArtifactType = "features.xml";
+ private String attachmentArtifactType = "xml";
/**
* The artifact classifier for attaching the generated file to the project
*
- * @parameter
+ * @parameter default-value="features"
*/
- private String attachmentArtifactClassifier;
+ private String attachmentArtifactClassifier = "features";
/**
* Should we generate a <feature> for the current project?
*
- * @parameter default-value="true"
+ * @parameter default-value="false"
*/
- private boolean includeProject = true;
+ private boolean includeProject = false;
/**
* Should we generate a <feature> for the current project's <dependency>s?
*
- * @parameter default-value="false"
+ * @parameter default-value="true"
*/
- private boolean includeDependencies = false;
-
+ private boolean includeDependencies = true;
+
+ /**
+ * The kernel version for which to generate the bundle
+ *
+ * @parameter
+ */
+ private String kernelVersion;
+
+ /**
+ * A properties file containing bundle translations
+ *
+ * @parameter
+ */
+ private File translation;
+
+ /*
+ * The translations
+ */
+ private Map<String, Map<VersionRange, String>> translations = new HashMap<String, Map<VersionRange,String>>() {
+ @Override
+ public Map<VersionRange, String> get(Object key) {
+ if (super.get(key) == null) {
+ super.put(key.toString(), new HashMap<VersionRange, String>());
+ }
+ return super.get(key);
+ }
+ };
+
/*
* These bundles are the features that will be built
*/
@@ -117,15 +155,23 @@
* List of bundles included in the current feature
*/
private Set<Artifact> currentFeature = new HashSet<Artifact>();
+
+ /*
+ * List of missing bundles
+ */
+ private Set<Artifact> missingBundles = new TreeSet<Artifact>();
public void execute() throws MojoExecutionException, MojoFailureException {
OutputStream out = null;
try {
+ prepare();
+ getLog().info(String.format("-- Start generating %s --", outputFile.getAbsolutePath()));
outputFile.getParentFile().mkdirs();
out = new FileOutputStream(outputFile);
+
PrintStream printer = new PrintStream(out);
populateProperties(printer);
- getLog().info("Created: " + outputFile);
+ getLog().info(String.format("-- Done generating %s --", outputFile.getAbsolutePath()));
// now lets attach it
projectHelper.attachArtifact(project, attachmentArtifactType, attachmentArtifactClassifier, outputFile);
@@ -142,43 +188,75 @@
}
}
- protected void populateProperties(PrintStream out) {
+ protected void populateProperties(PrintStream out) throws ArtifactResolutionException, ArtifactNotFoundException, IOException {
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<features>");
if (includeProject) {
writeCurrentProjectFeature(out);
}
if (includeDependencies) {
- prepare();
writeProjectDependencyFeatures(out);
}
out.println("</features>");
}
- private void prepare() {
- for (Artifact artifact : (Set<Artifact>)project.getDependencyArtifacts()) {
- if ("provided".equals(artifact.getScope())) {
- getLog().debug(String.format("Adding '%s' as provided bundle", artifact.toString()));
- provided.add(artifact);
- }
+ private void prepare() throws ArtifactResolutionException, ArtifactNotFoundException, IOException, InvalidVersionSpecificationException {
+ if (translation != null) {
+ InputStream stream = null;
+ try {
+ stream = new BufferedInputStream(new FileInputStream(translation));
+ Properties file = new Properties();
+ file.load(stream);
+ for (String key : file.stringPropertyNames()) {
+ String[] elements = key.split("/");
+ translations.get(String.format("%s/%s", elements[0], elements[1]))
+ .put(VersionRange.createFromVersionSpec(elements[2]), file.getProperty(key));
+ }
+ getLog().info("Loaded " + translations.size() + " bundle name translation rules from " + translation.getAbsolutePath());
+ } finally {
+ if (stream != null) {
+ stream.close();
+ }
+ }
+ }
+
+ Artifact kernel = factory.createArtifact("org.apache.servicemix.kernel",
+ "apache-servicemix-kernel",
+ kernelVersion, Artifact.SCOPE_PROVIDED, "pom");
+ resolver.resolve(kernel, remoteRepos, localRepo);
+ getLog().info("-- List of bundles provided by ServiceMix Kernel " + kernelVersion + " --");
+ for (Artifact artifact : getDependencies(kernel)) {
+ getLog().info(" " + artifact);
+ provided.add(artifact);
}
+ getLog().info("-- <end of list> --");
}
private void writeProjectDependencyFeatures(PrintStream out) {
Set<Artifact> dependencies = (Set<Artifact>)project.getDependencyArtifacts();
dependencies.removeAll(provided);
for (Artifact artifact : dependencies) {
- System.out.println("Adding feature " + artifact.getArtifactId() + " from " + artifact);
+ getLog().info(" Generating feature " + artifact.getArtifactId() + " from " + artifact);
out.println(" <feature name='" + artifact.getArtifactId() + "'>");
currentFeature.clear();
writeBundle(out, artifact);
features.add(artifact);
out.println(" </feature>");
}
-
+ if (missingBundles.size() > 0) {
+ getLog().info("-- Some bundles were missing --");
+ for (Artifact artifact : missingBundles) {
+ getLog().info(String.format(" %s", artifact));
+ }
+ }
}
private void writeBundle(PrintStream out, Artifact artifact) {
+ Artifact replacement = getReplacement(artifact);
+ if (replacement != null) {
+ writeBundle(out, replacement);
+ return;
+ }
if (isProvided(artifact)) {
getLog().debug(String.format("Skipping '%s' -- bundle will be provided at runtime", artifact));
return;
@@ -190,7 +268,7 @@
}
// first write the dependencies
for (Artifact dependency : getDependencies(artifact)) {
- if (dependency.isOptional() || "test".equals(dependency.getScope())) {
+ if (dependency.isOptional() || Artifact.SCOPE_TEST.equals(dependency.getScope())) {
// omit optional dependencies
getLog().debug(String.format("Omitting optional and/or test scoped dependency '%s' for '%s'",
dependency, artifact));
@@ -206,23 +284,46 @@
}
// and then write the bundle itself
if (isBundle(artifact)) {
+ getLog().info(String.format(" adding bundle %s", artifact));
writeBundle(out, artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion());
} else {
Artifact wrapper = findServicemixBundle(artifact);
if (wrapper != null) {
- writeBundle(out, wrapper);
+ getLog().info(String.format(" adding bundle %s (for %s)", wrapper, artifact));
+ writeBundle(out, wrapper.getGroupId(), wrapper.getArtifactId(), wrapper.getBaseVersion());
} else {
- getLog().error(String.format("Unable to find suitable bundle for artifact '%s' -- resulting feature won't work", artifact));
+ getLog().error(String.format(" unable to find suitable bundle for artifact '%s'", artifact));
+ missingBundles.add(artifact);
}
}
}
- private Artifact findServicemixBundle(Artifact artifact) {
+ private Artifact getReplacement(Artifact artifact) {
+ String key = String.format("%s/%s", artifact.getGroupId(), artifact.getArtifactId());
+ String bundle = null;
+ for (VersionRange range : translations.get(key).keySet()) {
+ try {
+ if (range.containsVersion(artifact.getSelectedVersion())) {
+ bundle = translations.get(key).get(range);
+ break;
+ }
+ } catch (OverConstrainedVersionException e) {
+ bundle = null;
+ }
+ }
+ if (bundle != null) {
+ String[] split = bundle.split("/");
+ return factory.createArtifact(split[0], split[1], split[2], Artifact.SCOPE_PROVIDED, artifact.getArtifactHandler().getPackaging());
+ } else {
+ return null;
+ }
+ }
+
+ private Artifact findServicemixBundle(Artifact artifact) {
Artifact noVersionWrapper = factory.createArtifact("org.apache.servicemix.bundles",
"org.apache.servicemix.bundles." + artifact.getArtifactId(),
"",
artifact.getScope(), artifact.getType());
-
try {
List versions = artifactMetadataSource.retrieveAvailableVersions(noVersionWrapper, localRepo, remoteRepos);
Artifact wrapper = factory.createArtifact("org.apache.servicemix.bundles",
@@ -313,7 +414,9 @@
List<Artifact> list = new ArrayList<Artifact>();
try {
ResolutionGroup pom = artifactMetadataSource.retrieve(artifact, localRepo, remoteRepos);
- list.addAll(pom.getArtifacts());
+ if (pom != null) {
+ list.addAll(pom.getArtifacts());
+ }
} catch (ArtifactMetadataRetrievalException e) {
getLog().warn("Unable to retrieve metadata for " + artifact + ", not including dependencies for it");
} catch (InvalidArtifactRTException e) {