00001
00025 package org.objectweb.jonas_ejb.lib;
00026
00027 import java.util.HashMap;
00028 import java.util.HashSet;
00029 import java.util.Iterator;
00030 import java.util.Map;
00031 import java.util.Stack;
00032
00033 import org.objectweb.jonas_ejb.container.TraceEjb;
00034 import org.objectweb.jonas_ejb.deployment.api.DeploymentDescEjb2;
00035 import org.objectweb.jonas_ejb.deployment.ejbql.ASTAbstractSchemaName;
00036 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCollectionMemberDeclaration;
00037 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCollectionValuedPathExpression;
00038 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEJBQL;
00039 import org.objectweb.jonas_ejb.deployment.ejbql.ASTFromClause;
00040 import org.objectweb.jonas_ejb.deployment.ejbql.ASTIdentifier;
00041 import org.objectweb.jonas_ejb.deployment.ejbql.ASTPath;
00042 import org.objectweb.jonas_ejb.deployment.ejbql.ASTRangeVariableDeclaration;
00043 import org.objectweb.jonas_ejb.deployment.ejbql.ParseException;
00044 import org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode;
00045 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSelectClause;
00046 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSelectExpression;
00047 import org.objectweb.jonas_ejb.deployment.ejbql.ASTAggregateSelectExpression;
00048 import org.objectweb.jonas_ejb.deployment.ejbql.ASTIdentificationVariable;
00049 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCmpPathExpression;
00050 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSingleValuedCmrPathExpression;
00051 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSingleValuedPathExpression;
00052 import org.objectweb.jonas_ejb.deployment.ejbql.ASTWhereClause;
00053 import org.objectweb.jonas_ejb.deployment.ejbql.ASTConditionalExpression;
00054 import org.objectweb.jonas_ejb.deployment.ejbql.ASTConditionalTerm;
00055 import org.objectweb.jonas_ejb.deployment.ejbql.ASTConditionalFactor;
00056 import org.objectweb.jonas_ejb.deployment.ejbql.ASTBetweenExpression;
00057 import org.objectweb.jonas_ejb.deployment.ejbql.ASTInExpression;
00058 import org.objectweb.jonas_ejb.deployment.ejbql.ASTLikeExpression;
00059 import org.objectweb.jonas_ejb.deployment.ejbql.ASTNullComparisonExpression;
00060 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEmptyCollectionComparisonExpression;
00061 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCollectionMemberExpression;
00062 import org.objectweb.jonas_ejb.deployment.ejbql.ASTComparisonExpression;
00063 import org.objectweb.jonas_ejb.deployment.ejbql.ASTArithmeticExpression;
00064 import org.objectweb.jonas_ejb.deployment.ejbql.ASTArithmeticTerm;
00065 import org.objectweb.jonas_ejb.deployment.ejbql.ASTArithmeticFactor;
00066 import org.objectweb.jonas_ejb.deployment.ejbql.ASTStringExpression;
00067 import org.objectweb.jonas_ejb.deployment.ejbql.ASTDatetimeExpression;
00068 import org.objectweb.jonas_ejb.deployment.ejbql.ASTBooleanExpression;
00069 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEntityBeanExpression;
00070 import org.objectweb.jonas_ejb.deployment.ejbql.ASTFunctionsReturningStrings;
00071 import org.objectweb.jonas_ejb.deployment.ejbql.ASTFunctionsReturningNumerics;
00072 import org.objectweb.jonas_ejb.deployment.ejbql.ASTOrderByClause;
00073 import org.objectweb.jonas_ejb.deployment.ejbql.ASTOrderByItem;
00074 import org.objectweb.jorm.metainfo.api.Class;
00075 import org.objectweb.jorm.metainfo.api.Manager;
00076 import org.objectweb.medor.api.Field;
00077 import org.objectweb.medor.api.MedorException;
00078 import org.objectweb.medor.query.api.QueryTree;
00079 import org.objectweb.medor.query.api.QueryTreeField;
00080 import org.objectweb.medor.query.jorm.lib.ClassExtent;
00081 import org.objectweb.medor.query.jorm.lib.PNameField;
00082 import org.objectweb.medor.query.jorm.lib.QueryBuilder;
00083 import org.objectweb.medor.query.lib.QueryTreePrinter;
00084 import org.objectweb.medor.filter.lib.BasicFieldOperand;
00085 import org.objectweb.util.monolog.api.BasicLevel;
00086
00110 public class EjbqlVariableVisitor extends EjbqlAbstractVisitor {
00111
00115 private Manager manager;
00116
00120 private DeploymentDescEjb2 dd;
00121
00125 private HashMap ids = new HashMap();
00126
00130 private HashMap fields = new HashMap();
00131
00132 private QueryBuilder qb = new QueryBuilder();
00133
00137 private HashSet collections = new HashSet();
00138
00147 public EjbqlVariableVisitor(ASTEJBQL ejbql, DeploymentDescEjb2 dd, QueryBuilder qb) throws Exception {
00148 this.dd = dd;
00149 this.qb = qb;
00150 manager = dd.getJormManager();
00151
00152
00153 visit(ejbql);
00154
00155 for (Iterator it = ids.keySet().iterator(); it.hasNext(); ) {
00156 String id = (String) it.next();
00157 IdValue idv = (IdValue) ids.get(id);
00158 fields.put(id + "." + Field.PNAMENAME, qb.project(define(id)));
00159 for (int i = 0; i < idv.getDeclaredPathLength(); i++) {
00160 String path = idv.getMergedPath(i);
00161 if (!collections.contains(path)) {
00162 fields.put(path, qb.project(define(path)));
00163 }
00164 }
00165 }
00166 }
00167
00168 private QueryTreeField define(String id) throws ParseException, MedorException {
00169 String[] path = splitPath(id);
00170
00171 if (!qb.contains(path[0])) {
00172 IdValue idv = (IdValue) ids.get(path[0]);
00173 String[] name = idv.getName();
00174
00175 PNameField pnf;
00176 if (name.length == 1) {
00177 pnf = extent(name[0], path[0]);
00178 } else {
00179 pnf = (PNameField) define(mergePath(name));
00180 }
00181 qb.define(path[0], pnf);
00182 }
00183
00184 return qb.navigate(path);
00185 }
00186
00187 private PNameField extent(String schema, String alias) throws ParseException, MedorException {
00188 if (schema == null) { throw new NullPointerException("schema"); }
00189 String cn = dd.asn2BeanDesc(schema).getJormClassName();
00190 Class theClass = manager.getClass(cn);
00191 if (theClass == null) {
00192 throw new ParseException
00193 ("Abstract schema name \"" + schema +
00194 "\" has not been declared in the jorm meta information");
00195 }
00196 ClassExtent ext = new ClassExtent(theClass, alias, Field.PNAMENAME, false);
00197 return (PNameField) ext.getField(ext.getPNameFieldName());
00198 }
00199
00206 public Map getFields() {
00207 return fields;
00208 }
00209
00214 public void traceIds(HashMap idsM) {
00215 if (TraceEjb.isDebugQuery()) {
00216 TraceEjb.query.log(BasicLevel.DEBUG, "Begin of IDS structure:");
00217
00218 for (Iterator i = idsM.keySet().iterator(); i.hasNext();) {
00219 String id = (String) i.next();
00220 IdValue idv = (IdValue) idsM.get(id);
00221 TraceEjb.query.log(BasicLevel.DEBUG, "ids[" + id + "]=" + idv);
00222 if (idv.getQueryTree() != null) {
00223 QueryTreePrinter.printQueryTree(idv.getQueryTree(), TraceEjb.query, BasicLevel.DEBUG);
00224 }
00225 }
00226 TraceEjb.query.log(BasicLevel.DEBUG, "End of IDS structure:");
00227 }
00228 }
00229
00236 public Object visit(ASTFromClause node, Object data) {
00237 return visit((SimpleNode) node, data);
00238 }
00239
00246 public Object visit(ASTCollectionMemberDeclaration node, Object data) {
00247 return visit((SimpleNode) node, data);
00248 }
00249
00256 public Object visit(ASTRangeVariableDeclaration node, Object data) {
00257 return visit((SimpleNode) node, data);
00258 }
00259
00266 public Object visit(ASTCollectionValuedPathExpression node, Object data) {
00267 return visit((SimpleNode) node, data);
00268 }
00269
00276 public Object visit(ASTAbstractSchemaName node, Object data) {
00277 ((Stack) data).push(node.value);
00278 return null;
00279 }
00280
00287 public Object visit(ASTIdentifier node, Object data) {
00288 String id = (String) node.value;
00289 String name = (String) ((Stack) data).pop();
00290 IdValue iv = (IdValue) ids.get(id);
00291 if (iv == null) {
00292 iv = new IdValue(name);
00293 ids.put(id, iv);
00294 } else {
00295 iv.setName(splitPath(name));
00296 }
00297 return null;
00298 }
00299
00306 public Object visit(ASTPath node, Object data) {
00307 ((Stack) data).push(node.value);
00308 return null;
00309 }
00310
00315 private void processVariable(String path) {
00316
00317 String id = splitPath(path)[0];
00318 IdValue iv = (IdValue) ids.get(id);
00319 if (iv == null) {
00320 iv = new IdValue();
00321 ids.put(id, iv);
00322 }
00323 iv.addPath(path);
00324 }
00325
00326
00333 public Object visit(ASTSelectClause node, Object data) {
00334 visit((SimpleNode) node, data);
00335 Stack st = (Stack) data;
00336 if (!st.empty()) {
00337 processVariable((String) st.pop());
00338 }
00339 return null;
00340 }
00341
00348 public Object visit(ASTSelectExpression node, Object data) {
00349 return visit((SimpleNode) node, data);
00350 }
00351
00358 public Object visit(ASTAggregateSelectExpression node, Object data) {
00359 return visit((SimpleNode) node, data);
00360 }
00361
00368 public Object visit(ASTIdentificationVariable node, Object data) {
00369 return visit((SimpleNode) node, data);
00370 }
00371
00378 public Object visit(ASTSingleValuedPathExpression node, Object data) {
00379 return visit((SimpleNode) node, data);
00380 }
00381
00388 public Object visit(ASTSingleValuedCmrPathExpression node, Object data) {
00389 return visit((SimpleNode) node, data);
00390 }
00391
00398 public Object visit(ASTCmpPathExpression node, Object data) {
00399 return visit((SimpleNode) node, data);
00400 }
00401
00402
00409 public Object visit(ASTWhereClause node, Object data) {
00410 visit((SimpleNode) node, data);
00411 Stack st = (Stack) data;
00412 while (!st.empty()) {
00413 processVariable((String) st.pop());
00414 }
00415 return null;
00416 }
00417
00424 public Object visit(ASTConditionalExpression node, Object data) {
00425 return visit((SimpleNode) node, data);
00426 }
00427
00434 public Object visit(ASTConditionalTerm node, Object data) {
00435 return visit((SimpleNode) node, data);
00436 }
00437
00444 public Object visit(ASTConditionalFactor node, Object data) {
00445 return visit((SimpleNode) node, data);
00446 }
00447
00454 public Object visit(ASTBetweenExpression node, Object data) {
00455 return visit((SimpleNode) node, data);
00456 }
00457
00464 public Object visit(ASTInExpression node, Object data) {
00465 return visit((SimpleNode) node, data);
00466 }
00467
00474 public Object visit(ASTLikeExpression node, Object data) {
00475 return visit((SimpleNode) node, data);
00476 }
00477
00484 public Object visit(ASTNullComparisonExpression node, Object data) {
00485 return visit((SimpleNode) node, data);
00486 }
00487
00494 public Object visit(ASTEmptyCollectionComparisonExpression node, Object data) {
00495 visit((SimpleNode) node, data);
00496 Stack st = (Stack) data;
00497 String path = (String) st.peek();
00498 collections.add(path);
00499 return null;
00500 }
00501
00508 public Object visit(ASTCollectionMemberExpression node, Object data) {
00509 visit((SimpleNode) node, data);
00510 Stack st = (Stack) data;
00511 String path = (String) st.peek();
00512 collections.add(path);
00513 return null;
00514 }
00515
00522 public Object visit(ASTComparisonExpression node, Object data) {
00523 return visit((SimpleNode) node, data);
00524 }
00525
00532 public Object visit(ASTArithmeticExpression node, Object data) {
00533 return visit((SimpleNode) node, data);
00534 }
00535
00542 public Object visit(ASTArithmeticTerm node, Object data) {
00543 return visit((SimpleNode) node, data);
00544 }
00545
00552 public Object visit(ASTArithmeticFactor node, Object data) {
00553 return visit((SimpleNode) node, data);
00554 }
00555
00562 public Object visit(ASTStringExpression node, Object data) {
00563 return visit((SimpleNode) node, data);
00564 }
00565
00572 public Object visit(ASTDatetimeExpression node, Object data) {
00573 return visit((SimpleNode) node, data);
00574 }
00575
00582 public Object visit(ASTBooleanExpression node, Object data) {
00583 return visit((SimpleNode) node, data);
00584 }
00585
00592 public Object visit(ASTEntityBeanExpression node, Object data) {
00593 return visit((SimpleNode) node, data);
00594 }
00595
00602 public Object visit(ASTFunctionsReturningStrings node, Object data) {
00603 return visit((SimpleNode) node, data);
00604 }
00605
00612 public Object visit(ASTFunctionsReturningNumerics node, Object data) {
00613 return visit((SimpleNode) node, data);
00614 }
00615
00616
00623 public Object visit(ASTOrderByClause node, Object data) {
00624 visit((SimpleNode) node, data);
00625 Stack st = (Stack) data;
00626 while (!st.empty()) {
00627 processVariable((String) st.pop());
00628 }
00629 return null;
00630 }
00631
00638 public Object visit(ASTOrderByItem node, Object data) {
00639 return visit((SimpleNode) node, data);
00640 }
00641
00642 }