You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by is...@apache.org on 2016/05/28 17:45:03 UTC

svn commit: r1745911 - in /synapse/trunk/java/modules/core/src: main/java/org/apache/synapse/config/xml/ main/java/org/apache/synapse/mediators/transform/ test/java/org/apache/synapse/config/xml/ test/java/org/apache/synapse/mediators/transform/

Author: isudana
Date: Sat May 28 17:45:02 2016
New Revision: 1745911

URL: http://svn.apache.org/viewvc?rev=1745911&view=rev
Log:
applying refactored patch by buddhima for SYNAPSE-1021 improvement

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/config/xml/XMLConfigConstants.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/config/xml/HeaderMediatorConfigurationTest.java
    synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorSerializationTest.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=1745911&r1=1745910&r2=1745911&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 Sat May 28 17:45:02 2016
@@ -48,6 +48,7 @@ public class HeaderMediatorFactory exten
 
     private static final QName HEADER_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "header");
     private static final QName ATT_ACTION = new QName("action");
+    private static final QName ATT_SCOPE = new QName("scope");
 
     public Mediator createSpecificMediator(OMElement elem, Properties properties) {
 
@@ -56,40 +57,44 @@ public class HeaderMediatorFactory exten
         OMAttribute value  = elem.getAttribute(ATT_VALUE);
         OMAttribute exprn  = elem.getAttribute(ATT_EXPRN);
         OMAttribute action = elem.getAttribute(ATT_ACTION);
+        OMAttribute scope = elem.getAttribute(ATT_SCOPE);
 
+        // Setting Header Name
         if (name == null || name.getAttributeValue() == null) {
-            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);
+            // Name is required unless otherwise we are setting an embedded XML
+            if (!isEmbeddedXML(elem)) {
+                handleException("A valid name attribute is required for the header mediator");
             }
         } else {
-            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);
-                String namespaceURI = OMElementUtils.getNameSpaceWithPrefix(prefix, elem);
-                if (namespaceURI == null) {
-                    handleException("Invalid namespace prefix '" + prefix + "' in name attribute");
+
+            if (scope == null) {
+                String nameAtt = name.getAttributeValue();
+
+                // Known Headers
+                if (SynapseConstants.HEADER_TO.equals(nameAtt) ||
+                    SynapseConstants.HEADER_FROM.equals(nameAtt) ||
+                    SynapseConstants.HEADER_ACTION.equals(nameAtt) ||
+                    SynapseConstants.HEADER_FAULT.equals(nameAtt) ||
+                    SynapseConstants.HEADER_REPLY_TO.equals(nameAtt) ||
+                    SynapseConstants.HEADER_RELATES_TO.equals(nameAtt)) {
+
+                    headerMediator.setQName(new QName(nameAtt));
                 } else {
-                	headerMediator.setQName(new QName(namespaceURI, nameAtt.substring(colonPos+1),
-                            prefix));
+                    // SOAP Headers
+                    setSOAPHeader(headerMediator, elem, name);
                 }
             } else {
-                // no prefix
-                if (SynapseConstants.HEADER_TO.equals(nameAtt) ||
-                        SynapseConstants.HEADER_FROM.equals(nameAtt) ||
-                        SynapseConstants.HEADER_ACTION.equals(nameAtt) ||
-                        SynapseConstants.HEADER_FAULT.equals(nameAtt) ||
-                        SynapseConstants.HEADER_REPLY_TO.equals(nameAtt) ||
-                        SynapseConstants.HEADER_RELATES_TO.equals(nameAtt)) {
+                String scopeAttValue = scope.getAttributeValue();
 
-                    headerMediator.setQName(new QName(nameAtt));
+                if (XMLConfigConstants.HEADER_SCOPE_SOAP.equalsIgnoreCase(scopeAttValue)) {
+                    setSOAPHeader(headerMediator, elem, name);
+                } else if (XMLConfigConstants.HEADER_SCOPE_TRANSPORT.equalsIgnoreCase(scopeAttValue)) {
+                    headerMediator.setQName(new QName(name.getAttributeValue()));
                 } else {
-                    handleException("Invalid SOAP header: " + nameAtt + " specified at the " +
-                            "header mediator. All SOAP headers must be namespace qualified.");
+                    handleException("Unsupported Scope : " + scopeAttValue + " . Only " + XMLConfigConstants.HEADER_SCOPE_SOAP
+                                    + " and " + XMLConfigConstants.HEADER_SCOPE_TRANSPORT + " allowed");
                 }
+                headerMediator.setScope(scopeAttValue);
             }
         }
 
@@ -132,6 +137,29 @@ public class HeaderMediatorFactory exten
         return headerMediator;
     }
 
+    private void setSOAPHeader(HeaderMediator headerMediator, OMElement elem, OMAttribute name) {
+        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);
+            String namespaceURI = OMElementUtils.getNameSpaceWithPrefix(prefix, elem);
+            if (namespaceURI == null) {
+                handleException("Invalid namespace prefix '" + prefix + "' in name attribute");
+            } else {
+                headerMediator.setQName(new QName(namespaceURI, nameAtt.substring(colonPos+1),
+                                                  prefix));
+            }
+        } else {
+            handleException("Invalid SOAP header: " + nameAtt + " specified at the " +
+                            "header mediator. All SOAP headers must be namespace qualified.");
+        }
+    }
+
+    private boolean isEmbeddedXML(OMElement elem) {
+        return (elem.getChildElements() != null && elem.getChildElements().hasNext());
+    }
+
     public QName getTagQName() {
         return HEADER_Q;
     }

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=1745911&r1=1745910&r2=1745911&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 Sat May 28 17:45:02 2016
@@ -76,6 +76,10 @@ public class HeaderMediatorSerializer ex
             }
         }
 
+        if (mediator.getScope() != null) {
+            header.addAttribute(fac.createOMAttribute("scope", nullNS, mediator.getScope()));
+        }
+
         if (mediator.hasEmbeddedXml()) {
             for (OMElement e : mediator.getEmbeddedXml()) {
                 header.addChild(e);

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/XMLConfigConstants.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/XMLConfigConstants.java?rev=1745911&r1=1745910&r2=1745911&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/XMLConfigConstants.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/XMLConfigConstants.java Sat May 28 17:45:02 2016
@@ -47,10 +47,15 @@ public class XMLConfigConstants {
     public static final String SCOPE_TRANSPORT = "transport";
     /** The scope name for registry properties */
     public static final String SCOPE_REGISTRY = "registry";
-
     /** The scope name for the system properties  */
     public static final String SCOPE_SYSTEM = "system";
 
+    //-- HeaderMediator --
+    /** The scope name for SOAP headers */
+    public static final String HEADER_SCOPE_SOAP = "soap";
+    /** The scope name for Transport headers */
+    public static final String HEADER_SCOPE_TRANSPORT = "transport";
+
     public static final String KEY = "key";
     public static final String RECEIVE = "receive";
 

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=1745911&r1=1745910&r2=1745911&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 Sat May 28 17:45:02 2016
@@ -29,12 +29,16 @@ import org.apache.axis2.addressing.Relat
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.SynapseLog;
+import org.apache.synapse.config.xml.XMLConfigConstants;
+import org.apache.synapse.core.axis2.Axis2MessageContext;
 import org.apache.synapse.mediators.AbstractMediator;
 import org.apache.synapse.util.xpath.SynapseXPath;
 
 import javax.xml.namespace.QName;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * The header mediator is able to set a given value as a SOAP header, or remove a given
@@ -58,6 +62,8 @@ public class HeaderMediator extends Abst
     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;
+    /** The scope that decides which header should be updated: SOAP or Transport. */
+    private String scope = null;
 
     /**
      * Sets/Removes a SOAP header on the current message
@@ -77,16 +83,30 @@ public class HeaderMediator extends Abst
             }
         }
 
+        if (XMLConfigConstants.HEADER_SCOPE_TRANSPORT.equals(scope)) {
+            alterTransportHeader(synCtx);
+        } else {
+            alterSOAPOrKnownHeader(synCtx);
+        }
+
+        synLog.traceOrDebug("End : Header mediator");
+        return true;
+    }
+
+    private void alterSOAPOrKnownHeader(MessageContext synCtx) {
+
+        SynapseLog synLog = getLog(synCtx);
+
         if (action == ACTION_SET) {
 
-            String value = (getExpression() == null ? getValue() :
-                    expression.stringValueOf(synCtx));
+            String value = (getExpression() == null ? getValue() : expression.stringValueOf(synCtx));
 
             if (synLog.isTraceOrDebugEnabled()) {
-                synLog.traceOrDebug("Set SOAP header : " + qName + " to : " + value);
+                synLog.traceOrDebug("Setting header : " + qName + " to : " + value);
             }
 
-            if (!isImplicit() && (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())) {
@@ -111,7 +131,7 @@ public class HeaderMediator extends Abst
         } else {
 
             if (synLog.isTraceOrDebugEnabled()) {
-                synLog.traceOrDebug("Removing SOAP Header : " + qName);
+                synLog.traceOrDebug("Removing Header : " + qName);
             }
 
             if (qName.getNamespaceURI() == null || "".equals(qName.getNamespaceURI())) {
@@ -151,9 +171,55 @@ public class HeaderMediator extends Abst
                 }
             }
         }
+    }
 
-        synLog.traceOrDebug("End : Header mediator");
-        return true;
+    private void alterTransportHeader(MessageContext synCtx) {
+
+        SynapseLog synLog = getLog(synCtx);
+        String headerName = qName.getLocalPart();
+
+        String value = (getExpression() == null ? getValue() : expression.stringValueOf(synCtx));
+
+        if (action == ACTION_SET) {
+
+            if (synLog.isTraceOrDebugEnabled()) {
+                synLog.traceOrDebug("Setting Transport header : " + headerName + " to : " + value);
+            }
+
+            //Setting Transport Headers
+            Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
+            org.apache.axis2.context.MessageContext axis2MessageCtx =
+                    axis2smc.getAxis2MessageContext();
+            Object headers = axis2MessageCtx.
+                    getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+
+            if (headers != null && headers instanceof Map) {
+                Map headersMap = (Map) headers;
+                headersMap.put(headerName, value);
+            } else if (headers == null) {
+                Map headersMap = new HashMap();
+                headersMap.put(headerName, value);
+                axis2MessageCtx.setProperty(
+                        org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS, headersMap);
+            }
+        } else {
+            if (synLog.isTraceOrDebugEnabled()) {
+                synLog.traceOrDebug("Removing Transport Header : " + qName);
+            }
+
+            // Removing transport headers
+            Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
+            org.apache.axis2.context.MessageContext axis2MessageCtx =
+                    axis2smc.getAxis2MessageContext();
+            Object headers = axis2MessageCtx.getProperty(
+                    org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+            if (headers != null && headers instanceof Map) {
+                Map headersMap = (Map) headers;
+                headersMap.remove(headerName);
+            } else {
+                synLog.traceOrDebug("No transport headers found");
+            }
+        }
     }
 
     private void addCustomHeader(MessageContext synCtx, String value) {
@@ -244,4 +310,21 @@ public class HeaderMediator extends Abst
     public void setExpression(SynapseXPath expression) {
         this.expression = expression;
     }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    @Override
+    public boolean isContentAware() {
+        if (XMLConfigConstants.SCOPE_TRANSPORT.equals(scope)) {
+            return false;
+        } else {
+            return true;
+        }
+    }
 }

Modified: synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java?rev=1745911&r1=1745910&r2=1745911&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java (original)
+++ synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java Sat May 28 17:45:02 2016
@@ -122,4 +122,40 @@ public class HeaderMediatorConfiguration
         }
     }
 
+    public void testTransportScope() {
+        try {
+            String inputXml = "<header xmlns=\"http://ws.apache.org/ns/synapse\" name=\"User-Agent\" value=\"SynapseUser\" scope=\"transport\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml), new Properties());
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+
+        try {
+            String inputXml = "<header xmlns=\"http://ws.apache.org/ns/synapse\" name=\"User-Agent\" action=\"remove\" scope=\"transport\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml), new Properties());
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+    }
+
+    public void testSOAPScopeScenario() {
+        try {
+            String inputXml = "<header xmlns=\"http://ws.apache.org/ns/synapse\" xmlns:m=\"http://synapse.apache.org\" name=\"m:MyHeader\" value=\"MyValue\" scope=\"soap\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml), new Properties());
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+
+        try {
+            String inputXml = "<header xmlns=\"http://ws.apache.org/ns/synapse\" xmlns:m=\"http://synapse.apache.org\" name=\"m:MyHeader\" action=\"remove\" scope=\"soap\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml), new Properties());
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+    }
+
 }

Modified: synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorSerializationTest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorSerializationTest.java?rev=1745911&r1=1745910&r2=1745911&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorSerializationTest.java (original)
+++ synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorSerializationTest.java Sat May 28 17:45:02 2016
@@ -45,4 +45,10 @@ public class HeaderMediatorSerialization
         assertTrue(serialization(inputXml, headerMediatorFactory, headerMediatorSerializer));
         assertTrue(serialization(inputXml, headerMediatorSerializer));
     }
+
+    public void testHeaderMediatorSerializationSenarioThree() throws Exception {
+        String inputXml = "<header xmlns=\"http://ws.apache.org/ns/synapse\" name=\"User-Agent\" value=\"SynapseUser\" scope=\"transport\"/>";
+        assertTrue(serialization(inputXml, headerMediatorFactory, headerMediatorSerializer));
+        assertTrue(serialization(inputXml, headerMediatorSerializer));
+    }
 }

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=1745911&r1=1745910&r2=1745911&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 Sat May 28 17:45:02 2016
@@ -22,13 +22,17 @@ package org.apache.synapse.mediators.tra
 import junit.framework.TestCase;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.util.AXIOMUtil;
+import org.apache.http.protocol.HTTP;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.config.xml.HeaderMediatorFactory;
+import org.apache.synapse.config.xml.XMLConfigConstants;
+import org.apache.synapse.core.axis2.Axis2MessageContext;
 import org.apache.synapse.mediators.TestUtils;
 import org.apache.synapse.util.xpath.SynapseXPath;
 
 import javax.xml.namespace.QName;
+import java.util.Map;
 import java.util.Properties;
 
 public class HeaderMediatorTest extends TestCase {
@@ -145,4 +149,45 @@ public class HeaderMediatorTest extends
         assertEquals("complexHeader", result.getLocalName());
         assertEquals("TEST", result.getText());
     }
+
+    public void testTransportHeaderSetAndRemove() throws Exception {
+
+        String SYNAPSE_USER = "SynapseUser";
+
+        HeaderMediator headerMediator = new HeaderMediator();
+        headerMediator.setQName(new QName(HTTP.USER_AGENT));
+        headerMediator.setValue(SYNAPSE_USER);
+        headerMediator.setScope(XMLConfigConstants.HEADER_SCOPE_TRANSPORT);
+
+        // invoke transformation, with static envelope
+        MessageContext synCtx = TestUtils.createLightweightSynapseMessageContext("<empty/>");
+        headerMediator.mediate(synCtx);
+
+        // get transport header and assert
+        org.apache.axis2.context.MessageContext axisCtx =
+                ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+        Object transportHeaders = axisCtx.getProperty(
+                org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+        if (transportHeaders == null || !(transportHeaders instanceof Map)) {
+            fail("HeaderMediator Transport headers not found");
+        } else {
+            assertTrue(SYNAPSE_USER.equals(((Map) transportHeaders).get(HTTP.USER_AGENT)));
+        }
+
+        // Removing headers
+        headerMediator.setAction(HeaderMediator.ACTION_REMOVE);
+        headerMediator.mediate(synCtx);
+
+        // get transport header and assert
+        org.apache.axis2.context.MessageContext axisCtx2 =
+                ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+        transportHeaders = axisCtx2.getProperty(
+                org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+        if (transportHeaders == null || !(transportHeaders instanceof Map)) {
+            fail("HeaderMediator Transport headers not found");
+        } else {
+            assertTrue(((Map)transportHeaders).get(HTTP.USER_AGENT) == null);
+        }
+
+    }
 }