You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2008/03/15 17:32:26 UTC

svn commit: r637437 - in /maven/components/branches/maven-2.0.x/maven-artifact-manager/src: main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java

Author: brianf
Date: Sat Mar 15 09:32:21 2008
New Revision: 637437

URL: http://svn.apache.org/viewvc?rev=637437&view=rev
Log:
refactor wagon and add tests in preparation for MNG-3461. Note: this does not change current functionality and adds tests to establish the old functionality.

Modified:
    maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
    maven/components/branches/maven-2.0.x/maven-artifact-manager/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java

Modified: maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java?rev=637437&r1=637436&r2=637437&view=diff
==============================================================================
--- maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java (original)
+++ maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java Sat Mar 15 09:32:21 2008
@@ -19,6 +19,17 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -53,15 +64,6 @@
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
-import java.io.File;
-import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 public class DefaultWagonManager
     extends AbstractLogEnabled
     implements WagonManager, Contextualizable
@@ -78,7 +80,8 @@
 
     private Map serverPermissionsMap = new HashMap();
 
-    private Map mirrors = new HashMap();
+    //used LinkedMap to preserve the order.
+    private Map mirrors = new LinkedHashMap();
 
     /** Map( String, XmlPlexusConfiguration ) with the repository id and the wagon configuration */
     private Map serverConfigurationMap = new HashMap();
@@ -586,7 +589,7 @@
 
     public ArtifactRepository getMirrorRepository( ArtifactRepository repository )
     {
-        ArtifactRepository mirror = getMirror( repository.getId() );
+        ArtifactRepository mirror = getMirror( repository );
         if ( mirror != null )
         {
             repository = repositoryFactory.createArtifactRepository( mirror.getId(), mirror.getUrl(),
@@ -717,16 +720,56 @@
         return (AuthenticationInfo) authenticationInfoMap.get( id );
     }
 
-    public ArtifactRepository getMirror( String mirrorOf )
+    /**
+     * This method finds a matching mirror for the selected repository. If there is an exact match,
+     * this will be used. If there is no exact match, then the list of mirrors is examined to see
+     * if a pattern applies.
+     * @param originalRepository See if there is a mirror for this repository.
+     * @return the selected mirror or null if none are found.
+     */
+    public ArtifactRepository getMirror( ArtifactRepository originalRepository )
+    {
+        ArtifactRepository selectedMirror = (ArtifactRepository) mirrors.get( originalRepository.getId() );
+        if ( null == selectedMirror )
+        {
+            // Process the patterns in order. First one that matches wins.
+            Set keySet = mirrors.keySet();
+            if ( keySet != null )
+            {
+                Iterator iter = keySet.iterator();
+                while ( iter.hasNext() )
+                {
+                    String pattern = (String) iter.next();
+                    if ( matchPattern( originalRepository, pattern ) )
+                    {
+                        selectedMirror = (ArtifactRepository) mirrors.get( pattern );
+                    }
+                }
+            }
+
+        }
+        return selectedMirror;
+    }
+    
+    /**
+     * This method checks if the pattern matches the originalRepository. Currently only wildcard
+     * matches are peformed on the repository id. Wildcard == '*'
+     * @param originalRepository to compare for a match.
+     * @param pattern used for match. Currently only '*' is supported.
+     * @return true if the repository is a match to this pattern.
+     */
+    public boolean matchPattern (ArtifactRepository originalRepository, String pattern)
     {
-        ArtifactRepository repository = (ArtifactRepository) mirrors.get( mirrorOf );
-        if ( repository == null )
+        if (WILDCARD.equals( pattern ) || pattern.equals( originalRepository.getId() ))
         {
-            repository = (ArtifactRepository) mirrors.get( WILDCARD );
+            return true;
+        }
+        else
+        {
+            return false;
         }
-        return repository;
     }
-
+    
     /**
      * Set the proxy used for a particular protocol.
      *

Modified: maven/components/branches/maven-2.0.x/maven-artifact-manager/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java
URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact-manager/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java?rev=637437&r1=637436&r2=637437&view=diff
==============================================================================
--- maven/components/branches/maven-2.0.x/maven-artifact-manager/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java (original)
+++ maven/components/branches/maven-2.0.x/maven-artifact-manager/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java Sat Mar 15 09:32:21 2008
@@ -19,6 +19,9 @@
  * under the License.
  */
 
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
 import org.apache.maven.wagon.UnsupportedProtocolException;
 import org.apache.maven.wagon.Wagon;
 import org.apache.maven.wagon.repository.Repository;
@@ -43,6 +46,59 @@
         wagonManager = (WagonManager) lookup( WagonManager.ROLE );
     }
 
+    /**
+     * Check that lookups with exact matches work and that no matches don't corrupt the repo.
+     */
+    public void testMirrorLookup()
+    {
+        wagonManager.addMirror( "a", "a", "http://a" );
+        wagonManager.addMirror( "b", "b", "http://b" );
+        
+        ArtifactRepository repo = null;
+        repo = wagonManager.getMirrorRepository( getRepo("a","http://a.a" ));   
+        assertEquals( "http://a", repo.getUrl() );
+        
+        repo = wagonManager.getMirrorRepository( getRepo("b","http://a.a" ));   
+        assertEquals( "http://b", repo.getUrl() );
+        
+        repo = wagonManager.getMirrorRepository( getRepo("c","http://c.c") ); 
+        assertEquals( "http://c.c", repo.getUrl() );
+        
+    
+    }
+    
+    /**
+     * Check that wildcards don't override exact id matches.
+     */
+    public void testMirrorWildcardLookup()
+    {
+        wagonManager.addMirror( "a", "a", "http://a" );
+        wagonManager.addMirror( "b", "b", "http://b" );
+        wagonManager.addMirror( "c", "*", "http://wildcard" );
+        
+        ArtifactRepository repo = null;
+        repo = wagonManager.getMirrorRepository( getRepo("a","http://a.a" ));   
+        assertEquals( "http://a", repo.getUrl() );
+        
+        repo = wagonManager.getMirrorRepository( getRepo("b","http://a.a" ));   
+        assertEquals( "http://b", repo.getUrl() );
+        
+        repo = wagonManager.getMirrorRepository( getRepo("c","http://c.c") ); 
+        assertEquals( "http://wildcard", repo.getUrl() );    
+    
+    }
+    
+    /**
+     * Build an ArtifactRepository object.
+     * @param id
+     * @param url
+     * @return
+     */
+    private ArtifactRepository getRepo (String id, String url)
+    {
+        return (ArtifactRepository) new DefaultArtifactRepository(id,url,new DefaultRepositoryLayout());
+    }
+    
     public void testDefaultWagonManager()
         throws Exception
     {