1 37 package org.ungoverned.oscar.ldap; 38 39 import java.util.Stack ; 40 import java.util.Vector ; 41 42 public class Evaluator { 43 44 Object [] program = null; 45 Stack operands = new Stack (); 46 Mapper mapper = null; 47 48 public Evaluator() 49 { 50 reset(); 51 } 52 53 public Evaluator(Object [] prog) 54 { 55 reset(prog); 56 } 57 58 public void reset() 59 { 60 program = null; 61 mapper = null; 62 operands.clear(); 63 } 64 65 public void reset(Object [] prog) 66 { 67 reset(); 68 setProgram(prog); 69 } 70 71 public void setProgram(Object [] prog) 72 { 73 program = prog; 74 } 75 76 public void setMapper(Mapper mapper) 77 { 78 this.mapper = mapper; 79 } 80 81 public Stack getOperands() 82 { 83 return operands; 84 } 85 86 public boolean evaluate(Mapper mapper) throws EvaluationException 87 { 88 try 89 { 90 setMapper(mapper); 103 for (int i = 0; i < program.length; i++) 104 { 105 try 106 { 107 Operator op = (Operator) program[i]; 108 op.execute(operands, mapper); 109 } 111 catch (AttributeNotFoundException ex) 112 { 113 operands.push(new Unknown()); 114 } 115 catch (EvaluationException ex) 116 { 117 if (ex.isUnsupportedType() && (ex.getUnsupportedType() == Unknown.class)) 121 { 122 operands.push(Boolean.FALSE); 123 } 124 else 126 { 127 throw ex; 128 } 129 } 130 } 131 132 if (operands.empty()) 133 { 134 throw new EvaluationException("Evaluation.evalute: final stack is empty"); 135 } 136 137 Object result = operands.pop(); 138 139 if (!operands.empty()) 140 { 141 throw new EvaluationException( 142 "Evaluation.evalute: final stack has more than one result"); 143 } 144 145 if (!(result instanceof Boolean )) 146 { 147 throw new EvaluationException( 148 "Evaluation.evalute: final result is not Boolean"); 149 } 150 151 return ((Boolean ) result).booleanValue(); 152 } 153 finally 154 { 155 operands.clear(); 158 } 159 } 160 161 void printAction(Operator op) 163 { 164 System.err.println("Operator:"+op.toString()); 165 System.err.print("Stack After:"); 166 Vector v = operands; 168 int len = v.size(); 169 for (int i = 0; i < len; i++) 170 System.err.print(" " + v.elementAt(i)); 171 System.err.println(); 172 } 173 174 public String toString() 175 { 176 StringBuffer buf = new StringBuffer (); 177 for (int i = 0; i < program.length; i++) 178 { 179 buf.append((i==0) ? "{" : ";"); 180 buf.append(((Operator) program[i]).toString()); 181 } 182 buf.append("}"); 183 return buf.toString(); 184 } 185 186 public String toStringInfix() 187 { 188 operands.clear(); 192 for (int i = 0; i < program.length; i++) 193 { 194 ((Operator) program[i]).buildTree(operands); 195 } 196 StringBuffer b = new StringBuffer (); 197 Object result = operands.pop(); 198 ((Operator)result).toStringInfix(b); 199 operands.clear(); 200 return b.toString(); 201 } 202 } 203 | Popular Tags |