Author: ogusakov
Date: Sat Feb 21 06:37:18 2009
New Revision: 746441

URL: http://svn.apache.org/viewvc?rev=746441&view=rev
Log:
[MNG-3969,MERCURY-97] mercury-ant global exclusions work, bad metadata is 
partially addressed, maven bootstrap compiles fine

Added:
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java
   (with props)
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java
   (with props)
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java
   (with props)
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java
   (with props)
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java
   (with props)
Modified:
    maven/mercury/trunk/mercury-ant-tasks/mercury.xml
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dep.java
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dependency.java
    
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/ResolveTask.java
    
maven/mercury/trunk/mercury-ant-tasks/src/main/resources/org/apache/maven/mercury/ant/tasks/Messages.properties
    
maven/mercury/trunk/mercury-ant-tasks/src/test/java/org/apache/maven/mercury/ant/tasks/MercuryBootstrapTest.java
    
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactBasicMetadata.java
    
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/DefaultArtifactVersion.java
    
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRangeFactory.java
    
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java
    
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java
    
maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java
    
maven/mercury/trunk/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
    
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java
    
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java

Modified: maven/mercury/trunk/mercury-ant-tasks/mercury.xml
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/mercury.xml?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-ant-tasks/mercury.xml (original)
+++ maven/mercury/trunk/mercury-ant-tasks/mercury.xml Sat Feb 21 06:37:18 2009
@@ -109,7 +109,6 @@
     />
     
     <property name="cp"         refid="mercury.classpath"/>
-    <property name="cp.runtime" refid="mercury.classpath.runtime"/>
     
     <property name="cp.dir" location="${basedir}/target/test-copy"/>
     <delete dir="${cp.dir}"/>
@@ -138,11 +137,26 @@
                                    pgpValidation="false"
         />
       </mercury:remote-repositories>
-       
+    
       <mercury:resolve-dependencies 
source="maven:${basedir}/target/test-classes/pom-non-transitive.xml"/>
 
   </target>
 
+  <target name="exclusions">
+    
+    <mercury:local-repository location="${localRepo}"/>
+    <mercury:repository location="${remoteRepo}"/>
+    
+    <mercury:resolve-dependencies 
source="maven:${basedir}/target/test-classes/pom.xml">
+      <mercury:exclusions>
+       <mercury:exclusion id="g2:a2"/>
+      </mercury:exclusions>
+    </mercury:resolve-dependencies>
+
+       <property name="cp" refid="mercury.classpath"/>
+
+  </target>
+
        
        
        

Modified: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dep.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dep.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dep.java
 (original)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dep.java
 Sat Feb 21 06:37:18 2009
@@ -28,6 +28,8 @@
 import org.apache.maven.mercury.MavenDependencyProcessor;
 import org.apache.maven.mercury.artifact.Artifact;
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.ArtifactExclusionList;
+import org.apache.maven.mercury.artifact.ArtifactInclusionList;
 import org.apache.maven.mercury.artifact.ArtifactMetadata;
 import org.apache.maven.mercury.artifact.ArtifactQueryList;
 import org.apache.maven.mercury.artifact.ArtifactScopeEnum;
@@ -79,6 +81,10 @@
     private Storage _pomStorage;
 
     private Dependency _sourceDependency;
+    
+    List<String> _inclusions;
+    
+    List<String> _exclusions;
 
     private List<ArtifactBasicMetadata> getDependencies( 
VirtualRepositoryReader vr )
         throws RepositoryException
@@ -92,7 +98,6 @@
 
         for ( Dependency d : _dependencies )
         {
-
             if ( d._amd == null )
             {
                 throw new IllegalArgumentException( LANG.getMessage( 
"dep.dependency.name.mandatory" ) );
@@ -100,7 +105,7 @@
 
             if ( Util.isEmpty( d._pom ) )
             {
-                res.add( d._amd );
+                res.add( d.getMetadata() );
             }
             else
             {
@@ -195,14 +200,20 @@
         _pomRepo.setMetadataReader( vr );
 
         List<ArtifactBasicMetadata> depList = getDependencies( vr );
+        
+        ArtifactQueryList aql = new ArtifactQueryList( depList );
+        
+        ArtifactInclusionList ail = getInclusions();
+        
+        ArtifactExclusionList ael = getExclusions();
 
         List<ArtifactMetadata> res =
-            _transitive ? db.resolveConflicts( scope, new ArtifactQueryList( 
depList ), null, null )
+            _transitive ? db.resolveConflicts( scope, aql, ail, ael )
                             : toArtifactMetadataList( depList );
 
         if ( Util.isEmpty( res ) )
         {
-            return null;
+            throw new BuildException( LANG.getMessage( 
"resolve.empty.classpath", scope.toString(), depList.toString() ) );
         }
 
         ArtifactResults aRes = vr.readArtifacts( res );
@@ -260,6 +271,22 @@
         return _artifacts;
     }
 
+    private ArtifactExclusionList getExclusions()
+    {
+        if( Util.isEmpty( _exclusions ) )
+            return null;
+        
+        return new ArtifactExclusionList( _exclusions.toArray( new String 
[_exclusions.size()] ) );
+    }
+
+    private ArtifactInclusionList getInclusions()
+    {
+        if( Util.isEmpty( _inclusions ) )
+            return null;
+        
+        return new ArtifactInclusionList( _inclusions.toArray( new String 
[_inclusions.size()] ) );
+    }
+
     /**
      * @param depList
      * @return
@@ -308,12 +335,38 @@
     {
         this._transitive = val;
     }
+    
+    public void addConfiguredExclusions( Exclusions ex )
+    {
+        _exclusions = ex._list;
+    }
+    
+    public void addConfiguredInclusions( Inclusions in )
+    {
+        _inclusions = in._list;
+    }
 
     protected void setList( List<Dependency> dependencies )
     {
         _dependencies = dependencies;
     }
 
+    protected void setExclusions( List<String> exList )
+    {
+        if( _exclusions == null )
+            _exclusions = exList;
+        else
+            _exclusions.addAll( exList );
+    }
+
+    protected void setInclusions( List<String> inList )
+    {
+        if( _inclusions == null )
+            _inclusions = inList;
+        else
+            _inclusions.addAll( inList );
+    }
+
     // 
----------------------------------------------------------------------------------------
     public boolean isFilesystemOnly()
     {

Modified: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dependency.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dependency.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dependency.java
 (original)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Dependency.java
 Sat Feb 21 06:37:18 2009
@@ -19,7 +19,12 @@
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.util.Util;
 import org.codehaus.plexus.lang.DefaultLanguage;
 import org.codehaus.plexus.lang.Language;
 
@@ -32,17 +37,56 @@
 {
     private static final Language LANG = new DefaultLanguage( Dependency.class 
);
 
-    ArtifactBasicMetadata _amd;
+    protected ArtifactBasicMetadata _amd;
 
-    String _pom;
+    protected String _pom;
 
-    boolean _optional = false;
+    protected boolean _optional = false;
 
     /** dependency processor type, if any */
-    String _processor;
+    protected String _processor;
+    
+    protected List<String> _inclusions;
+    
+    protected List<String> _exclusions;
     
     private static long _count = 0L;
     
+    public ArtifactBasicMetadata getMetadata()
+    {
+        _amd.setInclusions( getInclusions() );
+        
+        _amd.setExclusions( getExclusions() );
+        
+        return _amd;
+    }
+    
+    private Collection<ArtifactBasicMetadata> getExclusions()
+    {
+        if( Util.isEmpty( _exclusions ))
+            return null;
+        
+        List<ArtifactBasicMetadata> res = new 
ArrayList<ArtifactBasicMetadata>( _exclusions.size() );
+        
+        for( String name : _exclusions )
+            res.add( new ArtifactBasicMetadata(name) );
+        
+        return res;
+    }
+
+    private Collection<ArtifactBasicMetadata> getInclusions()
+    {
+        if( Util.isEmpty( _inclusions ))
+            return null;
+        
+        List<ArtifactBasicMetadata> res = new 
ArrayList<ArtifactBasicMetadata>( _inclusions.size() );
+        
+        for( String name : _inclusions )
+            res.add( new ArtifactBasicMetadata(name) );
+        
+        return res;
+    }
+
     public void setName( String name )
     {
         if( _pom != null )
@@ -132,4 +176,14 @@
 
         _amd.setVersion( version );
     }
+    
+    public void addConfiguredExclusions( Exclusions ex )
+    {
+        _exclusions = ex._list;
+    }
+    
+    public void addConfiguredInclusions( Inclusions in )
+    {
+        _inclusions = in._list;
+    }
 }

Added: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java?rev=746441&view=auto
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java
 (added)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java
 Sat Feb 21 06:37:18 2009
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+
+package org.apache.maven.mercury.ant.tasks;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+
+public class Exclusion
+{
+    String _name;
+    
+    public void setId( String val )
+    {
+        _name = val;
+    }
+    
+    public void setName( String val )
+    {
+        _name = val;
+    }
+}
\ No newline at end of file

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusion.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java?rev=746441&view=auto
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java
 (added)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java
 Sat Feb 21 06:37:18 2009
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+
+package org.apache.maven.mercury.ant.tasks;
+
+import java.util.List;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class Exclusions
+    extends StringList
+{
+    protected List<String> getExclusions()
+    {
+        return _list;
+    }
+    
+    public void addConfiguredExclusion( Exclusion ex )
+    {
+        addString( ex._name );
+    }
+}

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Exclusions.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java?rev=746441&view=auto
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java
 (added)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java
 Sat Feb 21 06:37:18 2009
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+
+package org.apache.maven.mercury.ant.tasks;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+
+class Inclusion
+{
+    String _name;
+    
+    public void setId( String val )
+    {
+        _name = val;
+    }
+    
+    public void setName( String val )
+    {
+        _name = val;
+    }
+}
\ No newline at end of file

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusion.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java?rev=746441&view=auto
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java
 (added)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java
 Sat Feb 21 06:37:18 2009
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+
+package org.apache.maven.mercury.ant.tasks;
+
+import java.util.List;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class Inclusions
+    extends StringList
+{
+    protected List<String> getExclusions()
+    {
+        return _list;
+    }
+    
+    public void addConfiguredExclusion( Inclusion ex )
+    {
+        addString( ex._name );
+    }
+}

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/Inclusions.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/ResolveTask.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/ResolveTask.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/ResolveTask.java
 (original)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/ResolveTask.java
 Sat Feb 21 06:37:18 2009
@@ -74,6 +74,10 @@
 
     private Dependency _sourceDependency;
     
+    List<String> _inclusions;
+    
+    List<String> _exclusions;
+    
     // 
----------------------------------------------------------------------------------------
     @Override
     public String getDescription()
@@ -161,6 +165,10 @@
 }
 
             dep.setTransitive( _transitive );
+            
+            dep.setInclusions( _inclusions );
+            
+            dep.setExclusions( _exclusions );
 
             ArtifactScopeEnum[] scopes = _scope == null ? SCOPES : new 
ArtifactScopeEnum[] { _scope };
 
@@ -169,7 +177,9 @@
                 Collection<Artifact> artifacts = dep.resolve( config, sc );
 
                 if ( Util.isEmpty( artifacts ) )
+                {
                     continue;
+                }
 
                 if( _hasPathId && _scope != null )
                 {
@@ -361,5 +371,15 @@
 
         return dependency;
     }
+    
+    public void addConfiguredExclusions( Exclusions ex )
+    {
+        _exclusions = ex._list;
+    }
+    
+    public void addConfiguredInclusions( Inclusions in )
+    {
+        _inclusions = in._list;
+    }
 
 }
\ No newline at end of file

Added: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java?rev=746441&view=auto
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java
 (added)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java
 Sat Feb 21 06:37:18 2009
@@ -0,0 +1,45 @@
+/*
+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.
+*/
+
+package org.apache.maven.mercury.ant.tasks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public abstract class StringList
+    extends AbstractDataType
+{
+    List<String> _list;
+    
+    protected void addString( String str )
+    {
+        if( _list == null )
+            _list = new ArrayList<String>(8);
+        
+        _list.add( str );
+    }
+
+}

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/mercury/trunk/mercury-ant-tasks/src/main/java/org/apache/maven/mercury/ant/tasks/StringList.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
maven/mercury/trunk/mercury-ant-tasks/src/main/resources/org/apache/maven/mercury/ant/tasks/Messages.properties
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/main/resources/org/apache/maven/mercury/ant/tasks/Messages.properties?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/main/resources/org/apache/maven/mercury/ant/tasks/Messages.properties
 (original)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/main/resources/org/apache/maven/mercury/ant/tasks/Messages.properties
 Sat Feb 21 06:37:18 2009
@@ -17,6 +17,7 @@
 empty.map=internal error - please report to the authors: bucket map cannot be 
empty at this juncture - found {0}
 empty.map.2=internal error 2 - please report to the authors: bucket map cannot 
be empty at this juncture - found {0}
 resolve.cannot.read=cannot read artifacts from any repository in config {0}. 
Query is: {1}
+resolve.empty.classpath=resolved classpath for scope {0} is empty.\nDependency 
that failed to resolve is below:\n{1}
 
 write.repo.id.mandatory=repo id is mandatory for write task - none supplied
 write.repo.not.found=Repository {0} not yet declared in the build file.

Modified: 
maven/mercury/trunk/mercury-ant-tasks/src/test/java/org/apache/maven/mercury/ant/tasks/MercuryBootstrapTest.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-ant-tasks/src/test/java/org/apache/maven/mercury/ant/tasks/MercuryBootstrapTest.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-ant-tasks/src/test/java/org/apache/maven/mercury/ant/tasks/MercuryBootstrapTest.java
 (original)
+++ 
maven/mercury/trunk/mercury-ant-tasks/src/test/java/org/apache/maven/mercury/ant/tasks/MercuryBootstrapTest.java
 Sat Feb 21 06:37:18 2009
@@ -232,6 +232,37 @@
         assertTrue( tcr1.exists() );
         assertFalse( tcr2.exists() );
     }
+    // -----------------------------------
+    public void testExclusions()
+    {
+        String title = "exclusions";
+        System.out.println( "========> start " + title );
+        System.out.flush();
+
+        File a0 = new File( _localRepoDirFile, "g0/a0/v0/a0-v0.jar" );
+        File a1 = new File( _localRepoDirFile, "g1/a1/v1/a1-v1.jar" );
+        File a2 = new File( _localRepoDirFile, "g2/a2/v2/a2-v2.jar" );
+
+        assertFalse( a0.exists() );
+        assertFalse( a1.exists() );
+        assertFalse( a2.exists() );
+
+        executeTarget( title );
+
+        assertTrue( a0.exists() );
+        assertTrue( a1.exists() );
+        assertFalse( a2.exists() );
+
+        String cp = getProject().getProperty( "cp" );
+        assertNotNull( cp );
+        
+        // mercury.classpath
+        assertTrue( cp.indexOf( "a0" ) != -1 );
+        assertTrue( cp.indexOf( "a1" ) != -1 );
+        assertTrue( cp.indexOf( "a2" ) == -1 );
+        
+//        System.out.println( "cp = " + cp );
+    }
 
     // -----------------------------------
     public void testRepoPgp()
@@ -249,6 +280,8 @@
         assertFalse( a2.exists() );
 
         executeTarget( title );
+        
+        // TODO: prep. the test data to test pgp sigs
 //
 //        assertTrue( a0.exists() );
 //        assertTrue( a1.exists() );

Modified: 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactBasicMetadata.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactBasicMetadata.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactBasicMetadata.java
 (original)
+++ 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactBasicMetadata.java
 Sat Feb 21 06:37:18 2009
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
 import org.apache.maven.mercury.artifact.version.VersionException;
 import org.apache.maven.mercury.artifact.version.VersionRange;
 import org.apache.maven.mercury.artifact.version.VersionRangeFactory;
@@ -443,6 +444,11 @@
         this.local = local;
     }
 
+    public boolean isVirtual()
+    {
+        return DefaultArtifactVersion.isVirtual( version );
+    }
+
     public ArtifactCoordinates getEffectiveCoordinates()
     {
         if ( relocations == null || relocations.isEmpty() )

Modified: 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/DefaultArtifactVersion.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/DefaultArtifactVersion.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/DefaultArtifactVersion.java
 (original)
+++ 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/DefaultArtifactVersion.java
 Sat Feb 21 06:37:18 2009
@@ -119,8 +119,10 @@
         if ( version == null )
             return false;
 
-        if ( version.endsWith( Artifact.LATEST_VERSION ) || version.endsWith( 
Artifact.RELEASE_VERSION )
-            || version.endsWith( Artifact.SNAPSHOT_VERSION ) )
+        if ( version.endsWith( Artifact.SNAPSHOT_VERSION ) 
+            || version.endsWith( Artifact.LATEST_VERSION )
+            || version.endsWith( Artifact.RELEASE_VERSION )
+        )
             return true;
 
         return false;

Modified: 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRangeFactory.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRangeFactory.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRangeFactory.java
 (original)
+++ 
maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRangeFactory.java
 Sat Feb 21 06:37:18 2009
@@ -62,8 +62,9 @@
         for ( String vn : versions )
         {
             // RELEASE?
-            if ( noSnapshots && vn.endsWith( Artifact.SNAPSHOT_VERSION ) )
+            if ( noSnapshots )
             {
+                if( vn.endsWith( Artifact.SNAPSHOT_VERSION ) || vn.matches( 
Artifact.SNAPSHOT_TS_REGEX ) )
                 continue;
             }
 

Modified: 
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java
 (original)
+++ 
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java
 Sat Feb 21 06:37:18 2009
@@ -71,9 +71,19 @@
   throws Exception
   {
     String os = System.getProperty("os.name");
+    
     if( "Mac OS X".equals( os ) )
       goodOs = true;
+    
   }
+  
+    @Override
+    protected void tearDown()
+        throws Exception
+    {
+        if( query != null )
+            query.clear();
+    }
   
//------------------------------------------------------------------------------
   public void testReadReleaseVersion()
   throws IllegalArgumentException, RepositoryException
@@ -308,7 +318,7 @@
     
     if( ror.hasExceptions() )
       System.out.println( ror.getExceptions() );
-    
+  
     assertFalse( ror.hasExceptions() );
     assertTrue( ror.hasResults() );
     

Modified: 
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java
 (original)
+++ 
maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java
 Sat Feb 21 06:37:18 2009
@@ -86,6 +86,7 @@
     
     repo = new RemoteRepositoryM2( "testRepo", server, new 
MavenDependencyProcessor() );
     ((RemoteRepository)repo).setUpdatePolicy( up );
+    ((RemoteRepositoryM2)repo).setWorkAroundBadMetadata( false );
     
     repo.setDependencyProcessor(  new MetadataProcessorMock() );
     reader = repo.getReader();

Modified: 
maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java
 (original)
+++ 
maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java
 Sat Feb 21 06:37:18 2009
@@ -76,6 +76,8 @@
     private Map<String, MetadataTreeNode> _existingNodes;
 
     private EventManager _eventManager;
+    
+    private boolean _buildAllTrees = true;
 
     /**
      * creates an instance of MetadataTree. Use this instance to
@@ -180,55 +182,70 @@
             return res;
         }
 
-        List<MetadataTreeNode> deps = new ArrayList<MetadataTreeNode>( 
nodeCount );
+        DUMMY_ROOT.setDependencies( startMDs );
+        DUMMY_ROOT.setInclusions( inclusions == null ? null : 
inclusions.getMetadataList() );
+        DUMMY_ROOT.setExclusions( exclusions == null ? null : 
exclusions.getMetadataList() );
 
-        // build all trees
-        for ( ArtifactBasicMetadata bmd : startMDs )
+        List<MetadataTreeNode> deps = new ArrayList<MetadataTreeNode>( 
nodeCount );
+        
+        if( _buildAllTrees )
         {
-            if( inclusions != null )
+            for ( ArtifactBasicMetadata bmd : startMDs )
             {
-                List<ArtifactBasicMetadata> inc = inclusions.getMetadataList();
-                
-                if( ! inc.contains( bmd ) )
-                    continue;
-                
-                if( bmd.hasInclusions() )
-                    bmd.getInclusions().addAll( inc );
-                else
-                    bmd.setInclusions( inc );
-            }
-            
-            if( exclusions != null )
-            {
-                List<ArtifactBasicMetadata> excl = 
exclusions.getMetadataList();
+                try
+                {
+                    if( ! DUMMY_ROOT.allowDependency( bmd ) )
+                        continue;
+                }
+                catch ( VersionException e )
+                {
+                    throw new MetadataTreeException(e);
+                }
+           
+                if( inclusions != null )
+                {
+                    List<ArtifactBasicMetadata> inc = 
inclusions.getMetadataList();
+                    
+                    if( bmd.hasInclusions() )
+                        bmd.getInclusions().addAll( inc );
+                    else
+                        bmd.setInclusions( inc );
+                }
                 
-                if( excl.contains( bmd ) )
-                    continue;
+                if( exclusions != null )
+                {
+                    List<ArtifactBasicMetadata> excl = 
exclusions.getMetadataList();
+                    
+                    if( bmd.hasExclusions() )
+                        bmd.getExclusions().addAll( excl );
+                    else
+                        bmd.setExclusions( excl );
+                }
                 
-                if( bmd.hasExclusions() )
-                    bmd.getExclusions().addAll( excl );
-                else
-                    bmd.setExclusions( excl );
+                MetadataTreeNode rooty = buildTree( bmd, scope );
+    
+                deps.add( rooty );
             }
             
-            MetadataTreeNode rooty = buildTree( bmd, scope );
-
-            deps.add( rooty );
+            if( Util.isEmpty( deps ) ) // all dependencies are filtered out 
+                return null;
         }
 
-        DUMMY_ROOT.setDependencies( startMDs );
-        DUMMY_ROOT.setInclusions( inclusions == null ? null : 
inclusions.getMetadataList() );
-        DUMMY_ROOT.setExclusions( exclusions == null ? null : 
exclusions.getMetadataList() );
-
         // combine into one tree
-        MetadataTreeNode root = new MetadataTreeNode( DUMMY_ROOT, null, null );
-
-        for ( MetadataTreeNode kid : deps )
-            root.addChild( kid );
-
+        MetadataTreeNode root = _buildAllTrees
+                                ? new MetadataTreeNode( DUMMY_ROOT, null, null 
) 
+                                : buildTree( DUMMY_ROOT, scope )
+                                ;
+        if(_buildAllTrees)
+        {
+            for ( MetadataTreeNode kid : deps )
+                root.addChild( kid );
+        }
+    
         List<ArtifactMetadata> res = resolveConflicts( root );
 
-        res.remove( DUMMY_ROOT );
+        if( res != null )
+            res.remove( DUMMY_ROOT );
 
         return res;
     }
@@ -254,7 +271,10 @@
             if ( existingNode != null )
                 return MetadataTreeNode.deepCopy( existingNode );
 
-            mr = _reader.readDependencies( nodeMD );
+            if( DUMMY_ROOT.equals( nodeMD ))
+                mr = DUMMY_ROOT;
+            else
+                mr = _reader.readDependencies( nodeMD );
 
             if ( mr == null )
                 throw new MetadataTreeException( LANG.getMessage( 
"artifact.md.not.found", nodeMD.toString() ) );
@@ -299,12 +319,12 @@
                     if ( md.isOptional() )
                         continue;
 
-                    throw new MetadataTreeException( LANG.getMessage( 
"not.optional.missing" ) + md + " <== "
-                        + showPath( node ) );
+                    throw new MetadataTreeException( LANG.getMessage( 
"not.optional.missing" ) + md + " <== "+ showPath( node ) );
                 }
 
-                boolean noGoodVersions = true;
                 boolean noVersions = true;
+                boolean noGoodVersions = true;
+
                 for ( ArtifactBasicMetadata ver : versions )
                 {
                     if ( veto( ver, _filters ) || vetoInclusionsExclusions( 
node, ver ) )
@@ -331,7 +351,8 @@
                 {
                     if ( md.isOptional() )
                         continue;
-                    throw new MetadataTreeException( "did not find 
non-optional artifact for " + md );
+                    
+                    throw new MetadataTreeException( LANG.getMessage( 
"not.optional.missing" ) + md + " <== "+ showPath( node ) );
                 }
                 else
                     node.addQuery( md );

Modified: 
maven/mercury/trunk/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
 (original)
+++ 
maven/mercury/trunk/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
 Sat Feb 21 06:37:18 2009
@@ -64,12 +64,12 @@
   
   public String getRelPath()
   {
-    return 
gaPath+FileUtil.SEP+versionDir+FileUtil.SEP+baseName+FileUtil.DASH+version+getDashedClassifier()+'.'+type;
+    return gaPath+FileUtil.SEP+calculateVersionDir( version 
)+FileUtil.SEP+baseName+FileUtil.DASH+version+getDashedClassifier()+'.'+type;
   }
   
   public String getRelPomPath()
   {
-    return 
gaPath+FileUtil.SEP+versionDir+FileUtil.SEP+baseName+FileUtil.DASH+version+POM_EXT;
+    return gaPath+FileUtil.SEP+calculateVersionDir( version 
)+FileUtil.SEP+baseName+FileUtil.DASH+version+POM_EXT;
   }
   
   public String getAbsPath()

Modified: 
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java
 (original)
+++ 
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java
 Sat Feb 21 06:37:18 2009
@@ -38,7 +38,7 @@
   
   private Server _server;
   
-  protected boolean _goodWillEffort = true;
+  protected boolean _workAroundBadMetadata = true;
     
     /** default update policy */
     private RepositoryUpdatePolicy _updatePolicy = new 
RepositoryUpdateIntervalPolicy( 
RepositoryUpdateIntervalPolicy.DEFAULT_UPDATE_POLICY );
@@ -101,6 +101,16 @@
       return true;
     }
     
//----------------------------------------------------------------------------------
+    public boolean isWorkAroundBadMetadata()
+    {
+        return _workAroundBadMetadata;
+    }
+    
//----------------------------------------------------------------------------------
+    public void setWorkAroundBadMetadata( boolean aroundBadMetadata )
+    {
+        _workAroundBadMetadata = aroundBadMetadata;
+    }
+    
//----------------------------------------------------------------------------------
     public String getType()
     {
       return DEFAULT_REPOSITORY_TYPE;

Modified: 
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
URL: 
http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java?rev=746441&r1=746440&r2=746441&view=diff
==============================================================================
--- 
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
 (original)
+++ 
maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
 Sat Feb 21 06:37:18 2009
@@ -26,6 +26,7 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.TreeSet;
@@ -37,6 +38,7 @@
 import org.apache.maven.mercury.artifact.Quality;
 import org.apache.maven.mercury.artifact.QualityEnum;
 import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
+import org.apache.maven.mercury.artifact.version.VersionComparator;
 import org.apache.maven.mercury.artifact.version.VersionException;
 import org.apache.maven.mercury.artifact.version.VersionRange;
 import org.apache.maven.mercury.artifact.version.VersionRangeFactory;
@@ -64,6 +66,7 @@
 import org.apache.maven.mercury.repository.metadata.Metadata;
 import org.apache.maven.mercury.repository.metadata.MetadataBuilder;
 import org.apache.maven.mercury.repository.metadata.MetadataException;
+import org.apache.maven.mercury.repository.metadata.Versioning;
 import org.apache.maven.mercury.spi.http.client.HttpClientException;
 import 
org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetrievalRequest;
 import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetriever;
@@ -327,7 +330,7 @@
         }
 
         // nothing to do, but find latest
-        String ver = VersionRangeFactory.findLatest( versions, true );
+        String ver = VersionRangeFactory.findLatest( versions, false );
 
         if ( ver == null )
         {
@@ -465,7 +468,9 @@
     {
         RepositoryGAMetadata gam = null;
         ArtifactCoordinates coord = null;
-
+        TreeSet<String> gaVersions = null;
+        String ver = bmd.getVersion();
+        
         // check the cache first
         if ( _mdCache != null )
         {
@@ -475,8 +480,48 @@
                 coord.setVersion( loc.getVersion() );
 
                 gam = _mdCache.findGA( _repo.getId(), _repo.getUpdatePolicy(), 
coord );
+
                 if ( gam != null && !gam.isExpired() )
-                    return gam.getVersions();
+                {
+                    gaVersions = gam.getVersions();
+
+                    if ( !( (RemoteRepositoryM2) _repo 
)._workAroundBadMetadata )
+                        return gaVersions;
+
+                    if ( bmd.isVirtual() )
+                        return gaVersions;
+
+                    if ( gaVersions.contains( ver ) )
+                        return gaVersions;
+
+                    String versionDir = ArtifactLocation.calculateVersionDir( 
bmd.getVersion() );
+
+                    String binPath =
+                        loc.getGaPath() + FileUtil.SEP + versionDir + 
FileUtil.SEP + bmd.getArtifactId() + "-"
+                            + bmd.getVersion() + ".pom";
+                    
+                    byte [] pom = null;
+                    
+                    try
+                    {
+                        pom = readRawData( binPath, true );
+                    }
+                    catch( Exception e ) {}
+
+                    if ( pom != null && pom.length > 1 )
+                    {
+
+                        String oldSnapshot = findDuplicateSnapshot( ver, 
gaVersions );
+
+                        if ( oldSnapshot != null )
+                            gaVersions.remove( oldSnapshot );
+
+                        gaVersions.add( ver );
+
+                        _mdCache.updateGA( _repo.getId(), gam );
+                    }
+                    return gaVersions;
+                }
             }
             catch ( MetadataCorruptionException e )
             {
@@ -491,45 +536,59 @@
         // no cached data, or it has expired - read from repository
         String mdPath = loc.getGaPath() + FileUtil.SEP + 
_repo.getMetadataName();
         byte[] mavenMetadata = readRawData( mdPath, true );
+
+        Metadata mmd = null;
         
-        if ( mavenMetadata == null )
+        if( mavenMetadata != null )
+            mmd = MetadataBuilder.getMetadata( mavenMetadata );
+
+        if ( mmd == null
+            || mmd.getVersioning() == null
+            || mmd.getVersioning().getVersions() == null
+            || ! mmd.getVersioning().getVersions().contains( ver )
+        )
         {
-            if( ((RemoteRepositoryM2)_repo)._goodWillEffort )
+            if ( ( (RemoteRepositoryM2) _repo )._workAroundBadMetadata )
             {
                 // check for the pom
                 String versionDir = ArtifactLocation.calculateVersionDir( 
bmd.getVersion() );
-                
-                String binPath = loc.getGaPath()
-                                    + FileUtil.SEP + versionDir
-                                    + FileUtil.SEP + bmd.getArtifactId() + "-" 
+ bmd.getVersion() 
-                                        + ".pom"
-                                    ;
-                byte [] pom = readRawData( binPath, true );
-                
-                if( pom != null ) // version exists
-                    mavenMetadata = 
-(                    
-"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-+"<metadata>"
-+"<groupId>"+bmd.getGroupId()+"</groupId>"
-+"<artifactId>"+bmd.getGroupId()+"</artifactId>"
-+"<version>"+ArtifactLocation.calculateVersionDir( bmd.getVersion() 
)+"</version>"
-+"<versioning>"
-+"<versions>"
-+"<version>"+bmd.getVersion()+"</version>"
-+"</versions>"
-+"</versioning>"
-+"</metadata>"
-).getBytes()
-;
-            }
-
-            if ( mavenMetadata == null )
-                throw new MetadataReaderException( LANG.getMessage( 
"no.group.md", _repo.getServer().getURL().toString(),
-                                                                    mdPath ) );
-        }
 
-        Metadata mmd = MetadataBuilder.getMetadata( mavenMetadata );
+                String binPath =
+                    loc.getGaPath() + FileUtil.SEP + versionDir + FileUtil.SEP 
+ bmd.getArtifactId() + "-"
+                        + ver + ".pom";
+                byte[] pom = readRawData( binPath, true );
+
+                if ( pom != null ) // version exists
+                {
+                    if( mmd == null )
+                    {
+                        mavenMetadata =
+                            ( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
"<metadata>" + "<groupId>" + bmd.getGroupId()
+                                + "</groupId>" + "<artifactId>" + 
bmd.getGroupId() + "</artifactId>" + "<version>"
+                                + ArtifactLocation.calculateVersionDir( ver ) 
+ "</version>" + "<versioning>"
+                                + "<versions>" + "<version>" + ver + 
"</version>" + "</versions>"
+                                + "</versioning>" + "</metadata>" ).getBytes();
+                        mmd = MetadataBuilder.getMetadata( mavenMetadata );
+                    }
+                    else
+                    {
+                        Versioning v = mmd.getVersioning();
+                        
+                        if( v == null )
+                        {
+                            v = new Versioning();
+                            mmd.setVersioning( v );
+                        }
+                        
+                        v.addVersion( ver );
+                    }
+                }
+            }
+
+            if ( mmd == null )
+                throw new MetadataReaderException( LANG.getMessage( 
"no.group.md",
+                                                                    
_repo.getServer().getURL().toString(), mdPath ) );
+        }
 
         if ( mmd == null || mmd.getVersioning() == null )
         {
@@ -598,6 +657,36 @@
         return gam.getVersions();
     }
 
+    /**
+     * clean the list of duplicate TSs of the same SN (if any)
+     * 
+     * @param gaVersions
+     */
+    private String findDuplicateSnapshot( String ver, TreeSet<String> versions 
)
+    {
+        if ( !ver.matches( Artifact.SNAPSHOT_TS_REGEX ) )
+            return null;
+
+        String base = ArtifactLocation.stripTS( ver );
+
+        for ( String v : versions )
+        {
+            if ( !v.startsWith( base ) )
+                continue;
+
+            if ( v.matches( Artifact.SNAPSHOT_TS_REGEX ) )
+            {
+                Comparator<String> vc = new VersionComparator();
+
+                if ( vc.compare( ver, v ) > 0 )
+                    return v;
+                else
+                    return null;
+            }
+        }
+        return null;
+    }
+
     // 
---------------------------------------------------------------------------------------------------------------
     /**
      * direct metadata search, no redirects, first attempt
@@ -666,19 +755,19 @@
                 else
                 {
                     String base = ArtifactLocation.stripSN( bmd.getVersion() );
-                    
-                    if( base != null )
+
+                    if ( base != null )
                     {
                         int len = base.length();
-                        
+
                         for ( String v : versions )
                         {
-                            if( ! base.regionMatches( 0, v, 0, len ) )
+                            if ( !base.regionMatches( 0, v, 0, len ) )
                                 continue;
-                            
+
                             Quality q = new Quality( v );
-                            
-                            if( q.equals( Quality.SNAPSHOT_TS_QUALITY) )
+
+                            if ( q.equals( Quality.SNAPSHOT_TS_QUALITY ) )
                             {
                                 found = v;
                                 break;


Reply via email to