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]