ODE-380: Message#setHeaderPart should overwrite any previous value Thanks to William McCusker for the patch.
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/3650fcc1 Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/3650fcc1 Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/3650fcc1 Branch: refs/heads/ode-1.3.6.x Commit: 3650fcc1bae39006a6ebfc0afbac28096a65c970 Parents: daad0b6 Author: Tammo van Lessen <[email protected]> Authored: Tue Sep 17 00:17:15 2013 +0200 Committer: Tammo van Lessen <[email protected]> Committed: Tue Sep 17 00:17:15 2013 +0200 ---------------------------------------------------------------------- .../org/apache/ode/bpel/engine/MessageImpl.java | 33 +++++- .../org/apache/ode/bpel/engine/MessageTest.java | 105 +++++++++++++++++++ 2 files changed, 133 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/3650fcc1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageImpl.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageImpl.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageImpl.java index 72812f4..b8204ab 100644 --- a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageImpl.java +++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageImpl.java @@ -77,8 +77,7 @@ public class MessageImpl implements Message { header = doc.createElement("header"); doc.appendChild(header); } - Element part = header.getOwnerDocument().createElement(name); - header.appendChild(part); + Element part = replaceHeader(name, header); part.appendChild(header.getOwnerDocument().importNode(content, true)); _dao.setHeader(header); } @@ -90,11 +89,33 @@ public class MessageImpl implements Message { header = doc.createElement("header"); doc.appendChild(header); } - Element part = header.getOwnerDocument().createElement(name); - header.appendChild(part); + Element part = replaceHeader(name, header); part.setTextContent(content); _dao.setHeader(header); } + + /** + * Removes any existing header parts with the given name then adds a new + * header part with the new content + * + * @param name + * @param content + * @param header + */ + private Element replaceHeader(String name, Element header) { + NodeList nodeList = header.getChildNodes(); + // remove existing header part + for (int index = 0; index < nodeList.getLength(); index++) { + Node node = nodeList.item(index); + if (node.getNodeType() == Node.ELEMENT_NODE && name.equals(node.getNodeName())) { + header.removeChild(node); + } + } + // add header + Element part = header.getOwnerDocument().createElement(name); + header.appendChild(part); + return part; + } public void setMessage(Element msg) { _dao.setData(msg); @@ -130,7 +151,9 @@ public class MessageImpl implements Message { Element part = (Element) children.item(m); Node node = DOMUtils.findChildByType(part, Node.ELEMENT_NODE); if (node == null) node = DOMUtils.findChildByType(part, Node.TEXT_NODE); - l.put(part.getLocalName(), node); + // Element created with DOM level 1 method createElement(string) + // so getLocalName will alway return null + l.put(part.getNodeName(), node); } } return l; http://git-wip-us.apache.org/repos/asf/ode/blob/3650fcc1/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/MessageTest.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/MessageTest.java b/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/MessageTest.java new file mode 100644 index 0000000..2ba53d0 --- /dev/null +++ b/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/MessageTest.java @@ -0,0 +1,105 @@ +package org.apache.ode.bpel.engine; + +import java.util.Map; + +import javax.xml.namespace.QName; + +import org.apache.ode.bpel.dao.MessageDAO; +import org.apache.ode.bpel.dao.MessageExchangeDAO; +import org.apache.ode.utils.DOMUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import junit.framework.TestCase; +/** + * Tests for org.apache.ode.bpel.iapi.MessageImpl + */ +public class MessageTest extends TestCase { + /** + * Test that setting a header replaces existing header of same name + */ + public void testSetHeaderPart() { + String headerName = "h1"; + MessageDAOMock mock = new MessageDAOMock(); + MessageImpl message = new MessageImpl(mock); + message.setHeaderPart(headerName, "hello"); + + // overwrite existing header + String expected = "bye"; + message.setHeaderPart(headerName, expected); + assertHasHeaders(message, mock, 1, headerName, expected); + + // try setting element content + Document doc = DOMUtils.newDocument(); + Element content = doc.createElement("content"); + content.setTextContent(expected); + message.setHeaderPart(headerName, content); + assertHasHeaders(message, mock, 1, headerName, expected); + + // check children not removed + content.setTextContent(expected); + message.setHeaderPart("content", "testing"); + assertHasHeaders(message, mock, 2, headerName, expected); + Element el = message.getHeaderPart(headerName); + assertTrue("Missing header content",el.getElementsByTagName("content").getLength() == 1); + + // add new header + String newHeader = "h2"; + String newExpected = "why"; + message.setHeaderPart(newHeader, newExpected); + assertHasHeaders(message, mock, 3, newHeader, newExpected); + } + + private static void assertHasHeaders(MessageImpl message, MessageDAOMock mock, int size, String name, String expected) { + Map<String, Node> headers = message.getHeaderParts(); + assertTrue("Expected: "+size+" headers but found: "+headers.size(),headers.size() == size); + assertEquals("Expected header content: "+expected+" but found: "+headers.get(name).getTextContent(),headers.get(name).getTextContent(), expected); + // check underlying document to be sure + Element el = mock.getHeader(); + NodeList list = el.getElementsByTagName(name); + assertTrue("There should only be 1 element in headers for name: "+name, list.getLength() == 1); + } + + /** + * Mock MessageDAO to test simple Message operations + */ + private class MessageDAOMock implements MessageDAO { + Document _doc = null; + Element _header = null; + + public MessageDAOMock() { + _doc = DOMUtils.newDocument(); + _header = _doc.createElement("header"); + } + + public Element getData() { + return null; + } + + public Element getHeader() { + return _header; + } + + public MessageExchangeDAO getMessageExchange() { + return null; + } + + public QName getType() { + return null; + } + + public void setData(Element value) { + + } + + public void setHeader(Element value) { + _header = value; + } + + public void setType(QName type) { + + } + } +}
