Author: brianf Date: Sat Mar 15 09:42:24 2008 New Revision: 637438 URL: http://svn.apache.org/viewvc?rev=637438&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/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java Modified: maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java?rev=637438&r1=637437&r2=637438&view=diff ============================================================================== --- maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java (original) +++ maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java Sat Mar 15 09:42:24 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; @@ -54,16 +65,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.text.MessageFormat; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - /** @plexus.component */ public class DefaultWagonManager extends AbstractLogEnabled @@ -87,7 +88,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(); @@ -672,7 +674,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(), @@ -808,18 +810,56 @@ ; } - public ArtifactRepository getMirror( String mirrorOf ) - { - ArtifactRepository repository = (ArtifactRepository) mirrors.get( 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 ); + } + } + } - if ( repository == null ) + } + 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) + { + 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/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java?rev=637438&r1=637437&r2=637438&view=diff ============================================================================== --- maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java (original) +++ maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java Sat Mar 15 09:42:24 2008 @@ -28,6 +28,7 @@ import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; import org.apache.maven.artifact.repository.DefaultArtifactRepository; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.wagon.UnsupportedProtocolException; import org.apache.maven.wagon.Wagon; @@ -57,6 +58,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 {