00001
00025 package org.objectweb.jonas_ejb.lib;
00026
00027
00028 import java.util.ArrayList;
00029 import java.util.Iterator;
00030 import java.util.Map;
00031 import java.util.Stack;
00032
00033 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEJBQL;
00034 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCmpPathExpression;
00035 import org.objectweb.jonas_ejb.deployment.ejbql.ASTOrderByClause;
00036 import org.objectweb.jonas_ejb.deployment.ejbql.ASTOrderByItem;
00037 import org.objectweb.jonas_ejb.deployment.ejbql.ASTPath;
00038 import org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode;
00039
00040 import org.objectweb.medor.api.Field;
00041 import org.objectweb.medor.query.api.OrderField;
00042 import org.objectweb.medor.query.api.QueryTreeField;
00043 import org.objectweb.medor.query.lib.BasicOrderField;
00044
00051 public class EjbqlOrderByVisitor extends EjbqlAbstractVisitor {
00052
00053 Map fields;
00054 ArrayList orderFields;
00055
00061 public EjbqlOrderByVisitor(ASTEJBQL ejbql, Map _fields) throws Exception {
00062 orderFields = new ArrayList();
00063 fields = _fields;
00064 visit(ejbql);
00065 }
00066
00070 public OrderField[] getOrderFields() {
00071 OrderField[] ofs = new OrderField[orderFields.size()];
00072 Iterator itr = orderFields.iterator();
00073 for (int i=0; itr.hasNext(); i++) {
00074 ofs[i] = (OrderField) itr.next();
00075 }
00076 return ofs;
00077 }
00078
00079
00084 public Object visit(ASTOrderByClause node, Object data) {
00085 visit((SimpleNode) node, data);
00086 return null;
00087 }
00088
00092 public Object visit(ASTOrderByItem node, Object data) {
00093 visit((SimpleNode) node, data);
00094 QueryTreeField qtf = (QueryTreeField) ((Stack) data).pop();
00095 orderFields.add(new BasicOrderField(qtf, !node.asc));
00096 return null;
00097 }
00098
00105 public Object visit(ASTCmpPathExpression node, Object data) {
00106 visit((SimpleNode) node, data);
00107 try {
00108 String path = (String) ((ASTPath) ((Stack) data).pop()).value;
00109
00110 ((Stack) data).push((Field) fields.get(path));
00111 } catch (Exception e) {
00112 throw new VisitorException(e);
00113 }
00114 return null;
00115 }
00116
00120 public Object visit(ASTPath node, Object data) {
00121 ((Stack) data).push(node);
00122 return null;
00123 }
00124
00125 }