1 18 package org.objectweb.jorm.generator.lib; 19 20 import org.objectweb.jorm.type.api.PType; 21 import org.objectweb.jorm.api.PException; 22 import org.objectweb.medor.expression.api.Expression; 23 import org.objectweb.medor.expression.api.ExpressionException; 24 import org.objectweb.medor.expression.api.Operator; 25 import org.objectweb.medor.expression.api.Operand; 26 import org.objectweb.medor.expression.api.ParameterOperand; 27 import org.objectweb.medor.expression.lib.Equal; 28 import org.objectweb.medor.expression.lib.NotEqual; 29 import org.objectweb.medor.expression.lib.Mod; 30 import org.objectweb.medor.expression.lib.Round; 31 import org.objectweb.util.monolog.api.BasicLevel; 32 import org.objectweb.util.monolog.api.Logger; 33 34 import java.util.Map ; 35 import java.util.HashMap ; 36 37 43 public abstract class NamingFilterExpressionHelper extends CommonHelper { 44 45 51 public Map field2declarations = new HashMap (); 52 53 56 public StringBuffer filter = new StringBuffer (); 57 58 public Logger logger; 59 60 61 public NamingFilterExpressionHelper(Logger logger) 62 throws PException, ExpressionException { 63 this.logger = logger; 64 } 65 66 public Map getField2declarations() { 67 return field2declarations; 68 } 69 70 public String getFilter() { 71 return filter.toString(); 72 } 73 74 public String toString() { 75 return super.toString() 76 + " / filter=" + filter.toString() 77 + " / field2declarations=" + field2declarations 78 ; 79 } 80 81 protected void fillMatchInfo(Expression e) throws PException, ExpressionException { 82 if (e instanceof Round) { 83 PType type = ((Operator) e).getExpression(0).getType(); 84 if (type != null && ( 85 type.getTypeCode() == PType.TYPECODE_FLOAT 86 || type.getTypeCode() == PType.TYPECODE_DOUBLE)) { 87 filter.append("java.lang.Math.round("); 88 fillMatchInfo(((Operator) e).getExpression(0)); 89 filter.append(')'); 90 } else { 91 fillMatchInfo(((Operator) e).getExpression(0)); 92 } 93 94 } else if (e instanceof Operator) { 95 Operator operator = (Operator) e; 96 logger.log(BasicLevel.DEBUG, "Operator " + operator.getOperatorString()); 97 int nb = operator.getOperandNumber(); 98 if (nb == 1) { 99 filter.append(operator.getOperatorString()); 100 fillMatchInfo(operator.getExpression(0)); 101 } else if (nb == 2) { 102 String opPreString = ""; 103 String opString = " " + operator2String(operator) + " "; 104 String opPostString = ""; 105 if (((e instanceof Equal) || (e instanceof NotEqual)) 110 && (isObjectOperand(operator.getExpression(0)) 111 || isObjectOperand(operator.getExpression(1)))) { 112 opString = ".equals("; 113 opPostString = ")"; 114 if (e instanceof NotEqual) { 115 opPreString = "!"; 116 } 117 if (isArrayOperand(operator.getExpression(0)) 118 || isArrayOperand(operator.getExpression(1))) { 119 opPreString += "java.util.Arrays.equals("; 120 opString = ","; 121 } 122 } 123 124 filter.append('('); 125 filter.append(opPreString); 126 fillMatchInfo(operator.getExpression(0)); 127 filter.append(opString); 128 fillMatchInfo(operator.getExpression(1)); 129 filter.append(opPostString); 130 filter.append(')'); 131 } else { 132 throw new PException("Operators with more than 2 operands are not supported: " + e); 133 } 134 } else if (e instanceof ParameterOperand) { 135 fillMatchInfo((ParameterOperand) e); 136 } else if ((e instanceof Operand) && ((Operand) e).isDefined()) { 137 Operand operand = (Operand) e; 138 if (isObjectType(operand.getType())) { 139 Object o = operand.getObject(); 140 if (o == null) { 141 filter.append("null"); 142 } else { 143 filterAppendOperand(operand); 144 } 145 } else { 146 filterAppendOperand(operand); 147 } 148 } 149 } 150 151 private void filterAppendOperand(Operand operand) throws PException, ExpressionException{ 152 switch (operand.getType().getTypeCode()) { 153 case PType.TYPECODE_CHAR: 154 case PType.TYPECODE_OBJCHAR: 155 filter.append("'"); 156 filter.append(operand.getChar()); 157 filter.append("'"); 158 break; 159 160 case PType.TYPECODE_BYTE: 161 case PType.TYPECODE_OBJBYTE: 162 filter.append(operand.getByte()); 163 break; 164 165 case PType.TYPECODE_SHORT: 166 case PType.TYPECODE_OBJSHORT: 167 filter.append(operand.getShort()); 168 break; 169 170 case PType.TYPECODE_INT: 171 case PType.TYPECODE_OBJINT: 172 filter.append(operand.getInt()); 173 break; 174 175 case PType.TYPECODE_LONG: 176 case PType.TYPECODE_OBJLONG: 177 filter.append(operand.getLong()); 178 filter.append('l'); 179 break; 180 181 case PType.TYPECODE_STRING: 182 filter.append('"'); 183 filter.append(operand.getString()); 184 filter.append('"'); 185 break; 186 187 case PType.TYPECODE_BYTEARRAY: { 188 filter.append("new byte[]{"); 189 String sep = ""; 190 byte[] arrays = operand.getByteArray(); 191 for(int i=0; i<arrays.length; i++) { 192 filter.append(sep); 193 sep = ","; 194 filter.append(arrays[i]); 195 } 196 filter.append("}"); 197 break; 198 } 199 case PType.TYPECODE_CHARARRAY: { 200 char[] arrays = operand.getCharArray(); 201 filter.append("new char[]{"); 202 String sep = ""; 203 for(int i=0; i<arrays.length; i++) { 204 filter.append(sep); 205 sep = ","; 206 filter.append(arrays[i]); 207 } 208 filter.append("}"); 209 break; 210 } 211 case PType.TYPECODE_DATE: 212 filter.append("new java.util.Date("); 213 filter.append(operand.getDate().getTime()); 214 filter.append(')'); 215 break; 216 case PType.TYPECODE_BIGDECIMAL: 217 filter.append("new java.math.BigDecimal(\""); 218 filter.append(operand.getBigDecimal().toString()); 219 filter.append("\")"); 220 break; 221 222 case PType.TYPECODE_BIGINTEGER: 223 filter.append("new java.math.BigInteger(\""); 224 filter.append(operand.getBigDecimal().toString()); 225 filter.append("\")"); 226 break; 227 228 default: 229 230 } 231 } 232 233 private boolean isObjectOperand(Expression e) { 234 return (e instanceof Operand) && isObjectType(e.getType()); 235 } 236 237 private boolean isArrayOperand(Expression e) { 238 return (e instanceof Operand) 239 && (e.getType().getTypeCode() == PType.TYPECODE_CHARARRAY 240 || e.getType().getTypeCode() == PType.TYPECODE_BYTEARRAY); 241 } 242 243 protected String operator2String(Operator op) { 244 if (op instanceof Mod) { 245 return "%"; 246 } 247 return op.getOperatorString(); 248 } 249 250 protected abstract void fillMatchInfo(ParameterOperand po) 251 throws PException, ExpressionException; 252 253 } 254 255 | Popular Tags |