one.edee.darwin.model.version.VersionComparator Maven / Gradle / Ivy
Show all versions of darwin Show documentation
package one.edee.darwin.model.version;
import java.io.Serializable;
import java.util.Comparator;
import java.util.Iterator;
/**
* Compares two VersionDescriptor objects.
*
* @author Jan Novotný, FG Forrest a.s. (c) 2007
*/
public class VersionComparator implements Comparator, Serializable {
private static final long serialVersionUID = -7445439954199588183L;
/**
* Compares its two arguments for order. Returns a negative integer,
* zero, or a positive integer as the first argument is less than, equal
* to, or greater than the second.
*
* The implementor must ensure that sgn(compare(x, y)) ==
* -sgn(compare(y, x)) for all x and y. (This
* implies that compare(x, y) must throw an exception if and only
* if compare(y, x) throws an exception.)
*
* The implementor must also ensure that the relation is transitive:
* ((compare(x, y)>0) && (compare(y, z)>0)) implies
* compare(x, z)>0.
*
* Finally, the implementer must ensure that compare(x, y)==0
* implies that sgn(compare(x, z))==sgn(compare(y, z)) for all
* z.
*
* It is generally the case, but not strictly required that
* (compare(x, y)==0) == (x.equals(y)). Generally speaking,
* any comparator that violates this condition should clearly indicate
* this fact. The recommended language is "Note: this comparator
* imposes orderings that are inconsistent with equals."
*
* @param o1 the first object to be compared.
* @param o2 the second object to be compared.
* @return a negative integer, zero, or a positive integer as the
* first argument is less than, equal to, or greater than the
* second.
* @throws ClassCastException if the arguments' types prevent them from
* being compared by this Comparator.
*/
public int compare(VersionDescriptor o1, VersionDescriptor o2) {
if (o1 == null && o2 != null) return -1;
if (o2 == null) throw new IllegalArgumentException("Version to be compared against (second parameter) cannot be null!");
final Iterator itAlfa = o1.getIdentification().iterator();
final Iterator itBeta = o2.getIdentification().iterator();
Object lastAlfa = null;
while(itAlfa.hasNext()) {
final Object alfaVersion = itAlfa.next();
Object betaVersion = itBeta.hasNext() ? itBeta.next() : null;
if(betaVersion == null) {
if (alfaVersion instanceof Integer) {
betaVersion = 0;
} else {
return -1;
}
}
if(alfaVersion instanceof Integer) {
if(betaVersion instanceof Integer) {
if((Integer) alfaVersion > (Integer) betaVersion) return 1;
else if((Integer) alfaVersion < (Integer) betaVersion) return -1;
}
else {
return 1;
}
}
else {
if (betaVersion instanceof Integer) {
return -1;
} else {
int result = ((String)alfaVersion).compareToIgnoreCase((String)betaVersion);
if (result > 0) return 1;
if (result < 0) return -1;
}
}
lastAlfa = alfaVersion;
}
if(itBeta.hasNext()) {
Object nextVersion = itBeta.next();
if (lastAlfa instanceof Integer) {
return (nextVersion instanceof Integer)?-1:1;
}
else {
return -1;
}
}
return 0;
}
}