Author: asankha
Date: Sun Nov 19 11:00:41 2006
New Revision: 476882

URL: http://svn.apache.org/viewvc?view=rev&rev=476882
Log:
fix the header mediator to properly support removal of headers based on a QName 
i.e. switched the
internal name of the header from a string to a QName

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

Modified: 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java?view=diff&rev=476882&r1=476881&r2=476882
==============================================================================
--- 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
 (original)
+++ 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
 Sun Nov 19 11:00:41 2006
@@ -21,6 +21,7 @@
 
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.xpath.AXIOMXPath;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -30,6 +31,7 @@
 import org.jaxen.JaxenException;
 
 import javax.xml.namespace.QName;
+import java.util.Iterator;
 
 /**
  * This builds a Header Mediator parsing the XML configuration supplied
@@ -63,7 +65,23 @@
             log.error(msg);
             throw new SynapseException(msg);
         } else {
-            headerMediator.setName(name.getAttributeValue());
+            String nameAtt = name.getAttributeValue();
+            int colonPos = nameAtt.indexOf(":");
+            if (colonPos != -1) {
+                // has a NS prefix.. find it and the NS it maps into
+                String prefix = nameAtt.substring(0, colonPos);
+                Iterator it = elem.getAllDeclaredNamespaces();
+                while (it.hasNext()) {
+                    OMNamespace n = (OMNamespace) it.next();
+                    if (prefix.equals(n.getPrefix())) {
+                        headerMediator.setQName(
+                            new QName(n.getNamespaceURI(), 
nameAtt.substring(colonPos+1)));
+                    }
+                }
+            } else {
+                // no prefix
+                headerMediator.setQName(new QName(nameAtt));
+            }
         }
 
         // The action attribute is optional, if provided and equals to 
'remove' the
@@ -72,8 +90,9 @@
             headerMediator.setAction(HeaderMediator.ACTION_REMOVE);
         }
 
-        if (value == null && exprn == null) {
-            String msg = "A 'value' or 'expression' attribute is required for 
a header mediator";
+        if (headerMediator.getAction() == HeaderMediator.ACTION_SET &&
+            value == null && exprn == null) {
+            String msg = "A 'value' or 'expression' attribute is required for 
a [set] header mediator";
             log.error(msg);
             throw new SynapseException(msg);
         }
@@ -91,11 +110,6 @@
                 log.error(msg);
                 throw new SynapseException(msg, je);
             }
-            
-        } else {
-            String msg = "Invalid attribute value for the attribute 
'expression' or 'value'";
-            log.error(msg);
-            throw new SynapseException(msg);
         }
 
         return headerMediator;

Modified: 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java?view=diff&rev=476882&r1=476881&r2=476882
==============================================================================
--- 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
 (original)
+++ 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorSerializer.java
 Sun Nov 19 11:00:41 2006
@@ -26,6 +26,8 @@
 import org.apache.synapse.Mediator;
 import org.apache.synapse.mediators.transform.HeaderMediator;
 
+import javax.xml.namespace.QName;
+
 /**
  * Set header
  *   <pre>
@@ -50,9 +52,16 @@
         HeaderMediator mediator = (HeaderMediator) m;
         OMElement header = fac.createOMElement("header", synNS);
 
-        if (mediator.getName() != null) {
-            header.addAttribute(fac.createOMAttribute(
-                "name", nullNS, mediator.getName()));
+        QName qName = mediator.getQName();
+        if (qName != null) {
+            if (qName.getNamespaceURI() != null) {
+                header.addAttribute(fac.createOMAttribute(
+                    "name", nullNS, qName.getPrefix() + ":" + 
qName.getLocalPart()));
+                header.declareNamespace(qName.getPrefix(), 
qName.getNamespaceURI());
+            } else {
+                header.addAttribute(fac.createOMAttribute(
+                    "name", nullNS, qName.getLocalPart()));
+            }
         }
 
         if (mediator.getAction() == HeaderMediator.ACTION_REMOVE) {

Modified: 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java?view=diff&rev=476882&r1=476881&r2=476882
==============================================================================
--- 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
 (original)
+++ 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/HeaderMediator.java
 Sun Nov 19 11:00:41 2006
@@ -20,6 +20,7 @@
 package org.apache.synapse.mediators.transform;
 
 import org.apache.axiom.om.xpath.AXIOMXPath;
+import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.*;
@@ -27,14 +28,16 @@
 import org.apache.synapse.mediators.AbstractMediator;
 import org.apache.axis2.addressing.EndpointReference;
 
+import javax.xml.namespace.QName;
+import java.util.List;
+import java.util.Iterator;
+
 /**
  * The header mediator is able to set a given value as a SOAP header, or 
remove a given
  * header from the current message instance. This supports the headers 
currently
  * supported by the HeaderType class. If an expression is supplied, its 
runtime value
  * is evaluated using the current message. Unless the action is set to remove, 
the
  * default behaviour of this mediator is to set a header value.
- *
- * @see HeaderType
  */
 public class HeaderMediator extends AbstractMediator {
 
@@ -43,8 +46,8 @@
     public static final int ACTION_SET = 0;
     public static final int ACTION_REMOVE = 1;
 
-    /** The name of the header @see HeaderType */
-    private String name = null;
+    /** The qName of the header @see HeaderType */
+    private QName qName = null;
     /** The literal value to be set as the header (if one was specified) */
     private String value = null;
     /** Set the header (ACTION_SET) or remove it (ACTION_REMOVE). Defaults to 
ACTION_SET */
@@ -65,42 +68,63 @@
             String value = (getValue() != null ? getValue() :
                 Axis2MessageContext.getStringValue(getExpression(), synCtx));
 
-            log.debug("Setting header : " + name + " to : " + value);
+            log.debug("Setting header : " + qName + " to : " + value);
 
-            if (Constants.HEADER_TO.equals(name)) {
-                synCtx.setTo(new EndpointReference(value));
-            } else if (Constants.HEADER_FROM.equals(name)){
-                synCtx.setFrom(new EndpointReference(value));
-            } else if (Constants.HEADER_ACTION.equals(name)) {
-                synCtx.setWSAAction(value);
-            } else if (Constants.HEADER_FAULT.equals(name)) {
-                synCtx.setFaultTo(new EndpointReference(value));
-            } else if (Constants.HEADER_REPLY_TO.equals(name)) {
-                synCtx.setReplyTo(new EndpointReference(value));
-            } else {
-                handleException("Unsupported header : " + name);
+            if (qName.getNamespaceURI() == null || 
"".equals(qName.getNamespaceURI())) {
+                if (Constants.HEADER_TO.equals(qName.getLocalPart())) {
+                    synCtx.setTo(new EndpointReference(value));
+                } else if (Constants.HEADER_FROM.equals(qName.getLocalPart())){
+                    synCtx.setFrom(new EndpointReference(value));
+                } else if 
(Constants.HEADER_ACTION.equals(qName.getLocalPart())) {
+                    synCtx.setWSAAction(value);
+                } else if 
(Constants.HEADER_FAULT.equals(qName.getLocalPart())) {
+                    synCtx.setFaultTo(new EndpointReference(value));
+                } else if 
(Constants.HEADER_REPLY_TO.equals(qName.getLocalPart())) {
+                    synCtx.setReplyTo(new EndpointReference(value));
+                } else {
+                    handleException("Unsupported header : " + 
qName.getLocalPart());
+                }
             }
 
         } else {
-            log.debug("Removing header : " + name + " from current message");
+            log.debug("Removing header : " + qName + " from current message");
 
-            if (Constants.HEADER_TO.equals(name)) {
-                synCtx.setTo(null);
-            } else if (Constants.HEADER_FROM.equals(name)){
-                synCtx.setFrom(null);
-            } else if (Constants.HEADER_ACTION.equals(name)) {
-                synCtx.setWSAAction(null);
-            } else if (Constants.HEADER_FAULT.equals(name)) {
-                synCtx.setFaultTo(null);
-            } else if (Constants.HEADER_REPLY_TO.equals(name)) {
-                synCtx.setReplyTo(null);
+            if (qName.getNamespaceURI() == null || 
"".equals(qName.getNamespaceURI())) {
+                if (Constants.HEADER_TO.equals(qName.getLocalPart())) {
+                    synCtx.setTo(null);
+                } else if (Constants.HEADER_FROM.equals(qName.getLocalPart())){
+                    synCtx.setFrom(null);
+                } else if 
(Constants.HEADER_ACTION.equals(qName.getLocalPart())) {
+                    synCtx.setWSAAction(null);
+                } else if 
(Constants.HEADER_FAULT.equals(qName.getLocalPart())) {
+                    synCtx.setFaultTo(null);
+                } else if 
(Constants.HEADER_REPLY_TO.equals(qName.getLocalPart())) {
+                    synCtx.setReplyTo(null);
+                } else {
+                    
removeFromHeaderList(synCtx.getEnvelope().getHeader().getHeaderBlocksWithNSURI(""));
+                }                
             } else {
-                handleException("Unsupported header : " + name);
+                removeFromHeaderList(synCtx.getEnvelope().getHeader().
+                    getHeaderBlocksWithNSURI(qName.getNamespaceURI()));
             }
         }
         return true;
     }
 
+    private void removeFromHeaderList(List headersList) {
+        if (headersList == null || headersList.isEmpty()) {
+            return;
+        }
+        
+        Iterator iter = headersList.iterator();
+        while (iter.hasNext()) {
+            SOAPHeaderBlock header = (SOAPHeaderBlock) iter.next();
+            if (header.getLocalName().equals(qName.getLocalPart())) {
+                header.detach();
+            }
+        }
+    }
+
     public int getAction() {
         return action;
     }
@@ -109,12 +133,12 @@
         this.action = action;
     }
 
-    public String getName() {
-        return name;
+    public QName getQName() {
+        return qName;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setQName(QName qName) {
+        this.qName = qName;
     }
 
     public String getValue() {

Modified: 
incubator/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java?view=diff&rev=476882&r1=476881&r2=476882
==============================================================================
--- 
incubator/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java
 (original)
+++ 
incubator/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/HeaderMediatorTest.java
 Sun Nov 19 11:00:41 2006
@@ -25,6 +25,8 @@
 import org.apache.synapse.Constants;
 import org.apache.synapse.mediators.TestUtils;
 
+import javax.xml.namespace.QName;
+
 public class HeaderMediatorTest extends TestCase {
 
     private static final String TEST_HEADER = "http://server/path";;
@@ -32,7 +34,7 @@
     public void testSimpleHeaderSetAndRemove() throws Exception {
 
         HeaderMediator headerMediator = new HeaderMediator();
-        headerMediator.setName(Constants.HEADER_TO);
+        headerMediator.setQName(new QName(Constants.HEADER_TO));
         headerMediator.setValue(TEST_HEADER);
 
         // invoke transformation, with static enveope
@@ -51,7 +53,7 @@
     public void testSimpleHeaderXPathSetAndRemove() throws Exception {
 
         HeaderMediator headerMediator = new HeaderMediator();
-        headerMediator.setName(Constants.HEADER_TO);
+        headerMediator.setQName(new QName(Constants.HEADER_TO));
         headerMediator.setExpression(new 
AXIOMXPath("concat('http://','server','/path')"));
 
         // invoke transformation, with static enveope



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to