public class JavaVersion implements Comparable {
	public static final JavaVersion JVM_16 = new JavaVersion("1.6");

	public static final JavaVersion JVM_15 = new JavaVersion("1.5");

	public static final JavaVersion JVM_14 = new JavaVersion("1.4");

	public static final JavaVersion JVM_13 = new JavaVersion("1.3");

	public static final JavaVersion JVM_12 = new JavaVersion("1.2");

	public static final JavaVersion JVM_11 = new JavaVersion("1.1");

	private int release;

	private int major;

	private int minor;

	public JavaVersion(String version) throws IllegalArgumentException {
		if (version == null) {
			throw new IllegalArgumentException("null argument.");
		}
		parse(version);
	}

	private void parse(String version) {
		version = version.trim();
		StringTokenizer token = new StringTokenizer(version, ".");
		release = 1;
		major = 0;
		minor = 0;
		release = parseToken(token.nextToken());
		if (token.hasMoreTokens()) {
			major = parseToken(token.nextToken());
		}

		if (token.hasMoreTokens()) {
			minor = parseToken(token.nextToken());
		}

	}

	private int parseToken(String part) {
		if (part.contains("_")) {
			part = part.substring(0, part.indexOf('_'));
		}
		try {
			return Integer.parseInt(part);
		} catch (NumberFormatException e) {
			return 0;
		}
	}

	public static final JavaVersion getCurrentJavaVersion() {
		return new JavaVersion(System.getProperty("java.version"));
	}

	public int getMajor() {
		return major;
	}

	public int getMinor() {
		return minor;
	}

	public int getRelease() {
		return release;
	}

	public boolean newerOrEqual(JavaVersion version) {
		return compareTo(version) >= 0;
	}

	public boolean olderOrEqual(JavaVersion version) {
		return compareTo(version) <= 0;
	}

	public int compareTo(Object o) {
		if (!(o instanceof JavaVersion)) {
			throw new ClassCastException();
		}
		JavaVersion v = (JavaVersion) o;
		if ((release - v.release) == 0) {
			if ((major - v.major) == 0) {
				return minor - v.minor;
			}
			return (major - v.major);
		}

		return release - v.release;
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof JavaVersion)) {
			return false;
		}
		return compareTo(obj) == 0;
	}

	@Override
	public int hashCode() {
		return (release + 10) ^ (major + 20) ^ (minor + 30);
	}

	@Override
	public String toString() {
		return release + "." + major + "." + minor;
	}
}

