Repository: cxf
Updated Branches:
  refs/heads/3.0.x-fixes e6595a6bc -> 32812b2bd


[CXF-6434] slightly simplify the code and add test cases


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/32812b2b
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/32812b2b
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/32812b2b

Branch: refs/heads/3.0.x-fixes
Commit: 32812b2bd313f98ac0f0bbead80b53aa15a62c9d
Parents: e6595a6
Author: Akitoshi Yoshida <a...@apache.org>
Authored: Thu Jun 4 12:06:56 2015 +0200
Committer: Akitoshi Yoshida <a...@apache.org>
Committed: Thu Jun 4 12:08:52 2015 +0200

----------------------------------------------------------------------
 .../interceptor/SoapActionInInterceptor.java    |   7 +-
 .../SoapActionInInterceptorTest.java            | 190 +++++++++++++++++++
 2 files changed, 194 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/32812b2b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptor.java
----------------------------------------------------------------------
diff --git 
a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptor.java
 
b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptor.java
index ede1404..b9ad7d7 100644
--- 
a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptor.java
+++ 
b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptor.java
@@ -81,10 +81,11 @@ public class SoapActionInInterceptor extends 
AbstractSoapInterceptor {
             }
             
             int start = ct.indexOf("action=");
-            if (start == -1 && ct.indexOf("multipart/related") == 0) {
+            if (start == -1 && ct.indexOf("multipart/related") == 0 && 
ct.indexOf("start-info") == -1) {
                 // the action property may not be found at the package's 
content-type for non-mtom multipart message
-                List<String> cts = CastUtils.cast((List<?>)(CastUtils.cast(
-                    (Map<?, 
?>)message.get(AttachmentDeserializer.ATTACHMENT_PART_HEADERS)).get(Message.CONTENT_TYPE)));
+                // but skip searching if the start-info property is set
+                List<String> cts = CastUtils.cast((List<?>)(((Map<?, ?>)
+                    
message.get(AttachmentDeserializer.ATTACHMENT_PART_HEADERS)).get(Message.CONTENT_TYPE)));
                 if (cts != null && cts.size() > 0) {
                     ct = cts.get(0);
                     start = ct.indexOf("action=");

http://git-wip-us.apache.org/repos/asf/cxf/blob/32812b2b/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptorTest.java
----------------------------------------------------------------------
diff --git 
a/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptorTest.java
 
b/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptorTest.java
new file mode 100644
index 0000000..206b752
--- /dev/null
+++ 
b/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/interceptor/SoapActionInInterceptorTest.java
@@ -0,0 +1,190 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.cxf.binding.soap.interceptor;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.cxf.attachment.AttachmentDeserializer;
+import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.Soap12;
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.SoapVersion;
+import org.apache.cxf.message.Message;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ */
+public class SoapActionInInterceptorTest extends Assert {
+    private IMocksControl control;
+
+    @Before
+    public void setUp() {
+        control = EasyMock.createNiceControl();
+    }
+
+    @Test
+    public void testGetSoapActionForSOAP11() throws Exception {
+        SoapMessage message = setUpMessage("text/xml", Soap11.getInstance(), 
"urn:cxf"); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    public void testGetSoapActionForSOAP11None() throws Exception {
+        SoapMessage message = setUpMessage("text/xml", Soap11.getInstance(), 
null);  
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertNull(action);
+        control.verify();
+    }
+
+    @Test
+    public void testGetSoapActionForSOAP12() throws Exception {
+        SoapMessage message = setUpMessage("application/soap+xml; 
action=\"urn:cxf\"", Soap12.getInstance(), null);
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    public void testGetSoapActionForSOAP12None() throws Exception {
+        SoapMessage message = setUpMessage("application/soap+xml", 
Soap12.getInstance(), null);
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertNull(action);
+        control.verify();
+    }
+
+    @Test
+    public void testGetSoapActionForSOAP11SwA() throws Exception {
+        SoapMessage message = setUpMessage("multipart/related", 
Soap11.getInstance(), "urn:cxf"); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    // note this combination of SOAP12 with SwA is not normative, but some 
systems may use it.
+    // here the optional start-info is used to encode action as in 
start-info="application/soap+xml; action=\"urn:cxf\""
+    public void testGetSoapActionForSOAP12SwAWithStartInfo() throws Exception {
+        SoapMessage message = setUpMessage(
+            "multipart/related; start-info=\"application/soap+xml; 
action=\\\"urn:cxf\\\"",
+            Soap12.getInstance(), null); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    // note this combination of SOAP12 with SwA is not normative, but some 
systems use it.
+    // here the action property is set as in action="urn:cxf", although this 
usage is invalid because the action
+    // property is not part of the multipart/related media type.
+    public void testGetSoapActionForSOAP12SwAWithAction() throws Exception {
+        SoapMessage message = setUpMessage(
+            "multipart/related; start-info=\"application/soap+xml\"; 
action=\"urn:cxf\"",
+            Soap12.getInstance(), null); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    // note this combination of SOAP12 with SwA is not normative, but some 
systems may use it.
+    // here the action property is only set at the part header as in 
action="urn:cxf"
+    public void testGetSoapActionForSOAP12SwAWithActionInPartHeaders() throws 
Exception {
+        SoapMessage message = setUpMessage(
+            "multipart/related",
+            Soap12.getInstance(), "urn:cxf"); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    // note this combination of SOAP12 with SwA is not normative, but some 
systems may use it.
+    public void testGetSoapActionForSOAP12SwANone() throws Exception {
+        SoapMessage message = setUpMessage(
+            "multipart/related",
+            Soap12.getInstance(), null); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertNull(action);
+        control.verify();
+    }
+
+    @Test
+    public void testGetSoapActionForSOAP11MTOM() throws Exception {
+        SoapMessage message = setUpMessage(
+            "multipart/related; type=\"application/xop+xml\"; 
start-info=\"text/xml\"",
+            Soap11.getInstance(), "urn:cxf"); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    @Test
+    // some systems use this form, although this is not spec-conformant as 
+    // the action property is not part of the multipart/related media type.
+    // here the action propety is set as in start-info="application/soap+xml"; 
action="urn:cxf"
+    public void testGetSoapActionForSOAP12MTOMWithAction() throws Exception {
+        SoapMessage message = setUpMessage(
+            "multipart/related; type=\"application/xop+xml\""
+                + "; start-info=\"application/soap+xml\"; action=\"urn:cxf\"",
+            Soap11.getInstance(), "urn:cxf"); 
+        control.replay();
+        String action = SoapActionInInterceptor.getSoapAction(message);
+        assertEquals("urn:cxf", action);
+        control.verify();
+    }
+
+    private SoapMessage setUpMessage(String contentType, SoapVersion version, 
String prop) {
+        SoapMessage message = control.createMock(SoapMessage.class);
+        Map<String, List<String>> headers = new TreeMap<String, 
List<String>>(String.CASE_INSENSITIVE_ORDER);
+        Map<String, List<String>> partHeaders = new TreeMap<String, 
List<String>>(String.CASE_INSENSITIVE_ORDER);
+        if (version instanceof Soap11 && prop != null) {
+            headers.put("SOAPAction", Collections.singletonList(prop));
+        } else if (version instanceof Soap12 && prop != null) {
+            partHeaders.put(Message.CONTENT_TYPE, 
+                            Collections.singletonList("application/soap+xml; 
action=\"" + prop + "\""));
+        }
+        EasyMock.expect(message.getVersion()).andReturn(version).anyTimes();
+        
EasyMock.expect(message.get(Message.CONTENT_TYPE)).andReturn(contentType).anyTimes();
+        
EasyMock.expect(message.get(Message.PROTOCOL_HEADERS)).andReturn(headers).anyTimes();
+        
EasyMock.expect(message.get(AttachmentDeserializer.ATTACHMENT_PART_HEADERS)).andReturn(partHeaders).anyTimes();
+        return message;
+    }
+}

Reply via email to