/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-app/src/java/org/sakaiproject/tool/assessment/util/BeanSortComparator.java $ * $Id: BeanSortComparator.java 108478 2012-05-23 09:15:56Z darolmar@upvnet.upv.es $ *********************************************************************************** * * Copyright (c) 2005, 2006, 2008, 2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.tool.assessment.util; import java.io.Serializable; import java.util.Comparator; import java.util.Map; import java.util.HashMap; import java.text.Collator; import java.text.ParseException; import java.text.RuleBasedCollator; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * DOCUMENTATION PENDING * * @author $author$ * @version $Id: BeanSortComparator.java 108478 2012-05-23 09:15:56Z darolmar@upvnet.upv.es $ */ public class BeanSortComparator implements Comparator { private static Log log = LogFactory.getLog(BeanSortComparator.class); private String propertyName; /** * The only public constructor. Requires a valid property name for a a Java * Bean as a sole parameter. * * @param propertyName the property name for Java Bean to sort by */ public BeanSortComparator(String propertyName) { this.propertyName = propertyName; } /** * Creates a new BeanSortComparator object. */ protected BeanSortComparator() { } ; /** * standard compare method * * @param o1 object * @param o2 object * * @return lt, eq, gt zero depending on whether o1 lt, eq, gt o2 */ public int compare(Object o1, Object o2) { int result = 0; Map m1 = describeBean(o1); Map m2 = describeBean(o2); String s1 = (String) m1.get(propertyName); String s2 = (String) m2.get(propertyName); result = subCompare(s1, s2); // If students have the same last name, then we need to compare their first name if (result == 0 && "lastName".equals(propertyName)) { String firstName1 = (String) m1.get("firstName"); String firstName2 = (String) m2.get("firstName"); result = subCompare(firstName1, firstName2); } // Take out tags return result; } private int subCompare(String s1, String s2) { //we do not want to use null values for sorting if(s1 == null) { s1 = ""; } if(s2 == null) { s2 = ""; } // Deal with n/a case if (s1.toLowerCase().startsWith("n/a") && !s2.toLowerCase().startsWith("n/a")) return 1; if (s2.toLowerCase().startsWith("n/a") && !s1.toLowerCase().startsWith("n/a")) return -1; String finalS1 = s1.replaceAll("<.*?>", ""); String finalS2 = s2.replaceAll("<.*?>", ""); RuleBasedCollator collator_ini = (RuleBasedCollator)Collator.getInstance(); try { RuleBasedCollator collator= new RuleBasedCollator(collator_ini.getRules().replaceAll("<'\u005f'", "<' '<'\u005f'")); return collator.compare(finalS1.toLowerCase(), finalS2.toLowerCase()); } catch (ParseException e) {} return Collator.getInstance().compare(finalS1.toLowerCase(), finalS2.toLowerCase()); } /** * protected utility method to wrap BeanUtils * * @param o DOCUMENTATION PENDING * * @return DOCUMENTATION PENDING * * @throws java.lang.UnsupportedOperationException DOCUMENTATION PENDING */ protected Map describeBean(Object o) { Map m = null; try { m = BeanUtils.describe((Serializable) o); } catch(Throwable t) { log.debug("Caught error in BeanUtils.describe(): " + t.getMessage()); t.printStackTrace(); throw new java.lang.UnsupportedOperationException( "Invalid describeBean. Objects may not be Java Beans. " + t); } return m; } }