package com.limegroup.gnutella.version;
/**
* Enscapulates a version, allowing easy compareTos.
*/
public class Version implements Comparable {
/**
* The version string.
*/
private final String v;
/**
* The major version.
* X in X.Y.Z_r
*/
private final int major;
/**
* The minor version.
* Y in X.Y.Z_r
*/
private final int minor;
/**
* The service version.
* Z in X.Y.Z_r
*/
private final int service;
/**
* The revision.
* r in X.Y.Z_r
*/
private final int revision;
/**
* Constructs a new Version.
*/
public Version(String s) throws VersionFormatException {
v = s;
int[] nums = parse(s);
major = nums[0];
minor = nums[1];
service = nums[2];
revision = nums[3];
}
/**
* Returns the version.
*/
public String getVersion() {
return v;
}
/**
* Returns the version.
*/
public String toString() {
return getVersion();
}
/**
* Compares two versions.
*/
public int compareTo(Object o) {
int retVal;
Version other = (Version)o;
if(major == other.major)
if(minor == other.minor)
if(service == other.service)
// if revision == other.revision
// return 0;
// else
retVal = revision - other.revision;
else
retVal = service - other.service;
else
retVal = minor - other.minor;
else
retVal = major - other.major;
return retVal;
}
/**
* Equality.
*/
public boolean equals(Object o) {
return compareTo(o) == 0;
}
/**
* Parses a version for major/minor/service & revision.
* Major, Minor & Service are required. Revision can be implied.
*/
private int[] parse(String vers) throws VersionFormatException {
int major, minor, service, revision;
int dot1, dot2, lastNum;
dot1 = vers.indexOf(".");
if(dot1 == -1)
throw new VersionFormatException(vers);
dot2 = vers.indexOf(".", dot1 + 1);
if(dot2 == -1)
throw new VersionFormatException(vers);
try {
major = Integer.parseInt(vers.substring(0, dot1));
} catch(NumberFormatException nfe) {
throw new VersionFormatException(vers);
}
try {
minor = Integer.parseInt(vers.substring(dot1 + 1, dot2));
} catch(NumberFormatException nfe) {
throw new VersionFormatException(vers);
}
try {
int q = dot2 + 1;
while(q < vers.length() && Character.isDigit(vers.charAt(q)))
q++;
lastNum = q;
service = Integer.parseInt(vers.substring(dot2 + 1, q));
} catch(NumberFormatException nfe) {
throw new VersionFormatException(vers);
}
revision = 0;
try {
int q = lastNum + 1;
while (q < vers.length() && !Character.isDigit(vers.charAt(q)))
q++;
if(q < vers.length())
revision = Integer.parseInt(vers.substring(q));
} catch(NumberFormatException okay) {
// not everything will have a revision digit.
}
return new int[] { major, minor, service, revision };
}
}