Blob Blame History Raw
From 4c0c5f3edc45ffbf273ed7096340161def8515e4 Mon Sep 17 00:00:00 2001
From: Jason van Zyl <jason@tesla.io>
Date: Tue, 20 Aug 2013 05:54:28 -0700
Subject: [PATCH] MNG-5503: Fix for the issue where Maven 3.1.0 fails to
 resolve artifacts produced by reactor build

The general strategy is to fall back to Aether artifact type and use its notion of identity as much as possible. I have
a simple IT taken from the sample project that I will also push.
---
 .../main/java/org/apache/maven/ReactorReader.java  | 244 +++++++--------------
 .../java/org/apache/maven/RepositoryUtils.java     |  10 +
 2 files changed, 93 insertions(+), 161 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/ReactorReader.java b/maven-core/src/main/java/org/apache/maven/ReactorReader.java
index 90d102f..9b19e27 100644
--- a/maven-core/src/main/java/org/apache/maven/ReactorReader.java
+++ b/maven-core/src/main/java/org/apache/maven/ReactorReader.java
@@ -19,12 +19,6 @@
  * under the License.
  */
 
-import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.project.MavenProject;
-import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.repository.WorkspaceReader;
-import org.eclipse.aether.repository.WorkspaceRepository;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -35,6 +29,13 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.project.MavenProject;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.util.artifact.ArtifactIdUtils;
+
 /**
  * An implementation of a workspace reader that knows how to search the Maven reactor for artifacts.
  * 
@@ -43,8 +44,6 @@
 class ReactorReader
     implements WorkspaceReader
 {
-    private static final Collection<String> JAR_LIKE_TYPES = Arrays.asList( "jar", "test-jar", "ejb-client" );
-
     private static final Collection<String> COMPILE_PHASE_TYPES = Arrays.asList( "jar", "ejb-client" );
 
     private Map<String, MavenProject> projectsByGAV;
@@ -52,7 +51,7 @@
     private Map<String, List<MavenProject>> projectsByGA;
 
     private WorkspaceRepository repository;
-    
+        
     public ReactorReader( Map<String, MavenProject> reactorProjects )
     {
         projectsByGAV = reactorProjects;
@@ -73,9 +72,64 @@ public ReactorReader( Map<String, MavenProject> reactorProjects )
             projects.add( project );
         }
 
-        repository = new WorkspaceRepository( "reactor", new HashSet<String>( projectsByGAV.keySet() ) );
+        repository = new WorkspaceRepository( "reactor", new HashSet<String>( projectsByGAV.keySet() ) );        
+    }
+
+    //
+    // Public API
+    //
+    
+    public WorkspaceRepository getRepository()
+    {
+        return repository;
+    }
+    
+    public File findArtifact( Artifact artifact )
+    {
+        String projectKey = ArtifactUtils.key( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() );
+
+        MavenProject project = projectsByGAV.get( projectKey );
+
+        if ( project != null )
+        {
+            File file = find( project, artifact );
+            if ( file == null && project != project.getExecutionProject() )
+            {
+                file = find( project.getExecutionProject(), artifact );
+            }
+            return file;
+        }
+
+        return null;
     }
 
+    public List<String> findVersions( Artifact artifact )
+    {
+        String key = ArtifactUtils.versionlessKey( artifact.getGroupId(), artifact.getArtifactId() );
+
+        List<MavenProject> projects = projectsByGA.get( key );
+        if ( projects == null || projects.isEmpty() )
+        {
+            return Collections.emptyList();
+        }
+
+        List<String> versions = new ArrayList<String>();
+
+        for ( MavenProject project : projects )
+        {
+            if ( find( project, artifact ) != null )
+            {
+                versions.add( project.getVersion() );
+            }
+        }
+
+        return Collections.unmodifiableList( versions );
+    }    
+    
+    //
+    // Implementation
+    //
+    
     private File find( MavenProject project, Artifact artifact )
     {
         if ( "pom".equals( artifact.getExtension() ) )
@@ -83,7 +137,7 @@ private File find( MavenProject project, Artifact artifact )
             return project.getFile();
         }
 
-        org.apache.maven.artifact.Artifact projectArtifact = findMatchingArtifact( project, artifact );
+        Artifact projectArtifact = findMatchingArtifact( project, artifact );
 
         if ( hasArtifactFileFromPackagePhase( projectArtifact ) )
         {
@@ -116,7 +170,7 @@ else if ( !hasBeenPackaged( project ) )
         return null;
     }
 
-    private boolean hasArtifactFileFromPackagePhase( org.apache.maven.artifact.Artifact projectArtifact )
+    private boolean hasArtifactFileFromPackagePhase( Artifact projectArtifact )
     {
         return projectArtifact != null && projectArtifact.getFile() != null && projectArtifact.getFile().exists();
     }
@@ -136,122 +190,38 @@ private boolean hasBeenPackaged( MavenProject project )
      * 
      * Note that this 
      */
-    private org.apache.maven.artifact.Artifact findMatchingArtifact( MavenProject project, Artifact requestedArtifact )
+    private Artifact findMatchingArtifact( MavenProject project, Artifact requestedArtifact )
     {
-        String requestedRepositoryConflictId = getConflictId( requestedArtifact );
+        String requestedRepositoryConflictId = ArtifactIdUtils.toVersionlessId( requestedArtifact );
 
-        org.apache.maven.artifact.Artifact mainArtifact = project.getArtifact();
-        if ( requestedRepositoryConflictId.equals( getConflictId( mainArtifact ) ) )
+        Artifact mainArtifact = RepositoryUtils.toArtifact( project.getArtifact() );
+        if ( requestedRepositoryConflictId.equals( ArtifactIdUtils.toVersionlessId( mainArtifact ) ) )
         {
             return mainArtifact;
         }
 
-        Collection<org.apache.maven.artifact.Artifact> attachedArtifacts = project.getAttachedArtifacts();
-        if ( attachedArtifacts != null && !attachedArtifacts.isEmpty() )
+        for ( Artifact attachedArtifact : RepositoryUtils.toArtifacts( project.getAttachedArtifacts() ) )
         {
-            for ( org.apache.maven.artifact.Artifact attachedArtifact : attachedArtifacts )
+            if ( attachedArtifactComparison ( requestedArtifact, attachedArtifact ) )
             {
-                /*
-                 * Don't use the conflict ids, use a customized comparison that takes various ideas into account.
-                 */
-                if ( attachedArtifactComparison ( requestedArtifact, attachedArtifact ) )
-                {
-                    return attachedArtifact;
-                }
+                return attachedArtifact;
             }
         }
 
         return null;
     }
-    
-    /**
-     * Try to satisfy both MNG-4065 and MNG-5214. Consider jar and test-jar equivalent.
-     * @param requestedType
-     * @param artifactType
-     * @return
-     */
-    private boolean attachedArtifactComparison ( Artifact requestedArtifact, org.apache.maven.artifact.Artifact attachedArtifact )
-    {
-        if ( ! requestedArtifact.getGroupId().equals ( attachedArtifact.getGroupId() ) ) 
-        { 
-            return false;
-        }
-        if ( ! requestedArtifact.getArtifactId().equals ( attachedArtifact.getArtifactId() ) ) 
-        { 
-            return false;
-        }
-        String requestedExtension = requestedArtifact.getExtension();
-        String attachedExtension = null;
-        if ( attachedArtifact.getArtifactHandler() != null ) 
-            {
-                attachedExtension = attachedArtifact.getArtifactHandler().getExtension();
-            }
-        String requestedType = requestedArtifact.getProperty ( "type", "" );
-        String attachedType = attachedArtifact.getType();
-        boolean typeOk = false;
-        
-        if ( requestedExtension.equals ( attachedExtension ) )
-        {
-            // the ideal case.
-            typeOk = true;
-        }
-        else if ( requestedType.equals( attachedType ) )
-        {
-            typeOk = true;
-        }
-        else if ( JAR_LIKE_TYPES.contains( requestedType ) && JAR_LIKE_TYPES.contains( attachedType ) )
-        {
-            typeOk = true;
-        }
         
-        if ( !typeOk )
-        {
-            return false;
-        }
-        return requestedArtifact.getClassifier().equals ( attachedArtifact.getClassifier() );
-    }
-    
-    /**
-     * Gets the repository conflict id of the specified artifact. Unlike the dependency conflict id, the repository
-     * conflict id uses the artifact file extension instead of the artifact type. Hence, the repository conflict id more
-     * closely reflects the identity of artifacts as perceived by a repository.
-     * 
-     * @param artifact The artifact, must not be <code>null</code>.
-     * @return The repository conflict id, never <code>null</code>.
-     */
-    private String getConflictId( org.apache.maven.artifact.Artifact artifact )
+    private boolean attachedArtifactComparison( Artifact requested, Artifact attached )
     {
-        StringBuilder buffer = new StringBuilder( 128 );
-        buffer.append( artifact.getGroupId() );
-        buffer.append( ':' ).append( artifact.getArtifactId() );
-        if ( artifact.getArtifactHandler() != null )
-        {
-            buffer.append( ':' ).append( artifact.getArtifactHandler().getExtension() );
-        }
-        else
-        {
-            buffer.append( ':' ).append( artifact.getType() );
-        }
-        if ( artifact.hasClassifier() )
-        {
-            buffer.append( ':' ).append( artifact.getClassifier() );
-        }
-        return buffer.toString();
-    }
-
-    private String getConflictId( Artifact artifact )
-    {
-        StringBuilder buffer = new StringBuilder( 128 );
-        buffer.append( artifact.getGroupId() );
-        buffer.append( ':' ).append( artifact.getArtifactId() );
-        buffer.append( ':' ).append( artifact.getExtension() );
-        if ( artifact.getClassifier().length() > 0 )
-        {
-            buffer.append( ':' ).append( artifact.getClassifier() );
-        }
-        return buffer.toString();
-    }
-
+          //
+          // We are taking as much as we can from the DefaultArtifact.equals(). The requested artifact has no file so
+          // we want to remove that from the comparision.          
+          //
+          return requested.getArtifactId().equals( attached.getArtifactId() ) && requested.getGroupId().equals( attached.getGroupId() )
+            && requested.getVersion().equals( attached.getVersion() ) && requested.getExtension().equals( attached.getExtension() )
+            && requested.getClassifier().equals( attached.getClassifier() );
+    }    
+       
     /**
      * Determines whether the specified artifact refers to test classes.
      * 
@@ -263,52 +233,4 @@ private static boolean isTestArtifact( Artifact artifact )
         return ( "test-jar".equals( artifact.getProperty( "type", "" ) ) )
             || ( "jar".equals( artifact.getExtension() ) && "tests".equals( artifact.getClassifier() ) );
     }
-
-    public File findArtifact( Artifact artifact )
-    {
-        String projectKey = ArtifactUtils.key( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() );
-
-        MavenProject project = projectsByGAV.get( projectKey );
-
-        if ( project != null )
-        {
-            File file = find( project, artifact );
-            if ( file == null && project != project.getExecutionProject() )
-            {
-                file = find( project.getExecutionProject(), artifact );
-            }
-            return file;
-        }
-
-        return null;
-    }
-
-    public List<String> findVersions( Artifact artifact )
-    {
-        String key = ArtifactUtils.versionlessKey( artifact.getGroupId(), artifact.getArtifactId() );
-
-        List<MavenProject> projects = projectsByGA.get( key );
-        if ( projects == null || projects.isEmpty() )
-        {
-            return Collections.emptyList();
-        }
-
-        List<String> versions = new ArrayList<String>();
-
-        for ( MavenProject project : projects )
-        {
-            if ( find( project, artifact ) != null )
-            {
-                versions.add( project.getVersion() );
-            }
-        }
-
-        return Collections.unmodifiableList( versions );
-    }
-
-    public WorkspaceRepository getRepository()
-    {
-        return repository;
-    }
-
 }
diff --git a/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java b/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java
index 9b68a2e..c966e9a 100644
--- a/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java
+++ b/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java
@@ -350,4 +350,14 @@ public ArtifactType get( String stereotypeId )
 
     }
 
+    public static Collection<Artifact> toArtifacts(Collection<org.apache.maven.artifact.Artifact> artifactsToConvert ) 
+    {
+        List<Artifact> artifacts = new ArrayList<Artifact>();
+        for( org.apache.maven.artifact.Artifact a : artifactsToConvert )
+        {
+            artifacts.add(toArtifact(a));
+        }
+        return artifacts;
+    }
+
 }
-- 
1.8.1.4