You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2009/07/02 16:02:18 UTC

svn commit: r790596 - in /maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant: AbstractArtifactTask.java AntDownloadMonitor.java

Author: jvanzyl
Date: Thu Jul  2 14:02:18 2009
New Revision: 790596

URL: http://svn.apache.org/viewvc?rev=790596&view=rev
Log:
MANTTASKS-141: Using expressions in a mirrorOf element brakes the downloading of depencies


Modified:
    maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java
    maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AntDownloadMonitor.java

Modified: maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java
URL: http://svn.apache.org/viewvc/maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java?rev=790596&r1=790595&r2=790596&view=diff
==============================================================================
--- maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java (original)
+++ maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java Thu Jul  2 14:02:18 2009
@@ -19,6 +19,21 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+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.factory.ArtifactFactory;
 import org.apache.maven.artifact.manager.WagonManager;
@@ -59,16 +74,6 @@
 import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Base class for artifact tasks.
  *
@@ -78,8 +83,16 @@
 public abstract class AbstractArtifactTask
     extends Task
 {
+    private static final String WILDCARD = "*";
+
+    private static final String EXTERNAL_WILDCARD = "external:*";
+
+    private static int anonymousMirrorIdSeed = 0;
+    
     private static ClassLoader plexusClassLoader;
 
+    private Map/*<String, ArtifactRepository>*/ mirrors = new LinkedHashMap/*<String, ArtifactRepository>*/();
+    
     private File userSettingsFile;
 
     private File globalSettingsFile;
@@ -439,15 +452,23 @@
                 repository.addProxy( new Proxy( proxy ) );
             }
         }
-         
-        Mirror mirror = getSettings().getMirrorOf( repository.getId() );
-        if ( mirror == null )
-        {
-            mirror = getSettings().getMirrorOf( "*" );
-        }
-        if ( mirror != null )
+
+        if ( getSettings().getMirrors() != null )
         {
-            repository.setUrl( mirror.getUrl() );
+            for ( Iterator i = getSettings().getMirrors().iterator(); i.hasNext(); )
+            {
+                Mirror mirror = (Mirror) i.next();
+
+                addMirror( mirror.getId(), mirror.getMirrorOf(), mirror.getUrl() );
+            }
+
+            ArtifactRepository mirrorRepository = (ArtifactRepository) getMirrors(
+               Arrays.asList( new ArtifactRepository[] { new DefaultArtifactRepository( repository.getId(), repository.getUrl(),                                                                                                                                                            null ) } ) ).get( 0 );
+
+            if ( mirrorRepository != null )
+            {
+                repository.setUrl( mirrorRepository.getUrl() );
+            }
         }
     }
          
@@ -694,4 +715,195 @@
      * The main entry point for the task.
      */
     protected abstract void doExecute();
+    
+    //
+    // Code taken from 3.x to deal with external:*
+    //
+    
+    public void addMirror( String id, String mirrorOf, String url )
+    {        
+        if ( id == null )
+        {
+            id = "mirror-" + anonymousMirrorIdSeed++;
+        }
+
+        ArtifactRepository mirror = new DefaultArtifactRepository( id, url, null );
+
+        if ( !mirrors.containsKey( mirrorOf ) )
+        {
+            mirrors.put( mirrorOf, mirror );
+        }
+    }
+            
+    /**
+     * 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/*<String>*/ keySet = mirrors.keySet();
+            if ( keySet != null )
+            {
+                for ( Iterator i = keySet.iterator(); i.hasNext(); )
+                {
+                    String pattern = (String) i.next();
+                    
+                    if ( matchPattern( originalRepository, pattern ) )
+                    {
+                        selectedMirror = (ArtifactRepository) mirrors.get( pattern );
+                        //stop on the first match.
+                        break;
+                    }
+                }
+            }
+        }
+        
+        return selectedMirror;
+    }
+
+    public void clearMirrors()
+    {
+        mirrors.clear();    
+        anonymousMirrorIdSeed = 0;
+    }       
+    
+    public List/*<ArtifactRepository>*/ getMirrors( List/*<ArtifactRepository>*/ remoteRepositories )
+    {
+        if ( remoteRepositories != null )
+        {            
+            for ( Iterator i = remoteRepositories.iterator(); i.hasNext(); )
+            {                
+                ArtifactRepository repository = (ArtifactRepository) i.next();
+                                                
+                // Check to see if we have a valid mirror for this repository
+                ArtifactRepository mirror = getMirror( repository );
+                                        
+                if ( mirror != null )
+                {                         
+                    // We basically just want to take the URL
+                    ((org.apache.maven.wagon.repository.Repository)repository).setUrl( mirror.getUrl() );
+                    
+                    // I would like a mirrored repository to be visually different but we'll put another field
+                    // in the repository as changing the ID hoses up authentication.
+                    ((org.apache.maven.wagon.repository.Repository)repository).setId( mirror.getId() );
+                }
+            }
+        }
+        
+        return remoteRepositories;
+    }
+    
+    // Make these available to tests
+    
+    ArtifactRepository getMirrorRepository( ArtifactRepository repository )
+    {
+        ArtifactRepository mirror = getMirror( repository );
+        if ( mirror != null )
+        {
+            String id = mirror.getId();
+            if ( id == null )
+            {
+                // TODO: this should be illegal in settings.xml
+                id = repository.getId();
+            }
+
+            repository = getArtifactRepositoryFactory().createArtifactRepository( id, mirror.getUrl(), repository.getLayout(), repository.getSnapshots(), repository.getReleases() );
+        }
+        return repository;
+    }    
+        
+    private ArtifactRepositoryFactory getArtifactRepositoryFactory()
+    {
+        return (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
+    }
+    
+    /**
+     * This method checks if the pattern matches the originalRepository. Valid patterns: * =
+     * everything external:* = everything not on the localhost and not file based. repo,repo1 = repo
+     * or repo1 *,!repo1 = everything except repo1
+     * 
+     * @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.
+     */
+    boolean matchPattern( ArtifactRepository originalRepository, String pattern )
+    {
+        boolean result = false;
+        String originalId = originalRepository.getId();
+
+        // simple checks first to short circuit processing below.
+        if ( WILDCARD.equals( pattern ) || pattern.equals( originalId ) )
+        {
+            result = true;
+        }
+        else
+        {
+            // process the list
+            String[] repos = pattern.split( "," );
+            
+            for ( int i = 0; i < repos.length; i++ )
+            {
+                String repo = repos[i];
+                
+                // see if this is a negative match
+                if ( repo.length() > 1 && repo.startsWith( "!" ) )
+                {
+                    if ( originalId.equals( repo.substring( 1 ) ) )
+                    {
+                        // explicitly exclude. Set result and stop processing.
+                        result = false;
+                        break;
+                    }
+                }
+                // check for exact match
+                else if ( originalId.equals( repo ) )
+                {
+                    result = true;
+                    break;
+                }
+                // check for external:*
+                else if ( EXTERNAL_WILDCARD.equals( repo ) && isExternalRepo( originalRepository ) )
+                {
+                    result = true;
+                    // don't stop processing in case a future segment explicitly excludes this repo
+                }
+                else if ( WILDCARD.equals( repo ) )
+                {
+                    result = true;
+                    // don't stop processing in case a future segment explicitly excludes this repo
+                }
+            }
+        }
+        return result;
+    }
+    
+    
+    /**
+     * Checks the URL to see if this repository refers to an external repository
+     * 
+     * @param originalRepository
+     * @return true if external.
+     */
+    boolean isExternalRepo( ArtifactRepository originalRepository )
+    {
+        try
+        {
+            URL url = new URL( originalRepository.getUrl() );
+            return !( url.getHost().equals( "localhost" ) || url.getHost().equals( "127.0.0.1" ) || url.getProtocol().equals( "file" ) );
+        }
+        catch ( MalformedURLException e )
+        {
+            // bad url just skip it here. It should have been validated already, but the wagon lookup will deal with it
+            return false;
+        }
+    }
+        
 }

Modified: maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AntDownloadMonitor.java
URL: http://svn.apache.org/viewvc/maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AntDownloadMonitor.java?rev=790596&r1=790595&r2=790596&view=diff
==============================================================================
--- maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AntDownloadMonitor.java (original)
+++ maven/ant-tasks/trunk/src/main/java/org/apache/maven/artifact/ant/AntDownloadMonitor.java Thu Jul  2 14:02:18 2009
@@ -60,7 +60,7 @@
         String message = event.getRequestType() == TransferEvent.REQUEST_PUT ? "Uploading" : "Downloading";
         String dest = event.getRequestType() == TransferEvent.REQUEST_PUT ? " to " : " from ";
 
-        log( message + ": " + event.getResource().getName() + dest + event.getWagon().getRepository().getId() );
+        log( message + ": " + event.getResource().getName() + dest + event.getWagon().getRepository().getId() + "[" + event.getWagon().getRepository().getUrl() + "]" );        
     }
 
     public void transferProgress( TransferEvent event, byte[] bytes, int i )