Author: karthick
Date: Fri Jan 23 14:20:40 2009
New Revision: 737207

URL: http://svn.apache.org/viewvc?rev=737207&view=rev
Log:
ODE-498 Compile all XPath variable references, no matter where they appear.

Modified:
    
ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
    
ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity2/TestAssign.bpel

Modified: 
ode/branches/APACHE_ODE_1.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.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java?rev=737207&r1=737206&r2=737207&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/elang/xpath20/compiler/XPath20ExpressionCompilerImpl.java
 Fri Jan 23 14:20:40 2009
@@ -19,7 +19,9 @@
 
 package org.apache.ode.bpel.elang.xpath20.compiler;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.xml.namespace.QName;
@@ -30,6 +32,7 @@
 import javax.xml.xpath.XPathFactory;
 import javax.xml.xpath.XPathFactoryConfigurationException;
 
+import net.sf.saxon.om.Name11Checker;
 import net.sf.saxon.om.NamespaceConstant;
 import net.sf.saxon.xpath.XPathEvaluator;
 import net.sf.saxon.xpath.XPathFactoryImpl;
@@ -147,14 +150,22 @@
             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); 
+               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 
+               }
+            }
         } catch (XPathFactoryConfigurationException xpfce) {
             __log.debug(xpfce);
             __log.info("Couldn't validate properly expression " + xpathStr);
@@ -170,7 +181,54 @@
         }
     }
 
-    public Map<String, String> getProperties() {
+    /**
+     * 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.
+     *  
+     * @param xpathStr
+     * @return list of variable expressions that may not have been resolved 
properly
+     */
+    private List<String> extractVariableExprs(String xpathStr) {       
+               ArrayList<String> variableExprs = new ArrayList<String>();
+               if (xpathStr.indexOf("$") > 0 && // the xpath references a 
variable
+                               xpathStr.indexOf("(") > 0) { // the xpath 
contains a function
+                       // most likely, the variable reference has not been 
resolved, so make that happen
+                       StringBuffer variableExpr = new StringBuffer();
+                       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);
+                                               if (index == xpathStr.length() 
|| 
+                                                               
!nameChecker.isQName(variableExpr.substring(1))) {
+                                                       variable = false;
+                                                       
variableExpr.setLength(variableExpr.length() - 1);
+                                                       
variableExprs.add(variableExpr.toString());
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return variableExprs;
+       }
+
+       public Map<String, String> getProperties() {
         return _properties;
     }
 

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity2/TestAssign.bpel
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity2/TestAssign.bpel?rev=737207&r1=737206&r2=737207&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity2/TestAssign.bpel
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity2/TestAssign.bpel
 Fri Jan 23 14:20:40 2009
@@ -43,6 +43,7 @@
         <variable name="myVar" messageType="test:TestAssignMessage"/>
         <variable name="otherMsgVar" messageType="test:TestAssignMessage"/>
         <variable name="strVar" type="xsd:string"/>
+        <variable name="txtVar" type="xsd:string"/>
         <variable name="intVar" type="xsd:int"/>
     </variables>
 
@@ -77,6 +78,22 @@
                 <to>$otherMsgVar.TestPart</to>
             </copy>
         </assign>
+
+        <assign name="assign2">
+            <copy>
+                <from><literal>1</literal></from>
+                <to variable="intVar"/>
+            </copy>
+            <copy>
+                
<from>ode:process-property("dd:epr")/addr:EndpointReference/child::node()[position()=$intVar]</from>
+                <to variable="strVar"/>
+            </copy>
+            <copy>
+                
<from>ode:process-property("dd:epr")/addr:EndpointReference/child::node()[$intVar]</from>
+                <to variable="strVar"/>
+            </copy>
+        </assign>
+
         <reply name="end" partnerLink="TestAssignPartnerLink" 
portType="test:TestAssignPortType"
                operation="testAssign" variable="otherMsgVar"/>
     </sequence>


Reply via email to