You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by dc...@apache.org on 2010/06/04 20:47:51 UTC
svn commit: r951527 - in /ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src:
main/java/org/apache/ode/bpel/elang/xpath20/compiler/
test/java/org/apache/ode/bpel/elang/xpath20/compiler/
Author: dcarver
Date: Fri Jun 4 18:47:51 2010
New Revision: 951527
URL: http://svn.apache.org/viewvc?rev=951527&view=rev
Log:
ODE-840 fix for failing to parse XPath functions correctly, caused by ODE-807.
Modified:
ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java
Modified: ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java?rev=951527&r1=951526&r2=951527&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java (original)
+++ ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java Fri Jun 4 18:47:51 2010
@@ -58,11 +58,13 @@ import org.w3c.dom.Node;
/**
* XPath compiler based on the SAXON implementation.
+ *
* @author Matthieu Riou <mriou at apache dot org>
*/
public class XPath20ExpressionCompilerImpl implements ExpressionCompiler {
- protected static final Log __log = LogFactory.getLog(XPath20ExpressionCompilerBPEL20.class);
+ protected static final Log __log = LogFactory
+ .getLog(XPath20ExpressionCompilerBPEL20.class);
protected String _bpelNS;
protected QName _qnLinkStatus;
@@ -70,32 +72,39 @@ public class XPath20ExpressionCompilerIm
protected QName _qnVarData;
protected QName _qnXslTransform;
- protected final XPathMessages __msgs = MessageBundle.getMessages(XPathMessages.class);
+ protected final XPathMessages __msgs = MessageBundle
+ .getMessages(XPathMessages.class);
protected Map<String, String> _properties = new HashMap<String, String>();
protected CompilerContext _compilerContext;
public XPath20ExpressionCompilerImpl(String bpelNS) {
_bpelNS = bpelNS;
_qnLinkStatus = new QName(_bpelNS, Constants.EXT_FUNCTION_GETLINKSTATUS);
- _qnVarProp = new QName(_bpelNS, Constants.EXT_FUNCTION_GETVARIABLEPROPERTY);
+ _qnVarProp = new QName(_bpelNS,
+ Constants.EXT_FUNCTION_GETVARIABLEPROPERTY);
_qnVarData = new QName(_bpelNS, Constants.EXT_FUNCTION_GETVARIABLEDATA);
- _qnXslTransform = new QName(_bpelNS, Constants.EXT_FUNCTION_DOXSLTRANSFORM);
+ _qnXslTransform = new QName(_bpelNS,
+ Constants.EXT_FUNCTION_DOXSLTRANSFORM);
- _properties.put("runtime-class", "org.apache.ode.bpel.elang.xpath20.runtime.XPath20ExpressionRuntime");
+ _properties
+ .put("runtime-class",
+ "org.apache.ode.bpel.elang.xpath20.runtime.XPath20ExpressionRuntime");
TransformerFactory trsf = new net.sf.saxon.TransformerFactoryImpl();
XslTransformHandler.getInstance().setTransformerFactory(trsf);
}
public void setCompilerContext(CompilerContext compilerContext) {
_compilerContext = compilerContext;
- XslCompilationErrorListener xe = new XslCompilationErrorListener(compilerContext);
+ XslCompilationErrorListener xe = new XslCompilationErrorListener(
+ compilerContext);
XslTransformHandler.getInstance().setErrorListener(xe);
}
/**
* @see org.apache.ode.bpel.compiler.api.ExpressionCompiler#compileJoinCondition(java.lang.Object)
*/
- public OExpression compileJoinCondition(Object source) throws CompilationException {
+ public OExpression compileJoinCondition(Object source)
+ throws CompilationException {
return _compile((Expression) source, true);
}
@@ -109,70 +118,81 @@ public class XPath20ExpressionCompilerIm
/**
* @see org.apache.ode.bpel.compiler.api.ExpressionCompiler#compileLValue(java.lang.Object)
*/
- public OLValueExpression compileLValue(Object source) throws CompilationException {
+ public OLValueExpression compileLValue(Object source)
+ throws CompilationException {
return (OLValueExpression) _compile((Expression) source, false);
}
/**
* @see org.apache.ode.bpel.compiler.api.ExpressionCompiler#compile(java.lang.Object)
*/
- private OExpression _compile(org.apache.ode.bpel.compiler.bom.Expression xpath, boolean isJoinCondition)
- throws CompilationException {
- OXPath20ExpressionBPEL20 oexp = new OXPath20ExpressionBPEL20(_compilerContext.getOProcess(), _qnVarData,
- _qnVarProp, _qnLinkStatus, _qnXslTransform, isJoinCondition);
+ private OExpression _compile(
+ org.apache.ode.bpel.compiler.bom.Expression xpath,
+ boolean isJoinCondition) throws CompilationException {
+ OXPath20ExpressionBPEL20 oexp = new OXPath20ExpressionBPEL20(
+ _compilerContext.getOProcess(), _qnVarData, _qnVarProp,
+ _qnLinkStatus, _qnXslTransform, isJoinCondition);
oexp.namespaceCtx = xpath.getNamespaceContext();
doJaxpCompile(oexp, xpath);
return oexp;
}
- private void doJaxpCompile(OXPath20ExpressionBPEL20 out, Expression source) throws CompilationException {
+ private void doJaxpCompile(OXPath20ExpressionBPEL20 out, Expression source)
+ throws CompilationException {
String xpathStr;
Node node = source.getExpression();
if (node == null) {
- throw new CompilationException(__msgs.errEmptyExpression(source.getURI(), new QName(source.getElement().getNamespaceURI(), source.getElement().getNodeName())));
+ throw new CompilationException(__msgs.errEmptyExpression(source
+ .getURI(), new QName(source.getElement().getNamespaceURI(),
+ source.getElement().getNodeName())));
}
if (node.getNodeType() != Node.TEXT_NODE) {
- throw new CompilationException(__msgs.errUnexpectedNodeTypeForXPath(DOMUtils.domToString(node)));
+ throw new CompilationException(
+ __msgs.errUnexpectedNodeTypeForXPath(DOMUtils
+ .domToString(node)));
}
xpathStr = node.getNodeValue();
xpathStr = xpathStr.trim();
if (xpathStr.length() == 0) {
- throw new CompilationException(__msgs.warnXPath20Syntax(DOMUtils.domToString(node), "empty string"));
+ throw new CompilationException(__msgs.warnXPath20Syntax(
+ DOMUtils.domToString(node), "empty string"));
}
out.xpath = xpathStr;
- try {
- __log.debug("Compiling expression " + xpathStr);
+ try {
+ __log.debug("Compiling expression " + xpathStr);
XPathFactory xpf = new XPathFactoryImpl();
JaxpFunctionResolver funcResolver = new JaxpFunctionResolver(
- _compilerContext, out, source.getNamespaceContext(), _bpelNS);
- JaxpVariableResolver varResolver = new JaxpVariableResolver(_compilerContext, out);
+ _compilerContext, out, source.getNamespaceContext(),
+ _bpelNS);
+ JaxpVariableResolver varResolver = new JaxpVariableResolver(
+ _compilerContext, out);
XPath xpe = xpf.newXPath();
xpe.setXPathFunctionResolver(funcResolver);
xpe.setXPathVariableResolver(varResolver);
- xpe.setNamespaceContext(source.getNamespaceContext());
+ xpe.setNamespaceContext(source.getNamespaceContext());
XPathExpression expr = xpe.compile(xpathStr);
// evaluate the expression so as to initialize the variables
- try {
- expr.evaluate(node);
- } catch (XPathExpressionException xpee) {
- // swallow errors caused by uninitialized variable
+ try {
+ expr.evaluate(node);
+ } catch (XPathExpressionException xpee) {
+ // swallow errors caused by uninitialized variable
}
for (String varExpr : extractVariableExprs(xpathStr)) {
expr = xpe.compile(varExpr);
- try {
- expr.evaluate(node);
- } catch (XPathExpressionException xpee) {
- // swallow errors caused by uninitialized variable
- }
+ try {
+ expr.evaluate(node);
+ } catch (XPathExpressionException xpee) {
+ // swallow errors caused by uninitialized variable
+ }
}
for (String functionExpr : extractFunctionExprs(xpathStr)) {
expr = xpe.compile(functionExpr);
- try {
- expr.evaluate(node);
- } catch (XPathExpressionException xpee) {
- // swallow errors caused by uninitialized variable
- }
+ try {
+ expr.evaluate(node);
+ } catch (XPathExpressionException xpee) {
+ // swallow errors caused by uninitialized variable
+ }
}
} catch (XPathExpressionException e) {
__log.debug(e);
@@ -188,90 +208,96 @@ public class XPath20ExpressionCompilerIm
/**
* Returns the list of variable references in the given XPath expression
- * that may not have been resolved properly, which is the case especially
- * if the expression contains a function, which short circuited the evaluation.
- *
+ * that may not have been resolved properly, which is the case especially if
+ * the expression contains a function, which short circuited the evaluation.
+ *
* @param xpathStr
- * @return list of variable expressions that may not have been resolved properly
+ * @return list of variable expressions that may not have been resolved
+ * properly
*/
- private List<String> extractVariableExprs(String xpathStr) {
- ArrayList<String> variableExprs = new ArrayList<String>();
- int firstVariable = xpathStr.indexOf("$"),
- lastVariable = xpathStr.lastIndexOf("$"),
- firstFunction = xpathStr.indexOf("(");
- StringBuffer variableExpr = new StringBuffer();
- if ((firstVariable > 0 && // the xpath references a variable
- firstFunction > 0) || // the xpath contains a function
- (firstVariable < lastVariable)) { // the xpath references multiple variables
- // most likely, the variable reference has not been resolved, so make that happen
- boolean quoted = false, doubleQuoted = false, variable = false;
- Name11Checker nameChecker = Name11Checker.getInstance();
- for (int index = 0; index < xpathStr.length(); index++) {
- char ch = xpathStr.charAt(index);
- if (ch == '\''){
- quoted = !quoted;
- }
- if (ch == '\"') {
- doubleQuoted = !doubleQuoted;
- }
- if (quoted || doubleQuoted){
- continue;
- }
- if (ch == '$') {
- variable = true;
- variableExpr.setLength(0);
- variableExpr.append(ch);
- } else {
- if (variable) {
- variableExpr.append(ch);
- // in the name is qualified, don't check if its a qname when we're at the ":" character
- if (ch == ':') {
- continue;
- }
- if (index == xpathStr.length() ||
- !nameChecker.isQName(variableExpr.substring(1))) {
- variable = false;
- variableExpr.setLength(variableExpr.length() - 1);
- variableExprs.add(variableExpr.toString());
- variableExpr.setLength(0);
- }
- }
- }
- }
- if (variableExpr.length() > 0) {
- variableExprs.add(variableExpr.toString());
- }
- }
- return variableExprs;
- }
+ private List<String> extractVariableExprs(String xpathStr) {
+ ArrayList<String> variableExprs = new ArrayList<String>();
+ int firstVariable = xpathStr.indexOf("$"), lastVariable = xpathStr
+ .lastIndexOf("$"), firstFunction = xpathStr.indexOf("(");
+ StringBuffer variableExpr = new StringBuffer();
+ if ((firstVariable > 0 && // the xpath references a variable
+ firstFunction > 0)
+ || // the xpath contains a function
+ (firstVariable < lastVariable)) { // the xpath references
+ // multiple variables
+ // most likely, the variable reference has not been resolved, so
+ // make that happen
+ boolean quoted = false, doubleQuoted = false, variable = false;
+ Name11Checker nameChecker = Name11Checker.getInstance();
+ for (int index = 0; index < xpathStr.length(); index++) {
+ char ch = xpathStr.charAt(index);
+ if (ch == '\'') {
+ quoted = !quoted;
+ }
+ if (ch == '\"') {
+ doubleQuoted = !doubleQuoted;
+ }
+ if (quoted || doubleQuoted) {
+ continue;
+ }
+ if (ch == '$') {
+ variable = true;
+ variableExpr.setLength(0);
+ variableExpr.append(ch);
+ } else {
+ if (variable) {
+ variableExpr.append(ch);
+ // in the name is qualified, don't check if its a qname
+ // when we're at the ":" character
+ if (ch == ':') {
+ continue;
+ }
+ if (index == xpathStr.length()
+ || !nameChecker.isQName(variableExpr
+ .substring(1))) {
+ variable = false;
+ variableExpr.setLength(variableExpr.length() - 1);
+ variableExprs.add(variableExpr.toString());
+ variableExpr.setLength(0);
+ }
+ }
+ }
+ }
+ if (variableExpr.length() > 0) {
+ variableExprs.add(variableExpr.toString());
+ }
+ }
+ return variableExprs;
+ }
/**
* Returns the list of function references in the given XPath expression
- * that may not have been resolved properly, which is the case especially
- * if the expression contains a preceding function, which short circuited the evaluation.
- *
+ * that may not have been resolved properly, which is the case especially if
+ * the expression contains a preceding function, which short circuited the
+ * evaluation.
+ *
* @param xpathStr
- * @return list of function expressions that may not have been resolved properly
+ * @return list of function expressions that may not have been resolved
+ * properly
*/
- private List<String> extractFunctionExprs(String xpathStr) {
- ArrayList<String> functionExprs = new ArrayList<String>();
- // Match the prefix : function name ( all contents except the ) and the closing )'s that may occur
- final String FUNCTION_REGEX = "\\w+:\\w+\\([.[^\\)]]*\\)*";
- int firstFunction = xpathStr.indexOf("("),
- lastFunction = xpathStr.lastIndexOf("(");
- if ((firstFunction > 0 && firstFunction < lastFunction)) {
- Pattern regex = Pattern.compile(FUNCTION_REGEX);
- Matcher matcher = regex.matcher(xpathStr);
-
- while (matcher.find()) {
- String function = matcher.group();
- functionExprs.add(function);
- }
- }
- return functionExprs;
- }
-
- public Map<String, String> getProperties() {
+ private List<String> extractFunctionExprs(String xpathStr) {
+ ArrayList<String> functionExprs = new ArrayList<String>();
+ final String FUNCTION_REGEX = "(\\w+:)?\\w+\\((.+)?\\)";
+ int firstFunction = xpathStr.indexOf("("), lastFunction = xpathStr
+ .lastIndexOf("(");
+ if ((firstFunction > 0 && firstFunction < lastFunction)) {
+ Pattern regex = Pattern.compile(FUNCTION_REGEX);
+ Matcher matcher = regex.matcher(xpathStr);
+
+ while (matcher.find()) {
+ String function = matcher.group();
+ functionExprs.add(function);
+ }
+ }
+ return functionExprs;
+ }
+
+ public Map<String, String> getProperties() {
return _properties;
}
Modified: ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java?rev=951527&r1=951526&r2=951527&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java (original)
+++ ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java Fri Jun 4 18:47:51 2010
@@ -24,33 +24,32 @@ import java.util.List;
import org.junit.*;
-
public class XPath20ExpressionCompilerImplTest {
-
+
private static final String TEST_NAMESPACE = "http://www.example.com/";
private static final String EXTRACT_FUNCTION_EXPRS = "extractFunctionExprs";
@Test
public void testresolvedFunctionsExpr() throws Exception {
- XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(TEST_NAMESPACE);
- final Method[] methods =
- xp20Exp.getClass().getDeclaredMethods();
+ XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
+ TEST_NAMESPACE);
+ final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
for (int i = 0; i < methods.length; ++i) {
if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
final Object params[] = { "count(count(1))" };
methods[i].setAccessible(true);
Object ret = methods[i].invoke(xp20Exp, params);
List<?> values = (List<?>) ret;
- Assert.assertEquals(0, values.size());
+ Assert.assertEquals(1, values.size());
}
}
}
-
+
@Test
public void testTimeStampInFunction() throws Exception {
- XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(TEST_NAMESPACE);
- final Method[] methods =
- xp20Exp.getClass().getDeclaredMethods();
+ XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
+ TEST_NAMESPACE);
+ final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
for (int i = 0; i < methods.length; ++i) {
if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
final Object params[] = { "concat(xs:concat(\"P\", \"08:30:00.000+08:00\"))" };
@@ -62,25 +61,45 @@ public class XPath20ExpressionCompilerIm
}
}
-
+
@Test
public void testresolvedFunctionsTimeStamp() throws Exception {
- XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(TEST_NAMESPACE);
- final Method[] methods =
- xp20Exp.getClass().getDeclaredMethods();
+ XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
+ TEST_NAMESPACE);
+ final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
+ for (int i = 0; i < methods.length; ++i) {
+ if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
+ String multipleFunctions = "concat(current-date() + xs:dayTimeDuration(concat(\"P\", $DAYS_TO_NEXT_REMINDER, \"D\")), \"T\", \"08:30:00.000+08:00\")";
+ final Object params[] = { multipleFunctions };
+ methods[i].setAccessible(true);
+ Object ret = methods[i].invoke(xp20Exp, params);
+ List<?> values = (List<?>) ret;
+ Assert.assertEquals(1, values.size());
+ Assert.assertEquals("Unexpected Function value",
+ multipleFunctions, (String) values.get(0));
+ }
+ }
+ }
+
+ @Test
+ public void testExtractFunctionsExprs() throws Exception {
+ XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
+ TEST_NAMESPACE);
+ final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
+ String ODE_840 = "bpel:doXslTransform(\"1.0.1/some.xsl\", $Variable.body, \"someParameter\", $OtherVariable.body, \"someParameter2\", $SwsHeaderRQ, \"someParameter3\", true(), \"someXpathParameter\", $XPath)";
+
for (int i = 0; i < methods.length; ++i) {
if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
- final Object params[] = { "concat(current-date() + xs:dayTimeDuration(concat(\"P\", $DAYS_TO_NEXT_REMINDER, \"D\")), \"T\", \"08:30:00.000+08:00\")" };
+ final Object params[] = { ODE_840 };
methods[i].setAccessible(true);
Object ret = methods[i].invoke(xp20Exp, params);
List<?> values = (List<?>) ret;
Assert.assertEquals(1, values.size());
- Assert.assertEquals("Unexpected Function value", "xs:dayTimeDuration(concat(\"P\", $DAYS_TO_NEXT_REMINDER, \"D\"))", (String)values.get(0));
+ Assert.assertEquals("Unexpected Function value", ODE_840,
+ (String) values.get(0));
}
}
+
}
-
-
-
}
Re: svn commit: r951527 - in /ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src:
main/java/org/apache/ode/bpel/elang/xpath20/compiler/ test/java/org/apache/ode/bpel/elang/xpath20/compiler/
Posted by Tammo van Lessen <tv...@gmail.com>.
Hi guys,
Dave's first commit! Welcome on board!
Tammo
On 04.06.2010 20:47, dcarver@apache.org wrote:
> Author: dcarver
> Date: Fri Jun 4 18:47:51 2010
> New Revision: 951527
>
> URL: http://svn.apache.org/viewvc?rev=951527&view=rev
> Log:
> ODE-840 fix for failing to parse XPath functions correctly, caused by ODE-807.
>
> Modified:
> ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
> ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java
>
> Modified: ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
> URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java?rev=951527&r1=951526&r2=951527&view=diff
> ==============================================================================
> --- ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java (original)
> +++ ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java Fri Jun 4 18:47:51 2010
> @@ -58,11 +58,13 @@ import org.w3c.dom.Node;
>
> /**
> * XPath compiler based on the SAXON implementation.
> + *
> * @author Matthieu Riou <mriou at apache dot org>
> */
> public class XPath20ExpressionCompilerImpl implements ExpressionCompiler {
>
> - protected static final Log __log = LogFactory.getLog(XPath20ExpressionCompilerBPEL20.class);
> + protected static final Log __log = LogFactory
> + .getLog(XPath20ExpressionCompilerBPEL20.class);
>
> protected String _bpelNS;
> protected QName _qnLinkStatus;
> @@ -70,32 +72,39 @@ public class XPath20ExpressionCompilerIm
> protected QName _qnVarData;
> protected QName _qnXslTransform;
>
> - protected final XPathMessages __msgs = MessageBundle.getMessages(XPathMessages.class);
> + protected final XPathMessages __msgs = MessageBundle
> + .getMessages(XPathMessages.class);
> protected Map<String, String> _properties = new HashMap<String, String>();
> protected CompilerContext _compilerContext;
>
> public XPath20ExpressionCompilerImpl(String bpelNS) {
> _bpelNS = bpelNS;
> _qnLinkStatus = new QName(_bpelNS, Constants.EXT_FUNCTION_GETLINKSTATUS);
> - _qnVarProp = new QName(_bpelNS, Constants.EXT_FUNCTION_GETVARIABLEPROPERTY);
> + _qnVarProp = new QName(_bpelNS,
> + Constants.EXT_FUNCTION_GETVARIABLEPROPERTY);
> _qnVarData = new QName(_bpelNS, Constants.EXT_FUNCTION_GETVARIABLEDATA);
> - _qnXslTransform = new QName(_bpelNS, Constants.EXT_FUNCTION_DOXSLTRANSFORM);
> + _qnXslTransform = new QName(_bpelNS,
> + Constants.EXT_FUNCTION_DOXSLTRANSFORM);
>
> - _properties.put("runtime-class", "org.apache.ode.bpel.elang.xpath20.runtime.XPath20ExpressionRuntime");
> + _properties
> + .put("runtime-class",
> + "org.apache.ode.bpel.elang.xpath20.runtime.XPath20ExpressionRuntime");
> TransformerFactory trsf = new net.sf.saxon.TransformerFactoryImpl();
> XslTransformHandler.getInstance().setTransformerFactory(trsf);
> }
>
> public void setCompilerContext(CompilerContext compilerContext) {
> _compilerContext = compilerContext;
> - XslCompilationErrorListener xe = new XslCompilationErrorListener(compilerContext);
> + XslCompilationErrorListener xe = new XslCompilationErrorListener(
> + compilerContext);
> XslTransformHandler.getInstance().setErrorListener(xe);
> }
>
> /**
> * @see org.apache.ode.bpel.compiler.api.ExpressionCompiler#compileJoinCondition(java.lang.Object)
> */
> - public OExpression compileJoinCondition(Object source) throws CompilationException {
> + public OExpression compileJoinCondition(Object source)
> + throws CompilationException {
> return _compile((Expression) source, true);
> }
>
> @@ -109,70 +118,81 @@ public class XPath20ExpressionCompilerIm
> /**
> * @see org.apache.ode.bpel.compiler.api.ExpressionCompiler#compileLValue(java.lang.Object)
> */
> - public OLValueExpression compileLValue(Object source) throws CompilationException {
> + public OLValueExpression compileLValue(Object source)
> + throws CompilationException {
> return (OLValueExpression) _compile((Expression) source, false);
> }
>
> /**
> * @see org.apache.ode.bpel.compiler.api.ExpressionCompiler#compile(java.lang.Object)
> */
> - private OExpression _compile(org.apache.ode.bpel.compiler.bom.Expression xpath, boolean isJoinCondition)
> - throws CompilationException {
> - OXPath20ExpressionBPEL20 oexp = new OXPath20ExpressionBPEL20(_compilerContext.getOProcess(), _qnVarData,
> - _qnVarProp, _qnLinkStatus, _qnXslTransform, isJoinCondition);
> + private OExpression _compile(
> + org.apache.ode.bpel.compiler.bom.Expression xpath,
> + boolean isJoinCondition) throws CompilationException {
> + OXPath20ExpressionBPEL20 oexp = new OXPath20ExpressionBPEL20(
> + _compilerContext.getOProcess(), _qnVarData, _qnVarProp,
> + _qnLinkStatus, _qnXslTransform, isJoinCondition);
> oexp.namespaceCtx = xpath.getNamespaceContext();
> doJaxpCompile(oexp, xpath);
> return oexp;
> }
>
> - private void doJaxpCompile(OXPath20ExpressionBPEL20 out, Expression source) throws CompilationException {
> + private void doJaxpCompile(OXPath20ExpressionBPEL20 out, Expression source)
> + throws CompilationException {
> String xpathStr;
> Node node = source.getExpression();
> if (node == null) {
> - throw new CompilationException(__msgs.errEmptyExpression(source.getURI(), new QName(source.getElement().getNamespaceURI(), source.getElement().getNodeName())));
> + throw new CompilationException(__msgs.errEmptyExpression(source
> + .getURI(), new QName(source.getElement().getNamespaceURI(),
> + source.getElement().getNodeName())));
> }
> if (node.getNodeType() != Node.TEXT_NODE) {
> - throw new CompilationException(__msgs.errUnexpectedNodeTypeForXPath(DOMUtils.domToString(node)));
> + throw new CompilationException(
> + __msgs.errUnexpectedNodeTypeForXPath(DOMUtils
> + .domToString(node)));
> }
> xpathStr = node.getNodeValue();
> xpathStr = xpathStr.trim();
> if (xpathStr.length() == 0) {
> - throw new CompilationException(__msgs.warnXPath20Syntax(DOMUtils.domToString(node), "empty string"));
> + throw new CompilationException(__msgs.warnXPath20Syntax(
> + DOMUtils.domToString(node), "empty string"));
> }
>
> out.xpath = xpathStr;
> - try {
> - __log.debug("Compiling expression " + xpathStr);
> + try {
> + __log.debug("Compiling expression " + xpathStr);
> XPathFactory xpf = new XPathFactoryImpl();
> JaxpFunctionResolver funcResolver = new JaxpFunctionResolver(
> - _compilerContext, out, source.getNamespaceContext(), _bpelNS);
> - JaxpVariableResolver varResolver = new JaxpVariableResolver(_compilerContext, out);
> + _compilerContext, out, source.getNamespaceContext(),
> + _bpelNS);
> + JaxpVariableResolver varResolver = new JaxpVariableResolver(
> + _compilerContext, out);
> XPath xpe = xpf.newXPath();
> xpe.setXPathFunctionResolver(funcResolver);
> xpe.setXPathVariableResolver(varResolver);
> - xpe.setNamespaceContext(source.getNamespaceContext());
> + xpe.setNamespaceContext(source.getNamespaceContext());
> XPathExpression expr = xpe.compile(xpathStr);
> // evaluate the expression so as to initialize the variables
> - try {
> - expr.evaluate(node);
> - } catch (XPathExpressionException xpee) {
> - // swallow errors caused by uninitialized variable
> + try {
> + expr.evaluate(node);
> + } catch (XPathExpressionException xpee) {
> + // swallow errors caused by uninitialized variable
> }
> for (String varExpr : extractVariableExprs(xpathStr)) {
> expr = xpe.compile(varExpr);
> - try {
> - expr.evaluate(node);
> - } catch (XPathExpressionException xpee) {
> - // swallow errors caused by uninitialized variable
> - }
> + try {
> + expr.evaluate(node);
> + } catch (XPathExpressionException xpee) {
> + // swallow errors caused by uninitialized variable
> + }
> }
> for (String functionExpr : extractFunctionExprs(xpathStr)) {
> expr = xpe.compile(functionExpr);
> - try {
> - expr.evaluate(node);
> - } catch (XPathExpressionException xpee) {
> - // swallow errors caused by uninitialized variable
> - }
> + try {
> + expr.evaluate(node);
> + } catch (XPathExpressionException xpee) {
> + // swallow errors caused by uninitialized variable
> + }
> }
> } catch (XPathExpressionException e) {
> __log.debug(e);
> @@ -188,90 +208,96 @@ public class XPath20ExpressionCompilerIm
>
> /**
> * Returns the list of variable references in the given XPath expression
> - * that may not have been resolved properly, which is the case especially
> - * if the expression contains a function, which short circuited the evaluation.
> - *
> + * that may not have been resolved properly, which is the case especially if
> + * the expression contains a function, which short circuited the evaluation.
> + *
> * @param xpathStr
> - * @return list of variable expressions that may not have been resolved properly
> + * @return list of variable expressions that may not have been resolved
> + * properly
> */
> - private List<String> extractVariableExprs(String xpathStr) {
> - ArrayList<String> variableExprs = new ArrayList<String>();
> - int firstVariable = xpathStr.indexOf("$"),
> - lastVariable = xpathStr.lastIndexOf("$"),
> - firstFunction = xpathStr.indexOf("(");
> - StringBuffer variableExpr = new StringBuffer();
> - if ((firstVariable > 0 && // the xpath references a variable
> - firstFunction > 0) || // the xpath contains a function
> - (firstVariable < lastVariable)) { // the xpath references multiple variables
> - // most likely, the variable reference has not been resolved, so make that happen
> - boolean quoted = false, doubleQuoted = false, variable = false;
> - Name11Checker nameChecker = Name11Checker.getInstance();
> - for (int index = 0; index < xpathStr.length(); index++) {
> - char ch = xpathStr.charAt(index);
> - if (ch == '\''){
> - quoted = !quoted;
> - }
> - if (ch == '\"') {
> - doubleQuoted = !doubleQuoted;
> - }
> - if (quoted || doubleQuoted){
> - continue;
> - }
> - if (ch == '$') {
> - variable = true;
> - variableExpr.setLength(0);
> - variableExpr.append(ch);
> - } else {
> - if (variable) {
> - variableExpr.append(ch);
> - // in the name is qualified, don't check if its a qname when we're at the ":" character
> - if (ch == ':') {
> - continue;
> - }
> - if (index == xpathStr.length() ||
> - !nameChecker.isQName(variableExpr.substring(1))) {
> - variable = false;
> - variableExpr.setLength(variableExpr.length() - 1);
> - variableExprs.add(variableExpr.toString());
> - variableExpr.setLength(0);
> - }
> - }
> - }
> - }
> - if (variableExpr.length() > 0) {
> - variableExprs.add(variableExpr.toString());
> - }
> - }
> - return variableExprs;
> - }
> + private List<String> extractVariableExprs(String xpathStr) {
> + ArrayList<String> variableExprs = new ArrayList<String>();
> + int firstVariable = xpathStr.indexOf("$"), lastVariable = xpathStr
> + .lastIndexOf("$"), firstFunction = xpathStr.indexOf("(");
> + StringBuffer variableExpr = new StringBuffer();
> + if ((firstVariable > 0 && // the xpath references a variable
> + firstFunction > 0)
> + || // the xpath contains a function
> + (firstVariable < lastVariable)) { // the xpath references
> + // multiple variables
> + // most likely, the variable reference has not been resolved, so
> + // make that happen
> + boolean quoted = false, doubleQuoted = false, variable = false;
> + Name11Checker nameChecker = Name11Checker.getInstance();
> + for (int index = 0; index < xpathStr.length(); index++) {
> + char ch = xpathStr.charAt(index);
> + if (ch == '\'') {
> + quoted = !quoted;
> + }
> + if (ch == '\"') {
> + doubleQuoted = !doubleQuoted;
> + }
> + if (quoted || doubleQuoted) {
> + continue;
> + }
> + if (ch == '$') {
> + variable = true;
> + variableExpr.setLength(0);
> + variableExpr.append(ch);
> + } else {
> + if (variable) {
> + variableExpr.append(ch);
> + // in the name is qualified, don't check if its a qname
> + // when we're at the ":" character
> + if (ch == ':') {
> + continue;
> + }
> + if (index == xpathStr.length()
> + || !nameChecker.isQName(variableExpr
> + .substring(1))) {
> + variable = false;
> + variableExpr.setLength(variableExpr.length() - 1);
> + variableExprs.add(variableExpr.toString());
> + variableExpr.setLength(0);
> + }
> + }
> + }
> + }
> + if (variableExpr.length() > 0) {
> + variableExprs.add(variableExpr.toString());
> + }
> + }
> + return variableExprs;
> + }
>
> /**
> * Returns the list of function references in the given XPath expression
> - * that may not have been resolved properly, which is the case especially
> - * if the expression contains a preceding function, which short circuited the evaluation.
> - *
> + * that may not have been resolved properly, which is the case especially if
> + * the expression contains a preceding function, which short circuited the
> + * evaluation.
> + *
> * @param xpathStr
> - * @return list of function expressions that may not have been resolved properly
> + * @return list of function expressions that may not have been resolved
> + * properly
> */
> - private List<String> extractFunctionExprs(String xpathStr) {
> - ArrayList<String> functionExprs = new ArrayList<String>();
> - // Match the prefix : function name ( all contents except the ) and the closing )'s that may occur
> - final String FUNCTION_REGEX = "\\w+:\\w+\\([.[^\\)]]*\\)*";
> - int firstFunction = xpathStr.indexOf("("),
> - lastFunction = xpathStr.lastIndexOf("(");
> - if ((firstFunction > 0 && firstFunction < lastFunction)) {
> - Pattern regex = Pattern.compile(FUNCTION_REGEX);
> - Matcher matcher = regex.matcher(xpathStr);
> -
> - while (matcher.find()) {
> - String function = matcher.group();
> - functionExprs.add(function);
> - }
> - }
> - return functionExprs;
> - }
> -
> - public Map<String, String> getProperties() {
> + private List<String> extractFunctionExprs(String xpathStr) {
> + ArrayList<String> functionExprs = new ArrayList<String>();
> + final String FUNCTION_REGEX = "(\\w+:)?\\w+\\((.+)?\\)";
> + int firstFunction = xpathStr.indexOf("("), lastFunction = xpathStr
> + .lastIndexOf("(");
> + if ((firstFunction > 0 && firstFunction < lastFunction)) {
> + Pattern regex = Pattern.compile(FUNCTION_REGEX);
> + Matcher matcher = regex.matcher(xpathStr);
> +
> + while (matcher.find()) {
> + String function = matcher.group();
> + functionExprs.add(function);
> + }
> + }
> + return functionExprs;
> + }
> +
> + public Map<String, String> getProperties() {
> return _properties;
> }
>
>
> Modified: ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java
> URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java?rev=951527&r1=951526&r2=951527&view=diff
> ==============================================================================
> --- ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java (original)
> +++ ode/branches/APACHE_ODE_1.3.4.X/bpel-compiler/src/test/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImplTest.java Fri Jun 4 18:47:51 2010
> @@ -24,33 +24,32 @@ import java.util.List;
>
> import org.junit.*;
>
> -
> public class XPath20ExpressionCompilerImplTest {
> -
> +
> private static final String TEST_NAMESPACE = "http://www.example.com/";
> private static final String EXTRACT_FUNCTION_EXPRS = "extractFunctionExprs";
>
> @Test
> public void testresolvedFunctionsExpr() throws Exception {
> - XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(TEST_NAMESPACE);
> - final Method[] methods =
> - xp20Exp.getClass().getDeclaredMethods();
> + XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
> + TEST_NAMESPACE);
> + final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
> for (int i = 0; i < methods.length; ++i) {
> if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
> final Object params[] = { "count(count(1))" };
> methods[i].setAccessible(true);
> Object ret = methods[i].invoke(xp20Exp, params);
> List<?> values = (List<?>) ret;
> - Assert.assertEquals(0, values.size());
> + Assert.assertEquals(1, values.size());
> }
> }
> }
> -
> +
> @Test
> public void testTimeStampInFunction() throws Exception {
> - XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(TEST_NAMESPACE);
> - final Method[] methods =
> - xp20Exp.getClass().getDeclaredMethods();
> + XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
> + TEST_NAMESPACE);
> + final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
> for (int i = 0; i < methods.length; ++i) {
> if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
> final Object params[] = { "concat(xs:concat(\"P\", \"08:30:00.000+08:00\"))" };
> @@ -62,25 +61,45 @@ public class XPath20ExpressionCompilerIm
> }
>
> }
> -
> +
> @Test
> public void testresolvedFunctionsTimeStamp() throws Exception {
> - XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(TEST_NAMESPACE);
> - final Method[] methods =
> - xp20Exp.getClass().getDeclaredMethods();
> + XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
> + TEST_NAMESPACE);
> + final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
> + for (int i = 0; i < methods.length; ++i) {
> + if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
> + String multipleFunctions = "concat(current-date() + xs:dayTimeDuration(concat(\"P\", $DAYS_TO_NEXT_REMINDER, \"D\")), \"T\", \"08:30:00.000+08:00\")";
> + final Object params[] = { multipleFunctions };
> + methods[i].setAccessible(true);
> + Object ret = methods[i].invoke(xp20Exp, params);
> + List<?> values = (List<?>) ret;
> + Assert.assertEquals(1, values.size());
> + Assert.assertEquals("Unexpected Function value",
> + multipleFunctions, (String) values.get(0));
> + }
> + }
> + }
> +
> + @Test
> + public void testExtractFunctionsExprs() throws Exception {
> + XPath20ExpressionCompilerImpl xp20Exp = new XPath20ExpressionCompilerImpl(
> + TEST_NAMESPACE);
> + final Method[] methods = xp20Exp.getClass().getDeclaredMethods();
> + String ODE_840 = "bpel:doXslTransform(\"1.0.1/some.xsl\", $Variable.body, \"someParameter\", $OtherVariable.body, \"someParameter2\", $SwsHeaderRQ, \"someParameter3\", true(), \"someXpathParameter\", $XPath)";
> +
> for (int i = 0; i < methods.length; ++i) {
> if (methods[i].getName().equals(EXTRACT_FUNCTION_EXPRS)) {
> - final Object params[] = { "concat(current-date() + xs:dayTimeDuration(concat(\"P\", $DAYS_TO_NEXT_REMINDER, \"D\")), \"T\", \"08:30:00.000+08:00\")" };
> + final Object params[] = { ODE_840 };
> methods[i].setAccessible(true);
> Object ret = methods[i].invoke(xp20Exp, params);
> List<?> values = (List<?>) ret;
> Assert.assertEquals(1, values.size());
> - Assert.assertEquals("Unexpected Function value", "xs:dayTimeDuration(concat(\"P\", $DAYS_TO_NEXT_REMINDER, \"D\"))", (String)values.get(0));
> + Assert.assertEquals("Unexpected Function value", ODE_840,
> + (String) values.get(0));
> }
> }
> +
> }
> -
> -
> -
>
> }
>
>
--
Tammo van Lessen - http://www.taval.de