blob: 7643f732515555b8cd7b369c9364884cbdbe48d4 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}