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;