EjbqlOrderByVisitor.java

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             // FIXME check type for cmp field
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 }

Generated on Tue Feb 15 15:05:49 2005 for JOnAS by  doxygen 1.3.9.1