package org.infoglue.cms.util.sorters; import java.util.Comparator; import org.apache.commons.beanutils.PropertyUtils; import org.apache.log4j.Logger; import org.infoglue.cms.entities.structure.SiteNodeVO; import org.infoglue.deliver.controllers.kernel.impl.simple.TemplateController; /** * Sort on a particular property, using reflection to find the value * * @author Frank Febbraro (frank@phase2technology.com) */ public class SiteNodeComparator implements Comparator { private final static Logger logger = Logger.getLogger(SiteNodeComparator.class.getName()); private String sortProperty; private String sortOrder; private TemplateController templateController; public SiteNodeComparator(String sortProperty, String sortOrder, TemplateController templateController) { this.sortProperty = sortProperty; this.sortOrder = sortOrder; this.templateController = templateController; } public int compare(Object o1, Object o2) { SiteNodeVO siteNodeVO1 = (SiteNodeVO)o1; SiteNodeVO siteNodeVO2 = (SiteNodeVO)o2; Comparable valueOne = (String)siteNodeVO1.getExtraProperties().get(sortProperty); Comparable valueTwo = (String)siteNodeVO2.getExtraProperties().get(sortProperty); long previousTime = System.currentTimeMillis(); if(valueOne == null) { valueOne = getProperty(o1, sortProperty); valueTwo = getProperty(o2, sortProperty); } if(valueOne == null && this.templateController != null) { Integer meta1Id = this.templateController.getMetaInformationContentId(siteNodeVO1.getId()); Integer meta2Id = this.templateController.getMetaInformationContentId(siteNodeVO2.getId()); valueOne = this.templateController.getContentAttribute(meta1Id, this.templateController.getLanguageId(), sortProperty); valueTwo = this.templateController.getContentAttribute(meta2Id, this.templateController.getLanguageId(), sortProperty); } if(valueOne != null && valueTwo != null) { if(sortOrder.equalsIgnoreCase("desc")) return valueTwo.compareTo(valueOne); else return valueOne.compareTo(valueTwo); } else return 0; } 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 null; } } }