KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > za > co > csir > icomtek > workflow > handlers > ComparatorHandler


1 package za.co.csir.icomtek.workflow.handlers;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.Vector JavaDoc;
5 import java.util.Iterator JavaDoc;
6 import java.util.HashMap JavaDoc;
7
8 import org.apache.commons.beanutils.MethodUtils;
9 import org.apache.commons.lang.builder.CompareToBuilder;
10
11 import za.co.csir.icomtek.workflow.interfaces.WorkflowContext;
12 import za.co.csir.icomtek.workflow.model.*;
13
14 /**
15  * NOTE: User defined comparators are REQUIRED to implement a compare method
16  * that returns a boolean.
17  *
18  * The parameter blocks specify a value and a type. If the type is specified
19  * as "invoke" then it is assumed that the value specifies a module followed
20  * by dot notated method calls that will resolve to a 0 arg method call that
21  * will return an object that will be the parameter used.
22  * When specifying a hard-coded value the type field contains the java type.
23  * NOTE: always use the wrapper type for primatives
24  */

25 public class ComparatorHandler extends BaseHandler {
26
27     private static final String JavaDoc EQUAL = "==";
28     private static final String JavaDoc NOT_EQUAL = "!=";
29     private static final String JavaDoc GREATER_THAN = ">";
30     private static final String JavaDoc LESS_THAN = "<";
31     private static final String JavaDoc GREATER_THAN_OR_EQUAL = ">=";
32     private static final String JavaDoc LESS_THAN_OR_EQUAL = "<=";
33     private static final String JavaDoc EQUALS = "equals";
34     private static final String JavaDoc COMPARE = "compare";
35     private static final String JavaDoc BOOLEAN = "boolean";
36
37     private static ArrayList JavaDoc knownBinaryComparators = new ArrayList JavaDoc();
38     private static HashMap JavaDoc cachedComparators = new HashMap JavaDoc();
39
40     static {
41         // Initialize the system with known comparators
42

43         knownBinaryComparators.add(EQUAL);
44         knownBinaryComparators.add(NOT_EQUAL);
45         knownBinaryComparators.add(GREATER_THAN_OR_EQUAL);
46         knownBinaryComparators.add(GREATER_THAN);
47         knownBinaryComparators.add(LESS_THAN);
48         knownBinaryComparators.add(LESS_THAN_OR_EQUAL);
49         knownBinaryComparators.add(EQUALS);
50     }
51
52     public static boolean compare (String JavaDoc comparatorName, Vector JavaDoc parameters,
53                                    WorkflowContext ctx)
54     {
55         boolean retVal = false;
56         try {
57             ArrayList JavaDoc requestAttrs = new ArrayList JavaDoc();
58             Object JavaDoc [] parameterVals =
59                 populateParameterValues(parameters, ctx, requestAttrs);
60             if (BOOLEAN.equals(comparatorName) && parameters.size() == 1) {
61                 retVal = ((Boolean JavaDoc)parameterVals[0]).booleanValue();
62             } else if (knownBinaryComparators.contains(comparatorName)) {
63                 if (parameters.size() >= 2) {
64                     System.err.println("<< comparatorHandler 2 params");
65                     System.err.println("<< comparatorHandler param1: "+parameterVals[0]);
66                     System.err.println("<< comparatorHandler param2: "+parameterVals[1]);
67                     int result = new CompareToBuilder()
68                         .append(parameterVals[0], parameterVals[1])
69                         .toComparison();
70                     System.err.println("<< compareToBuilder result: "+result);
71                     if (comparatorName.equals(EQUAL)) {
72                         retVal = 0 == result;
73                         System.err.println("<< in == compare result: "+retVal);
74                     } else if (comparatorName.equals(NOT_EQUAL)) {
75                         retVal = 0 != result;
76                     } else if (comparatorName.equals(GREATER_THAN)) {
77                         retVal = result > 0;
78                     } else if (comparatorName.equals(LESS_THAN)) {
79                         retVal = result < 0;
80                     } else if (comparatorName.equals(GREATER_THAN_OR_EQUAL)) {
81                         retVal = result > 0 || result == 0;
82                     } else if (comparatorName.equals(LESS_THAN_OR_EQUAL)) {
83                         retVal = result < 0 || result == 0;
84                     } else if (comparatorName.equals(EQUALS)) {
85                         retVal = parameterVals[0].equals(parameterVals[1]);
86                     }
87                 }
88             } else {
89                 // This means we have a custom comparator, instantiate the class
90
// and invoke it reflectivly with all the given parameters
91
Object JavaDoc comparator = cachedComparators.get(comparatorName);
92                 if (comparator != null) {
93                     Boolean JavaDoc result =
94                         (Boolean JavaDoc)MethodUtils.invokeMethod(comparator, COMPARE,
95                                                           parameterVals);
96                     retVal = result.booleanValue();
97                 }
98             }
99             clearRequestAttributes(ctx, requestAttrs);
100         } catch (Exception JavaDoc e) {
101             e.printStackTrace();
102             throw new RuntimeException JavaDoc ("could not complete a compare");
103         }
104         System.err.println("<< comparatorHandler returning: "+retVal);
105         return retVal;
106     }
107
108     public static void registerComparators (Vector JavaDoc comparators) throws Exception JavaDoc {
109         for (Iterator JavaDoc it = comparators.iterator(); it.hasNext(); ) {
110             Comparator comp = (Comparator)it.next();
111             cachedComparators.put(comp.getName(),
112                                   Class.forName(comp.getClazz()).newInstance());
113         }
114     }
115
116 }
117
Popular Tags