Karolis Petrauskas' patch for ODE-664 applied. Some testcases fixed accordingly.
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/ce94ea8f Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/ce94ea8f Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/ce94ea8f Branch: refs/heads/ode-1.3.6.x Commit: ce94ea8f7f98551185df169c6960963023b18735 Parents: 4891521 Author: Tammo van Lessen <[email protected]> Authored: Wed May 22 10:10:25 2013 +0200 Committer: Tammo van Lessen <[email protected]> Committed: Wed May 22 10:31:13 2013 +0200 ---------------------------------------------------------------------- .../src/main/java/org/apache/ode/il/OMUtils.java | 30 ++++++++++++++- .../java/org/apache/ode/bpel/runtime/ASSIGN.java | 29 +++++++++----- .../bpel/2.0/ExtVar-GenKey/test.properties | 2 +- .../2.0/TestInsertMissingData/test1.properties | 2 +- .../bpel/2.0/TestSubTreeAssign/test1.properties | 2 +- .../bpel/2.0/TestXPathNamespace1/test1.properties | 2 +- .../main/java/org/apache/ode/utils/DOMUtils.java | 25 ++++++++++++ 7 files changed, 75 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/bpel-epr/src/main/java/org/apache/ode/il/OMUtils.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/OMUtils.java b/bpel-epr/src/main/java/org/apache/ode/il/OMUtils.java index 1a20bda..0f238b1 100644 --- a/bpel-epr/src/main/java/org/apache/ode/il/OMUtils.java +++ b/bpel-epr/src/main/java/org/apache/ode/il/OMUtils.java @@ -35,6 +35,8 @@ import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.om.OMNode; import org.apache.axiom.om.OMText; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.NSContext; import org.w3c.dom.Attr; @@ -52,6 +54,8 @@ import org.xml.sax.InputSource; */ public class OMUtils { + private static Log __log = LogFactory.getLog(OMUtils.class); + public static OMElement getFirstChildWithName(OMElement parent, String name) { if (parent == null) throw new IllegalArgumentException("null parent"); @@ -74,12 +78,32 @@ public class OMUtils { @SuppressWarnings("unchecked") public static Element toDOM(OMElement element, Document doc, boolean deepNS) { - final Element domElement = doc.createElementNS(element.getQName().getNamespaceURI(), element.getQName().getLocalPart()); + // + // Fix regarding lost qnames on response of invoke activity: + // * copy an element including its prefix. + // * add all namespase attributes. + // + String domElementNsUri = element.getQName().getNamespaceURI(); + String domElementQName; + if (element.getQName().getPrefix() == null || element.getQName().getPrefix().trim().length() == 0) { + domElementQName = element.getQName().getLocalPart(); + } else { + domElementQName = element.getQName().getPrefix() + ":" + element.getQName().getLocalPart(); + } + if (__log.isTraceEnabled()) + __log.trace("toDOM: creating element with nsUri=" + domElementNsUri + + " qname=" + domElementQName + + " from omElement, name=" + element.getLocalName()); + + final Element domElement = doc.createElementNS( + domElementNsUri, + domElementQName); + if (deepNS) { NSContext nscontext = new NSContext(); buildNScontext(nscontext, element); - DOMUtils.injectNamespaces(domElement,nscontext); + DOMUtils.injectNamespacesWithAllPrefixes(domElement,nscontext); } else { if (element.getAllDeclaredNamespaces() != null) { for (Iterator<OMNamespace> i = element.getAllDeclaredNamespaces(); i.hasNext(); ) { @@ -92,6 +116,8 @@ public class OMUtils { } } + if (__log.isTraceEnabled()) + __log.trace("toDOM: created root element (deepNS=" + deepNS + "): " + DOMUtils.domToString(domElement)); for (Iterator i = element.getAllAttributes(); i.hasNext();) { final OMAttribute attr = (OMAttribute) i.next(); http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java index 3a50599..d2a69e5 100644 --- a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java +++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java @@ -60,6 +60,7 @@ import java.net.URI; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.Map; /** * Assign activity run-time template. @@ -222,6 +223,22 @@ class ASSIGN extends ACTIVITY { OExpression expr = ((OAssign.Expression) from).expression; try { l = getBpelRuntimeContext().getExpLangRuntime().evaluate(expr, getEvaluationContext()); + if (l.size() == 0 || l.get(0) == null || !(l.get(0) instanceof Element)) { + if (__log.isTraceEnabled()) { + __log.trace("evalRValue: OAssign.Expression: eval reult not Element or node=null"); + } + } else { + Element element = (Element)l.get(0); + for (Map.Entry<String, String> entry : DOMUtils.getMyNSContext(element).toMap().entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (entry.getKey() == null || entry.getKey().length() == 0) { + element.setAttributeNS(DOMUtils.NS_URI_XMLNS, "xmlns", value); + } else { + element.setAttributeNS(DOMUtils.NS_URI_XMLNS, "xmlns:" + key, value); + } + } + } } catch (EvaluationException e) { String msg = __msgs.msgEvalException(from.toString(), e.getMessage()); if (__log.isDebugEnabled()) __log.debug(from + ": " + msg); @@ -504,17 +521,7 @@ class ASSIGN extends ACTIVITY { NamedNodeMap attrs = src.getAttributes(); for (int i = 0; i < attrs.getLength(); ++i) { Attr attr = (Attr)attrs.item(i); - if (!attr.getName().startsWith("xmlns")) { - replacement.setAttributeNodeNS((Attr)doc.importNode(attrs.item(i), true)); - // Case of qualified attribute values, we're forced to add corresponding namespace declaration manually - int colonIdx = attr.getValue().indexOf(":"); - if (colonIdx > 0) { - String prefix = attr.getValue().substring(0, colonIdx); - String attrValNs = src.lookupPrefix(prefix); - if (attrValNs != null) - replacement.setAttributeNS(DOMUtils.NS_URI_XMLNS, "xmlns:"+ prefix, attrValNs); - } - } + replacement.setAttributeNodeNS((Attr)doc.importNode(attr, true)); } parent.replaceChild(replacement, ptr); DOMUtils.copyNSContext(ptr, replacement); http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/bpel-test/src/test/resources/bpel/2.0/ExtVar-GenKey/test.properties ---------------------------------------------------------------------- diff --git a/bpel-test/src/test/resources/bpel/2.0/ExtVar-GenKey/test.properties b/bpel-test/src/test/resources/bpel/2.0/ExtVar-GenKey/test.properties index fa819a7..e5b57dc 100644 --- a/bpel-test/src/test/resources/bpel/2.0/ExtVar-GenKey/test.properties +++ b/bpel-test/src/test/resources/bpel/2.0/ExtVar-GenKey/test.properties @@ -19,5 +19,5 @@ namespace=http://example.com/process/ExtVar/GenKey service=TestService operation=Start request1=<message><body><tns:StartRequest xmlns:tns="http://example.com/process/ExtVar/GenKey">foo</tns:StartRequest></body></message> -response1=.*><this:keyString xmlns:this="http://example.com/process/ExtVar/GenKey">1</this:keyString><this:stringCol xmlns:this="http://example.com/process/ExtVar/GenKey">foo</this:stringCol>.* +response1=.*xmlns:this="http://example.com/process/ExtVar/GenKey" xmlns:tns="http://example.com/process/ExtVar/GenKey"><this:keyString>1</this:keyString><this:stringCol>foo</this:stringCol>.* http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties ---------------------------------------------------------------------- diff --git a/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties b/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties index c0de3b4..7a92158 100644 --- a/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties +++ b/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties @@ -19,4 +19,4 @@ namespace=http://ode/bpel/unit-test/TestInsertMissingData.wsdl service=TestInsertMissingDataService operation=request request1=<message><requestMessageData><ens:aTestMessage xmlns:ens="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types"><requestID>Start InsertMissingData</requestID><requestText>Event InsertMissingData</requestText><typeIndicators xmlns:foo="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types"><foo:indicatorOne>fail</foo:indicatorOne><foo:indicatorTwo>fail</foo:indicatorTwo></typeIndicators></ens:aTestMessage></requestMessageData></message> -response1=.*<replyID>Start InsertMissingData</replyID><replyText>pass</replyText>.* +response1=.*<replyID xmlns:ens="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types">Start InsertMissingData</replyID><replyText>pass</replyText>.* http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/bpel-test/src/test/resources/bpel/2.0/TestSubTreeAssign/test1.properties ---------------------------------------------------------------------- diff --git a/bpel-test/src/test/resources/bpel/2.0/TestSubTreeAssign/test1.properties b/bpel-test/src/test/resources/bpel/2.0/TestSubTreeAssign/test1.properties index fa47211..64d8a4f 100644 --- a/bpel-test/src/test/resources/bpel/2.0/TestSubTreeAssign/test1.properties +++ b/bpel-test/src/test/resources/bpel/2.0/TestSubTreeAssign/test1.properties @@ -19,4 +19,4 @@ namespace=http://ode/bpel/unit-test/TestSubTreeAssign.wsdl service=TestSubTreeAssignService operation=request request1=<message><requestMessageData><ens:aTestMessage xmlns:ens="http://ode/bpel/unit-test/TestSubTreeAssign.wsdl.types"><requestID>Start SubTreeAssign</requestID><requestText>Event SubTreeAssign</requestText><typeIndicators xmlns:foo="http://ode/bpel/unit-test/TestSubTreeAssign.wsdl.types"><foo:indicatorOne>fail</foo:indicatorOne><foo:indicatorTwo>fail</foo:indicatorTwo></typeIndicators></ens:aTestMessage></requestMessageData></message> -response1=.*<replyID>Start SubTreeAssign</replyID><replyText>pass</replyText>.* +response1=.*<replyID xmlns:ens="http://ode/bpel/unit-test/TestSubTreeAssign.wsdl.types">Start SubTreeAssign</replyID><replyText xmlns:ens="http://ode/bpel/unit-test/TestSubTreeAssign.wsdl.types" xmlns:foo="http://ode/bpel/unit-test/TestSubTreeAssign.wsdl.types">pass</replyText>.* http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/bpel-test/src/test/resources/bpel/2.0/TestXPathNamespace1/test1.properties ---------------------------------------------------------------------- diff --git a/bpel-test/src/test/resources/bpel/2.0/TestXPathNamespace1/test1.properties b/bpel-test/src/test/resources/bpel/2.0/TestXPathNamespace1/test1.properties index 9faff4d..bc4f69d 100644 --- a/bpel-test/src/test/resources/bpel/2.0/TestXPathNamespace1/test1.properties +++ b/bpel-test/src/test/resources/bpel/2.0/TestXPathNamespace1/test1.properties @@ -19,4 +19,4 @@ namespace=http://ode/bpel/unit-test/TestXPathNamespace1.wsdl service=TestXPathNamespace1Service operation=request request1=<message><requestMessageData><requestID>Start TestXPathNamespace1</requestID><requestText>Event TestXPathNamespace1</requestText><typeIndicators xmlns:foo="http://ode/bpel/unit-test/TestXPathNamespace1.wsdl.footypes"><foo:indicatorOne>pass</foo:indicatorOne><foo:indicatorTwo>pass</foo:indicatorTwo></typeIndicators></requestMessageData></message> -response1=.*<replyID>Start TestXPathNamespace1</replyID><replyText>pass</replyText>.* +response1=.*<replyID>Start TestXPathNamespace1</replyID><replyText xmlns:foo="http://ode/bpel/unit-test/TestXPathNamespace1.wsdl.footypes">pass</replyText>.* http://git-wip-us.apache.org/repos/asf/ode/blob/ce94ea8f/utils/src/main/java/org/apache/ode/utils/DOMUtils.java ---------------------------------------------------------------------- diff --git a/utils/src/main/java/org/apache/ode/utils/DOMUtils.java b/utils/src/main/java/org/apache/ode/utils/DOMUtils.java index 58bb2d2..a9d30de 100644 --- a/utils/src/main/java/org/apache/ode/utils/DOMUtils.java +++ b/utils/src/main/java/org/apache/ode/utils/DOMUtils.java @@ -837,6 +837,31 @@ public class DOMUtils { } } + /** + * Adds namespaces including all prefixes. + * This is needed for correct handling of xsi:type attributes. + * @param domElement An element wi which the namespace attributes should be added. + * @param nscontext A namespace context. + * @author k.petrauskas + */ + public static void injectNamespacesWithAllPrefixes(Element domElement, NSContext nscontext) { + if (__log.isDebugEnabled()) + __log.debug("injectNamespacesWithAllPrefixes: element=" + domToString(domElement) + " nscontext=" + nscontext); + for (Map.Entry<String, String> entry : nscontext.toMap().entrySet()) { + String prefix = entry.getKey(); + String uri = entry.getValue(); + if (prefix == null || "".equals(prefix)) + domElement.setAttributeNS(DOMUtils.NS_URI_XMLNS, "xmlns", uri); + else + domElement.setAttributeNS(DOMUtils.NS_URI_XMLNS, "xmlns:"+ prefix, uri); + + if (__log.isDebugEnabled()) + __log.debug("injectNamespacesWithAllPrefixes: added namespace: prefix=\"" + prefix + "\" uri=\"" + uri + "\""); + } + if (__log.isDebugEnabled()) + __log.debug("injectNamespacesWithAllPrefixes: result: element=" + domToString(domElement)); + } + public static void copyNSContext(Element source, Element dest) { Map<String, String> sourceNS = getParentNamespaces(source); sourceNS.putAll(getMyNamespaces(source));
