package org.infoglue.cms.util.sorters;
import java.util.Comparator;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.infoglue.deliver.applications.databeans.WebPage;
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 HardcodedPageComparator implements Comparator
{
private final static Logger logger = Logger.getLogger(HardcodedPageComparator.class.getName());
private String sortProperty;
private String sortOrder;
private boolean numberOrder;
private String nameProperty;
private String namesInOrderString;
private TemplateController templateController;
public HardcodedPageComparator(String sortProperty, String sortOrder, boolean numberOrder, String nameProperty, String namesInOrderString, TemplateController templateController)
{
this.sortProperty = sortProperty;
this.sortOrder = sortOrder;
this.numberOrder = numberOrder;
this.nameProperty = nameProperty;
this.namesInOrderString = namesInOrderString;
this.templateController = templateController;
}
public int compare(Object o1, Object o2)
{
Comparable valueOne = getProperty(o1, sortProperty);
Comparable valueTwo = getProperty(o2, sortProperty);
Comparable valueOneName = getProperty(o1, nameProperty);
Comparable valueTwoName = getProperty(o2, nameProperty);
if(valueOne == null)
{
WebPage webPage1 = (WebPage)o1;
WebPage webPage2 = (WebPage)o2;
Integer meta1Id = webPage1.getMetaInfoContentId(); //this.templateController.getMetaInformationContentId(webPage1.getSiteNodeId());
Integer meta2Id = webPage2.getMetaInfoContentId(); //this.templateController.getMetaInformationContentId(webPage2.getSiteNodeId());
valueOne = this.templateController.getContentAttribute(meta1Id, this.templateController.getLanguageId(), sortProperty);
valueTwo = this.templateController.getContentAttribute(meta2Id, this.templateController.getLanguageId(), sortProperty);
if(valueOneName == null)
{
valueOneName = this.templateController.getContentAttribute(meta1Id, this.templateController.getLanguageId(), nameProperty);
valueTwoName = this.templateController.getContentAttribute(meta2Id, this.templateController.getLanguageId(), nameProperty);
}
if(this.numberOrder)
{
try
{
if(valueOne != null && !valueOne.equals(""))
valueOne = (Comparable)new Long(valueOne.toString());
else
{
if(sortOrder.equalsIgnoreCase("desc"))
valueOne = (Comparable)new Long(Long.MIN_VALUE);
else
valueOne = (Comparable)new Long(Long.MAX_VALUE);
}
}
catch(Exception e)
{
logger.info("Not a number..." + e.getMessage());
}
try
{
if(valueTwo != null && !valueTwo.equals(""))
valueTwo = (Comparable)new Long(valueTwo.toString());
else
{
if(sortOrder.equalsIgnoreCase("desc"))
valueTwo = (Comparable)new Long(Long.MIN_VALUE);
else
valueTwo = (Comparable)new Long(Long.MAX_VALUE);
}
}
catch(Exception e)
{
logger.info("Not a number..." + e.getMessage());
}
}
}
if(after(valueOne, valueTwo, valueOneName, valueTwoName))
return 1;
else
return -1;
}
private boolean after(Comparable valueOne, Comparable valueTwo, Comparable valueOneName, Comparable valueTwoName)
{
int index1 = namesInOrderString.indexOf(valueOneName.toString());
int index2 = namesInOrderString.indexOf(valueTwoName.toString());
if(index1 != -1 && index2 != -1)
{
if(index1 > index2)
return true;
else
return false;
}
else
{
if(index1 == -1 && index2 != -1)
return true;
else if(index2 == -1 && index1 != -1)
return false;
else
{
int result;
if(sortOrder.equalsIgnoreCase("desc"))
{
if((valueOne != null && !valueOne.toString().equalsIgnoreCase("")) && (valueTwo == null || valueTwo.toString().equalsIgnoreCase("")))
result = -1;
if((valueTwo != null && !valueTwo.toString().equalsIgnoreCase("")) && (valueOne == null || valueOne.toString().equalsIgnoreCase("")))
result = 1;
result = valueTwo.compareTo(valueOne);
}
else
{
if((valueOne != null && !valueOne.toString().equalsIgnoreCase("")) && (valueTwo == null || valueTwo.toString().equalsIgnoreCase("")))
result = -1;
if((valueTwo != null && !valueTwo.toString().equalsIgnoreCase("")) && (valueOne == null || valueOne.toString().equalsIgnoreCase("")))
result = 1;
result = valueOne.compareTo(valueTwo);
}
if(result > 0)
return true;
else
return false;
}
}
}
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;
}
}
}