/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank; /* * #%L * JSF Support Beans * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.lang.reflect.InvocationTargetException; import java.util.Comparator; import org.apache.commons.beanutils.PropertyUtils; /** * PropertyComparer * * @author dangleton * */ public class PropertyComparer<T> implements Comparator<T> { private String propertyName; private SortOrder sortOrder; /** * @param propertyName */ public PropertyComparer(String propertyName) { this(propertyName, SortOrder.ASCENDING); } /** * @param propertyName * @param sortOrder */ public PropertyComparer(String propertyName, PropertyComparer.SortOrder sortOrder) { super(); this.propertyName = propertyName; this.sortOrder = sortOrder; } /** * @{inheritDoc */ @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public int compare(T src, T tgt) { int retVal = 0; if (src == null && tgt == null) { retVal = 0; } else if (src != null && tgt == null) { retVal = 1; } else if (src == null && tgt != null) { retVal = -1; } else { try { Object property = PropertyUtils.getProperty(src, propertyName); Object property2 = PropertyUtils.getProperty(tgt, propertyName); if (property == null && property2 == null) { retVal = 0; } else if (property == null && property2 != null) { retVal = -1; } else if (property != null && property2 == null) { retVal = 1; } else if (Comparable.class.isAssignableFrom(property .getClass())) { Comparable c1 = (Comparable) property; Comparable c2 = (Comparable) property2; retVal = c1.compareTo(c2); } else { retVal = property.toString() .compareTo(property2.toString()); } } catch (IllegalAccessException e) { throw new RuntimeException( "Cannot access the method. Possible error in setting the access type for the getter setters of " + propertyName); } catch (InvocationTargetException e) { throw new RuntimeException(e.getMessage()); } catch (NoSuchMethodException e) { throw new RuntimeException("No getter/setter method found for " + propertyName); } } if (sortOrder == SortOrder.DESCENDING) { retVal = retVal * -1; } return retVal; } public enum SortOrder { ASCENDING, DESCENDING } }