ode-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tammo van Lessen <tvanles...@gmail.com>
Subject 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/
Date Mon, 07 Jun 2010 13:16:49 GMT
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

Mime
View raw message