package eu.irreality.age.util;
import java.util.Comparator;
import org.cougaar.util.NaturalOrderComparator;
/**
* Compares strings that describe versions.
* @author carlos
*
*/
public class VersionComparator implements Comparator
{
/**
* If the string ends with a digit -> adds .a
* If the string ends with a letter and no dot before the letter -> add dot before the letter (if not already there).
* So that:
* 1.3.0 -> 1.3.0.a
* 1.3.0b -> 1.3.0.b
* So that NaturalLanguageComparator handles well cases like 1.2.0b vs 1.2.3
* @param versionString
* @return
*/
public String normalizeVersionString ( String versionString )
{
if ( versionString == null ) return null;
if ( versionString.length() == 0 ) return "";
if ( Character.isDigit(versionString.charAt(versionString.length()-1)) )
{
return versionString + ".a";
}
else if ( Character.isLetter(versionString.charAt(versionString.length()-1)) )
{
if ( versionString.length() >= 2 && versionString.charAt(versionString.length()-2) != '.' )
return versionString.substring(0,versionString.length()-1) + "." + versionString.charAt(versionString.length()-1);
else
return versionString;
}
else //we don't know what this is
{
return versionString;
}
}
/**
* Compare two version strings.
*/
public int compare(Object arg0, Object arg1)
{
if ( arg0 == null || arg1 == null ) return 0; //if version is unspecified we won't complain
String version0 = (String) arg0;
String version1 = (String) arg1;
if ( "".equals(arg0) || "".equals(arg1) ) return 0; //again, version unspecified
if ( !version0.matches(".*\\d.*") || !version1.matches(".*\\d.*") ) return 0; //no numbers in version strings
return NaturalOrderComparator.NUMERICAL_ORDER.compare(normalizeVersionString(version0),normalizeVersionString(version1));
}
}