/*******************************************************************************
* Copyright (c) 2005-2011, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.rgw.tools;
/**
* Einfaches API zum Vergleich von Versionsnummern des Typs maior.minor.rev
*
* @author G. Weirich
* @version 1.6.0
*/
public class VersionInfo implements Comparable<VersionInfo> {
public static String Version(){
return "1.8.0";
}
String orig;
String[] spl;
public VersionInfo(){
this(Version());
}
public VersionInfo(final String v){
if (StringTool.isNothing(v)) {
orig = null;
spl = null;
} else {
orig = v;
spl = orig.split("\\.");
}
}
public String getMaior(){
if ((spl == null) || (spl.length < 1)) {
return "0";
}
if (StringTool.isNothing(spl[0])) {
return "0";
}
return spl[0];
}
public String getMinor(){
if ((spl == null) || (spl.length < 2)) {
return "0";
}
return spl[1];
}
public String getRevision(){
if ((spl == null) || (spl.length < 3)) {
return "0";
}
return spl[2];
}
public String getBuildTag(){
if ((spl == null) || (spl.length < 4)) {
return "";
} else {
return spl[3];
}
}
public String version(){
return orig;
}
public boolean matches(VersionInfo pattern){
for (int i = 0; i < 3; i++) {
if (i >= spl.length) {
if (i >= pattern.spl.length) {
return true;
}
return false;
}
if (i >= pattern.spl.length) {
return false;
}
if (!matchElements(spl[0], pattern.spl[0])) {
return false;
}
}
return true;
}
private boolean matchElements(final String a, final String b){
if (a.equals("*") || b.equals("*")) {
return true;
}
if (compareElem(a, b) == 0) {
return true;
}
return false;
}
public boolean isNewer(final String other){
VersionInfo vo = new VersionInfo(other);
return isNewer(vo);
}
public boolean isOlder(final String other){
VersionInfo vn = new VersionInfo(other);
return isOlder(vn);
}
/**
* Ist diese Version neuer, als die andere?
*
* @param vo
* die andere
* @return true:ja, false: nein
*/
public boolean isNewer(final VersionInfo vo){
return (compareTo(vo) > 0);
}
public boolean isOlder(final VersionInfo vo){
return (compareTo(vo) < 0);
}
public boolean isNewerMaior(final VersionInfo vo){
return compareElem(this.getMaior(), vo.getMaior()) > 0;
}
public boolean isNewerMinor(final VersionInfo vo){
if (isNewerMaior(vo)) {
return true;
}
if (isOlder(vo)) {
return false;
}
return compareElem(this.getMinor(), vo.getMinor()) > 0;
}
public boolean isNewerRev(final VersionInfo vo){
return isNewerMaior(vo) ? true : isNewerMinor(vo) ? true : compareElem(this.getRevision(),
vo.getRevision()) > 0;
}
public boolean isNewerBuild(final VersionInfo vo){
return isNewerRev(vo) ? true : compareElem(this.getBuildTag(), vo.getBuildTag()) > 0;
}
public boolean isEqual(final VersionInfo vo){
return (compareTo(vo) == 0);
}
public int compareTo(final VersionInfo vo){
int c = compareElem(this.getMaior(), vo.getMaior());
if (c != 0) {
return c;
}
c = compareElem(this.getMinor(), vo.getMinor());
if (c != 0) {
return c;
}
c = compareElem(this.getRevision(), vo.getRevision());
if (c != 0) {
return c;
}
return compareElem(this.getBuildTag(), vo.getBuildTag());
}
private int compareElem(final String a, final String b){
int al = a.length();
int bl = b.length();
if (al == bl) {
return a.compareToIgnoreCase(b);
}
int diff = Math.abs(al - bl);
String x = StringTool.pad(StringTool.LEFT, '0', a, al + diff + 1);
String y = StringTool.pad(StringTool.LEFT, '0', b, al + diff + 1);
return x.compareToIgnoreCase(y);
}
}