/******************************************************************************* * Copyright (c) 2006 Oracle Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Oracle Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.validator.xpath; import java.io.IOException; import java.text.MessageFormat; import java.util.Iterator; import java.util.List; import org.eclipse.bpel.xpath10.*; import org.eclipse.bpel.xpath10.parser.XPath10Exception; import org.eclipse.bpel.xpath10.parser.XPath10Factory; /** * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Oct 17, 2006 * */ @SuppressWarnings({"nls","boxing"}) public class Main { /** * @param argv * @throws Exception */ static public void main (String argv[]) throws Exception { Main main = new Main(); main.prompt (); } void prompt () throws IOException { int ch = 0; Walker visitor = new Walker(); while (ch != -1) { p("XPath> "); StringBuilder buf = new StringBuilder(100); ch = System.in.read(); while (ch != '\n' && ch != (-1) ) { buf.append((char) ch); ch = System.in.read(); } String xpath = buf.toString().trim(); if (xpath.length() == 0) { continue; } Expr expr = null; try { expr = XPath10Factory.create ( xpath ); } catch (XPath10Exception t) { pl("error: ... cannot create XPath expression"); //$NON-NLS-1$ System.out.println(xpath); for(int i=0,j=t.getPosition(); i <= j; i++) { System.out.print(" "); } pl("^^^ {0}",t.getMessage()); continue; } visitor.visit( expr ); } } static void p (String msg, Object ... args ) { String text = MessageFormat.format(msg, args); System.out.print(text); System.out.flush(); } static void pl (String msg, Object ... args ) { p(msg,args); System.out.println(""); //$NON-NLS-1$ System.out.flush(); } class Walker { int offset = 0; /** (non-Javadoc) * @see org.jaxen.expr.VisitorSupport#visit(org.jaxen.expr.AdditiveExpr) */ protected void visit (AdditiveExpr arg0) { out("{0}: op={1} text={2}", arg0.getClass().getSimpleName(), arg0.getOperator(), arg0.getText() ); out("LHS:"); visit(arg0.getLHS()); out("RHS:"); visit(arg0.getRHS()); } protected void visit(AllNodeStep arg0) { out("{0}: axis={1}, text={2}", arg0.getClass().getSimpleName(), arg0.getAxis(), arg0.getText()); out("predicates:"); visitList(arg0.getPredicates()); } protected void visit(CommentNodeStep arg0) { out("{0}: {1}",arg0.getClass().getSimpleName(),arg0.getText()); out("predicates:"); visitList(arg0.getPredicates()); } protected void visit(EqualityExpr arg0) { out("{0}: op={1} text={2}", arg0.getClass().getSimpleName(), arg0.getOperator(), arg0.getText() ); out("LHS:"); visit(arg0.getLHS()); out("RHS:"); visit(arg0.getRHS()); } protected void visit(FilterExpr arg0) { out("{0}: text={1}",arg0.getClass().getSimpleName(),arg0.getText()); out("expression:"); visit(arg0.getExpr()); out("predicates:"); visitList(arg0.getPredicates()); } protected void visit(FunctionCallExpr arg0) { out("{0}: name={1}, prefix={2}, #arguments={3}, text={4}", //$NON-NLS-1$ arg0.getClass().getSimpleName(), arg0.getFunctionName(), arg0.getPrefix(), arg0.getParameters().size(), arg0.getText()); out("arguments:"); visitList(arg0.getParameters()); } protected void visit(LiteralExpr arg0) { out("{0}: literal={1}, text={2}", arg0.getClass().getSimpleName(), arg0.getLiteral(), arg0.getText()); } protected void visit (LocationPath arg0) { out("{0}: text={1}",arg0.getClass().getSimpleName(),arg0.getText()); out("steps:"); visitList(arg0.getSteps()); } protected void visit(LogicalExpr arg0) { out("{0}: op={1} text={2}", arg0.getClass().getSimpleName(), arg0.getOperator(), arg0.getText() ); out("LHS:"); visit(arg0.getLHS()); out("RHS:"); visit(arg0.getRHS()); } protected void visit (MultiplicativeExpr arg0) { out("{0}: op={1} text={2}", arg0.getClass().getSimpleName(), arg0.getOperator(), arg0.getText() ); out("LHS:"); visit(arg0.getLHS()); out("RHS:"); visit(arg0.getRHS()); } protected void visit(NameStep arg0) { out("{0}: axis={1}, name={2}, prefix={3}, text={4}", arg0.getClass().getSimpleName(), arg0.getAxis(), arg0.getLocalName(), arg0.getPrefix(), arg0.getText()); out("predicates:"); visitList(arg0.getPredicates()); } protected void visit(NumberExpr arg0) { out("{0}: {1}",arg0.getClass().getSimpleName(),arg0.getNumber()); } protected void visit(PathExpr arg0) { out("{0}: text={1}",arg0.getClass().getSimpleName(),arg0.getText()); out("filterExpr:"); visit ( arg0.getFilterExpr() ); out("locationPath:"); visit ( arg0.getLocationPath() ); } protected void visit(Predicate arg0) { out("{0}: text={1}",arg0.getClass().getSimpleName(),arg0.getText()); out("expression:"); visit(arg0.getExpr()); } protected void visit(ProcessingInstructionNodeStep arg0) { out("{0}: name={1}, axis={2}, text={3}",arg0.getClass().getSimpleName(), arg0.getName(), arg0.getAxis(), arg0.getText()); out("predicates:"); visitList(arg0.getPredicates()); } protected void visit(RelationalExpr arg0) { out("{0}: op={1} text={2}", arg0.getClass().getSimpleName(), arg0.getOperator(), arg0.getText() ); out("LHS:"); visit(arg0.getLHS()); out("RHS:"); visit(arg0.getRHS()); } protected void visit(TextNodeStep arg0) { out("{0}: axis={1}, text={2}", arg0.getClass().getSimpleName(), arg0.getAxis(), arg0.getText()); out("predicates:"); visitList(arg0.getPredicates()); } protected void visit(UnaryExpr arg0) { out("{0}: text={1}",arg0.getClass().getSimpleName(),arg0.getText() ) ; out("expression:"); visit(arg0.getExpr()); } protected void visit(UnionExpr arg0) { out("{0}: text={1}", arg0.getClass().getSimpleName(), arg0.getText() ); out("LHS:"); visit(arg0.getLHS()); out("RHS:"); visit(arg0.getRHS()); } /** (non-Javadoc) * @see org.jaxen.expr.VisitorSupport#visit(org.jaxen.expr.VariableReferenceExpr) */ protected void visit(VariableReferenceExpr arg0) { out("{0}: variable={1}, prefix={2}, text={3}",arg0.getClass().getSimpleName(), arg0.getVariableName(), arg0.getPrefix(), arg0.getText()); } protected void visitList (List<?> list) { offset += 3; Iterator<?> it = list.iterator(); while (it.hasNext()) { visit(it.next()); } offset -= 3; } /** * Visit the generic expression. * * @param expr */ public void visit (Object expr) { offset += 2; if (expr instanceof VariableReferenceExpr) { visit ( (VariableReferenceExpr) expr); } else if (expr instanceof UnionExpr) { visit ( (UnionExpr) expr); } else if ( expr instanceof UnaryExpr) { visit ( (UnaryExpr) expr); } else if ( expr instanceof TextNodeStep ) { visit ( (TextNodeStep) expr) ; } else if ( expr instanceof RelationalExpr) { visit ( (RelationalExpr) expr); } else if ( expr instanceof ProcessingInstructionNodeStep) { visit ( (ProcessingInstructionNodeStep) expr) ; } else if ( expr instanceof Predicate) { visit ( (Predicate) expr ); } else if ( expr instanceof PathExpr) { visit ( (PathExpr) expr) ; } else if ( expr instanceof NumberExpr) { visit ( (NumberExpr) expr); } else if ( expr instanceof NameStep) { visit ( (NameStep) expr); } else if ( expr instanceof MultiplicativeExpr) { visit ( (MultiplicativeExpr) expr); } else if ( expr instanceof LogicalExpr) { visit ( (LogicalExpr) expr); } else if ( expr instanceof LocationPath) { visit ( (LocationPath) expr); } else if ( expr instanceof LiteralExpr) { visit ( (LiteralExpr) expr); } else if ( expr instanceof FunctionCallExpr) { visit ( (FunctionCallExpr) expr); } else if ( expr instanceof FilterExpr) { visit ( (FilterExpr) expr); } else if ( expr instanceof EqualityExpr) { visit ( (EqualityExpr) expr); } else if ( expr instanceof CommentNodeStep) { visit ( (CommentNodeStep)expr); } else if ( expr instanceof AllNodeStep) { visit ( (AllNodeStep) expr); } else if ( expr instanceof AdditiveExpr) { visit ( (AdditiveExpr) expr); } else if (expr instanceof List) { visitList((List)expr); } else if (expr != null) { out("Panic: Unknown expression kind {0} ",expr.getClass().getName()); //$NON-NLS-1$ } else { out("null - unset"); } offset -= 2; } void out ( String msg, Object ... args ) { for(int i=0; i < offset; i++) { System.out.print(' '); } pl (msg,args); } } }