Author: hiranya
Date: Fri Jul 19 23:30:23 2013
New Revision: 1505064

URL: http://svn.apache.org/r1505064
Log:
Applying the patch for SYNAPSE-841. Adding support for complex XML blocks in 
the header mediator.

Modified:
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
    
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java?rev=1505064&r1=1505063&r2=1505064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
 Fri Jul 19 23:30:23 2013
@@ -28,6 +28,7 @@ import org.apache.synapse.mediators.tran
 import org.jaxen.JaxenException;
 
 import javax.xml.namespace.QName;
+import java.util.Iterator;
 import java.util.Properties;
 
 /**
@@ -57,9 +58,11 @@ public class HeaderMediatorFactory exten
         OMAttribute action = elem.getAttribute(ATT_ACTION);
 
         if (name == null || name.getAttributeValue() == null) {
-            String msg = "A valid name attribute is required for the header 
mediator";
-            log.error(msg);
-            throw new SynapseException(msg);
+            if (elem.getChildElements() == null || 
!elem.getChildElements().hasNext()) {
+                String msg = "A valid name attribute is required for the 
header mediator";
+                log.error(msg);
+                throw new SynapseException(msg);
+            }
         } else {
             String nameAtt = name.getAttributeValue();
             int colonPos = nameAtt.indexOf(":");
@@ -101,7 +104,7 @@ public class HeaderMediatorFactory exten
         }
 
         if (headerMediator.getAction() == HeaderMediator.ACTION_SET &&
-            value == null && exprn == null) {
+                value == null && exprn == null && 
!headerMediator.isImplicit()) {
             handleException("A 'value' or 'expression' attribute is required 
for a [set] " +
                     "header mediator");
         }
@@ -115,8 +118,17 @@ public class HeaderMediatorFactory exten
             } catch (JaxenException je) {
                 handleException("Invalid XPath expression : " + 
exprn.getAttributeValue());
             }
+        } else if (headerMediator.isImplicit()) { // we have an implicit, non 
standard header
+            Iterator i = elem.getChildElements();
+            if (i == null) {
+                handleException("A non standard header with both value and 
expression null must " +
+                        "contain an embedded XML definition.");
+                return null;
+            }
+            while (i.hasNext()) {
+                headerMediator.addEmbeddedXml((OMElement) i.next());
+            }
         }
-
         return headerMediator;
     }
 

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java?rev=1505064&r1=1505063&r2=1505064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
 Fri Jul 19 23:30:23 2013
@@ -36,6 +36,7 @@ public class HeaderMediatorSerializer ex
 
         if (!(m instanceof HeaderMediator)) {
             handleException("Unsupported mediator passed in for serialization 
: " + m.getType());
+            return null;
         }
 
         HeaderMediator mediator = (HeaderMediator) m;
@@ -75,6 +76,11 @@ public class HeaderMediatorSerializer ex
             }
         }
 
+        if (mediator.hasEmbeddedXml()) {
+            for (OMElement e : mediator.getEmbeddedXml()) {
+                header.addChild(e);
+            }
+        }
         return header;
     }
 

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java?rev=1505064&r1=1505063&r2=1505064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
 Fri Jul 19 23:30:23 2013
@@ -33,6 +33,7 @@ import org.apache.synapse.mediators.Abst
 import org.apache.synapse.util.xpath.SynapseXPath;
 
 import javax.xml.namespace.QName;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -53,6 +54,8 @@ public class HeaderMediator extends Abst
     private String value = null;
     /** Set the header (ACTION_SET) or remove it (ACTION_REMOVE). Defaults to 
ACTION_SET */
     private int action = ACTION_SET;
+    /** Optional embedded XML content of the header element */
+    private List<OMElement> embeddedXmlContent = new ArrayList<OMElement>();
     /** An expression which should be evaluated, and the result set as the 
header value */
     private SynapseXPath expression = null;
 
@@ -83,7 +86,7 @@ public class HeaderMediator extends Abst
                 synLog.traceOrDebug("Set SOAP header : " + qName + " to : " + 
value);
             }
 
-            if (qName.getNamespaceURI() == null || 
"".equals(qName.getNamespaceURI())) {
+            if (!isImplicit() && (qName.getNamespaceURI() == null || 
"".equals(qName.getNamespaceURI()))) {
 
                 // is this a "well known" Synapse header?
                 if (SynapseConstants.HEADER_TO.equals(qName.getLocalPart())) {
@@ -160,9 +163,15 @@ public class HeaderMediator extends Abst
         }
         SOAPFactory fac = (SOAPFactory) env.getOMFactory();
         SOAPHeader header = env.getOrCreateHeader();
-        SOAPHeaderBlock hb = header.addHeaderBlock(qName.getLocalPart(),
-                fac.createOMNamespace(qName.getNamespaceURI(), 
qName.getPrefix()));
-        hb.setText(value);
+        if (!isImplicit()) {
+            SOAPHeaderBlock hb = header.addHeaderBlock(qName.getLocalPart(),
+                    fac.createOMNamespace(qName.getNamespaceURI(), 
qName.getPrefix()));
+            hb.setText(value);
+        } else if (hasEmbeddedXml()) {
+            for (OMElement e : embeddedXmlContent) {
+                header.addChild(e);
+            }
+        }
     }
 
     private void removeFromHeaderList(List headersList) {
@@ -184,6 +193,24 @@ public class HeaderMediator extends Abst
         }
     }
 
+    public List<OMElement> getEmbeddedXml() {
+        return embeddedXmlContent;
+    }
+
+    public void addEmbeddedXml(OMElement element) {
+        if (element != null && !embeddedXmlContent.contains(element)) {
+            embeddedXmlContent.add(element);
+        }
+    }
+
+    public boolean hasEmbeddedXml() {
+        return !embeddedXmlContent.isEmpty();
+    }
+
+    public boolean isImplicit() {
+        return getQName() == null;
+    }
+
     public int getAction() {
         return action;
     }

Modified: 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java?rev=1505064&r1=1505063&r2=1505064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java
 Fri Jul 19 23:30:23 2013
@@ -20,12 +20,16 @@
 package org.apache.synapse.mediators.transform;
 
 import junit.framework.TestCase;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.util.AXIOMUtil;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseConstants;
+import org.apache.synapse.config.xml.HeaderMediatorFactory;
 import org.apache.synapse.mediators.TestUtils;
 import org.apache.synapse.util.xpath.SynapseXPath;
 
 import javax.xml.namespace.QName;
+import java.util.Properties;
 
 public class HeaderMediatorTest extends TestCase {
 
@@ -86,4 +90,34 @@ public class HeaderMediatorTest extends 
             // This is expected
         }
     }
+
+    public void testEmbeddedXml() throws Exception {
+        String simpleHeader = "<header name=\"m:simpleHeader\" value=\"Simple 
Header\" xmlns:m=\"http://org.synapse.example\"/>";
+        String complexHeader = "<header><m:complexHeader 
xmlns:m=\"http://org.synapse.example\";><property key=\"k1\" 
value=\"v1\"/><property key=\"k2\" value=\"v2\"/></m:complexHeader></header>";
+        String removeHeader = "<header name=\"m:complexHeader\" 
action=\"remove\" xmlns:m=\"http://org.synapse.example\"/>";
+
+        HeaderMediatorFactory fac = new HeaderMediatorFactory();
+        // Adding headers.
+        MessageContext synCtx = TestUtils.getTestContext("<empty/>");
+        HeaderMediator headerMediator = (HeaderMediator) fac.createMediator(
+                AXIOMUtil.stringToOM(simpleHeader), new Properties());
+        headerMediator.mediate(synCtx);
+        OMElement result = synCtx.getEnvelope().getHeader().getFirstElement();
+        assertEquals("simpleHeader", result.getLocalName());
+
+        headerMediator = (HeaderMediator) fac.createMediator(
+                AXIOMUtil.stringToOM(complexHeader), new Properties());
+        headerMediator.mediate(synCtx);
+        result = synCtx.getEnvelope().getHeader().getFirstChildWithName(
+                new QName("http://org.synapse.example";, "complexHeader"));
+        assertNotNull(result);
+
+        // Removing headers.
+        headerMediator = (HeaderMediator) fac.createMediator(
+                AXIOMUtil.stringToOM(removeHeader), new Properties());
+        headerMediator.mediate(synCtx);
+        result = synCtx.getEnvelope().getHeader().getFirstChildWithName(
+                new QName("http://org.synapse.example";, "complexHeader"));
+        assertNull(result);
+    }
 }


Reply via email to