Author: gpb
Date: Wed Dec  7 16:26:56 2011
New Revision: 1211512

URL: http://svn.apache.org/viewvc?rev=1211512&view=rev
Log:
ODE-672 - fix insertMissingToData when applied to message part.

Modified:
    
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
    
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
    
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java
    
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
    ode/trunk/bpel-runtime/src/test/resources/xpath20/variables.xml

Modified: 
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java?rev=1211512&r1=1211511&r2=1211512&view=diff
==============================================================================
--- 
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
 (original)
+++ 
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
 Wed Dec  7 16:26:56 2011
@@ -102,7 +102,7 @@ public class XPath20ExpressionModifier {
             return;
         }
 
-        Document document = DOMUtils.toDOMDocument(contextNode);
+        Document document = contextNode.getOwnerDocument();
         PathExpression pathExpr = (PathExpression) subExpr;
         Expression step = pathExpr.getFirstStep();
 

Modified: 
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java?rev=1211512&r1=1211511&r2=1211512&view=diff
==============================================================================
--- 
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
 (original)
+++ 
ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
 Wed Dec  7 16:26:56 2011
@@ -250,7 +250,28 @@ public class XPath20ExpressionRuntime im
             // Create step nodes in XPath in case it is incompletely 
instantiated
             if (oxpath20.insertMissingData) {
                 XPath20ExpressionModifier modifier = new 
XPath20ExpressionModifier(oxpath20.namespaceCtx, ((XPathFactoryImpl) 
_xpf).getConfiguration().getNamePool());
-                modifier.insertMissingData(expr, ctx.getRootNode());
+
+                Node temp = ctx.getRootNode();
+                if (temp.getLocalName().equals("message") && 
temp.getNamespaceURI() == null) {
+                       int startind=xpath.indexOf('.');
+                       int endind=xpath.indexOf('/');
+                       if (startind != -1) {
+                               String part=null;
+                               if (endind != -1) {
+                                       part = xpath.substring(startind+1, 
endind);
+                               } else {
+                                       part = xpath.substring(startind+1);
+                               }
+                               Element 
partElem=DOMUtils.findChildByName((Element)temp,
+                                                                       new 
QName(null, part));
+                               
+                               if (partElem != null && 
partElem.getFirstChild() != null) {
+                                       temp = partElem.getFirstChild();
+                               }
+                       }
+                }
+                
+                modifier.insertMissingData(expr, temp);
             }
             Object evalResult = expr.evaluate(contextNode, type);
             if (evalResult != null && __log.isDebugEnabled()) {

Modified: 
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java?rev=1211512&r1=1211511&r2=1211512&view=diff
==============================================================================
--- 
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java
 (original)
+++ 
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java
 Wed Dec  7 16:26:56 2011
@@ -192,6 +192,20 @@ public class MockCompilerContext impleme
         var.name = name;
         _vars.put(name, var);
     }
+    
+    public void registerMessageTypeVar(String name, QName type, 
java.util.List<String> partNames,
+                                       java.util.List<QName> partTypes) {
+       java.util.List<Part> parts=new java.util.Vector<Part>();
+       for (int i=0; i < partNames.size(); i++) {
+               parts.add(new Part(getOProcess(), partNames.get(i), 
+                               new OElementVarType(getOProcess(), 
partTypes.get(i))));
+       }
+        OMessageVarType varType = new 
OMessageVarType(getOProcess(),type,parts);
+        OScope.Variable var = new OScope.Variable(getOProcess(),varType);
+        var.name = name;
+        _vars.put(name, var);
+    }
+    
     public OExpression compileExpr(String locationstr, NSContext nsContext) {
         // TODO Auto-generated method stub
         return null;

Modified: 
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java?rev=1211512&r1=1211511&r2=1211512&view=diff
==============================================================================
--- 
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
 (original)
+++ 
ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
 Wed Dec  7 16:26:56 2011
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 import java.net.URI;
 import java.net.URL;
@@ -59,6 +60,8 @@ public class XPath20ExpressionRuntimeTes
 
     private MockCompilerContext _cc;
     private Document _vardoc;
+    private Node _rootNode;
+
     public XPath20ExpressionRuntimeTest() {}
 
     @Before
@@ -86,6 +89,41 @@ public class XPath20ExpressionRuntimeTes
                 Element el = (Element)cn;
                 _cc.registerElementVar(name, new 
QName(el.getNamespaceURI(),el.getLocalName()));
                 _vars.put(name,el);
+            } else if (v.getLocalName().equals("messageTypeVar")) {
+                String name = v.getAttribute("name");
+                Node cn = v.getFirstChild();
+                while (cn != null && cn.getNodeType() != Node.ELEMENT_NODE)
+                    cn = cn.getNextSibling();
+                Element el = (Element)cn;
+                
+                java.util.List<String> partNames=new 
java.util.Vector<String>();
+                java.util.List<QName> partTypes=new java.util.Vector<QName>();
+                NodeList nl=el.getChildNodes();
+                
+                for (int j=0; j < nl.getLength(); j++) {
+                       Node partNode=nl.item(j);
+                       if (partNode instanceof Element) {
+                               partNames.add(partNode.getLocalName());
+                               
+                               partNode.normalize();
+                               
+                               Node body=((Element)partNode).getFirstChild();
+                               
+                               while (body != null && (body instanceof 
Element) == false) {
+                                       body = body.getNextSibling();
+                               }
+                               
+                               if (body != null) {
+                                       QName partType=new 
QName(((Element)body).getNamespaceURI(),
+                                                       
((Element)body).getLocalName());
+                                       partTypes.add(partType);
+                               }
+                       }
+                }
+                
+                _cc.registerMessageTypeVar(name, new 
QName(el.getNamespaceURI(),el.getLocalName()),
+                                               partNames, partTypes);
+                _vars.put(name,el);
             }
         }
     }
@@ -141,6 +179,58 @@ public class XPath20ExpressionRuntimeTes
         assertEquals("Unexpected root node", "variables", 
retVal.getNodeName());
     }
     
+    @Test
+    public void testMessageTypeVariableSelection() throws Exception {
+        OXPath20ExpressionBPEL20 exp = compile("$messageVar.parameters");
+        Node retVal = _runtime.evaluateNode(exp, this);
+        assertNotNull(retVal);
+        assertSame(retVal , _vars.get("messageVar"));
+        assertSame(retVal.getOwnerDocument(),_vardoc);
+    }
+
+    @Test
+    public void testMessageInsertMissingData() throws Exception {
+       String insertElementName="InsertedNode";
+       
+        OXPath20ExpressionBPEL20 exp = 
compile("$messageVar.parameters/"+insertElementName);
+        exp.insertMissingData = true;
+        
+        // Setup root node
+        _rootNode = DOMUtils.stringToDOM("<message><parameters>" +
+                       "<tns:ApplicationData 
xmlns:tns=\"http://foobar\"/></parameters></message>");
+        
+        java.util.List<?> list = _runtime.evaluate(exp, this);
+        
+        if (list == null || list.size() != 0) {
+               fail("List should have no elements");
+        }
+        
+        if 
(((Element)_rootNode).getElementsByTagName(insertElementName).getLength() != 1) 
{
+               fail("Missing '"+insertElementName+"' element has not been 
inserted");
+        }
+    }
+    
+    @Test
+    public void testVariableInsertMissingData() throws Exception {
+       String insertElementName="InsertedNode";
+       
+        OXPath20ExpressionBPEL20 exp = 
compile("$reallyEmptyVar/"+insertElementName);
+        exp.insertMissingData = true;
+        
+        // Setup root node
+        _rootNode = DOMUtils.stringToDOM("<tns:ApplicationData 
xmlns:tns=\"http://foobar\"/>");
+        
+        java.util.List<?> list = _runtime.evaluate(exp, this);
+        
+        if (list == null || list.size() != 0) {
+               fail("List should have no elements");
+        }
+        
+        if 
(((Element)_rootNode).getElementsByTagName(insertElementName).getLength() != 1) 
{
+               fail("Missing '"+insertElementName+"' element has not been 
inserted");
+        }
+    }
+
     public Node readVariable(Variable variable, Part part) throws 
FaultException {
         return _vars.get(variable.name);
     }
@@ -161,8 +251,7 @@ public class XPath20ExpressionRuntimeTes
     }
 
     public Node getRootNode() {
-        // TODO Auto-generated method stub
-        return null;
+        return _rootNode;
     }
 
     public Node evaluateQuery(Node root, OExpression expr) throws 
FaultException {

Modified: ode/trunk/bpel-runtime/src/test/resources/xpath20/variables.xml
URL: 
http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/test/resources/xpath20/variables.xml?rev=1211512&r1=1211511&r2=1211512&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/test/resources/xpath20/variables.xml (original)
+++ ode/trunk/bpel-runtime/src/test/resources/xpath20/variables.xml Wed Dec  7 
16:26:56 2011
@@ -61,5 +61,14 @@
                              </tns:PaymentInfo>
                          </tns:ApplicationData>
 
-    </elementVar>
+       </elementVar>
+       
+       <messageTypeVar name="messageVar"  xmlns:tns="http://foobar"; >
+               <tns:ExampleMessage>
+                       <parameters>
+                                       <tns:ApplicationData/>
+                       </parameters>
+               </tns:ExampleMessage>
+       </messageTypeVar>
+
 </variables>
\ No newline at end of file


Reply via email to