You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2009/08/18 23:26:48 UTC

svn commit: r805587 - /tuscany/maven-plugins/trunk/maven-bundle-plugin/src/main/java/org/apache/tuscany/maven/bundle/plugin/ModuleBundlesBuildMojo.java

Author: rfeng
Date: Tue Aug 18 21:26:47 2009
New Revision: 805587

URL: http://svn.apache.org/viewvc?rev=805587&view=rev
Log:
Add support to include different versions of 3rd party jars into the distribution if it is omitted by a lower version in maven

Modified:
    tuscany/maven-plugins/trunk/maven-bundle-plugin/src/main/java/org/apache/tuscany/maven/bundle/plugin/ModuleBundlesBuildMojo.java

Modified: tuscany/maven-plugins/trunk/maven-bundle-plugin/src/main/java/org/apache/tuscany/maven/bundle/plugin/ModuleBundlesBuildMojo.java
URL: http://svn.apache.org/viewvc/tuscany/maven-plugins/trunk/maven-bundle-plugin/src/main/java/org/apache/tuscany/maven/bundle/plugin/ModuleBundlesBuildMojo.java?rev=805587&r1=805586&r2=805587&view=diff
==============================================================================
--- tuscany/maven-plugins/trunk/maven-bundle-plugin/src/main/java/org/apache/tuscany/maven/bundle/plugin/ModuleBundlesBuildMojo.java (original)
+++ tuscany/maven-plugins/trunk/maven-bundle-plugin/src/main/java/org/apache/tuscany/maven/bundle/plugin/ModuleBundlesBuildMojo.java Tue Aug 18 21:26:47 2009
@@ -49,10 +49,14 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
@@ -60,6 +64,10 @@
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor;
 import org.osgi.framework.Constants;
 
 /**
@@ -115,6 +123,25 @@
     private ArtifactMetadataSource artifactMetadataSource;
 
     /**
+     * The artifact collector to use.
+     * 
+     * @component
+     * @required
+     * @readonly
+     */
+    private ArtifactCollector artifactCollector;
+    
+    /**
+     * The dependency tree builder to use.
+     * 
+     * @component
+     * @required
+     * @readonly
+     */
+    private DependencyTreeBuilder dependencyTreeBuilder;
+
+
+    /**
      * Location of the local repository.
      *
      * @parameter expression="${localRepository}"
@@ -231,6 +258,11 @@
      * @parameter default-value="true"
      */
     private boolean generateBundleStart = true;
+    
+    /**
+     * @parameter default-value="true"
+     */
+    private boolean includeConflictingDepedencies = true;
 
     /**
      * Generete manifest.jar
@@ -370,9 +402,40 @@
         }
         return null;
     }
+    
+    /**
+     * Gets the artifact filter to use when resolving the dependency tree.
+     * 
+     * @return the artifact filter
+     */
+    private ArtifactFilter createResolvingArtifactFilter(String scope) {
+        ArtifactFilter filter;
+
+        // filter scope
+        if (scope != null) {
+            getLog().debug("+ Resolving dependency tree for scope '" + scope + "'");
+
+            filter = new ScopeArtifactFilter(scope);
+        } else {
+            filter = null;
+        }
+
+        return filter;
+    }
 
     public void execute() throws MojoExecutionException {
         Log log = getLog();
+        
+        Set<Artifact> artifacts = null;
+        if (includeConflictingDepedencies) {
+            try {
+                artifacts = getDependencyArtifacts(project);
+            } catch (Exception e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+        } else {
+            artifacts = project.getArtifacts();
+        }
 
         try {
 
@@ -431,8 +494,7 @@
             ProjectSet jarNames = new ProjectSet(poms);
             ProjectSet serviceProviders = new ProjectSet(poms);
             
-            for (Object o : project.getArtifacts()) {
-                Artifact artifact = (Artifact)o;
+            for (Artifact artifact: artifacts) {
 
                 // Only consider Compile and Runtime dependencies
                 if (!(Artifact.SCOPE_COMPILE.equals(artifact.getScope()) || Artifact.SCOPE_RUNTIME.equals(artifact
@@ -685,6 +747,60 @@
         }
 
     }
+
+    private Set<Artifact> getDependencyArtifacts(MavenProject project) throws DependencyTreeBuilderException,
+        ArtifactResolutionException, ArtifactNotFoundException {
+        Log log = getLog();
+        Set<Artifact> artifacts = new HashSet<Artifact>();
+        ArtifactFilter artifactFilter = createResolvingArtifactFilter(Artifact.SCOPE_RUNTIME);
+
+        // TODO: note that filter does not get applied due to MNG-3236
+
+        DependencyNode rootNode =
+            dependencyTreeBuilder.buildDependencyTree(project,
+                                                      local,
+                                                      factory,
+                                                      artifactMetadataSource,
+                                                      artifactFilter,
+                                                      artifactCollector);
+        CollectingDependencyNodeVisitor visitor = new CollectingDependencyNodeVisitor();
+        rootNode.accept(visitor);
+        // Add included artifacts
+        for (Object node : visitor.getNodes()) {
+            DependencyNode depNode = (DependencyNode)node;
+            int state = depNode.getState();
+            if (state == DependencyNode.INCLUDED ) {
+                Artifact artifact = depNode.getArtifact();
+                resolver.resolve(artifact, remoteRepos, local);
+                artifacts.add(artifact);
+            }
+        }
+        // Scan for newer versions that are omitted
+        for (Object node : visitor.getNodes()) {
+            DependencyNode depNode = (DependencyNode)node;
+            int state = depNode.getState();
+            if (state == DependencyNode.OMITTED_FOR_CONFLICT) {
+                Artifact artifact = depNode.getArtifact();
+                resolver.resolve(artifact, remoteRepos, local);
+                if (state == DependencyNode.OMITTED_FOR_CONFLICT) {
+                    Artifact related = depNode.getRelatedArtifact();
+                    if (log.isDebugEnabled()) {
+                        log.debug("Dependency node: " + depNode);
+                    }
+                    // Compare the version
+                    ArtifactVersion v1 = new DefaultArtifactVersion(artifact.getVersion());
+                    ArtifactVersion v2 = new DefaultArtifactVersion(related.getVersion());
+                    if (v1.compareTo(v2) > 0) {
+                        // Only add newer version if it is omitted for conflict
+                        if (artifacts.add(artifact)) {
+                            log.info("Dependency node added: " + depNode);
+                        }
+                    }
+                }
+            }
+        }
+        return artifacts;
+    }
     
     private static boolean isServiceProvider(Manifest mf) {
         if (mf != null) {
@@ -927,19 +1043,23 @@
     }
 
     private MavenProject buildProject(Artifact artifact) throws ProjectBuildingException,
-        InvalidDependencyVersionException, ArtifactResolutionException, ArtifactNotFoundException {
+        InvalidDependencyVersionException, ArtifactResolutionException, ArtifactNotFoundException, DependencyTreeBuilderException {
         MavenProject pomProject = mavenProjectBuilder.buildFromRepository(artifact, this.remoteRepos, this.local);
         if (pomProject.getDependencyArtifacts() == null) {
             pomProject.setDependencyArtifacts(pomProject.createArtifacts(factory, null, // Artifact.SCOPE_TEST,
                                                                          new ScopeArtifactFilter(Artifact.SCOPE_TEST)));
         }
-        ArtifactResolutionResult result =
-            resolver.resolveTransitively(pomProject.getDependencyArtifacts(),
-                                         pomProject.getArtifact(),
-                                         remoteRepos,
-                                         local,
-                                         artifactMetadataSource);
-        pomProject.setArtifacts(result.getArtifacts());
+        if (includeConflictingDepedencies) {
+            pomProject.setArtifacts(getDependencyArtifacts(pomProject));
+        } else {
+            ArtifactResolutionResult result =
+                resolver.resolveTransitively(pomProject.getDependencyArtifacts(),
+                                             pomProject.getArtifact(),
+                                             remoteRepos,
+                                             local,
+                                             artifactMetadataSource);
+            pomProject.setArtifacts(result.getArtifacts());
+        }
         return pomProject;
     }