1 23 24 package org.objectweb.medor.filter.jorm.lib; 25 26 import org.objectweb.jorm.api.PException; 27 import org.objectweb.jorm.naming.api.PNameCoder; 28 import org.objectweb.jorm.naming.api.PName; 29 import org.objectweb.jorm.type.api.PType; 30 import org.objectweb.medor.expression.api.MalformedExpressionException; 31 import org.objectweb.medor.api.Field; 32 import org.objectweb.medor.api.MedorException; 33 import org.objectweb.medor.expression.api.TypingException; 34 import org.objectweb.medor.eval.lib.TuplePNameGetter; 35 import org.objectweb.medor.filter.api.FieldOperand; 36 import org.objectweb.medor.expression.api.Operator; 37 import org.objectweb.medor.expression.api.ParameterOperand; 38 import org.objectweb.medor.expression.api.ExpressionException; 39 import org.objectweb.medor.expression.api.Expression; 40 import org.objectweb.medor.expression.api.Operand; 41 import org.objectweb.medor.expression.lib.BasicVariableOperand; 42 import org.objectweb.medor.expression.lib.BasicOperator; 43 import org.objectweb.medor.query.api.QueryTreeField; 44 import org.objectweb.util.monolog.api.BasicLevel; 45 46 import java.util.HashMap ; 47 import java.util.Map ; 48 49 71 public class CompositePName extends BasicOperator implements Operator { 72 73 protected String [] cofns = null; 74 protected TuplePNameGetter myGetter = null; 75 76 77 89 public CompositePName(FieldOperand[] fs, 90 String [] compositefieldnames, 91 Operand po, 92 PType t) throws MedorException { 93 super(t); 94 expressions = new Expression[fs.length + 1]; 95 expressions[0] = po; 96 System.arraycopy(fs, 0, expressions, 1, fs.length); 97 cofns = compositefieldnames; 98 Map name2Index = new HashMap (fs.length); 99 boolean debug = logger != null && logger.isLoggable(BasicLevel.DEBUG); 100 if (debug) { 101 logger.log(BasicLevel.DEBUG, "Composite PName for " + fs.length + " fields"); 102 } 103 for (int i=0; i<fs.length; i++) { 104 QueryTreeField qtf = (QueryTreeField) fs[i].getField(); 105 if (debug) { 106 logger.log(BasicLevel.DEBUG, "Field " + qtf.getName()); 107 Field[] tsf = qtf.getQueryTree().getTupleStructure().getFields(); 108 logger.log(BasicLevel.DEBUG, "Fields of qt:"); 109 for (int jj = 0; jj < tsf.length; jj++) { 110 logger.log(BasicLevel.DEBUG, "Field name " + tsf[jj].getName()); 111 } 112 } 113 int rank = qtf.getQueryTree().getTupleStructure().getFieldRank(qtf); 114 name2Index.put(compositefieldnames[i], new Integer (rank)); 115 } 116 myGetter = new TuplePNameGetter(name2Index, po, logger); 117 } 118 119 120 125 public String [] getCompositeFieldName() { 126 return cofns; 127 } 128 129 public ParameterOperand getPNameManagerParameter() { 130 return (expressions[0] instanceof ParameterOperand 131 ? (ParameterOperand) expressions[0] 132 : null); 133 } 134 135 138 public Object clone(Object clone, Map obj2clone) throws CloneNotSupportedException { 139 clone = super.clone(clone, obj2clone); 140 ((CompositePName) clone).cofns = cofns; 141 if (myGetter != null) { 144 ((CompositePName) clone).myGetter = new TuplePNameGetter(myGetter); 145 } 146 return clone; 147 } 148 149 155 public Operand getResult() throws IllegalStateException { 156 if (verified) { 157 return result; 158 } else 159 throw new IllegalStateException ("Can't get result of an uncompiled expression"); 160 } 161 162 165 public Operand evaluate(ParameterOperand[] pos, Object o) 166 throws ExpressionException { 167 expressions[0].evaluate(pos, o); 169 if (result == null) 171 result = new BasicVariableOperand(type); 172 PNameCoder pnc = (PNameCoder) ((Operand) expressions[0]).getObject(); 173 try { 174 PName pn = pnc.decodeAbstract(myGetter, o); 175 if (logger != null && logger.isLoggable(BasicLevel.DEBUG)) { 176 logger.log(BasicLevel.DEBUG, "PName built: " + pn); 177 } 178 result.setValue(pn); 179 } catch (PException pe) { 180 throw new ExpressionException("Problem for builing composite PName from tuple", pe); 181 } 182 return result; 183 } 184 185 196 public Operand compileExpression() 197 throws TypingException, MalformedExpressionException { 198 if (expressions != null && expressions.length > 1) { 199 result = new BasicVariableOperand(type); 200 verified = true; 201 } else 202 throw new MalformedExpressionException("null children value"); 204 return result; 205 } 206 207 public FieldOperand[] getFields() { 208 FieldOperand[] res = new FieldOperand[expressions.length - 1]; 209 for(int i=0; i<res.length; i++) { 210 res[i] = (FieldOperand) expressions[i + 1]; 211 } 212 return res; 213 } 214 215 219 public String getOperatorString() { 220 return "compositePName"; 221 } 222 } 223 | Popular Tags |