package com.revolsys.util; import java.text.Collator; import java.util.Comparator; import com.revolsys.comparator.NumericComparator; import com.revolsys.datatype.DataTypes; public class CompareUtil { public static final Comparator<?> INSTANCE = CompareUtil::compare; public static <T> int compare(final Comparable<T> object1, final T object2) { if (object1 == null) { if (object2 == null) { return 0; } else { return -1; } } else if (object2 == null) { return 1; } else { if (object1 instanceof Number) { return NumericComparator.numericCompare(object1, object2); } else { return object1.compareTo(object2); } } } public static <T> int compare(final Comparable<T> object1, final T object2, final boolean nullsFirst) { if (object1 == null) { if (object2 == null) { return 0; } else { if (nullsFirst) { return -1; } else { return 1; } } } else if (object2 == null) { if (nullsFirst) { return 1; } else { return -1; } } else { return object1.compareTo(object2); } } public static <T> int compare(final Comparator<T> comparator, final T object1, final T object2) { if (object1 == null) { if (object2 == null) { return 0; } else { return -1; } } else if (object2 == null) { return 1; } else { return comparator.compare(object1, object2); } } public static int compare(final Object object1, Object object2) { if (object1 == null) { if (object2 == null) { return 0; } else { return -1; } } else if (object2 == null) { return 1; } else if (object1 instanceof Comparable) { if (object1 instanceof Number) { return NumericComparator.numericCompare(object1, object2); } else if (object2 instanceof Number) { final Object value = object2; object2 = DataTypes.toString(value); } @SuppressWarnings("unchecked") final Comparable<Object> comparable = (Comparable<Object>)object1; return comparable.compareTo(object2); } else { return object1.toString().compareTo(object2.toString()); } } public static Comparator<?> getComparator(final Class<?> columnClass) { if (Number.class.isAssignableFrom(columnClass)) { return new NumericComparator<>(); } else if (Comparable.class.isAssignableFrom(columnClass)) { return INSTANCE; } else { return Collator.getInstance(); } } }