1 package za.co.csir.icomtek.workflow.handlers; 2 3 import java.util.ArrayList ; 4 import java.util.Vector ; 5 import java.util.Iterator ; 6 import java.util.HashMap ; 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 25 public class ComparatorHandler extends BaseHandler { 26 27 private static final String EQUAL = "=="; 28 private static final String NOT_EQUAL = "!="; 29 private static final String GREATER_THAN = ">"; 30 private static final String LESS_THAN = "<"; 31 private static final String GREATER_THAN_OR_EQUAL = ">="; 32 private static final String LESS_THAN_OR_EQUAL = "<="; 33 private static final String EQUALS = "equals"; 34 private static final String COMPARE = "compare"; 35 private static final String BOOLEAN = "boolean"; 36 37 private static ArrayList knownBinaryComparators = new ArrayList (); 38 private static HashMap cachedComparators = new HashMap (); 39 40 static { 41 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 comparatorName, Vector parameters, 53 WorkflowContext ctx) 54 { 55 boolean retVal = false; 56 try { 57 ArrayList requestAttrs = new ArrayList (); 58 Object [] parameterVals = 59 populateParameterValues(parameters, ctx, requestAttrs); 60 if (BOOLEAN.equals(comparatorName) && parameters.size() == 1) { 61 retVal = ((Boolean )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 Object comparator = cachedComparators.get(comparatorName); 92 if (comparator != null) { 93 Boolean result = 94 (Boolean )MethodUtils.invokeMethod(comparator, COMPARE, 95 parameterVals); 96 retVal = result.booleanValue(); 97 } 98 } 99 clearRequestAttributes(ctx, requestAttrs); 100 } catch (Exception e) { 101 e.printStackTrace(); 102 throw new RuntimeException ("could not complete a compare"); 103 } 104 System.err.println("<< comparatorHandler returning: "+retVal); 105 return retVal; 106 } 107 108 public static void registerComparators (Vector comparators) throws Exception { 109 for (Iterator 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 |