/**
* (C) Copyright IBM Corporation 2014.
*
* Licensed 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 net.wasdev.wlp.ant.install;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Version implements Comparable<Version> {
private final static int WILDCARD = -1;
private final int major;
private final int minor;
private final int micro;
private final String qualifier;
private Version(int major, int minor, int micro, String qualifier) {
this.major = major;
this.minor = minor;
this.micro = micro;
this.qualifier = qualifier;
}
public static Version parseVersion(String version) {
return parseVersion(version, false);
}
public static Version parseVersion(String version, boolean wildcard) {
Pattern p = null;
if (wildcard) {
p = Pattern.compile("^([\\d\\+]+)(?:\\.([\\d\\+]+))?(?:\\.([\\d\\+]+))?(?:\\_(.*))?$");
} else {
p = Pattern.compile("^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\_(.*))?$");
}
Matcher m = p.matcher(version);
if (m.find()) {
int major = parseComponent(m.group(1));
int minor = parseComponent(m.group(2));
int micro = parseComponent(m.group(3));
String qualifier = m.group(4);
return new Version(major, minor, micro, qualifier);
} else {
throw new IllegalArgumentException("Invalid version: " + version);
}
}
private static int parseComponent(String version) {
if (version == null) {
return 0;
} else if ("+".equals(version)) {
return WILDCARD;
} else {
return Integer.parseInt(version);
}
}
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof Version)) {
return false;
}
return compareTo((Version)other) == 0;
}
public int compareTo(Version other) {
if (other == this) {
return 0;
}
int result = major - other.major;
if (result != 0) {
return result;
}
result = minor - other.minor;
if (result != 0) {
return result;
}
result = micro - other.micro;
if (result != 0) {
return result;
}
return qualifier.compareTo(other.qualifier);
}
public boolean match(Version version) {
if (major == WILDCARD) {
return true;
} else if (major != version.major) {
return false;
}
if (minor == WILDCARD) {
return true;
} else if (minor != version.minor) {
return false;
}
if (micro == WILDCARD) {
return true;
} else if (micro != version.micro) {
return false;
}
if ("+".equals(qualifier)) {
return true;
} else if (qualifier == null) {
return version.qualifier == null;
} else {
return qualifier.equals(version.qualifier);
}
}
public int getMajor() {
return major;
}
public int getMinor() {
return minor;
}
public int getMicro() {
return micro;
}
public String getQualifier() {
return qualifier;
}
public String toString() {
StringBuilder result = new StringBuilder();
if (major == WILDCARD) {
result.append('+');
} else {
result.append(major);
result.append('.');
if (minor == WILDCARD) {
result.append('+');
} else {
result.append(minor);
result.append('.');
if (micro == WILDCARD) {
result.append('+');
} else {
result.append(micro);
if (qualifier != null) {
result.append('_');
result.append(qualifier);
}
}
}
}
return result.toString();
}
}