You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by va...@apache.org on 2013/09/17 01:35:11 UTC

git commit: ODE-380: Message#setHeaderPart should overwrite any previous value Thanks to William McCusker for the patch.

Updated Branches:
  refs/heads/master ed5f024d4 -> d548cc041


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/d548cc04
Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/d548cc04
Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/d548cc04

Branch: refs/heads/master
Commit: d548cc041b76bc0b9b2da91842b2f8c9c52a5963
Parents: ed5f024
Author: Tammo van Lessen <tv...@gmail.com>
Authored: Tue Sep 17 00:17:15 2013 +0200
Committer: Tammo van Lessen <tv...@gmail.com>
Committed: Tue Sep 17 01:34:46 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/d548cc04/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 4cb9895..cbc9ebb 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/d548cc04/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) {
+            
+        }
+    }
+}