package org.infoglue.cms.util.sorters;
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
/**
* Sort on a particular property, using reflection to find the value
*
* @author Mattias Bogeblad
*/
public class ReflectionComparator implements Comparator
{
private final static Logger logger = Logger.getLogger(ReflectionComparator.class.getName());
private String sortProperty;
private Collator collation = Collator.getInstance();
public ReflectionComparator(String prop)
{
sortProperty = prop;
}
public ReflectionComparator(String prop, Locale locale)
{
sortProperty = prop;
if(locale != null)
this.collation = Collator.getInstance(locale);
}
public int compare(Object o1, Object o2)
{
Comparable valueOne = getProperty(o1, sortProperty);
Comparable valueTwo = getProperty(o2, sortProperty);
if(valueOne instanceof String && valueTwo instanceof String)
return collation.compare(valueOne, valueTwo);
else
return valueOne.compareTo(valueTwo);
}
private Comparable getProperty(Object o, String property)
{
try
{
Object propertyObject = PropertyUtils.getProperty(o, sortProperty);
if(propertyObject instanceof String)
return (Comparable)propertyObject.toString().toLowerCase();
else
return (Comparable)propertyObject;
}
catch (Exception e)
{
logger.info(getClass().getName() + " Error finding property " + property, e);
return new Comparable()
{
public int compareTo(Object o)
{
return 0;
}
};
}
}
}