/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.ejb.plugins.cmp.ejbql; import org.jboss.ejb.plugins.cmp.jdbc.SQLUtil; /** * This a basic abstract syntax tree visitor. It simply converts the tree * back into ejbql. This is useful for testing and extensions, as most * extensions translate just a few elements of the tree. * * @author <a href="mailto:dain@daingroup.com">Dain Sundstrom</a> * @version $Revision: 81030 $ */ public class BasicVisitor implements JBossQLParserVisitor { public Object visit(SimpleNode node, Object data) { return data; } public Object visit(ASTEJBQL node, Object data) { StringBuffer buf = (StringBuffer)data; for(int i = 0; i < node.jjtGetNumChildren(); i++) { if(i > 0) { buf.append(' '); } node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTFrom node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.FROM); for(int i = 0; i < node.jjtGetNumChildren(); i++) { if(i > 0) { buf.append(SQLUtil.COMMA); } node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTCollectionMemberDeclaration node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.IN).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')').append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTRangeVariableDeclaration node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTSelect node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.SELECT); node.jjtGetChild(0).jjtAccept(this, data); return data; } public Object visit(ASTWhere node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.WHERE); node.jjtGetChild(0).jjtAccept(this, data); return data; } public Object visit(ASTOr node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); for(int i = 1; i < node.jjtGetNumChildren(); ++i) { buf.append(SQLUtil.OR); node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTWhereConditionalTerm node, Object data) { for(int i = 0; i < node.jjtGetNumChildren(); ++i) { node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTAnd node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); for(int i = 1; i < node.jjtGetNumChildren(); i++) { buf.append(SQLUtil.AND); node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTNot node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.NOT); node.jjtGetChild(0).jjtAccept(this, data); return data; } public Object visit(ASTConditionalParenthetical node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTBetween node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); if(node.not) { buf.append(SQLUtil.NOT); } buf.append(SQLUtil.BETWEEN); node.jjtGetChild(1).jjtAccept(this, data); buf.append(SQLUtil.AND); node.jjtGetChild(2).jjtAccept(this, data); return data; } public Object visit(ASTIn node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); if(node.not) { buf.append(SQLUtil.NOT); } buf.append(SQLUtil.IN).append('('); node.jjtGetChild(1).jjtAccept(this, data); for(int i = 2; i < node.jjtGetNumChildren(); i++) { buf.append(SQLUtil.COMMA); node.jjtGetChild(i).jjtAccept(this, data); } buf.append(')'); return data; } public Object visit(ASTLike node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); if(node.not) { buf.append(SQLUtil.NOT); } buf.append(SQLUtil.LIKE); node.jjtGetChild(1).jjtAccept(this, data); if(node.jjtGetNumChildren() == 3) { buf.append(" {ESCAPE "); node.jjtGetChild(2).jjtAccept(this, data); buf.append('}'); } return data; } public Object visit(ASTNullComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(SQLUtil.IS); if(node.not) { buf.append(SQLUtil.NOT); } buf.append(SQLUtil.NULL); return data; } public Object visit(ASTIsEmpty node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(SQLUtil.IS); if(node.not) { buf.append(SQLUtil.NOT); } buf.append(SQLUtil.EMPTY); return data; } public Object visit(ASTMemberOf node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); if(node.not) { buf.append(SQLUtil.NOT); } buf.append(SQLUtil.MEMBER_OF); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTStringComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(' ').append(node.opp).append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTBooleanComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); if(node.jjtGetNumChildren() == 2) { buf.append(' ').append(node.opp).append(' '); node.jjtGetChild(1).jjtAccept(this, data); } return data; } public Object visit(ASTDatetimeComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(' ').append(node.opp).append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTEntityComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(' ').append(node.opp).append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTValueClassComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(' ').append(node.opp).append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTArithmeticComparison node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); buf.append(' ').append(node.opp).append(' '); node.jjtGetChild(1).jjtAccept(this, data); return data; } public Object visit(ASTPlusMinus node, Object data) { StringBuffer buf = (StringBuffer)data; for(int i = 0; i < node.jjtGetNumChildren(); i++) { if(i > 0) { buf.append(' ').append(node.opps.get(i - 1)).append(' '); } node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTMultDiv node, Object data) { StringBuffer buf = (StringBuffer)data; for(int i = 0; i < node.jjtGetNumChildren(); i++) { if(i > 0) { buf.append(' ').append(node.opps.get(i - 1)).append(' '); } node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTNegation node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append('-'); node.jjtGetChild(0).jjtAccept(this, data); return data; } public Object visit(ASTArithmeticParenthetical node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTStringParenthetical node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTConcat node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.CONCAT).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(SQLUtil.COMMA); node.jjtGetChild(1).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTSubstring node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.SUBSTRING).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(SQLUtil.COMMA); node.jjtGetChild(1).jjtAccept(this, data); buf.append(SQLUtil.COMMA); node.jjtGetChild(2).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTLCase node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.LCASE).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTUCase node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.UCASE).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTLength node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.LENGTH).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTLocate node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.LOCATE).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(SQLUtil.COMMA); node.jjtGetChild(1).jjtAccept(this, data); if(node.jjtGetNumChildren() == 3) { buf.append(SQLUtil.COMMA); node.jjtGetChild(2).jjtAccept(this, data); } buf.append(')'); return data; } public Object visit(ASTAbs node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.ABS).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTSqrt node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.SQRT).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTCount node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.COUNT).append('('); ASTPath path = (ASTPath)node.jjtGetChild(0); path.children[0].jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTMax node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.MAX).append('('); ASTPath path = (ASTPath)node.jjtGetChild(0); path.children[0].jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTMin node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.MIN).append('('); ASTPath path = (ASTPath)node.jjtGetChild(0); path.children[0].jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTAvg node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.AVG).append('('); ASTPath path = (ASTPath)node.jjtGetChild(0); path.children[0].jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTSum node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.SUM).append('('); ASTPath path = (ASTPath)node.jjtGetChild(0); path.children[0].jjtAccept(this, data); buf.append(')'); return data; } public Object visit(ASTOrderBy node, Object data) { StringBuffer buf = (StringBuffer)data; for(int i = 0; i < node.jjtGetNumChildren(); i++) { if(i > 0) { buf.append(SQLUtil.COMMA); } node.jjtGetChild(i).jjtAccept(this, data); } return data; } public Object visit(ASTOrderByPath node, Object data) { StringBuffer buf = (StringBuffer)data; node.jjtGetChild(0).jjtAccept(this, data); if(node.ascending) { buf.append(SQLUtil.ASC); } else { buf.append(SQLUtil.DESC); } return data; } public Object visit(ASTPath node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.getPath()); return data; } public Object visit(ASTIdentifier node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.identifier); return data; } public Object visit(ASTAbstractSchema node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.abstractSchemaName); return data; } public Object visit(ASTParameter node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append("?").append(node.number); return data; } public Object visit(ASTExactNumericLiteral node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.literal); return data; } public Object visit(ASTApproximateNumericLiteral node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.literal); return data; } public Object visit(ASTStringLiteral node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.value); return data; } public Object visit(ASTBooleanLiteral node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(node.value); return data; } public Object visit(ASTLimitOffset node, Object data) { StringBuffer buf = (StringBuffer)data; int child = 0; if(node.hasOffset) { buf.append(SQLUtil.OFFSET); node.jjtGetChild(child++).jjtAccept(this, data); } if(node.hasLimit) { buf.append(SQLUtil.LIMIT); node.jjtGetChild(child).jjtAccept(this, data); } return data; } public Object visit(ASTMod node, Object data) { StringBuffer buf = (StringBuffer)data; buf.append(SQLUtil.MOD).append('('); node.jjtGetChild(0).jjtAccept(this, data); buf.append(SQLUtil.COMMA); node.jjtGetChild(1).jjtAccept(this, data); buf.append(')'); return data; } }