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