/**
* Copyright (c) 2009--2010 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.common.util;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.frontend.struts.RequestContext;
import org.apache.commons.beanutils.PropertyUtils;
import java.text.Collator;
import java.util.Comparator;
/**
* DynamicComparator - simple class that can be
* used with Collections.sort(list, comparator).
* Create an instance of this class with the
* passed in fieldname and it will create a Comparator
* that will compare two objects based on the field
* passed into the Constructor.
*
* Usefull if you have a Collection of Beans that you
* want to sort based on a specific property.
*
* @version $Rev$
*/
public class DynamicComparator implements Comparator {
private String fieldName;
private int order;
private Collator collator;
/**
* Create a new DynamicComparator that
* can be used to compare indivdual beans..
* @param fieldNameIn Name of field you want to use in
* the bean to compare to
*
* @param sortOrder Should be either <code>RequestContext.LIST_SORT_ASC</code> or
* <code>RequestContext.LIST_SORT_DESC</code>
*/
public DynamicComparator(String fieldNameIn, String sortOrder) {
this (fieldNameIn, RequestContext.SORT_ASC.equals(sortOrder));
}
/**
* Create a new DynamicComparator that
* can be used to compare indivdual beans..
* @param fieldNameIn Name of field you want to use in
* the bean to compare to
*
* @param ascending true for ascending order
*/
public DynamicComparator(String fieldNameIn, boolean ascending) {
this.fieldName = fieldNameIn;
if (ascending) {
order = 1;
}
else {
order = -1;
}
}
/**
* {@inheritDoc}
*/
public int compare(Object o1, Object o2) {
Comparable val1 = null;
Comparable val2 = null;
try {
val1 = (Comparable)PropertyUtils.getProperty(o1, fieldName);
val2 = (Comparable)PropertyUtils.getProperty(o2, fieldName);
if (val1 instanceof String && val2 instanceof String) {
return order * getCollator().compare(val1, val2);
}
// a < b = -1, a > b = 1 , a== b =0
if (val1 == null && val2 != null) {
return order * -1;
}
else if (val1 != null && val2 == null) {
return order * 1;
}
else if (val1 == val2) {
return 0;
}
return order * val1.compareTo(val2);
}
catch (Exception e) {
throw new IllegalArgumentException("Exception trying to compare " +
"two objects: o1: " + o1 + " o2: " + o2 + " with field: " +
this.fieldName + " generated this exception: " + e);
}
}
/**
* @return Returns the fieldName.
*/
public String getFieldName() {
return fieldName;
}
private Collator getCollator() {
if (collator == null) {
collator = LocalizationService.getInstance().newCollator();
}
return collator;
}
}