You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/08/08 00:17:19 UTC

svn commit: r802251 - in /maven/components/trunk: maven-compat/src/main/java/org/apache/maven/artifact/ maven-compat/src/main/java/org/apache/maven/artifact/metadata/ maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ maven-compat/...

Author: bentmann
Date: Fri Aug  7 22:17:19 2009
New Revision: 802251

URL: http://svn.apache.org/viewvc?rev=802251&view=rev
Log:
o Fixed critical performance regression introduced in r801648. The relocation is now grabbed alongside the direct dependencies when we get the resolution group, these bits are stored in the same file and so we can as well process them in one go.
Issue id: o

Modified:
    maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactUtils.java
    maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/metadata/ResolutionGroup.java
    maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource.java
    maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ResolutionGroup.java
    maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector.java
    maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/deployer/SimpleArtifactMetadataSource.java
    maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/metadata/TestMetadataSource.java
    maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java
    maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
    maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/metadata/TestMetadataSource.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java

Modified: maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactUtils.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactUtils.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactUtils.java (original)
+++ maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactUtils.java Fri Aug  7 22:17:19 2009
@@ -122,6 +122,11 @@
         return artifactMap;
     }
 
+    public static Artifact copyArtifactSafe( Artifact artifact )
+    {
+        return ( artifact != null ) ? copyArtifact( artifact ) : null;
+    }
+
     public static Artifact copyArtifact( Artifact artifact )
     {
         VersionRange range = artifact.getVersionRange();

Modified: maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/metadata/ResolutionGroup.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/metadata/ResolutionGroup.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/metadata/ResolutionGroup.java (original)
+++ maven/components/trunk/maven-compat/src/main/java/org/apache/maven/artifact/metadata/ResolutionGroup.java Fri Aug  7 22:17:19 2009
@@ -33,10 +33,10 @@
         super( pomArtifact, artifacts, resolutionRepositories );
     }
 
-    public ResolutionGroup( Artifact pomArtifact, Set<Artifact> artifacts, Map<String, Artifact> managedVersions,
-                            List<ArtifactRepository> resolutionRepositories )
+    public ResolutionGroup( Artifact pomArtifact, Artifact relocatedArtifact, Set<Artifact> artifacts,
+                            Map<String, Artifact> managedVersions, List<ArtifactRepository> resolutionRepositories )
     {
-        super( pomArtifact, artifacts, managedVersions, resolutionRepositories );
+        super( pomArtifact, relocatedArtifact, artifacts, managedVersions, resolutionRepositories );
     }
 
 }

Modified: maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource.java (original)
+++ maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource.java Fri Aug  7 22:17:19 2009
@@ -72,11 +72,4 @@
     List<ArtifactVersion> retrieveAvailableVersionsFromDeploymentRepository( Artifact artifact, ArtifactRepository localRepository, ArtifactRepository remoteRepository )                                                                            
         throws ArtifactMetadataRetrievalException;
 
-    /**
-     * Resolve all relocations in the POM for this artifact, and return the new artifact coordinate.
-     */
-    Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository,
-                                        List<ArtifactRepository> remoteRepositories )
-        throws ArtifactMetadataRetrievalException;
-
 }
\ No newline at end of file

Modified: maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ResolutionGroup.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ResolutionGroup.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ResolutionGroup.java (original)
+++ maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/metadata/ResolutionGroup.java Fri Aug  7 22:17:19 2009
@@ -35,18 +35,21 @@
 
     private final Artifact pomArtifact;
 
+    private final Artifact relocatedArtifact;
+
     private final Map<String, Artifact> managedVersions;
 
     public ResolutionGroup( Artifact pomArtifact, Set<Artifact> artifacts,
                             List<ArtifactRepository> resolutionRepositories )
     {
-        this( pomArtifact, artifacts, null, resolutionRepositories );
+        this( pomArtifact, null, artifacts, null, resolutionRepositories );
     }
 
-    public ResolutionGroup( Artifact pomArtifact, Set<Artifact> artifacts, Map<String, Artifact> managedVersions,
-                            List<ArtifactRepository> resolutionRepositories )
+    public ResolutionGroup( Artifact pomArtifact, Artifact relocatedArtifact, Set<Artifact> artifacts,
+                            Map<String, Artifact> managedVersions, List<ArtifactRepository> resolutionRepositories )
     {
         this.pomArtifact = pomArtifact;
+        this.relocatedArtifact = relocatedArtifact;
         this.artifacts = artifacts;
         this.managedVersions = managedVersions;
         this.resolutionRepositories = resolutionRepositories;
@@ -57,6 +60,11 @@
         return pomArtifact;
     }
 
+    public Artifact getRelocatedArtifact()
+    {
+        return relocatedArtifact;
+    }
+
     public Set<Artifact> getArtifacts()
     {
         return artifacts;

Modified: maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector.java (original)
+++ maven/components/trunk/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector.java Fri Aug  7 22:17:19 2009
@@ -400,6 +400,8 @@
 
                         try
                         {
+                            ResolutionGroup rGroup;
+
                             Object childKey;
                             do
                             {
@@ -481,9 +483,14 @@
                                     fireEvent( ResolutionListener.SELECT_VERSION_FROM_RANGE, listeners, child );
                                 }
 
-                                Artifact relocated =
-                                    source.retrieveRelocatedArtifact( artifact, localRepository,
-                                                                      childRemoteRepositories );
+                                rGroup = source.retrieve( artifact, localRepository, childRemoteRepositories );
+
+                                if ( rGroup == null )
+                                {
+                                    break;
+                                }
+
+                                Artifact relocated = rGroup.getRelocatedArtifact();
                                 if ( relocated != null && !artifact.equals( relocated ) )
                                 {
                                     relocated.setDependencyFilter( artifact.getDependencyFilter() );
@@ -504,8 +511,6 @@
                                 continue;
                             }
 
-                            ResolutionGroup rGroup = source.retrieve( artifact, localRepository, childRemoteRepositories );
-
                             // TODO might be better to have source.retrieve() throw a specific exception for this
                             // situation
                             // and catch here rather than have it return null

Modified: maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/deployer/SimpleArtifactMetadataSource.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/deployer/SimpleArtifactMetadataSource.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/deployer/SimpleArtifactMetadataSource.java (original)
+++ maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/deployer/SimpleArtifactMetadataSource.java Fri Aug  7 22:17:19 2009
@@ -57,14 +57,6 @@
         return Collections.<ArtifactVersion>singletonList( new DefaultArtifactVersion( "10.1.3" ) );
     }
 
-    public Artifact retrieveRelocatedArtifact( Artifact artifact,
-                                               ArtifactRepository localRepository,
-                                               List<ArtifactRepository> remoteRepositories )
-        throws ArtifactMetadataRetrievalException
-    {
-        return artifact;
-    }
-
     public ResolutionGroup retrieve( MetadataResolutionRequest request )
         throws ArtifactMetadataRetrievalException
     {

Modified: maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/metadata/TestMetadataSource.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/metadata/TestMetadataSource.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/metadata/TestMetadataSource.java (original)
+++ maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/metadata/TestMetadataSource.java Fri Aug  7 22:17:19 2009
@@ -69,12 +69,6 @@
         throw new UnsupportedOperationException( "Cannot get available versions in this test case" );
     }
 
-    public Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
-        throws ArtifactMetadataRetrievalException
-    {
-        return artifact;
-    }
-
     public ResolutionGroup retrieve( MetadataResolutionRequest request )
         throws ArtifactMetadataRetrievalException
     {

Modified: maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java (original)
+++ maven/components/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java Fri Aug  7 22:17:19 2009
@@ -217,14 +217,6 @@
                 throw new UnsupportedOperationException( "Cannot get available versions in this test case" );
             }
 
-            public Artifact retrieveRelocatedArtifact( Artifact artifact,
-                                                       ArtifactRepository localRepository,
-                                                       List<ArtifactRepository> remoteRepositories )
-                throws ArtifactMetadataRetrievalException
-            {
-                return artifact;
-            }
-
             public ResolutionGroup retrieve( MetadataResolutionRequest request )
                 throws ArtifactMetadataRetrievalException
             {

Modified: maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java (original)
+++ maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java Fri Aug  7 22:17:19 2009
@@ -969,14 +969,6 @@
             return artifactVersions;
         }
 
-        public Artifact retrieveRelocatedArtifact( Artifact artifact,
-                                                   ArtifactRepository localRepository,
-                                                   List<ArtifactRepository> remoteRepositories )
-            throws ArtifactMetadataRetrievalException
-        {
-            return artifact;
-        }
-
         public ResolutionGroup retrieve( MetadataResolutionRequest request )
             throws ArtifactMetadataRetrievalException
         {

Modified: maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/metadata/TestMetadataSource.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/metadata/TestMetadataSource.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/metadata/TestMetadataSource.java (original)
+++ maven/components/trunk/maven-compat/src/test/java/org/apache/maven/repository/metadata/TestMetadataSource.java Fri Aug  7 22:17:19 2009
@@ -72,12 +72,6 @@
         throw new UnsupportedOperationException( "Cannot get available versions in this test case" );
     }
 
-    public Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
-        throws ArtifactMetadataRetrievalException
-    {
-        return artifact;
-    }
-
     public ResolutionGroup retrieve( MetadataResolutionRequest request )
         throws ArtifactMetadataRetrievalException
     {

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java Fri Aug  7 22:17:19 2009
@@ -126,6 +126,7 @@
     public class CacheRecord
     {
         private Artifact pomArtifact;
+        private Artifact relocatedArtifact;
         private List<Artifact> artifacts;
         private Map<String, Artifact> managedVersions;
         private List<ArtifactRepository> remoteRepositories;
@@ -133,9 +134,11 @@
         private long length;
         private long timestamp;
 
-        CacheRecord(Artifact pomArtifact, Set<Artifact> artifacts, Map<String, Artifact> managedVersions, List<ArtifactRepository> remoteRepositories)
+        CacheRecord( Artifact pomArtifact, Artifact relocatedArtifact, Set<Artifact> artifacts,
+                     Map<String, Artifact> managedVersions, List<ArtifactRepository> remoteRepositories )
         {
             this.pomArtifact = ArtifactUtils.copyArtifact( pomArtifact );
+            this.relocatedArtifact = ArtifactUtils.copyArtifactSafe( relocatedArtifact );
             this.artifacts = ArtifactUtils.copyArtifacts( artifacts, new ArrayList<Artifact>() );
             this.remoteRepositories = new ArrayList<ArtifactRepository>( remoteRepositories );
 
@@ -158,12 +161,17 @@
                 this.timestamp = -1;
             }
         }
-        
+
         public Artifact getArtifact()
         {
             return pomArtifact;
         }
 
+        public Artifact getRelocatedArtifact()
+        {
+            return relocatedArtifact;
+        }
+
         public List<Artifact> getArtifacts()
         {
             return artifacts;
@@ -203,6 +211,7 @@
         if ( cacheRecord != null && !cacheRecord.isStale() )
         {
             Artifact pomArtifact = ArtifactUtils.copyArtifact( cacheRecord.getArtifact() );
+            Artifact relocatedArtifact = ArtifactUtils.copyArtifactSafe( cacheRecord.getRelocatedArtifact() );
             Set<Artifact> artifacts =
                 ArtifactUtils.copyArtifacts( cacheRecord.getArtifacts(), new LinkedHashSet<Artifact>() );
             Map<String, Artifact> managedVersions = cacheRecord.getManagedVersions();
@@ -210,7 +219,8 @@
             {
                 managedVersions = ArtifactUtils.copyArtifacts( managedVersions, new LinkedHashMap<String, Artifact>() );
             }
-            return new ResolutionGroup( pomArtifact, artifacts, managedVersions, cacheRecord.getRemoteRepositories() );
+            return new ResolutionGroup( pomArtifact, relocatedArtifact, artifacts, managedVersions,
+                                        cacheRecord.getRemoteRepositories() );
         }
 
         cache.remove( cacheKey );
@@ -223,8 +233,8 @@
     {
         CacheKey cacheKey = new CacheKey( artifact, resolveManagedVersions, localRepository, remoteRepositories );
         CacheRecord cacheRecord =
-            new CacheRecord( result.getPomArtifact(), result.getArtifacts(), result.getManagedVersions(),
-                             result.getResolutionRepositories() );
+            new CacheRecord( result.getPomArtifact(), result.getRelocatedArtifact(), result.getArtifacts(),
+                             result.getManagedVersions(), result.getResolutionRepositories() );
 
         cache.put( cacheKey, cacheRecord );
     }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java?rev=802251&r1=802250&r2=802251&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java Fri Aug  7 22:17:19 2009
@@ -26,6 +26,7 @@
 import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
@@ -127,6 +128,8 @@
 
         Artifact pomArtifact;
 
+        Artifact relocatedArtifact = null;
+
         //TODO: Not even sure this is really required as the project will be cached in the builder, we'll see this
         // is currently the biggest hotspot
         if ( artifact instanceof ArtifactWithDependencies )
@@ -157,6 +160,8 @@
             }
             else
             {
+                relocatedArtifact = rel.relocatedArtifact;
+
                 dependencies = rel.project.getDependencies();
 
                 DependencyManagement depMngt = rel.project.getDependencyManagement();
@@ -195,7 +200,8 @@
             }
         }
 
-        ResolutionGroup result = new ResolutionGroup( pomArtifact, artifacts, managedVersions, remoteRepositories );
+        ResolutionGroup result =
+            new ResolutionGroup( pomArtifact, relocatedArtifact, artifacts, managedVersions, remoteRepositories );
 
         cache.put( artifact, resolveManagedVersions, localRepository, remoteRepositories, result );
 
@@ -410,63 +416,6 @@
         return projectBuilder;
     }
 
-    public Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository,
-                                               List<ArtifactRepository> remoteRepositories )
-        throws ArtifactMetadataRetrievalException
-    {
-
-        ProjectRelocation rel = retrieveRelocatedProject( artifact, localRepository, remoteRepositories );
-
-        if ( rel == null )
-        {
-            return artifact;
-        }
-
-        MavenProject project = rel.project;
-        if ( project == null || getRelocationKey( artifact ).equals( getRelocationKey( project.getArtifact() ) ) )
-        {
-            return artifact;
-        }
-
-        // NOTE: Using artifact information here, since some POMs are deployed
-        // to central with one version in the filename, but another in the <version> string!
-        // Case in point: org.apache.ws.commons:XmlSchema:1.1:pom.
-        //
-        // Since relocation triggers a reconfiguration of the artifact's information
-        // in retrieveRelocatedProject(..), this is safe to do.
-        Artifact result = null;
-        if ( artifact.getClassifier() != null )
-        {
-            result =
-                repositorySystem.createArtifactWithClassifier( artifact.getGroupId(), artifact.getArtifactId(),
-                                                               artifact.getVersion(), artifact.getType(),
-                                                               artifact.getClassifier() );
-        }
-        else
-        {
-            result =
-                repositorySystem.createArtifact( artifact.getGroupId(), artifact.getArtifactId(),
-                                                 artifact.getVersion(), artifact.getScope(), artifact.getType() );
-        }
-
-        result.setResolved( artifact.isResolved() );
-        result.setFile( artifact.getFile() );
-
-        result.setScope( artifact.getScope() );
-        result.setArtifactHandler( artifact.getArtifactHandler() );
-        result.setDependencyFilter( artifact.getDependencyFilter() );
-        result.setDependencyTrail( artifact.getDependencyTrail() );
-        result.setOptional( artifact.isOptional() );
-        result.setRelease( artifact.isRelease() );
-
-        return result;
-    }
-
-    private String getRelocationKey( Artifact artifact )
-    {
-        return artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getVersion();
-    }
-
     private ProjectRelocation retrieveRelocatedProject( Artifact artifact, ArtifactRepository localRepository,
                                                         List<ArtifactRepository> remoteRepositories )
         throws ArtifactMetadataRetrievalException
@@ -474,20 +423,21 @@
         MavenProject project = null;
 
         Artifact pomArtifact;
+        Artifact relocatedArtifact = artifact;
         boolean done = false;
         do
         {
-            // TODO: can we just modify the original?
             pomArtifact =
-                repositorySystem.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(),
-                                                        artifact.getVersion(), artifact.getScope() );
+                repositorySystem.createProjectArtifact( relocatedArtifact.getGroupId(),
+                                                        relocatedArtifact.getArtifactId(),
+                                                        relocatedArtifact.getVersion(), relocatedArtifact.getScope() );
 
-            if ( "pom".equals( artifact.getType() ) )
+            if ( "pom".equals( relocatedArtifact.getType() ) )
             {
-                pomArtifact.setFile( artifact.getFile() );
+                pomArtifact.setFile( relocatedArtifact.getFile() );
             }
 
-            if ( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
+            if ( Artifact.SCOPE_SYSTEM.equals( relocatedArtifact.getScope() ) )
             {
                 done = true;
             }
@@ -495,7 +445,6 @@
             {
                 try
                 {
-
                     ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
                     configuration.setLocalRepository( localRepository );
                     configuration.setRemoteRepositories( remoteRepositories );
@@ -520,31 +469,36 @@
                     {
                         relocation = distMgmt.getRelocation();
 
-                        artifact.setDownloadUrl( distMgmt.getDownloadUrl() );
+                        relocatedArtifact.setDownloadUrl( distMgmt.getDownloadUrl() );
                         pomArtifact.setDownloadUrl( distMgmt.getDownloadUrl() );
                     }
 
                     if ( relocation != null )
                     {
+                        if ( relocatedArtifact == artifact )
+                        {
+                            relocatedArtifact = ArtifactUtils.copyArtifact( artifact );
+                        }
+
                         if ( relocation.getGroupId() != null )
                         {
-                            artifact.setGroupId( relocation.getGroupId() );
+                            relocatedArtifact.setGroupId( relocation.getGroupId() );
                             project.setGroupId( relocation.getGroupId() );
                         }
                         if ( relocation.getArtifactId() != null )
                         {
-                            artifact.setArtifactId( relocation.getArtifactId() );
+                            relocatedArtifact.setArtifactId( relocation.getArtifactId() );
                             project.setArtifactId( relocation.getArtifactId() );
                         }
                         if ( relocation.getVersion() != null )
                         {
                             // note: see MNG-3454. This causes a problem, but fixing it may break more.
-                            artifact.setVersionRange( VersionRange.createFromVersion( relocation.getVersion() ) );
+                            relocatedArtifact.setVersionRange( VersionRange.createFromVersion( relocation.getVersion() ) );
                             project.setVersion( relocation.getVersion() );
                         }
 
                         if ( artifact.getDependencyFilter() != null
-                            && !artifact.getDependencyFilter().include( artifact ) )
+                            && !artifact.getDependencyFilter().include( relocatedArtifact ) )
                         {
                             return null;
                         }
@@ -555,14 +509,14 @@
                         List<ArtifactVersion> available = artifact.getAvailableVersions();
                         if ( available != null && !available.isEmpty() )
                         {
-                            artifact.setAvailableVersions( retrieveAvailableVersions( artifact, localRepository,
-                                                                                      remoteRepositories ) );
-
+                            available =
+                                retrieveAvailableVersions( relocatedArtifact, localRepository, remoteRepositories );
+                            relocatedArtifact.setAvailableVersions( available );
                         }
 
                         String message =
-                            "\n  This artifact has been relocated to " + artifact.getGroupId() + ":"
-                                + artifact.getArtifactId() + ":" + artifact.getVersion() + ".\n";
+                            "\n  This artifact has been relocated to " + relocatedArtifact.getGroupId() + ":"
+                                + relocatedArtifact.getArtifactId() + ":" + relocatedArtifact.getVersion() + ".\n";
 
                         if ( relocation.getMessage() != null )
                         {
@@ -596,6 +550,7 @@
         ProjectRelocation rel = new ProjectRelocation();
         rel.project = project;
         rel.pomArtifact = pomArtifact;
+        rel.relocatedArtifact = ( relocatedArtifact == artifact ) ? null : relocatedArtifact;
 
         return rel;
     }
@@ -605,6 +560,8 @@
         private MavenProject project;
 
         private Artifact pomArtifact;
+
+        private Artifact relocatedArtifact;
     }
 
 }