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 2008/05/22 07:15:04 UTC

svn commit: r659009 [1/2] - in /maven/artifact/branches/CAP: ./ src/main/java/org/apache/maven/artifact/ src/main/java/org/apache/maven/artifact/manager/ src/main/java/org/apache/maven/artifact/repository/ src/main/java/org/apache/maven/artifact/reposi...

Author: jvanzyl
Date: Wed May 21 22:15:02 2008
New Revision: 659009

URL: http://svn.apache.org/viewvc?rev=659009&view=rev
Log:
o merge in changes from trunk

Added:
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java   (with props)
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java   (with props)
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java   (with props)
    maven/artifact/branches/CAP/target-eclipse/
    maven/artifact/branches/CAP/target-eclipse/classes/
    maven/artifact/branches/CAP/target-eclipse/test-classes/
Modified:
    maven/artifact/branches/CAP/   (props changed)
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/Artifact.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/ArtifactUtils.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/DefaultArtifact.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsChangeRequest.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSource.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSourceException.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/WagonManager.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryPolicy.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactCollector.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactNotFoundException.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionException.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionRequest.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionResult.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolver.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/UnresolvedArtifacts.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolver.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionException.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilter.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/filter/ExcludesArtifactFilter.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/filter/ExclusionSetFilter.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/filter/IncludesArtifactFilter.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/filter/InversionArtifactFilter.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/AbstractVersionTransformation.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/ArtifactTransformation.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/ArtifactTransformationManager.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/DefaultArtifactTransformationManager.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/DefaultClasspathTransformation.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/LatestArtifactTransformation.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/MetadataGraphTransformationException.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/ReleaseArtifactTransformation.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/transform/SnapshotTransformation.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/versioning/OverConstrainedVersionException.java
    maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/versioning/VersionRange.java
    maven/artifact/branches/CAP/src/test/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManagerTest.java

Propchange: maven/artifact/branches/CAP/
------------------------------------------------------------------------------
    svn:mergeinfo = /maven/artifact/trunk:658725

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/Artifact.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/Artifact.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/Artifact.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/Artifact.java Wed May 21 22:15:02 2008
@@ -102,7 +102,7 @@
 
     void addMetadata( ArtifactMetadata metadata );
 
-    Collection getMetadataList();
+    Collection<ArtifactMetadata> getMetadataList();
 
     void setRepository( ArtifactRepository remoteRepository );
 
@@ -119,9 +119,9 @@
 
     void setDependencyFilter( ArtifactFilter artifactFilter );
 
-    List getDependencyTrail();
+    List<String> getDependencyTrail();
 
-    void setDependencyTrail( List dependencyTrail );
+    void setDependencyTrail( List<String> dependencyTrail );
 
     void setScope( String scope );
 

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/ArtifactUtils.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/ArtifactUtils.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/ArtifactUtils.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/ArtifactUtils.java Wed May 21 22:15:02 2008
@@ -25,14 +25,12 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 
 public final class ArtifactUtils
 {
-
     private ArtifactUtils()
     {
     }
@@ -94,34 +92,28 @@
             baseVersion;
     }
 
-    public static Map artifactMapByVersionlessId( Collection artifacts )
+    public static Map<String,Artifact> artifactMapByVersionlessId( Collection<Artifact> artifacts )
     {
-        Map artifactMap = new HashMap();
+        Map<String,Artifact> artifactMap = new HashMap<String,Artifact>();
 
         if ( artifacts != null )
         {
-            for ( Iterator it = artifacts.iterator(); it.hasNext(); )
-            {
-                Artifact artifact = (Artifact) it.next();
-
-                artifactMap.put( versionlessKey( artifact ), artifact );
+            for (Artifact artifact : artifacts) {
+                artifactMap.put(versionlessKey(artifact), artifact);
             }
         }
 
         return artifactMap;
     }
 
-    public static Map artifactMapByArtifactId( Collection artifacts )
+    public static Map<String,Artifact> artifactMapByArtifactId( Collection<Artifact> artifacts )
     {
-        Map artifactMap = new HashMap();
+        Map<String,Artifact> artifactMap = new HashMap<String,Artifact>();
 
         if ( artifacts != null )
         {
-            for ( Iterator it = artifacts.iterator(); it.hasNext(); )
-            {
-                Artifact artifact = (Artifact) it.next();
-
-                artifactMap.put( artifact.getId(), artifact );
+            for (Artifact artifact : artifacts) {
+                artifactMap.put(artifact.getId(), artifact);
             }
         }
 
@@ -148,13 +140,13 @@
         return clone;
     }
 
-    private static List copyList( List original )
+    private static <T> List<T> copyList( List<T> original )
     {
-        List copy = null;
+        List<T> copy = null;
 
         if ( original != null )
         {
-            copy = new ArrayList();
+            copy = new ArrayList<T>();
 
             if ( !original.isEmpty() )
             {

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/DefaultArtifact.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/DefaultArtifact.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/DefaultArtifact.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/DefaultArtifact.java Wed May 21 22:15:02 2008
@@ -48,10 +48,6 @@
 
     private String artifactId;
 
-    private String type;
-
-    private File file;
-
     /**
      * The resolved version for the artifact after conflict resolution, that has not been transformed.
      *
@@ -59,11 +55,15 @@
      */
     private String baseVersion;
 
+    private String type;
+
+    private File file;
+
     private String version;
 
     private VersionRange versionRange;
 
-    private Map metadataMap;
+    private Map<Object,ArtifactMetadata> metadataMap;
 
     // This is Maven specific. jvz/
     private String classifier;
@@ -302,10 +302,10 @@
     {
         if ( metadataMap == null )
         {
-            metadataMap = new HashMap();
+            metadataMap = new HashMap<Object,ArtifactMetadata>();
         }
 
-        ArtifactMetadata m = (ArtifactMetadata) metadataMap.get( metadata.getKey() );
+        ArtifactMetadata m = metadataMap.get( metadata.getKey() );
         if ( m != null )
         {
             m.merge( metadata );
@@ -316,9 +316,13 @@
         }
     }
 
-    public Collection getMetadataList()
+    public Collection<ArtifactMetadata> getMetadataList()
     {
-        return metadataMap == null ? Collections.EMPTY_LIST : metadataMap.values();
+        if (metadataMap == null) {
+            return Collections.emptyList();
+        }
+
+        return metadataMap.values();
     }
 
     // ----------------------------------------------------------------------
@@ -515,12 +519,12 @@
         dependencyFilter = artifactFilter;
     }
 
-    public List getDependencyTrail()
+    public List<String> getDependencyTrail()
     {
         return dependencyTrail;
     }
 
-    public void setDependencyTrail( List dependencyTrail )
+    public void setDependencyTrail( List<String> dependencyTrail )
     {
         this.dependencyTrail = dependencyTrail;
     }

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsChangeRequest.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsChangeRequest.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsChangeRequest.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsChangeRequest.java Wed May 21 22:15:02 2008
@@ -1,5 +1,24 @@
 package org.apache.maven.artifact.manager;
 
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 
 public class CredentialsChangeRequest

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSource.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSource.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSource.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSource.java Wed May 21 22:15:02 2008
@@ -1,5 +1,24 @@
 package org.apache.maven.artifact.manager;
 
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 
 /**
@@ -29,14 +48,7 @@
      * set, if not found, prompt and create Authentication info
      * for a given resource. This one uses the old password
      * member of AuthenticationInfo
-     *
-     * @param resourceId  resource ID for which authentication is required
-     * @param authInfo    authentication info to set for the given resource ID
-     * @param oldPassword old password if one exists or <code>null</code> if not needed
-     *                    - you know for sure that it's a new auth of the existing auth
-     *                    does not have a password, associated with the resource, or you want the
-     *                    old password to be prompted
-     * @return
+     * 
      * @throws CredentialsDataSourceException
      */
     void set( CredentialsChangeRequest req )

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSourceException.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSourceException.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSourceException.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/CredentialsDataSourceException.java Wed May 21 22:15:02 2008
@@ -1,5 +1,24 @@
 package org.apache.maven.artifact.manager;
 
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 public class CredentialsDataSourceException
     extends Exception
 {

Added: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java?rev=659009&view=auto
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java (added)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java Wed May 21 22:15:02 2008
@@ -0,0 +1,350 @@
+package org.apache.maven.artifact.manager;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.Logger;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.util.Date;
+import java.util.Properties;
+
+/** @plexus.component */
+public class DefaultUpdateCheckManager
+    extends AbstractLogEnabled
+    implements UpdateCheckManager
+{
+
+    public DefaultUpdateCheckManager()
+    {
+
+    }
+
+    public DefaultUpdateCheckManager( Logger logger )
+    {
+        enableLogging( logger );
+    }
+
+    public static final String LAST_UPDATE_TAG = ".lastUpdated";
+
+    private static final String TOUCHFILE_NAME = "resolver-status.properties";
+
+    public boolean isUpdateRequired( Artifact artifact, ArtifactRepository repository )
+    {
+        // Update intervals are never used for release artifacts. These intervals
+        // only exist on the release section of the repository definition in the POM for one reason:
+        // to specify how often artifact METADATA is checked. Here, we simply shortcut for non-snapshot
+        // artifacts.
+        if ( !artifact.isSnapshot() )
+        {
+            return false;
+        }
+
+        // we can safely assume that we're calculating based on the snapshot policy here if we've made it past the
+        // release-artifact short circuit above.
+        ArtifactRepositoryPolicy policy = repository.getSnapshots();
+
+        File file = artifact.getFile();
+
+        if ( !policy.isEnabled() )
+        {
+            return false;
+        }
+
+        if ( file == null )
+        {
+            // TODO throw something instead?
+            return true;
+        }
+
+        Date lastCheckDate;
+
+        if ( file.exists() )
+        {
+            lastCheckDate = new Date ( file.lastModified() );
+        }
+        else
+        {
+            File touchfile = getTouchfile( artifact );
+            lastCheckDate = readLastUpdated( touchfile, repository.getId() );
+        }
+
+        return ( lastCheckDate == null ) || policy.checkOutOfDate( lastCheckDate );
+    }
+
+    public boolean isUpdateRequired( RepositoryMetadata metadata, ArtifactRepository repository, File file )
+    {
+        // Here, we need to determine which policy to use. Release updateInterval will be used when
+        // the metadata refers to a release artifact or meta-version, and snapshot updateInterval will be used when
+        // it refers to a snapshot artifact or meta-version.
+        // NOTE: Release metadata includes version information about artifacts that have been released, to allow
+        // meta-versions like RELEASE and LATEST to resolve, and also to allow retrieval of the range of valid, released
+        // artifacts available.
+        ArtifactRepositoryPolicy policy = metadata.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
+
+        if ( !policy.isEnabled() )
+        {
+            return false;
+        }
+
+        if ( file == null )
+        {
+            // TODO throw something instead?
+            return true;
+        }
+
+        Date lastCheckDate = readLastUpdated( metadata, repository, file );
+
+        return ( lastCheckDate == null ) || policy.checkOutOfDate( lastCheckDate );
+    }
+
+    public Date readLastUpdated( RepositoryMetadata metadata, ArtifactRepository repository, File file )
+    {
+        File touchfile = getTouchfile( metadata, file );
+
+        String key = getMetadataKey( repository, file );
+
+        return readLastUpdated( touchfile, key );
+    }
+
+    public void touch( Artifact artifact, ArtifactRepository repository )
+    {
+        File file = artifact.getFile();
+
+        File touchfile = getTouchfile( artifact );
+
+        if ( file.exists() )
+        {
+            touchfile.delete();
+        }
+        else
+        {
+            writeLastUpdated( touchfile, repository.getId() );
+        }
+
+    }
+
+    public void touch( RepositoryMetadata metadata, ArtifactRepository repository, File file )
+    {
+        File touchfile = getTouchfile( metadata, file );
+
+        String key = getMetadataKey( repository, file );
+
+        writeLastUpdated( touchfile, key );
+    }
+
+    public String getMetadataKey( ArtifactRepository repository, File file )
+    {
+        return repository.getId() + "." + file.getName() + LAST_UPDATE_TAG;
+    }
+
+    private void writeLastUpdated( File touchfile, String key )
+    {
+        synchronized ( touchfile.getAbsolutePath().intern() )
+        {
+            if ( !touchfile.getParentFile().exists() && !touchfile.getParentFile().mkdirs() )
+            {
+                getLogger().debug( "Failed to create directory: " + touchfile.getParent() +
+                                       " for tracking artifact metadata resolution." );
+                return;
+            }
+
+            FileChannel channel = null;
+            FileLock lock = null;
+            try
+            {
+                Properties props = new Properties();
+
+                channel = new RandomAccessFile( touchfile, "rw" ).getChannel();
+                lock = channel.lock( 0, channel.size(), false );
+
+                if ( touchfile.canRead() )
+                {
+                    getLogger().debug( "Reading resolution-state from: " + touchfile );
+                    ByteBuffer buffer = ByteBuffer.allocate( (int) channel.size() );
+
+                    channel.read( buffer );
+                    buffer.flip();
+
+                    ByteArrayInputStream stream = new ByteArrayInputStream( buffer.array() );
+                    props.load( stream );
+                }
+
+                props.setProperty( key, Long.toString( System.currentTimeMillis() ) );
+
+                ByteArrayOutputStream stream = new ByteArrayOutputStream();
+
+                getLogger().debug( "Writing resolution-state to: " + touchfile );
+                props.store( stream, "Last modified on: " + new Date() );
+
+                byte[] data = stream.toByteArray();
+                ByteBuffer buffer = ByteBuffer.allocate( data.length );
+                buffer.put( data );
+                buffer.flip();
+
+                channel.position( 0 );
+                channel.write( buffer );
+            }
+            catch ( IOException e )
+            {
+                getLogger().debug( "Failed to record lastUpdated information for resolution.\nFile: " +
+                                       touchfile.toString() + "; key: " + key, e );
+            }
+            finally
+            {
+                if ( lock != null )
+                {
+                    try
+                    {
+                        lock.release();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLogger().debug( "Error releasing exclusive lock for resolution tracking file: " +
+                                               touchfile, e );
+                    }
+                }
+
+                if ( channel != null )
+                {
+                    try
+                    {
+                        channel.close();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLogger().debug( "Error closing FileChannel for resolution tracking file: " +
+                                               touchfile, e );
+                    }
+                }
+            }
+        }
+    }
+
+    public Date readLastUpdated( File touchfile, String key )
+    {
+        if ( !touchfile.canRead() )
+        {
+            return null;
+        }
+
+        synchronized ( touchfile.getAbsolutePath().intern() )
+        {
+            getLogger().debug( "Searching for: " + key + " in touchfile." );
+
+            Date result = null;
+            FileInputStream stream = null;
+            FileLock lock = null;
+            FileChannel channel = null;
+            try
+            {
+                Properties props = new Properties();
+
+                stream = new FileInputStream( touchfile );
+                channel = stream.getChannel();
+                lock = channel.lock( 0, channel.size(), true );
+
+                getLogger().debug( "Reading resolution-state from: " + touchfile );
+                props.load( stream );
+
+                String rawVal = props.getProperty( key );
+                if ( rawVal != null )
+                {
+                    try
+                    {
+                        result = new Date( Long.parseLong( rawVal ) );
+                    }
+                    catch ( NumberFormatException e )
+                    {
+                        getLogger().debug( "Cannot parse lastUpdated date: \'" + rawVal + "\'. Ignoring.", e );
+                        result = null;
+                    }
+                }
+            }
+            catch ( IOException e )
+            {
+                getLogger().debug( "Failed to read lastUpdated information.\nFile: " +
+                                       touchfile.toString() + "; key: " + key, e );
+            }
+            finally
+            {
+                if ( lock != null )
+                {
+                    try
+                    {
+                        lock.release();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLogger().debug( "Error releasing shared lock for resolution tracking file: " +
+                                               touchfile, e );
+                    }
+                }
+
+                if ( channel != null )
+                {
+                    try
+                    {
+                        channel.close();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLogger().debug( "Error closing FileChannel for resolution tracking file: " +
+                                           touchfile, e );
+                    }
+                }
+            }
+
+            return result;
+        }
+    }
+
+    public File getTouchfile( Artifact artifact )
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append( artifact.getArtifactId() );
+        sb.append( '-' ).append( artifact.getBaseVersion() );
+        if ( artifact.getClassifier() != null )
+        {
+            sb.append( '-' ).append( artifact.getClassifier() );
+        }
+        sb.append( '.' ).append( artifact.getType() ).append( LAST_UPDATE_TAG );
+        File touchfile = new File( artifact.getFile().getParentFile(), sb.toString() );
+        return touchfile;
+    }
+
+    public File getTouchfile( RepositoryMetadata metadata, File file )
+    {
+        return new File( file.getParent(), TOUCHFILE_NAME );
+    }
+
+}

Propchange: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java Wed May 21 22:15:02 2008
@@ -56,12 +56,16 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
 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;
 
 /** @plexus.component */
 public class DefaultWagonManager
@@ -71,6 +75,8 @@
 {
     private static final String WILDCARD = "*";
 
+    private static final String EXTERNAL_WILDCARD = "external:*";
+
     private static final String[] CHECKSUM_IDS = {"md5", "sha1"};
 
     /** have to match the CHECKSUM_IDS */
@@ -86,7 +92,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();
@@ -110,6 +117,9 @@
     /** encapsulates access to Server credentials */
     private CredentialsDataSource credentialsDataSource;
 
+    /** @plexus.requirement */
+    private UpdateCheckManager updateCheckManager;
+
     // TODO: this leaks the component in the public api - it is never released back to the container
     public Wagon getWagon( Repository repository )
         throws UnsupportedProtocolException, WagonConfigurationException
@@ -316,7 +326,15 @@
     // NOTE: It is not possible that this method throws TransferFailedException under current conditions.
     // FIXME: Change the throws clause to reflect the fact that we're never throwing TransferFailedException
     public void getArtifact( Artifact artifact,
-                             List remoteRepositories )
+                             List remoteRepositories  )
+        throws TransferFailedException, ResourceDoesNotExistException
+	{
+    	getArtifact( artifact, remoteRepositories, true );
+	}
+
+    public void getArtifact( Artifact artifact,
+                             List remoteRepositories,
+                             boolean force )
         throws TransferFailedException, ResourceDoesNotExistException
     {
         boolean successful = false;
@@ -327,7 +345,7 @@
 
             try
             {
-                getArtifact( artifact, repository );
+                getArtifact( artifact, repository, force );
 
                 successful = artifact.isResolved();
             }
@@ -355,6 +373,15 @@
 
     public void getArtifact( Artifact artifact,
                              ArtifactRepository repository )
+        throws TransferFailedException,
+               ResourceDoesNotExistException
+    {
+        getArtifact( artifact, repository, true );
+    }
+
+    public void getArtifact( Artifact artifact,
+                             ArtifactRepository repository,
+                             boolean force )
         throws TransferFailedException, ResourceDoesNotExistException
     {
         String remotePath = repository.pathOf( artifact );
@@ -369,11 +396,39 @@
         {
             getLogger().debug( "Skipping blacklisted repository " + repository.getId() );
         }
-        else
+        // If the artifact is a snapshot, we need to determine whether it's time to check this repository for an update:
+        // 1. If it's forced, then check
+        // 2. If the updateInterval has been exceeded since the last check for this artifact on this repository, then check.
+        else if ( artifact.isSnapshot() && ( force || updateCheckManager.isUpdateRequired( artifact, repository ) ) )
         {
             getLogger().debug( "Trying repository " + repository.getId() );
 
-            getRemoteFile( repository, artifact.getFile(), remotePath, downloadMonitor, policy.getChecksumPolicy(), false );
+            try
+            {
+                getRemoteFile( getMirrorRepository( repository ), artifact.getFile(), remotePath, downloadMonitor,
+                               policy.getChecksumPolicy(), false );
+            }
+            finally
+            {
+            	updateCheckManager.touch( artifact, repository );
+            }
+
+            getLogger().debug( "  Artifact resolved" );
+
+            artifact.setResolved( true );
+        }
+        // If it's not a snapshot artifact, then we don't care what the force flag says. If it's on the local
+        // system, it's resolved. Releases are presumed to be immutable, so release artifacts are not ever updated.
+        // NOTE: This is NOT the case for metadata files on relese-only repositories. This metadata may contain information
+        // about successive releases, so it should be checked using the same updateInterval/force characteristics as snapshot
+        // artifacts, above.
+
+        // don't write touch-file for release artifacts.
+        else if ( !artifact.isSnapshot() )
+        {
+            getLogger().debug( "Trying repository " + repository.getId() );
+
+            getRemoteFile( getMirrorRepository( repository ), artifact.getFile(), remotePath, downloadMonitor, policy.getChecksumPolicy(), false );
 
             getLogger().debug( "  Artifact resolved" );
 
@@ -389,6 +444,15 @@
     {
         String remotePath = repository.pathOfRemoteRepositoryMetadata( metadata );
 
+        getRemoteFile( getMirrorRepository( repository ), destination, remotePath, null, checksumPolicy, true );
+    }
+
+    public void getArtifactMetadataFromDeploymentRepository( ArtifactMetadata metadata, ArtifactRepository repository,
+                                                             File destination, String checksumPolicy )
+        throws TransferFailedException, ResourceDoesNotExistException
+    {
+        String remotePath = repository.pathOfRemoteRepositoryMetadata( metadata );
+
         getRemoteFile( repository, destination, remotePath, null, checksumPolicy, true );
     }
 
@@ -404,15 +468,6 @@
 
         failIfNotOnline();
 
-        ArtifactRepository mirror = getMirror( repository.getId() );
-
-        if ( mirror != null )
-        {
-            repository = repositoryFactory.createArtifactRepository( mirror.getId(), mirror.getUrl(),
-                repository.getLayout(), repository.getSnapshots(),
-                repository.getReleases() );
-        }
-
         String protocol = repository.getProtocol();
 
         Wagon wagon;
@@ -621,6 +676,26 @@
         }
     }
 
+    public 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();
+            }
+
+            getLogger().info( "Using mirror: " + mirror.getId() + " for repository: " + repository.getId() + "\n(mirror url: " + mirror.getUrl() + ")" );
+            repository = repositoryFactory.createArtifactRepository( id, mirror.getUrl(),
+                                                                     repository.getLayout(), repository.getSnapshots(),
+                                                                     repository.getReleases() );
+        }
+        return repository;
+    }
+
     private void failIfNotOnline()
         throws TransferFailedException
     {
@@ -685,7 +760,7 @@
                     expectedChecksum = expectedChecksum.substring( 0, spacePos );
                 }
             }
-            if ( expectedChecksum.equals( actualChecksum ) )
+            if ( expectedChecksum.equalsIgnoreCase( actualChecksum ) )
             {
                 File checksumFile = new File( destination + checksumFileExtension );
                 if ( checksumFile.exists() )
@@ -707,6 +782,7 @@
         }
     }
 
+
     private void disconnectWagon( Wagon wagon )
     {
         try
@@ -747,28 +823,130 @@
             ;
     }
 
-    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 repository = (ArtifactRepository) mirrors.get( mirrorOf );
+        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.
+     * 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.
+     */
+    public 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 ) )
         {
-            repository = (ArtifactRepository) mirrors.get( WILDCARD );
+            result = true;
         }
+        else
+        {
+            // process the list
+            String[] repos = pattern.split( "," );
+            for ( int i = 0; i < repos.length; i++ )
+            {
+                String repo = repos[i];
 
-        return repository;
+                // 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.
+     */
+    public 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;
+        }
     }
 
     /**
      * Set the proxy used for a particular protocol.
      *
-     * @param protocol      the protocol (required)
-     * @param host          the proxy host name (required)
-     * @param port          the proxy port (required)
-     * @param username      the username for the proxy, or null if there is none
-     * @param password      the password for the proxy, or null if there is none
-     * @param nonProxyHosts the set of hosts not to use the proxy for. Follows Java system
-     *                      property format: <code>*.foo.com|localhost</code>.
+     * @param protocol the protocol (required)
+     * @param host the proxy host name (required)
+     * @param port the proxy port (required)
+     * @param username the username for the proxy, or null if there is none
+     * @param password the password for the proxy, or null if there is none
+     * @param nonProxyHosts the set of hosts not to use the proxy for. Follows Java system property format:
+     *            <code>*.foo.com|localhost</code>.
      * @todo [BP] would be nice to configure this via plexus in some way
      */
     public void addProxy( String protocol,

Added: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java?rev=659009&view=auto
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java (added)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java Wed May 21 22:15:02 2008
@@ -0,0 +1,40 @@
+package org.apache.maven.artifact.manager;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
+
+public interface UpdateCheckManager {
+
+	String ROLE = UpdateCheckManager.class.getName();
+
+	boolean isUpdateRequired( Artifact artifact, ArtifactRepository repository );
+
+	void touch( Artifact artifact, ArtifactRepository repository );
+
+    boolean isUpdateRequired( RepositoryMetadata metadata, ArtifactRepository repository, File file );
+
+	void touch( RepositoryMetadata metadata, ArtifactRepository repository, File file );
+
+}

Propchange: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/UpdateCheckManager.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/WagonManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/WagonManager.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/WagonManager.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/manager/WagonManager.java Wed May 21 22:15:02 2008
@@ -77,9 +77,19 @@
         throws TransferFailedException, ResourceDoesNotExistException;
 
     void getArtifact( Artifact artifact,
+                      List remoteRepositories,
+                      boolean forceUpdateCheck )
+    	throws TransferFailedException, ResourceDoesNotExistException;
+
+    void getArtifact( Artifact artifact,
                       ArtifactRepository repository )
         throws TransferFailedException, ResourceDoesNotExistException;
 
+    void getArtifact( Artifact artifact,
+                      ArtifactRepository repository,
+                      boolean forceUpdateCheck )
+        throws TransferFailedException, ResourceDoesNotExistException;
+
     void putArtifact( File source,
                       Artifact artifact,
                       ArtifactRepository deploymentRepository )
@@ -96,6 +106,10 @@
                               String checksumPolicy )
         throws TransferFailedException, ResourceDoesNotExistException;
 
+    void getArtifactMetadataFromDeploymentRepository( ArtifactMetadata metadata, ArtifactRepository remoteRepository,
+                                                      File file, String checksumPolicyWarn )
+        throws TransferFailedException, ResourceDoesNotExistException;
+
     void setOnline( boolean online );
 
     boolean isOnline();
@@ -154,4 +168,6 @@
     void findAndRegisterWagons( PlexusContainer container );
 
     void setDefaultRepositoryPermissions( RepositoryPermissions permissions );
-}
\ No newline at end of file
+
+    ArtifactRepository getMirrorRepository( ArtifactRepository repository );
+}

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryPolicy.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryPolicy.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryPolicy.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryPolicy.java Wed May 21 22:15:02 2008
@@ -131,7 +131,7 @@
         else if ( updatePolicy.startsWith( UPDATE_POLICY_INTERVAL ) )
         {
             String s = updatePolicy.substring( UPDATE_POLICY_INTERVAL.length() + 1 );
-            int minutes = Integer.valueOf( s ).intValue();
+            int minutes = Integer.valueOf(s);
             Calendar cal = Calendar.getInstance();
             cal.add( Calendar.MINUTE, -minutes );
             if ( cal.getTime().after( lastModified ) )

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory.java Wed May 21 22:15:02 2008
@@ -41,15 +41,15 @@
     private String globalChecksumPolicy;
 
     // FIXME: This is a non-ThreadLocal cache!!
-    private final Map artifactRepositories = new HashMap();
+    private final Map<String,ArtifactRepository> artifactRepositories = new HashMap<String,ArtifactRepository>();
 
     /** @plexus.requirement role="org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout" */
-    private Map repositoryLayouts;
+    private Map<String,ArtifactRepositoryLayout> repositoryLayouts;
 
     public ArtifactRepositoryLayout getLayout( String layoutId )
         throws UnknownRepositoryLayoutException
     {
-        return (ArtifactRepositoryLayout) repositoryLayouts.get( layoutId );
+        return repositoryLayouts.get( layoutId );
     }
 
     public ArtifactRepository createDeploymentArtifactRepository( String id,
@@ -58,7 +58,7 @@
                                                                   boolean uniqueVersion )
         throws UnknownRepositoryLayoutException
     {
-        ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) repositoryLayouts.get( layoutId );
+        ArtifactRepositoryLayout layout = repositoryLayouts.get( layoutId );
 
         checkLayout( id, layoutId, layout );
 
@@ -91,7 +91,7 @@
                                                         ArtifactRepositoryPolicy releases )
         throws UnknownRepositoryLayoutException
     {
-        ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) repositoryLayouts.get( layoutId );
+        ArtifactRepositoryLayout layout = repositoryLayouts.get( layoutId );
 
         checkLayout( id, layoutId, layout );
 
@@ -107,7 +107,7 @@
         boolean blacklisted = false;
         if ( artifactRepositories.containsKey( id ) )
         {
-            ArtifactRepository repository = (ArtifactRepository) artifactRepositories.get( id );
+            ArtifactRepository repository = artifactRepositories.get( id );
             // TODO: this should be an if there are duplicates?
             if ( repository.getUrl().equals( url ) )
             {
@@ -137,8 +137,7 @@
             releases.setChecksumPolicy( globalChecksumPolicy );
         }
 
-        DefaultArtifactRepository repository = new DefaultArtifactRepository( id, url, repositoryLayout, snapshots,
-            releases );
+        DefaultArtifactRepository repository = new DefaultArtifactRepository( id, url, repositoryLayout, snapshots, releases );
         repository.setBlacklisted( blacklisted );
 
         artifactRepositories.put( id, repository );

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java Wed May 21 22:15:02 2008
@@ -19,6 +19,16 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.manager.UpdateCheckManager;
 import org.apache.maven.artifact.manager.WagonManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -32,16 +42,6 @@
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 /**
  * @author Jason van Zyl
  * @plexus.component
@@ -53,9 +53,13 @@
     /** @plexus.requirement */
     private WagonManager wagonManager;
 
-    protected DefaultRepositoryMetadataManager( WagonManager wagonManager, Logger logger )
+    /** @plexus.requirement */
+    private UpdateCheckManager updateCheckManager;
+
+    protected DefaultRepositoryMetadataManager( WagonManager wagonManager, UpdateCheckManager updateCheckManager, Logger logger )
     {
         this.wagonManager = wagonManager;
+        this.updateCheckManager = updateCheckManager;
         enableLogging( logger );
     }
 
@@ -64,62 +68,57 @@
     }
 
     public void resolve( RepositoryMetadata metadata,
-                         List remoteRepositories,
+                         List<ArtifactRepository> remoteRepositories,
                          ArtifactRepository localRepository )
         throws RepositoryMetadataResolutionException
     {
-        MetadataTouchfile touchfile = new MetadataTouchfile( metadata, localRepository );
-
-        for ( Iterator i = remoteRepositories.iterator(); i.hasNext(); )
-        {
-            ArtifactRepository repository = (ArtifactRepository) i.next();
-
+        for (ArtifactRepository repository : remoteRepositories) {
             ArtifactRepositoryPolicy policy =
-                metadata.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
+                    metadata.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
 
-            if ( !policy.isEnabled() )
-            {
-                getLogger().debug( "Skipping disabled repository " + repository.getId() );
-            }
-            else if ( repository.isBlacklisted() )
-            {
-                getLogger().debug( "Skipping blacklisted repository " + repository.getId() );
-            }
-            else
-            {
-                File file = new File( localRepository.getBasedir(),
-                    localRepository.pathOfLocalRepositoryMetadata( metadata, repository ) );
+            File file = new File(localRepository.getBasedir(),
+                    localRepository.pathOfLocalRepositoryMetadata(metadata, repository));
 
-                Date lastMod = touchfile.getLastCheckDate( repository.getId(), file.getName(), getLogger() );
-                getLogger().debug( "Got last-check-date of: " + lastMod + "\nfor metadata: " + metadata + "\nwith filename: " + file.getName() + "\nin repository: " + repository.getId() );
+            if (wagonManager.isOnline()) {
+                if (updateCheckManager.isUpdateRequired(metadata, repository, file)) {
+                    getLogger().info(metadata.getKey() + ": checking for updates from " + repository.getId());
+                    try {
+                        wagonManager.getArtifactMetadata(metadata, repository, file, policy.getChecksumPolicy());
+                    }
+                    catch (ResourceDoesNotExistException e) {
+                        getLogger().debug(metadata + " could not be found on repository: " + repository.getId());
 
-                boolean checkForUpdates =
-                    ( lastMod == null ) || policy.checkOutOfDate( lastMod );
+                        // delete the local copy so the old details aren't used.
+                        if (file.exists()) {
+                            file.delete();
+                        }
+                    }
+                    catch (TransferFailedException e) {
+                        getLogger().warn(metadata + " could not be retrieved from repository: " + repository.getId() +
+                                " due to an error: " + e.getMessage());
+                        getLogger().debug("Exception", e);
 
-                if ( checkForUpdates )
-                {
-                    getLogger().info( metadata.getKey() + ": checking for updates from " + repository.getId() );
+                        getLogger().info("Repository '" + repository.getId() + "' will be blacklisted");
+                        repository.setBlacklisted(true);
 
-                    try
-                    {
-                        resolveAlways( metadata, repository, file, policy.getChecksumPolicy(), touchfile, true );
-                    }
-                    catch ( TransferFailedException e )
-                    {
                         // TODO: [jc; 08-Nov-2005] revisit this for 2.1
                         // suppressing logging to avoid logging this error twice.
                     }
+                    finally {
+                        updateCheckManager.touch(metadata, repository, file);
+                    }
                 }
+            } else {
+                getLogger().debug(
+                        "System is offline. Cannot resolve metadata:\n" + metadata.extendedToString() + "\n\n");
+            }
 
-                // TODO: should this be inside the above check?
-                // touch file so that this is not checked again until interval has passed
-                if ( file.exists() )
-                {
-                    file.setLastModified( System.currentTimeMillis() );
-                }
+            // TODO: should this be inside the above check?
+            // touch file so that this is not checked again until interval has passed
+            if (file.exists()) {
+                file.setLastModified(System.currentTimeMillis());
             }
         }
-
         try
         {
             mergeMetadata( metadata, remoteRepositories, localRepository );
@@ -137,7 +136,7 @@
     }
 
     private void mergeMetadata( RepositoryMetadata metadata,
-                                List remoteRepositories,
+                                List<ArtifactRepository> remoteRepositories,
                                 ArtifactRepository localRepository )
         throws RepositoryMetadataStoreException, RepositoryMetadataReadException
     {
@@ -148,17 +147,13 @@
 
         Map previousMetadata = new HashMap();
         ArtifactRepository selected = null;
-        for ( Iterator i = remoteRepositories.iterator(); i.hasNext(); )
-        {
-            ArtifactRepository repository = (ArtifactRepository) i.next();
-
+        for (ArtifactRepository repository : remoteRepositories) {
             ArtifactRepositoryPolicy policy =
-                metadata.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
+                    metadata.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
 
-            if ( ( policy.isEnabled() && !repository.isBlacklisted() )
-                && ( loadMetadata( metadata, repository, localRepository, previousMetadata ) ) )
-            {
-                metadata.setRepository( repository );
+            if ((policy.isEnabled() && !repository.isBlacklisted())
+                    && (loadMetadata(metadata, repository, localRepository, previousMetadata))) {
+                metadata.setRepository(repository);
                 selected = repository;
             }
         }
@@ -295,21 +290,15 @@
                 "System is offline. Cannot resolve required metadata:\n" + metadata.extendedToString() );
         }
 
-        File file = new File( localRepository.getBasedir(),
-            localRepository.pathOfLocalRepositoryMetadata( metadata, remoteRepository ) );
-
+        File file;
         try
         {
-            MetadataTouchfile touchfile = new MetadataTouchfile( metadata, localRepository );
-
-            resolveAlways( metadata, remoteRepository, file, ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN, touchfile, false );
+            file = getArtifactMetadataFromDeploymentRepository( metadata, localRepository, remoteRepository );
         }
         catch ( TransferFailedException e )
         {
-            // TODO: [jc; 08-Nov-2005] revisit this for 2.1
-            // suppressing logging to avoid logging this error twice.
-            // We don't want to interrupt program flow here. Just allow empty metadata instead.
-            // rethrowing this would change behavior.
+            throw new RepositoryMetadataResolutionException( metadata + " could not be retrieved from repository: " +
+                remoteRepository.getId() + " due to an error: " + e.getMessage(), e );
         }
 
         try
@@ -326,59 +315,38 @@
         }
     }
 
-    private void resolveAlways( ArtifactMetadata metadata,
-                                ArtifactRepository repository,
-                                File file,
-                                String checksumPolicy,
-                                MetadataTouchfile touchfile,
-                                boolean allowBlacklisting )
-        throws RepositoryMetadataResolutionException, TransferFailedException
+    private File getArtifactMetadataFromDeploymentRepository( ArtifactMetadata metadata,
+                                                              ArtifactRepository localRepository,
+                                                              ArtifactRepository remoteRepository )
+        throws TransferFailedException
     {
-        if ( !wagonManager.isOnline() )
-        {
-            if ( allowBlacklisting )
-            {
-                getLogger().debug(
-                    "System is offline. Cannot resolve metadata:\n" + metadata.extendedToString() + "\n\n" );
-                return;
-            }
-            else
-            {
-                // metadata is required for deployment, can't be offline
-                throw new RepositoryMetadataResolutionException(
-                    "System is offline. Cannot resolve required metadata:\n" + metadata.extendedToString() );
-            }
-        }
+        File file = new File( localRepository.getBasedir(),
+                              localRepository.pathOfLocalRepositoryMetadata( metadata, remoteRepository ) );
 
         try
         {
-            wagonManager.getArtifactMetadata( metadata, repository, file, checksumPolicy );
+            wagonManager.getArtifactMetadataFromDeploymentRepository( metadata, remoteRepository, file,
+                                                                      ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
         }
         catch ( ResourceDoesNotExistException e )
         {
-            getLogger().debug( metadata
-                               + " could not be found on repository: "
-                               + repository.getId() );
+            getLogger().info(
+                metadata + " could not be found on repository: " + remoteRepository.getId() + ", so will be created" );
 
+            // delete the local copy so the old details aren't used.
             if ( file.exists() )
             {
                 file.delete();
             }
         }
-        catch ( TransferFailedException e )
-        {
-            getLogger().warn(
-                metadata + " could not be retrieved from repository: " + repository.getId() + " due to an error: " + e.getMessage() );
-            getLogger().info( "Repository '" + repository.getId() + "' will be blacklisted" );
-            getLogger().debug( "Exception", e );
-            repository.setBlacklisted( allowBlacklisting );
-
-            throw e;
-        }
         finally
         {
-            touchfile.touch( repository.getId(), file.getName(), getLogger() );
+            if ( metadata instanceof RepositoryMetadata )
+            {
+                updateCheckManager.touch( (RepositoryMetadata) metadata, remoteRepository, file );
+            }
         }
+        return file;
     }
 
     public void deploy( ArtifactMetadata metadata,
@@ -393,26 +361,26 @@
                 "System is offline. Cannot deploy metadata:\n" + metadata.extendedToString() );
         }
 
-        getLogger().info( "Retrieving previous metadata from " + deploymentRepository.getId() );
-
-        File file = new File( localRepository.getBasedir(),
-            localRepository.pathOfLocalRepositoryMetadata( metadata, deploymentRepository ) );
-
-        try
+        File file;
+        if ( metadata instanceof RepositoryMetadata )
         {
-            MetadataTouchfile touchfile = new MetadataTouchfile( metadata, localRepository );
-
-            resolveAlways( metadata, deploymentRepository, file, ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN, touchfile, false );
-        }
-        catch ( RepositoryMetadataResolutionException e )
-        {
-            throw new RepositoryMetadataDeploymentException(
-                "Unable to get previous metadata to update: " + e.getMessage(), e );
+            getLogger().info( "Retrieving previous metadata from " + deploymentRepository.getId() );
+            try
+            {
+                file = getArtifactMetadataFromDeploymentRepository( metadata, localRepository, deploymentRepository );
+            }
+            catch ( TransferFailedException e )
+            {
+                throw new RepositoryMetadataDeploymentException( metadata +
+                    " could not be retrieved from repository: " + deploymentRepository.getId() + " due to an error: " +
+                    e.getMessage(), e );
+            }
         }
-        catch ( TransferFailedException e )
+        else
         {
-            throw new RepositoryMetadataDeploymentException(
-                "Unable to get previous metadata to update: " + e.getMessage(), e );
+            // It's a POM - we don't need to retrieve it first
+            file = new File( localRepository.getBasedir(),
+                             localRepository.pathOfLocalRepositoryMetadata( metadata, deploymentRepository ) );
         }
 
         try

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager.java Wed May 21 22:15:02 2008
@@ -27,7 +27,7 @@
 public interface RepositoryMetadataManager
 {
     void resolve( RepositoryMetadata repositoryMetadata,
-                  List repositories,
+                  List<ArtifactRepository> repositories,
                   ArtifactRepository localRepository )
         throws RepositoryMetadataResolutionException;
 

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactCollector.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactCollector.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactCollector.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactCollector.java Wed May 21 22:15:02 2008
@@ -23,6 +23,7 @@
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.resolver.conflict.ConflictResolver;
 
 import java.util.List;
 import java.util.Map;
@@ -45,33 +46,33 @@
     String ROLE = ArtifactCollector.class.getName();
 
     // TODO: deprecate since conflict resolvers should always be specified
-    ArtifactResolutionResult collect( Set artifacts,
+    ArtifactResolutionResult collect( Set<Artifact> artifacts,
                                       Artifact originatingArtifact,
                                       ArtifactRepository localRepository,
-                                      List remoteRepositories,
+                                      List<ArtifactRepository> remoteRepositories,
                                       ArtifactMetadataSource source,
                                       ArtifactFilter filter,
-                                      List listeners );
+                                      List<ResolutionListener> listeners );
 
     // TODO: deprecate since conflict resolvers should always be specified
-    ArtifactResolutionResult collect( Set artifacts,
+    ArtifactResolutionResult collect( Set<Artifact> artifacts,
                                       Artifact originatingArtifact,
                                       Map managedVersions,
                                       ArtifactRepository localRepository,
-                                      List remoteRepositories,
+                                      List<ArtifactRepository> remoteRepositories,
                                       ArtifactMetadataSource source,
                                       ArtifactFilter filter,
-                                      List listeners );
+                                      List<ResolutionListener> listeners );
 
     /** @since 3.0 */
-    ArtifactResolutionResult collect( Set artifacts,
+    ArtifactResolutionResult collect( Set<Artifact> artifacts,
                                       Artifact originatingArtifact,
                                       Map managedVersions,
                                       ArtifactRepository localRepository,
-                                      List remoteRepositories,
+                                      List<ArtifactRepository> remoteRepositories,
                                       ArtifactMetadataSource source,
                                       ArtifactFilter filter,
-                                      List listeners,
-                                      List conflictResolvers )
+                                      List<ResolutionListener> listeners,
+                                      List<ConflictResolver> conflictResolvers )
         throws ArtifactResolutionException;
 }

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactNotFoundException.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactNotFoundException.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactNotFoundException.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactNotFoundException.java Wed May 21 22:15:02 2008
@@ -20,6 +20,7 @@
  */
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 
 import java.util.List;
@@ -35,7 +36,7 @@
 
     protected ArtifactNotFoundException( String message,
                                          Artifact artifact,
-                                         List remoteRepositories )
+                                         List<ArtifactRepository> remoteRepositories )
     {
         super( message, artifact, remoteRepositories );
     }
@@ -49,7 +50,7 @@
 
     protected ArtifactNotFoundException( String message,
                                          Artifact artifact,
-                                         List remoteRepositories,
+                                         List<ArtifactRepository> remoteRepositories,
                                          ResourceDoesNotExistException cause )
     {
         this( message, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType(),
@@ -63,7 +64,7 @@
                                       String version,
                                       String type,
                                       String classifier,
-                                      List remoteRepositories,
+                                      List<ArtifactRepository> remoteRepositories,
                                       String downloadUrl,
                                       List path,
                                       ResourceDoesNotExistException cause )
@@ -81,7 +82,7 @@
                                        String version,
                                        String type,
                                        String classifier,
-                                       List remoteRepositories,
+                                       List<ArtifactRepository> remoteRepositories,
                                        String downloadUrl,
                                        List path )
     {

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionException.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionException.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionException.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionException.java Wed May 21 22:15:02 2008
@@ -22,6 +22,7 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
+import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.wagon.TransferFailedException;
 
 import java.io.IOException;
@@ -40,7 +41,7 @@
                                         String version,
                                         String type,
                                         String classifier,
-                                        List remoteRepositories,
+                                        List<ArtifactRepository> remoteRepositories,
                                         List path,
                                         Throwable t )
     {
@@ -66,7 +67,7 @@
 
     public ArtifactResolutionException( String message,
                                         Artifact artifact,
-                                        List remoteRepositories )
+                                        List<ArtifactRepository> remoteRepositories )
     {
         super( message, artifact, remoteRepositories );
     }
@@ -80,7 +81,7 @@
 
     protected ArtifactResolutionException( String message,
                                            Artifact artifact,
-                                           List remoteRepositories,
+                                           List<ArtifactRepository> remoteRepositories,
                                            ArtifactMetadataRetrievalException cause )
     {
         super( message, artifact, remoteRepositories, cause );
@@ -88,7 +89,7 @@
 
     protected ArtifactResolutionException( String message,
                                            Artifact artifact,
-                                           List remoteRepositories,
+                                           List<ArtifactRepository> remoteRepositories,
                                            TransferFailedException cause )
     {
         super( message, artifact, remoteRepositories, cause );
@@ -96,7 +97,7 @@
 
     protected ArtifactResolutionException( String message,
                                            Artifact artifact,
-                                           List remoteRepositories,
+                                           List<ArtifactRepository> remoteRepositories,
                                            IOException cause )
     {
         super( message, artifact, remoteRepositories, cause );

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionRequest.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionRequest.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionRequest.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionRequest.java Wed May 21 22:15:02 2008
@@ -4,6 +4,7 @@
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.resolver.conflict.ConflictResolver;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,18 +31,18 @@
 
     private ArtifactRepository localRepository;
 
-    private List remoteRepostories;
+    private List<ArtifactRepository> remoteRepostories;
 
     private ArtifactFilter filter;
 
-    private List listeners = new ArrayList();
+    private List<ResolutionListener> listeners = new ArrayList<ResolutionListener>();
 
     // This should really be a component. Different impls can can be composed to account for different forms of metadata.
     private ArtifactMetadataSource metadataSource;
 
     private Map managedVersionMap;
 
-    private List conflictResolvers;
+    private List<ConflictResolver> conflictResolvers;
 
     public Artifact getArtifact()
     {
@@ -140,7 +141,7 @@
         return remoteRepostories;
     }
 
-    public ArtifactResolutionRequest setRemoteRepostories( List remoteRepostories )
+    public ArtifactResolutionRequest setRemoteRepostories( List<ArtifactRepository> remoteRepostories )
     {
         this.remoteRepostories = remoteRepostories;
 
@@ -199,12 +200,12 @@
         return this;
     }
 
-    public List getConflictResolvers()
+    public List<ConflictResolver> getConflictResolvers()
     {
         return conflictResolvers;
     }
 
-    public ArtifactResolutionRequest setConflictResolvers( List conflictResolvers )
+    public ArtifactResolutionRequest setConflictResolvers( List<ConflictResolver> conflictResolvers )
     {
         this.conflictResolvers = conflictResolvers;
 
@@ -214,9 +215,9 @@
     public String toString()
     {
         StringBuffer sb = new StringBuffer()
-            .append( "groupId = " + getGroupId() )
-            .append( "artifactId = " + getArtifactId() )
-            .append( "version = " + getVersion() );
+                .append("groupId = ").append(getGroupId())
+                .append("artifactId = ").append(getArtifactId())
+                .append("version = ").append(getVersion());
 
         return sb.toString();
     }

Modified: maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionResult.java
URL: http://svn.apache.org/viewvc/maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionResult.java?rev=659009&r1=659008&r2=659009&view=diff
==============================================================================
--- maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionResult.java (original)
+++ maven/artifact/branches/CAP/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionResult.java Wed May 21 22:15:02 2008
@@ -20,11 +20,11 @@
  */
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -49,70 +49,56 @@
 {
     private Artifact originatingArtifact;
 
-    private List versionRangeViolations;
+    private List<Exception> versionRangeViolations;
 
-    private List metadataResolutionExceptions;
+    private List<ArtifactResolutionException> metadataResolutionExceptions;
 
-    private List missingArtifacts;
+    private List<Artifact> missingArtifacts;
 
-    private List circularDependencyExceptions;
+    private List<CyclicDependencyException> circularDependencyExceptions;
 
-    private List errorArtifactExceptions;
+    private List<ArtifactResolutionException> errorArtifactExceptions;
 
     // file system errors
 
-    private List repositories;
+    private List<ArtifactRepository> repositories;
 
-    private Set resolutionNodes;
+    private Set<ResolutionNode> resolutionNodes;
 
-    private Set artifacts;
-
-    //
+    private Set<Artifact> artifacts;
 
     public Artifact getOriginatingArtifact()
     {
         return originatingArtifact;
     }
 
-    public ArtifactResolutionResult ListOriginatingArtifact( Artifact originatingArtifact )
+    public ArtifactResolutionResult ListOriginatingArtifact( final Artifact originatingArtifact )
     {
         this.originatingArtifact = originatingArtifact;
 
         return this;
     }
 
-    /**
-     * 
-     * @return set of Artifact instances
-     */
-    
-    public Set getArtifacts()
+    public Set<Artifact> getArtifacts()
     {
         if ( artifacts == null )
         {
-            artifacts = new LinkedHashSet();
-
-            for ( Iterator i = resolutionNodes.iterator(); i.hasNext(); )
-            {
-                ResolutionNode node = (ResolutionNode) i.next();
+            artifacts = new LinkedHashSet<Artifact>();
 
-                artifacts.add( node.getArtifact() );
+            for (ResolutionNode node : resolutionNodes) {
+                artifacts.add(node.getArtifact());
             }
         }
 
         return artifacts;
     }
 
-    /**
-     * 
-     * @return Set of ResolutionNode instances
-     */
     public Set getArtifactResolutionNodes()
     {
         return resolutionNodes == null ? Collections.EMPTY_SET : resolutionNodes;
     }
 
-    public ArtifactResolutionResult setArtifactResolutionNodes( Set resolutionNodes )
+    public ArtifactResolutionResult setArtifactResolutionNodes( final Set<ResolutionNode> resolutionNodes )
     {
         this.resolutionNodes = resolutionNodes;
 
@@ -136,7 +122,7 @@
         return this;
     }
 
-    public ArtifactResolutionResult setUnresolvedArtifacts( List unresolvedArtifacts )
+    public ArtifactResolutionResult setUnresolvedArtifacts( final List<Artifact> unresolvedArtifacts )
     {
         this.missingArtifacts = unresolvedArtifacts;
 
@@ -196,7 +182,7 @@
 
     public ArtifactResolutionException getMetadataResolutionException( int i )
     {
-        return (ArtifactResolutionException) metadataResolutionExceptions.get( i );
+        return metadataResolutionExceptions.get( i );
     }
 
     public List getMetadataResolutionExceptions()
@@ -222,9 +208,13 @@
         return this;
     }
 
-    public List getErrorArtifactExceptions()
+    public List<ArtifactResolutionException> getErrorArtifactExceptions()
     {
-        return errorArtifactExceptions == null ? Collections.EMPTY_LIST : errorArtifactExceptions;
+        if (errorArtifactExceptions == null) {
+            return Collections.emptyList();
+        }
+
+        return errorArtifactExceptions;
     }
 
     // ------------------------------------------------------------------------
@@ -247,37 +237,47 @@
 
     public CyclicDependencyException getCircularDependencyException( int i )
     {
-        return (CyclicDependencyException) circularDependencyExceptions.get( i );
+        return circularDependencyExceptions.get( i );
     }
 
-    public List getCircularDependencyExceptions()
+    public List<CyclicDependencyException> getCircularDependencyExceptions()
     {
-        return circularDependencyExceptions == null ? Collections.EMPTY_LIST : circularDependencyExceptions;
+        if (circularDependencyExceptions == null) {
+            return Collections.emptyList();
+        }
+
+        return circularDependencyExceptions;
     }
 
     // ------------------------------------------------------------------------
-    //
-    // ------------------------------------------------------------------------
-
     // Repositories
+    // ------------------------------------------------------------------------
 
-    public List getRepositories()
+    public List<ArtifactRepository> getRepositories()
     {
-        return repositories == null ? Collections.EMPTY_LIST : repositories;
+        if (repositories == null) {
+            return Collections.emptyList();
+        }
+
+        return repositories;
     }
 
-    public ArtifactResolutionResult setRepositories( List repositories )
+    public ArtifactResolutionResult setRepositories( final List<ArtifactRepository> repositories )
     {
         this.repositories = repositories;
 
         return this;
     }
 
-    private List initList( List l )
+    //
+    // Internal
+    //
+    
+    private <T> List<T> initList( final List<T> l )
     {
         if ( l == null )
         {
-            return new ArrayList();
+            return new ArrayList<T>();
         }
         return l;
     }