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

Reply via email to