/******************************************************************************* * 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.util.Iterator; import java.util.Map; import org.eclipse.bpel.validator.model.ARule; import org.eclipse.bpel.validator.model.INode; import org.eclipse.bpel.validator.model.IProblem; import org.eclipse.bpel.validator.model.Problem; import org.eclipse.bpel.xpath10.Expr; import org.eclipse.bpel.xpath10.FunctionCallExpr; import org.eclipse.bpel.xpath10.LocationPath; import org.eclipse.bpel.xpath10.UnaryExpr; import org.eclipse.bpel.xpath10.VariableReferenceExpr; import org.eclipse.bpel.xpath10.parser.XPath10Parser.unaryExpr_return; /** * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Mar 23, 2007 * */ @SuppressWarnings({"nls","boxing"}) public class Query extends XPathValidator { boolean bBpelFunctions = true; boolean bBpelVariables = false; /** * @see org.eclipse.bpel.validator.xpath.XPathValidator#start() */ @Override public void start () { super.start(); bBpelFunctions = getValue("bpel.function", bBpelFunctions); bBpelVariables = getValue("bpel.variables", bBpelVariables); } /** * Check query type of expressions (can only LocationPaths). * */ @ARule( sa = 27, desc = "Check the query location path", author = "michal.chmielewski@oracle.com", date = "01/20/2007", order = 16 ) public void CheckQuery () { IProblem problem; Expr expr = xpathExpr ; if (expr instanceof UnaryExpr && ((UnaryExpr)expr).getExpr() instanceof LocationPath) { expr = ((UnaryExpr)expr).getExpr(); Object obj = mVisitor.contextPeek(); if (obj instanceof INode) { mVisitor.visit( expr ); } else { problem = createError(); problem.fill("XPATH_NO_LOCATION_PATH", expr.getText(), toString(mNode.nodeName()) ); repointOffsets(problem, expr); } } else { problem = createError(); problem.fill("XPATH_NOT_A_LOCATION", //$NON-NLS-1$ exprStringTrimmed, toString(mNode.nodeName()) ); repointOffsets(problem, expr); } // Don't run anything else. disableRules(); } /** * Check Location path expressions * @param expr the location path expr * */ @ARule( sa = 27, desc = "There is no implicit context node in XPath expressions used in BPEL", author = "michal.chmielewski@oracle.com", date = "0/20/2007", tag = "location" ) public void CheckLocationPath ( LocationPath expr ) { Object obj = mVisitor.contextPeek(); if (obj instanceof INode) { return ; } IProblem problem = createError(); problem.fill("XPATH_NO_LOCATION_PATH", expr.getText(), toString(mNode.nodeName()) ); repointOffsets(problem, expr); disableRules(); } /** * @param expr */ @ARule( sa = 29, desc = "BPEL variables cannot be used in propertyAlias queries", author = "michal.chmielewski@oracle.com", date = "01/30/2007", tag = "variables" ) public void CheckVariable ( VariableReferenceExpr expr ) { if (bBpelVariables) { return ; } } /** * @param expr */ @SuppressWarnings("nls") @ARule( sa = 29, desc = "BPEL Functions must not be used in query expressions for propertyAlias", author = "michal.chmielewski@oracle.com", date = "01/20/2007", tag = "bpel.functions" ) public void CheckBPELFunctions ( FunctionCallExpr expr ) { if (bBpelFunctions) { return ; } IProblem problem = createError(); problem.fill("XPATH_BPEL_FUNCTION", toString(mNode.nodeName()), expr.getFunctionName(), fExprByNode ); repointOffsets(problem, expr); } }