package er.neo4jadaptor.utils;
import java.util.Comparator;
import com.webobjects.eoaccess.EOAttribute;
import com.webobjects.eoaccess.EOEntity;
import com.webobjects.eocontrol.EOSortOrdering;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSSelector;
import er.neo4jadaptor.ersatz.Ersatz;
@SuppressWarnings("unchecked")
public class SortingComparator <T extends Comparable> implements Comparator<Ersatz> {
private final NSArray<EOSortOrdering> sortOrdering;
private final EOEntity entity;
public SortingComparator(EOEntity entity, NSArray<EOSortOrdering> sortOrdering) {
this.sortOrdering = sortOrdering;
this.entity = entity;
}
private static boolean isAscendingSelector(NSSelector<?> selector) {
return selector.equals(EOSortOrdering.CompareAscending) || selector.equals(EOSortOrdering.CompareCaseInsensitiveAscending);
}
private static boolean isCaseInsensitive(NSSelector<?> selector) {
return selector.equals(EOSortOrdering.CompareCaseInsensitiveAscending) || selector.equals(EOSortOrdering.CompareCaseInsensitiveDescending);
}
public int compare(Ersatz u1, Ersatz u2) {
for (EOSortOrdering so : sortOrdering) {
EOAttribute att = entity.attributeNamed(so.key());
T c1 = (T) u1.get(att);
T c2 = (T) u2.get(att);
final int result;
if (c2 == null) {
if (c1 == null) {
return 0;
} else {
return -1;
}
}
if (c1 == null) {
return -compare(u2, u1);
}
if (isCaseInsensitive(so.selector())) {
String s1 = (String) c1;
String s2 = (String) c2;
result = s1.compareToIgnoreCase(s2);
} else {
result = c1.compareTo(c2);
}
if (result != 0) {
if (isAscendingSelector(so.selector())) {
return result;
} else {
return - result;
}
}
}
return 0;
}
}