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);
+ }
+
+ }
}