Hi,
Forget it, I fixed it myself by modifying the RowSorter class and now it can sort
Integers, boolean, Date, Decimals and Strings that contains Integers or whatever else,
like "BSLD-WK13-04"
Regards,
Bard
----- Original Message -----
From: B�rd Arve Evjen <[EMAIL PROTECTED]>
Date: Fri, 23 Apr 2004 17:08:53 +0800
To: [EMAIL PROTECTED]
Subject: [displaytag-user] Custom decorator to fix complex sorting
> Hi,
>
> I a trying to figure out how to implement my own sorting for a table decorator that
> checks on dates, integers and strings. E.g. I want to sort a string that contains
> several integers, like '134-234-2311'. I have made my own table decorator that
> extends displaytag TableDecorator and added a new function
>
> public int compareTo(Object o1, Object o2) {
> return new StringSort().compareTo(o1, o2);
> }
>
> both in my own decorator and in TableDecorator, like:
>
> public int compare(Object o1, Object o2) {
> return 0;
> }
>
> The StringSort class looks like this:
>
> import com.om.condico.util.quantity.Quantity;
>
> import java.util.Date;
> import java.util.HashMap;
>
> import org.apache.log4j.Logger;
>
> public class StringSort {
> String str1, str2, dataType;
> static HashMap delimiterMap;
> static HashMap typeMap;
> //Logger
> static Logger log = Logger.getLogger(StringSort.class);
>
> static {
> delimiterMap = new HashMap();
> typeMap = new HashMap();
> delimiterMap.put(new Integer("-".hashCode()), "-");
> delimiterMap.put(new Integer("/".hashCode()), "/");
> delimiterMap.put(new Integer("_".hashCode()), "_");
> typeMap.put(new Integer("integer".hashCode()), "int");
> typeMap.put(new Date("date".hashCode()), "date");
> typeMap.put(new Date("string".hashCode()), "string");
> typeMap.put(new Quantity("quantity".hashCode()), "quantity"); // BAE
> }
>
> public int compareTo(Object obj1, Object obj2) {
> dataType = null;
> log.debug("going in to stringsort");
> if (obj1 instanceof String && obj2 instanceof String) {
> str1 = (String) obj1;
> str2 = (String) obj2;
> //is this date objects ?
> try {
> java.text.SimpleDateFormat sdf =
> new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss z");
> java.util.Date d1 = sdf.parse(str1);
> java.util.Date d2 = sdf.parse(str2);
> return d1.compareTo(d2);
> } catch (Exception ex) { /*do nothing, just continue*/
> }
> //is this integer objects ?
> try {
> Integer i1 = new Integer(str1);
> Integer i2 = new Integer(str2);
> return i1.compareTo(i2);
> } catch (Exception ex) {/*do nothing, just continue*/
> }
>
> // BAE is this integer objects ?
> try {
> Quantity i1 = new Quantity(str1);
> Quantity i2 = new Quantity(str2);
> return i1.getAmountAsString().compareTo(i2.getAmountAsString());
> } catch (Exception ex) {/*do nothing, just continue*/
> }
>
> String delimiter1 = findDelimiter(str1);
> String delimiter2 = findDelimiter(str2);
> if (delimiter1 == null && delimiter2 == null)
> return str1.compareTo(str2);
>
> if (delimiter1.equalsIgnoreCase(delimiter2)) {
> try {
> new Integer(cifferBeforeDelimiter(str1, delimiter1));
> new Integer(cifferBeforeDelimiter(str2, delimiter2));
> if (cifferBeforeDelimiter(str1, delimiter1) <
> cifferBeforeDelimiter(str2, delimiter2))
> return -1;
> if (cifferBeforeDelimiter(str1, delimiter1) >
> cifferBeforeDelimiter(str2, delimiter2))
> return 1;
> if (cifferBeforeDelimiter(str1, delimiter1) ==
> cifferBeforeDelimiter(str2, delimiter2)) {
> try {
> new Integer(cifferAfterDelimiter(str1, delimiter1));
> new Integer(cifferAfterDelimiter(str2, delimiter2));
> if (cifferAfterDelimiter(str1, delimiter1) <
> cifferAfterDelimiter(str2, delimiter2))
> return -1;
> if (cifferAfterDelimiter(str1, delimiter1) >
> cifferAfterDelimiter(str2, delimiter2))
> return 1;
> if (cifferAfterDelimiter(str1, delimiter1) ==
> cifferAfterDelimiter(str2, delimiter2))
> return 0;
> } catch (Exception eex) {
> return 0;
> }
>
> }
> } catch (Exception eeex) {
> try {
> new Integer(cifferAfterDelimiter(str1, delimiter1));
> new Integer(cifferAfterDelimiter(str2, delimiter2));
> if (cifferAfterDelimiter(str1, delimiter1) <
> cifferAfterDelimiter(str2, delimiter2))
> return -1;
> if (cifferAfterDelimiter(str1, delimiter1) >
> cifferAfterDelimiter(str2, delimiter2))
> return 1;
> if (cifferAfterDelimiter(str1, delimiter1) ==
> cifferAfterDelimiter(str2, delimiter2))
> return 0;
>
> } catch (Exception eex) {
> return 0;
> }
> }
> }
> else
> return 0;
>
> }
> return 0;
> }
>
> private String findDelimiter(String str) {
> char[] ch = str.toCharArray();
> for (int i = 0; i < ch.length; i++) {
> String strCh = new String(new char[]{ch[i]});
> Integer hc = new Integer(strCh.hashCode());
> if (delimiterMap.containsKey(hc)) {
> //System.out.println("delimiter found: "+(String)map.get(hc));
> return (String) delimiterMap.get(hc);
> }
> }
> return null;
> }
>
> private int cifferBeforeDelimiter(String str, String delimiter) throws
> NumberFormatException {
> String ciffer = str.substring(0, getDelimiterIndex(str, delimiter));
> //System.out.println("ciffer found: "+ciffer);
> return new Integer(ciffer).intValue();
> }
>
> private int cifferAfterDelimiter(String str, String delimiter) {
> String ciffer = str.substring(getDelimiterIndex(str, delimiter) + 1,
> str.length());
> //System.out.println("ciffer found: "+ciffer);
> return new Integer(ciffer).intValue();
> }
>
> private int getDelimiterIndex(String str, String delimiter) {
> return str.indexOf(delimiter);
> }
>
> }
>
> ---------
>
> Now to my problem: The compareTo fuction is not called in my decorator, how can I
> specify that it should always call my compareTo function?
>
> Thanks,
> Bard A.
> --
> _____________________________________________________________
> Web-based SMS services available at http://www.operamail.com.
> From your mailbox to local or overseas cell phones.
>
> Powered by Outblaze
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
> For a limited time only, get FREE Ground shipping on all orders of $35
> or more. Hurry up and shop folks, this offer expires April 30th!
> http://www.thinkgeek.com/freeshipping/?cpg=12297
> _______________________________________________
> displaytag-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/displaytag-user
--
_____________________________________________________________
Web-based SMS services available at http://www.operamail.com.
>From your mailbox to local or overseas cell phones.
Powered by Outblaze
-------------------------------------------------------
This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
For a limited time only, get FREE Ground shipping on all orders of $35
or more. Hurry up and shop folks, this offer expires April 30th!
http://www.thinkgeek.com/freeshipping/?cpg=12297
_______________________________________________
displaytag-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/displaytag-user