1 23 24 package org.infoglue.cms.util.sorters; 25 26 import java.lang.reflect.Constructor ; 27 28 import org.apache.commons.beanutils.PropertyUtils; 29 import org.infoglue.cms.entities.content.ContentVO; 30 import org.infoglue.cms.entities.content.ContentVersionVO; 31 import org.infoglue.deliver.controllers.kernel.impl.simple.TemplateController; 32 33 44 45 public class SortElement implements Comparable 46 { 47 50 private final TemplateController controller; 51 52 55 private ContentVersionVO contentVersionVO; 56 57 60 private ContentVO contentVO; 61 62 65 private final CompoundComparable comparable = new CompoundComparable(); 66 67 73 SortElement(final TemplateController controller, final ContentVO contentVO) 74 { 75 this.controller = controller; 76 this.contentVO = contentVO; 77 } 78 79 85 SortElement(final TemplateController controller, final ContentVersionVO contentVersionVO) 86 { 87 this.controller = controller; 88 this.contentVersionVO = contentVersionVO; 89 } 90 91 97 public void addContentProperty(final String name, final boolean ascending) 98 { 99 comparable.add(getProperty(getContentVO(), name), ascending); 100 } 101 102 108 public void addContentVersionProperty(final String name, final boolean ascending) 109 { 110 comparable.add(getProperty(getContentVersionVO(), name), ascending); 111 } 112 113 121 public void addContentVersionAttribute(final String name, final Class clazz, final boolean ascending, final boolean caseSensitive) 122 { 123 final Integer contentId = getContentId(); 124 String stringValue = controller.getContentAttribute(contentId, controller.getLanguageId(), name); 125 if(!caseSensitive) 126 stringValue = stringValue.toLowerCase(); 127 128 comparable.add(castAttribute(name, clazz, stringValue), ascending); 129 } 130 131 139 private Comparable castAttribute(final String name, final Class clazz, final String stringValue) 140 { 141 if(String .class.equals(clazz)) 142 { 143 return stringValue; 144 } 145 try 146 { 147 final Constructor ctor = clazz.getConstructor(new Class [] { String .class }); 148 final String s = (Number .class.isAssignableFrom(clazz) && stringValue.equals("")) ? "0" : stringValue; 149 return (Comparable ) ctor.newInstance(new Object [] { s }); 150 } 151 catch(Exception e) 152 { 153 e.printStackTrace(); 154 throw new IllegalArgumentException ("Unable to cast [" + name + "] to [" + clazz.getName() + "]."); 155 } 156 } 157 158 163 private Integer getContentId() 164 { 165 return (contentVO != null) ? getContentVO().getContentId() : getContentVersionVO().getContentId(); 166 } 167 168 175 private Comparable getProperty(final Object o, final String name) 176 { 177 try 178 { 179 return (Comparable ) PropertyUtils.getProperty(o, name); 180 } 181 catch(Exception e) 182 { 183 e.printStackTrace(); 184 throw new IllegalArgumentException ("Illegal property [" + name + "] : " + e); 185 } 186 } 187 188 194 public ContentVersionVO getContentVersionVO() 195 { 196 if(contentVersionVO == null) 197 { 198 contentVersionVO = controller.getContentVersion(contentVO.getContentId()); 199 } 200 return contentVersionVO; 201 } 202 203 209 public ContentVO getContentVO() 210 { 211 if(contentVO == null) 212 { 213 contentVO = controller.getContent(contentVersionVO.getContentId()); 214 } 215 return contentVO; 216 } 217 218 225 public final int compareTo(Object o) 226 { 227 if(!(o instanceof SortElement)) 228 { 229 throw new ClassCastException (); 230 } 231 final SortElement other = (SortElement) o; 232 return comparable.compareTo(other.comparable); 233 } 234 } | Popular Tags |