You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by hi...@apache.org on 2010/05/04 08:28:25 UTC

svn commit: r940741 - in /synapse/trunk/java: modules/core/src/main/java/org/apache/synapse/config/xml/ modules/core/src/test/java/org/apache/synapse/config/xml/ src/site/xdoc/

Author: hiranya
Date: Tue May  4 06:28:25 2010
New Revision: 940741

URL: http://svn.apache.org/viewvc?rev=940741&view=rev
Log:
Fixing SYNAPSE-345. The header mediator factory now does not create header mediators with namespace unqualified headers. Added some test cases to cover the scenario and updated the docs.


Added:
    synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java
Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/HeaderMediatorFactory.java
    synapse/trunk/java/src/site/xdoc/Synapse_Configuration_Language.xml

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=940741&r1=940740&r2=940741&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 Tue May  4 06:28:25 2010
@@ -23,6 +23,7 @@ import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
 import org.apache.synapse.Mediator;
 import org.apache.synapse.SynapseException;
+import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.mediators.transform.HeaderMediator;
 import org.jaxen.JaxenException;
 
@@ -66,15 +67,25 @@ public class HeaderMediatorFactory exten
                 String prefix = nameAtt.substring(0, colonPos);
                 String namespaceURI = OMElementUtils.getNameSpaceWithPrefix(prefix, elem);
                 if (namespaceURI == null) {
-                    String msg = "Invalid namespace prefix '" + prefix + "' in name attribute";
-                    log.error(msg);
-                    throw new SynapseException(msg);
+                    handleException("Invalid namespace prefix '" + prefix + "' in name attribute");
                 } else {
-                	headerMediator.setQName(new QName(namespaceURI, nameAtt.substring(colonPos+1), prefix));
+                	headerMediator.setQName(new QName(namespaceURI, nameAtt.substring(colonPos+1),
+                            prefix));
                 }
             } else {
                 // no prefix
-                headerMediator.setQName(new QName(nameAtt));
+                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 {
+                    handleException("Invalid SOAP header: " + nameAtt + " specified at the " +
+                            "header mediator. All SOAP headers must be namespace qualified.");
+                }
             }
         }
 
@@ -90,9 +101,8 @@ public class HeaderMediatorFactory exten
 
         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);
+            handleException("A 'value' or 'expression' attribute is required for a [set] " +
+                    "header mediator");
         }
 
         if (value != null && value.getAttributeValue() != null) {
@@ -102,9 +112,7 @@ public class HeaderMediatorFactory exten
             try {
                 headerMediator.setExpression(SynapseXPathFactory.getSynapseXPath(elem, ATT_EXPRN));
             } catch (JaxenException je) {
-                String msg = "Invalid XPath expression : " + exprn.getAttributeValue();
-                log.error(msg);
-                throw new SynapseException(msg, je);
+                handleException("Invalid XPath expression : " + exprn.getAttributeValue());
             }
         }
 

Added: 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=940741&view=auto
==============================================================================
--- synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java (added)
+++ synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/HeaderMediatorConfigurationTest.java Tue May  4 06:28:25 2010
@@ -0,0 +1,124 @@
+/*
+ *  Copyright (c) 2005-2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ *  WSO2 Inc. licenses this file to you under the Apache License,
+ *  Version 2.0 (the "License"); you may not use this file except
+ *  in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.synapse.config.xml;
+
+import junit.framework.TestCase;
+import org.apache.axiom.om.util.AXIOMUtil;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.SynapseConstants;
+
+import javax.xml.stream.XMLStreamException;
+
+public class HeaderMediatorConfigurationTest extends TestCase {
+
+    public void testNamespaceUnqualifiedScenarioOne() {
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" name=\"MyHeader\" value=\"MyValue\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+            fail("HeaderMediator created with namespace unqualified SOAP header");
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        } catch (SynapseException ignored) {
+
+        }
+
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" name=\"MyHeader\" action=\"remove\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+            fail("HeaderMediator created with namespace unqualified SOAP header");
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        } catch (SynapseException ignored) {
+
+        }
+    }
+
+    public void testNamespaceUnqualifiedScenarioTwo() {
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" name=\"m:MyHeader\" value=\"MyValue\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+            fail("HeaderMediator created with namespace unqualified SOAP header");
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        } catch (SynapseException ignored) {
+
+        }
+
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" name=\"m:MyHeader\" action=\"remove\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+            fail("HeaderMediator created with namespace unqualified SOAP header");
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        } catch (SynapseException ignored) {
+
+        }
+    }
+
+    public void testPredefinedHeaders() {
+        predefinedHeaderTest(SynapseConstants.HEADER_TO);
+        predefinedHeaderTest(SynapseConstants.HEADER_ACTION);
+        predefinedHeaderTest(SynapseConstants.HEADER_FROM);
+        predefinedHeaderTest(SynapseConstants.HEADER_RELATES_TO);
+        predefinedHeaderTest(SynapseConstants.HEADER_REPLY_TO);
+        predefinedHeaderTest(SynapseConstants.HEADER_FAULT);
+    }
+
+    private void predefinedHeaderTest(String header) {
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" name=\"" + header + "\" value=\"MyValue\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" name=\"" + header + "\" action=\"remove\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+    }
+
+    public void testNamespaceQualifiedScenario() {
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" xmlns:m=\"http://synapse.apache.org\" name=\"m:MyHeader\" value=\"MyValue\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+
+        try {
+            String inputXml = "<header xmlns=\"http://synapse.apache.org/ns/2010/04/configuration\" xmlns:m=\"http://synapse.apache.org\" name=\"m:MyHeader\" action=\"remove\"/>";
+            HeaderMediatorFactory fac = new HeaderMediatorFactory();
+            fac.createMediator(AXIOMUtil.stringToOM(inputXml));
+        } catch (XMLStreamException e) {
+            fail("Error while parsing header mediator configuration");
+        }
+    }
+
+}

Modified: synapse/trunk/java/src/site/xdoc/Synapse_Configuration_Language.xml
URL: http://svn.apache.org/viewvc/synapse/trunk/java/src/site/xdoc/Synapse_Configuration_Language.xml?rev=940741&r1=940740&r2=940741&view=diff
==============================================================================
--- synapse/trunk/java/src/site/xdoc/Synapse_Configuration_Language.xml (original)
+++ synapse/trunk/java/src/site/xdoc/Synapse_Configuration_Language.xml Tue May  4 06:28:25 2010
@@ -1597,6 +1597,19 @@ where "sequence/dynamic_seq_1.xml" refer
       action attribute specifies whether the mediator should set or remove the
       header. If omitted, it defaults to a set-header.
     </p>
+    <p>
+      The value of the 'name' attribute must be one of the following aliases or
+      a valid QName with a namespace prefix. (In the latter case the namespace prefix
+      must be mapped to a valid namespace URI using the standard xmlns attribute)
+    </p>
+    <ul>
+        <li>To</li>
+        <li>From</li>
+        <li>Action</li>
+        <li>FaultTo</li>
+        <li>ReplyTo</li>
+        <li>RelatesTo</li>
+    </ul>
     <p/>
     <h3>
       Selection Mediators