package org.basex.util;
import static org.basex.util.Token.*;
/**
* Version according to the SemVer syntax.
*
* @author BaseX Team 2005-12, BSD License
* @author Rositsa Shadura
*/
public final class Version implements Comparable<Version> {
/** Major version. */
private final int major;
/** Minor version. */
private final int minor;
/** Patch version. */
private final int patch;
/**
* Constructor.
* @param version according to semantic versioning
*/
public Version(final String version) {
this(token(version));
}
/**
* Constructor.
* @param version according to semantic versioning
*/
public Version(final byte[] version) {
final byte[][] versions = split(version, '.');
major = toInt(versions[0]);
minor = versions.length > 1 ? toInt(versions[1]) : -1;
patch = versions.length > 2 ? toInt(versions[2]) : -1;
}
/**
* Checks if this version is compatible with the given version template.
* @param ver version template
* @return result
*/
public boolean isCompatible(final Version ver) {
if(major != ver.major) return false;
if(ver.minor == -1) return true;
if(ver.patch == -1) return minor == ver.minor;
return minor == ver.minor && patch == ver.patch;
}
@Override
public int compareTo(final Version ver) {
return major != ver.major ? major - ver.major :
minor != ver.minor ? minor - ver.minor : patch - ver.patch;
}
@Override
public boolean equals(final Object o) {
return o instanceof Version && compareTo((Version) o) == 0;
}
@Override
public int hashCode() {
return major + (minor << 8) + (patch << 16);
}
@Override
public String toString() {
return major + (minor == -1 ? "" : "." + minor +
(patch == -1 ? "" : "." + patch));
}
}