You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2007/08/14 18:35:10 UTC
svn commit: r565828 - in
/maven/components/branches/maven-2.0.x/maven-artifact/src:
main/java/org/apache/maven/artifact/versioning/
test/java/org/apache/maven/artifact/versioning/
Author: jdcasey
Date: Tue Aug 14 09:35:07 2007
New Revision: 565828
URL: http://svn.apache.org/viewvc?view=rev&rev=565828
Log:
[MNG-3047] Applying broader fix for comparisons and hashCode generation to ArtifactVersion. Merging from 565824 on trunk.
Modified:
maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ArtifactVersion.java
maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java
maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java
Modified: maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ArtifactVersion.java
URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ArtifactVersion.java?view=diff&rev=565828&r1=565827&r2=565828
==============================================================================
--- maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ArtifactVersion.java (original)
+++ maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ArtifactVersion.java Tue Aug 14 09:35:07 2007
@@ -40,4 +40,8 @@
String getQualifier();
void parseVersion( String version );
+
+ boolean equals( Object other );
+
+ int hashCode();
}
Modified: maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java
URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java?view=diff&rev=565828&r1=565827&r2=565828
==============================================================================
--- maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java (original)
+++ maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java Tue Aug 14 09:35:07 2007
@@ -40,6 +40,8 @@
private String qualifier;
+ private String unparsed;
+
public DefaultArtifactVersion( String version )
{
parseVersion( version );
@@ -47,38 +49,40 @@
public int compareTo( Object o )
{
- DefaultArtifactVersion otherVersion = (DefaultArtifactVersion) o;
+ ArtifactVersion otherVersion = (ArtifactVersion) o;
- int result = compareIntegers( majorVersion, otherVersion.majorVersion );
+ int result = getMajorVersion() - otherVersion.getMajorVersion();
if ( result == 0 )
{
- result = compareIntegers( minorVersion, otherVersion.minorVersion );
+ result = getMinorVersion() - otherVersion.getMinorVersion();
}
if ( result == 0 )
{
- result = compareIntegers( incrementalVersion, otherVersion.incrementalVersion );
+ result = getIncrementalVersion() - otherVersion.getIncrementalVersion();
}
if ( result == 0 )
{
if ( qualifier != null )
{
- if ( otherVersion.qualifier != null )
+ String otherQualifier = otherVersion.getQualifier();
+
+ if ( otherQualifier != null )
{
- if ( qualifier.length() > otherVersion.qualifier.length() &&
- qualifier.startsWith( otherVersion.qualifier ) )
+ if ( ( qualifier.length() > otherQualifier.length() )
+ && qualifier.startsWith( otherQualifier ) )
{
// here, the longer one that otherwise match is considered older
result = -1;
}
- else if ( qualifier.length() < otherVersion.qualifier.length() &&
- otherVersion.qualifier.startsWith( qualifier ) )
+ else if ( ( qualifier.length() < otherQualifier.length() )
+ && otherQualifier.startsWith( qualifier ) )
{
// here, the longer one that otherwise match is considered older
result = 1;
}
else
{
- result = qualifier.compareTo( otherVersion.qualifier );
+ result = qualifier.compareTo( otherQualifier );
}
}
else
@@ -87,40 +91,19 @@
result = -1;
}
}
- else if ( otherVersion.qualifier != null )
+ else if ( otherVersion.getQualifier() != null )
{
// otherVersion has a qualifier but we don't, we're newer
result = 1;
}
- else if ( buildNumber != null || otherVersion.buildNumber != null )
+ else
{
- result = compareIntegers( buildNumber, otherVersion.buildNumber );
+ result = getBuildNumber() - otherVersion.getBuildNumber();
}
}
return result;
}
- private int compareIntegers( Integer i1, Integer i2 )
- {
- // treat null as 0 in comparison
- if ( i1 == null ? i2 == null : i1.equals( i2 ) )
- {
- return 0;
- }
- else if ( i1 == null )
- {
- return -i2.intValue();
- }
- else if ( i2 == null )
- {
- return i1.intValue();
- }
- else
- {
- return i1.intValue() - i2.intValue();
- }
- }
-
public int getMajorVersion()
{
return majorVersion != null ? majorVersion.intValue() : 0;
@@ -148,6 +131,8 @@
public final void parseVersion( String version )
{
+ unparsed = version;
+
int index = version.indexOf( "-" );
String part1;
@@ -167,7 +152,7 @@
{
try
{
- if ( part2.length() == 1 || !part2.startsWith( "0" ) )
+ if ( ( part2.length() == 1 ) || !part2.startsWith( "0" ) )
{
buildNumber = Integer.valueOf( part2 );
}
@@ -182,7 +167,7 @@
}
}
- if ( part1.indexOf( "." ) < 0 && !part1.startsWith( "0" ) )
+ if ( ( part1.indexOf( "." ) < 0 ) && !part1.startsWith( "0" ) )
{
try
{
@@ -235,7 +220,7 @@
private static Integer getNextIntegerToken( StringTokenizer tok )
{
String s = tok.nextToken();
- if ( s.length() > 1 && s.startsWith( "0" ) )
+ if ( ( s.length() > 1 ) && s.startsWith( "0" ) )
{
throw new NumberFormatException( "Number part has a leading 0: '" + s + "'" );
}
@@ -244,34 +229,38 @@
public String toString()
{
- StringBuffer buf = new StringBuffer();
- if ( majorVersion != null )
- {
- buf.append( majorVersion );
- }
- if ( minorVersion != null )
- {
- buf.append( "." );
- buf.append( minorVersion );
- }
- if ( incrementalVersion != null )
+ return unparsed;
+ }
+
+ public boolean equals( Object other )
+ {
+ if ( this == other )
{
- buf.append( "." );
- buf.append( incrementalVersion );
+ return true;
}
- if ( buildNumber != null )
+
+ if ( false == ( other instanceof ArtifactVersion ) )
{
- buf.append( "-" );
- buf.append( buildNumber );
+ return false;
}
- else if ( qualifier != null )
+
+ return 0 == compareTo( other );
+ }
+
+ public int hashCode()
+ {
+ int result = 1229;
+
+ result = 1223 * result + getMajorVersion();
+ result = 1223 * result + getMinorVersion();
+ result = 1223 * result + getIncrementalVersion();
+ result = 1223 * result + getBuildNumber();
+
+ if ( null != getQualifier() )
{
- if ( buf.length() > 0 )
- {
- buf.append( "-" );
- }
- buf.append( qualifier );
+ result = 1223 * result + getQualifier().hashCode();
}
- return buf.toString();
+
+ return result;
}
}
Modified: maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java
URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java?view=diff&rev=565828&r1=565827&r2=565828
==============================================================================
--- maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java (original)
+++ maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java Tue Aug 14 09:35:07 2007
@@ -247,32 +247,147 @@
// version = new DefaultArtifactVersion( "1.1-foo-10" );
// assertTrue( version.compareTo( new DefaultArtifactVersion( "1.1-foo-2" ) ) > 0 );
}
-
+
public void testVersionComparingWithBuildNumberZero()
{
- DefaultArtifactVersion v1 = new DefaultArtifactVersion("2.0");
- DefaultArtifactVersion v2 = new DefaultArtifactVersion("2.0-0");
- DefaultArtifactVersion v3 = new DefaultArtifactVersion("2.0-alpha1");
- DefaultArtifactVersion v4 = new DefaultArtifactVersion("2.0-1");
-
+ DefaultArtifactVersion v1 = new DefaultArtifactVersion( "2.0" );
+ DefaultArtifactVersion v2 = new DefaultArtifactVersion( "2.0-0" );
+ DefaultArtifactVersion v3 = new DefaultArtifactVersion( "2.0-alpha1" );
+ DefaultArtifactVersion v4 = new DefaultArtifactVersion( "2.0-1" );
+
// v1 and v2 are equal
- assertTrue( v1.compareTo(v2) == 0 );
- assertTrue( v2.compareTo(v1) == 0 );
-
+ assertTrue( v1.compareTo( v2 ) == 0 );
+ assertTrue( v2.compareTo( v1 ) == 0 );
+
// v1 is newer than v3
- assertTrue( v1.compareTo(v3) > 0 );
- assertTrue( v3.compareTo(v1) < 0 );
-
+ assertTrue( v1.compareTo( v3 ) > 0 );
+ assertTrue( v3.compareTo( v1 ) < 0 );
+
// ergo, v2 should also be newer than v3
- assertTrue( v2.compareTo(v3) > 0 );
- assertTrue( v3.compareTo(v1) < 0 );
-
+ assertTrue( v2.compareTo( v3 ) > 0 );
+ assertTrue( v3.compareTo( v1 ) < 0 );
+
// nonzero build numbers still respected
- assertTrue( v1.compareTo(v4) < 0 ); // build number one is always newer
- assertTrue( v4.compareTo(v1) > 0 );
- assertTrue( v2.compareTo(v4) < 0 ); // same results as v1
- assertTrue( v4.compareTo(v2) > 0 );
- assertTrue( v3.compareTo(v4) < 0 ); // qualifier is always older
- assertTrue( v4.compareTo(v3) > 0 );
+ assertTrue( v1.compareTo( v4 ) < 0 ); // build number one is always newer
+ assertTrue( v4.compareTo( v1 ) > 0 );
+ assertTrue( v2.compareTo( v4 ) < 0 ); // same results as v1
+ assertTrue( v4.compareTo( v2 ) > 0 );
+ assertTrue( v3.compareTo( v4 ) < 0 ); // qualifier is always older
+ assertTrue( v4.compareTo( v3 ) > 0 );
+ }
+
+ public void testCompareToEqualsHashCodeConsistency()
+ {
+ DefaultArtifactVersion v1;
+ DefaultArtifactVersion v2;
+
+ // equal to itself
+ v1 = new DefaultArtifactVersion( "1.3" );
+ v2 = v1;
+ assertTrue( v1.equals( v2 ) && v2.equals( v1 ) && ( v1.hashCode() == v2.hashCode() ) && ( v1.compareTo( v2 ) == 0 )
+ && ( v2.compareTo( v1 ) == 0 ) );
+
+ // equal to something that means the same
+ v1 = new DefaultArtifactVersion( "1" );
+ v2 = new DefaultArtifactVersion( "1.0.0-0" );
+ assertTrue( v1.equals( v2 ) && v2.equals( v1 ) && ( v1.hashCode() == v2.hashCode() ) && ( v1.compareTo( v2 ) == 0 )
+ && ( v2.compareTo( v1 ) == 0 ) );
+
+ // equal with qualifier
+ v1 = new DefaultArtifactVersion( "1.3-alpha1" );
+ v2 = new DefaultArtifactVersion( "1.3-alpha1" );
+ assertTrue( v1.equals( v2 ) && v2.equals( v1 ) && ( v1.hashCode() == v2.hashCode() ) && ( v1.compareTo( v2 ) == 0 )
+ && ( v2.compareTo( v1 ) == 0 ) );
+
+ // longer qualifier with same start is *newer*
+ v1 = new DefaultArtifactVersion( "1.3-alpha1" );
+ v2 = new DefaultArtifactVersion( "1.3-alpha1-1" );
+ assertTrue( !v1.equals( v2 ) && !v2.equals( v1 ) && ( v1.compareTo( v2 ) > 0 ) && ( v2.compareTo( v1 ) < 0 ) );
+
+ // different qualifiers alpha compared
+ v1 = new DefaultArtifactVersion( "1.3-alpha1" );
+ v2 = new DefaultArtifactVersion( "1.3-beta1" );
+ assertTrue( !v1.equals( v2 ) && !v2.equals( v1 ) && ( v1.compareTo( v2 ) < 0 ) && ( v2.compareTo( v1 ) > 0 ) );
+ }
+
+ public void testTransitivity()
+ {
+ DefaultArtifactVersion v1 = new DefaultArtifactVersion( "1" );
+ DefaultArtifactVersion v2 = new DefaultArtifactVersion( "1.0-0" );
+ DefaultArtifactVersion v3 = new DefaultArtifactVersion( "1.0.1" );
+ DefaultArtifactVersion v4 = new DefaultArtifactVersion( "1.0-beta1" );
+
+ // v1 and v2 are equal
+ assertTrue( v1.equals( v2 ) && v2.equals( v1 ) && ( v1.compareTo( v2 ) == 0 ) && ( v2.compareTo( v1 ) == 0 ) );
+
+ // v1 is older than v3
+ assertTrue( !v1.equals( v3 ) && !v3.equals( v1 ) && ( v1.compareTo( v3 ) < 0 ) && ( v3.compareTo( v1 ) > 0 ) );
+
+ // ergo, v2 is older than v3
+ assertTrue( !v2.equals( v3 ) && !v3.equals( v2 ) && ( v2.compareTo( v3 ) < 0 ) && ( v3.compareTo( v2 ) > 0 ) );
+
+ // v1 is newer than v4
+ assertTrue( !v1.equals( v4 ) && !v4.equals( v1 ) && ( v1.compareTo( v4 ) > 0 ) && ( v4.compareTo( v1 ) < 0 ) );
+
+ // ergo, v2 is newer than v4
+ assertTrue( !v2.equals( v4 ) && !v4.equals( v2 ) && ( v2.compareTo( v4 ) > 0 ) && ( v4.compareTo( v2 ) < 0 ) );
+ }
+
+ private void testInterfaceCompare( String version )
+ {
+ final DefaultArtifactVersion dav = new DefaultArtifactVersion( version );
+
+ // create an anonymous instance to compare the big daddy to
+ ArtifactVersion av = new ArtifactVersion()
+ {
+ public int getMajorVersion()
+ {
+ return dav.getMajorVersion();
+ }
+
+ public int getMinorVersion()
+ {
+ return dav.getMinorVersion();
+ }
+
+ public int getIncrementalVersion()
+ {
+ return dav.getIncrementalVersion();
+ }
+
+ public int getBuildNumber()
+ {
+ return dav.getBuildNumber();
+ }
+
+ public String getQualifier()
+ {
+ return dav.getQualifier();
+ }
+
+ // required by interface but unused for our test
+ public int compareTo( Object o )
+ {
+ return 0; /* bogus */
+ }
+
+ public void parseVersion( String s )
+ { /* bogus */
+ }
+ };
+
+ assertTrue( dav.equals( av ) );
+ assertTrue( dav.compareTo( av ) == 0 );
+ }
+
+ public void testInterfaceCompares()
+ {
+ testInterfaceCompare( "1" );
+ testInterfaceCompare( "1.2" );
+ testInterfaceCompare( "1.2.3" );
+ testInterfaceCompare( "1.2.3-4" );
+ testInterfaceCompare( "1.2.3-four" );
+ testInterfaceCompare( "1-2" );
+ testInterfaceCompare( "1-two" );
}
}