package net.techreadiness.ui.tags; import java.util.Comparator; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import com.google.common.collect.Ordering; public class ViewFieldDisplayOrderComparator implements Comparator<ViewFieldTag> { @Override public int compare(ViewFieldTag o1, ViewFieldTag o2) { Integer displayOrder1 = getIntegerValue(o1.getDisplayOrder()); Integer displayOrder2 = getIntegerValue(o2.getDisplayOrder()); int displayOrderResult = Ordering.natural().compare(displayOrder1, displayOrder2); if (displayOrderResult != 0) { return displayOrderResult; } int pageOrderResult = Ordering.natural().nullsFirst().compare(o1.getPageOrder(), o2.getPageOrder()); if (pageOrderResult != 0) { return pageOrderResult; } return o1.getCode().compareTo(o2.getCode()); } private static Integer getIntegerValue(String displayOrder) { String defaultString = StringUtils.defaultString(displayOrder); try { Integer order = NumberUtils.createInteger(defaultString); return order; } catch (NumberFormatException e) { if (defaultString.equalsIgnoreCase("first") || StringUtils.isBlank(defaultString)) { return Integer.valueOf(Integer.MIN_VALUE); } else if (defaultString.equalsIgnoreCase("last")) { return Integer.valueOf(Integer.MAX_VALUE); } else { throw new IllegalArgumentException("The display order must be an integer, 'first' or 'last'."); } } } public int compare(String o1, String o2) { String value1 = StringUtils.defaultString(o1); String value2 = StringUtils.defaultString(o2); if (value1.equalsIgnoreCase(value2)) { return 0; } else if (StringUtils.isBlank(value1) && StringUtils.isBlank(value2)) { return 0; } else if (value1.equalsIgnoreCase("first") || value2.equalsIgnoreCase("last")) { return -1; } else if (value1.equalsIgnoreCase("last") || value2.equalsIgnoreCase("first")) { return 1; } else if (StringUtils.isBlank(value2) || !StringUtils.isNumeric(value2)) { return -1; } else if (StringUtils.isBlank(value1) || !StringUtils.isNumeric(value1)) { return 1; } else { return Integer.valueOf(value1).compareTo(Integer.valueOf(value2)); } } }