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/06/12 19:29:44 UTC

svn commit: r784210 - in /maven/components/trunk: maven-core/src/main/java/org/apache/maven/project/ maven-repository/src/main/java/org/apache/maven/repository/ maven-repository/src/main/java/org/apache/maven/repository/legacy/

Author: bentmann
Date: Fri Jun 12 17:29:44 2009
New Revision: 784210

URL: http://svn.apache.org/viewvc?rev=784210&view=rev
Log:
[MNG-4190] same remote repo is referecned multiple times

Modified:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
    maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/RepositorySystem.java
    maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/legacy/LegacyRepositorySystem.java

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java?rev=784210&r1=784209&r2=784210&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java Fri Jun 12 17:29:44 2009
@@ -233,27 +233,22 @@
         this.repositorySystem = repositorySystem;
         originalModel = model;
         
-        remoteArtifactRepositories = new ArrayList<ArtifactRepository>();
+        remoteArtifactRepositories =
+            createArtifactRepositories( model.getRepositories(), projectBuilderConfiguration.getRemoteRepositories() );
 
-        for ( Repository r : model.getRepositories() )
-        {
-            try
-            {
-                remoteArtifactRepositories.add( repositorySystem.buildArtifactRepository( r ) );
-            }
-            catch ( InvalidRepositoryException e )
-            {
-
-            }
-        }
+        pluginArtifactRepositories = createArtifactRepositories( model.getPluginRepositories(), null );
+    }
 
-        pluginArtifactRepositories = new ArrayList<ArtifactRepository>();
+    private List<ArtifactRepository> createArtifactRepositories( List<Repository> pomRepositories,
+                                                                 List<ArtifactRepository> externalRepositories )
+    {
+        List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
 
-        for ( Repository r : model.getPluginRepositories() )
+        for ( Repository repository : pomRepositories )
         {
             try
             {
-                pluginArtifactRepositories.add( repositorySystem.buildArtifactRepository( r ) );
+                artifactRepositories.add( repositorySystem.buildArtifactRepository( repository ) );
             }
             catch ( InvalidRepositoryException e )
             {
@@ -261,14 +256,16 @@
             }
         }
 
-        remoteArtifactRepositories = repositorySystem.getMirrors( remoteArtifactRepositories );
+        artifactRepositories = repositorySystem.getMirrors( artifactRepositories );
 
-        if ( projectBuilderConfiguration.getRemoteRepositories() != null )
+        if ( externalRepositories != null )
         {
-            remoteArtifactRepositories.addAll( projectBuilderConfiguration.getRemoteRepositories() );
+            artifactRepositories.addAll( externalRepositories );
         }
 
-        pluginArtifactRepositories = repositorySystem.getMirrors( pluginArtifactRepositories );
+        artifactRepositories = repositorySystem.getEffectiveRepositories( artifactRepositories );
+
+        return artifactRepositories;
     }
 
     // TODO: Find a way to use <relativePath/> here...it's tricky, because the moduleProject

Modified: maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/RepositorySystem.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/RepositorySystem.java?rev=784210&r1=784209&r2=784210&view=diff
==============================================================================
--- maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/RepositorySystem.java (original)
+++ maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/RepositorySystem.java Fri Jun 12 17:29:44 2009
@@ -70,7 +70,18 @@
     
     ArtifactRepository createLocalRepository( File localRepository )
         throws InvalidRepositoryException;
-    
+
+    /**
+     * Calculates the effective repositories for the given input repositories. This process will essentially remove
+     * duplicate repositories by merging them into one equivalent repository. It is worth to point out that merging does
+     * not simply choose one of the input repositories and discards the others but actually combines their possibly
+     * different policies.
+     * 
+     * @param repositories The original repositories, may be {@code null}.
+     * @return The effective repositories or {@code null} if the input was {@code null}.
+     */
+    List<ArtifactRepository> getEffectiveRepositories( List<ArtifactRepository> repositories );    
+
     ArtifactResolutionResult resolve( ArtifactResolutionRequest request );
 
     MetadataResolutionResult resolveMetadata( MetadataResolutionRequest request );

Modified: maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/legacy/LegacyRepositorySystem.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/legacy/LegacyRepositorySystem.java?rev=784210&r1=784209&r2=784210&view=diff
==============================================================================
--- maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/legacy/LegacyRepositorySystem.java (original)
+++ maven/components/trunk/maven-repository/src/main/java/org/apache/maven/repository/legacy/LegacyRepositorySystem.java Fri Jun 12 17:29:44 2009
@@ -17,7 +17,11 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.InvalidRepositoryException;
@@ -389,6 +393,137 @@
         return mirrorBuilder.getMirrors( repositories );
     }
 
+    public List<ArtifactRepository> getEffectiveRepositories( List<ArtifactRepository> repositories )
+    {
+        if ( repositories == null )
+        {
+            return null;
+        }
+
+        Map<String, List<ArtifactRepository>> reposByKey = new LinkedHashMap<String, List<ArtifactRepository>>();
+
+        for ( ArtifactRepository repository : repositories )
+        {
+            String key = repository.getId();
+
+            List<ArtifactRepository> aliasedRepos = reposByKey.get( key );
+
+            if ( aliasedRepos == null )
+            {
+                aliasedRepos = new ArrayList<ArtifactRepository>();
+                reposByKey.put( key, aliasedRepos );
+            }
+
+            aliasedRepos.add( repository );
+        }
+
+        List<ArtifactRepository> effectiveRepositories = new ArrayList<ArtifactRepository>();
+
+        for ( List<ArtifactRepository> aliasedRepos : reposByKey.values() )
+        {
+            List<ArtifactRepositoryPolicy> releasePolicies =
+                new ArrayList<ArtifactRepositoryPolicy>( aliasedRepos.size() );
+
+            for ( ArtifactRepository aliasedRepo : aliasedRepos )
+            {
+                releasePolicies.add( aliasedRepo.getReleases() );
+            }
+
+            ArtifactRepositoryPolicy releasePolicy = getEffectivePolicy( releasePolicies );
+
+            List<ArtifactRepositoryPolicy> snapshotPolicies =
+                new ArrayList<ArtifactRepositoryPolicy>( aliasedRepos.size() );
+
+            for ( ArtifactRepository aliasedRepo : aliasedRepos )
+            {
+                snapshotPolicies.add( aliasedRepo.getSnapshots() );
+            }
+
+            ArtifactRepositoryPolicy snapshotPolicy = getEffectivePolicy( snapshotPolicies );
+
+            ArtifactRepository aliasedRepo = aliasedRepos.get( 0 );
+
+            ArtifactRepository effectiveRepository =
+                artifactRepositoryFactory.createArtifactRepository( aliasedRepo.getId(), aliasedRepo.getUrl(),
+                                                                    aliasedRepo.getLayout(), snapshotPolicy,
+                                                                    releasePolicy );
+
+            effectiveRepositories.add( effectiveRepository );
+        }
+
+        return effectiveRepositories;
+    }
+
+    private ArtifactRepositoryPolicy getEffectivePolicy( Collection<ArtifactRepositoryPolicy> policies )
+    {
+        ArtifactRepositoryPolicy effectivePolicy = null;
+
+        for ( ArtifactRepositoryPolicy policy : policies )
+        {
+            if ( effectivePolicy == null )
+            {
+                effectivePolicy =
+                    new ArtifactRepositoryPolicy( policy.isEnabled(), policy.getUpdatePolicy(),
+                                                  policy.getChecksumPolicy() );
+            }
+            else
+            {
+                if ( policy.isEnabled() )
+                {
+                    effectivePolicy.setEnabled( true );
+
+                    if ( ordinalOfChecksumPolicy( policy.getChecksumPolicy() ) < ordinalOfChecksumPolicy( effectivePolicy.getChecksumPolicy() ) )
+                    {
+                        effectivePolicy.setChecksumPolicy( policy.getChecksumPolicy() );
+                    }
+
+                    if ( ordinalOfUpdatePolicy( policy.getUpdatePolicy() ) < ordinalOfUpdatePolicy( effectivePolicy.getUpdatePolicy() ) )
+                    {
+                        effectivePolicy.setUpdatePolicy( policy.getUpdatePolicy() );
+                    }
+                }
+            }
+        }
+
+        return effectivePolicy;
+    }
+
+    private int ordinalOfChecksumPolicy( String policy )
+    {
+        if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( policy ) )
+        {
+            return 2;
+        }
+        else if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( policy ) )
+        {
+            return 0;
+        }
+        else
+        {
+            return 1;
+        }
+    }
+
+    private int ordinalOfUpdatePolicy( String policy )
+    {
+        if ( ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
+        {
+            return 1440;
+        }
+        else if ( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
+        {
+            return 0;
+        }
+        else if ( policy != null && policy.startsWith( ArtifactRepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
+        {
+            return 60;
+        }
+        else
+        {
+            return Integer.MAX_VALUE;
+        }
+    }
+
     public MetadataResolutionResult resolveMetadata( MetadataResolutionRequest request )
     {