package org.argeo.slc.client.ui.dist.utils;
import org.argeo.eclipse.ui.TreeParent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
/**
* Enable comparison of two names version string with form org.argeo.slc-1.2.x.
* with following rules and assumptions:
*
* -
* Names are ordered using Lexicographical order
* -
* Version are parsed and compared segment by segment; doing best effort to
* convert major, minor and micro to integer and compare them as such (to have
* 0.1 < 0.9 < 0.10 not 0.1 < 0.10 < 0.9).
* - Version should not contain any dash (-), version segments should be
* separated by dots (.)
*
*/
public class NameVersionComparator extends ViewerComparator {
private static final long serialVersionUID = 8290130681918221197L;
private VersionComparator vc = new VersionComparator();
@Override
public int category(Object element) {
if (element instanceof String) {
int lastInd = ((String) element).lastIndexOf('-');
if (lastInd > 0)
return 10;
}
// unvalid names always last
return 5;
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
int cat1 = category(e1);
int cat2 = category(e2);
if (cat1 != cat2) {
return cat1 - cat2;
}
int result = 0;
String s1, s2;
if (e1 instanceof TreeParent) {
s1 = ((TreeParent) e1).getName();
s2 = ((TreeParent) e2).getName();
} else {
s1 = e1.toString();
s2 = e2.toString();
}
int i1 = s1.lastIndexOf('-');
int i2 = s2.lastIndexOf('-');
// Specific cases, unvalid Strings
if (i1 < 0)
if (i2 < 0)
return s1.compareTo(s2);
else
return 1;
else if (i2 < 0)
return -1;
String aName = s1.substring(0, s1.lastIndexOf('-'));
String aVersion = s1.substring(s1.lastIndexOf('-'));
String bName = s2.substring(0, s2.lastIndexOf('-'));
String bVersion = s2.substring(s2.lastIndexOf('-'));
result = aName.compareTo(bName);
if (result != 0)
return result;
else
return vc.compare(viewer, aVersion, bVersion);
}
}