Hi guys, Dave's first commit! Welcome on board!
Tammo On 04.06.2010 20:47, [email protected] 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
