Author: objectiser
Date: 2011-12-06 11:07:49 -0500 (Tue, 06 Dec 2011)
New Revision: 1479
Modified:
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/resources/xpath20/variables.xml
Log:
Fix for RIFTSAW-301/ODE-672 - issue with insertMissingToData when using a message with
parts.
Modified:
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
===================================================================
---
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java 2011-12-06
16:07:12 UTC (rev 1478)
+++
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java 2011-12-06
16:07:49 UTC (rev 1479)
@@ -102,7 +102,7 @@
return;
}
- Document document = DOMUtils.toDOMDocument(contextNode);
+ Document document = contextNode.getOwnerDocument();
PathExpression pathExpr = (PathExpression) subExpr;
Expression step = pathExpr.getFirstStep();
Modified:
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
===================================================================
---
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java 2011-12-06
16:07:12 UTC (rev 1478)
+++
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java 2011-12-06
16:07:49 UTC (rev 1479)
@@ -250,7 +250,28 @@
// 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:
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java
===================================================================
---
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java 2011-12-06
16:07:12 UTC (rev 1478)
+++
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java 2011-12-06
16:07:49 UTC (rev 1479)
@@ -192,6 +192,20 @@
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:
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
===================================================================
---
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java 2011-12-06
16:07:12 UTC (rev 1478)
+++
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java 2011-12-06
16:07:49 UTC (rev 1479)
@@ -50,6 +50,8 @@
private MockCompilerContext _cc;
private Document _vardoc;
+ private Node _rootNode;
+
public XPath20ExpressionRuntimeTest() {}
@Override
@@ -77,6 +79,41 @@
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);
}
}
}
@@ -109,6 +146,55 @@
assertNull(DOMUtils.getFirstChildElement((Element)retVal));
}
+ 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);
+ }
+
+ 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");
+ }
+ }
+
+ 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);
}
@@ -129,8 +215,7 @@
}
public Node getRootNode() {
- // TODO Auto-generated method stub
- return null;
+ return _rootNode;
}
public Node evaluateQuery(Node root, OExpression expr) throws FaultException {
Modified:
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/resources/xpath20/variables.xml
===================================================================
---
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/resources/xpath20/variables.xml 2011-12-06
16:07:12 UTC (rev 1478)
+++
branches/ODE/RiftSaw-ODE-trunk/bpel-runtime/src/test/resources/xpath20/variables.xml 2011-12-06
16:07:49 UTC (rev 1479)
@@ -62,4 +62,13 @@
</tns:ApplicationData>
</elementVar>
+
+ <messageTypeVar name="messageVar" xmlns:tns="http://foobar"
>
+ <tns:ExampleMessage>
+ <parameters>
+ <tns:ApplicationData/>
+ </parameters>
+ </tns:ExampleMessage>
+ </messageTypeVar>
+
</variables>
\ No newline at end of file