You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2013/02/15 20:21:48 UTC

svn commit: r1446734 - in /cxf/branches/2.6.x-fixes: rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/ systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_...

Author: dkulp
Date: Fri Feb 15 19:21:47 2013
New Revision: 1446734

URL: http://svn.apache.org/r1446734
Log:
Merged revisions 1446732 via  git cherry-pick from
https://svn.apache.org/repos/asf/cxf/branches/2.7.x-fixes

........
  r1446732 | dkulp | 2013-02-15 14:20:25 -0500 (Fri, 15 Feb 2013) | 11 lines

  Merged revisions 1446731 via  git cherry-pick from
  https://svn.apache.org/repos/asf/cxf/trunk

  ........
    r1446731 | dkulp | 2013-02-15 14:18:28 -0500 (Fri, 15 Feb 2013) | 3 lines

    [CXF-4819] Remove the soap specific attributes from the header elements so that validation can occur.
    Recheck the operation defined headers for ultimate reciever processing after the bindingoperationinfo is known.

  ........

........

Modified:
    cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java
    cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
    cxf/branches/2.6.x-fixes/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/MustUnderstandInterceptorTest.java
    cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/SchemaValidationImpl.java
    cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/ValidationClientServerTest.java
    cxf/branches/2.6.x-fixes/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/ProtocolVariationsTest.java
    cxf/branches/2.6.x-fixes/testutils/src/main/resources/wsdl/schema_validation.wsdl

Modified: cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java (original)
+++ cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java Fri Feb 15 19:21:47 2013
@@ -47,7 +47,7 @@ import org.apache.cxf.interceptor.OneWay
 import org.apache.cxf.phase.Phase;
 
 public class MustUnderstandInterceptor extends AbstractSoapInterceptor {
-    public static final String FAULT = "MustUnderstand.Fault";
+    public static final String UNKNOWNS = "MustUnderstand.UNKNOWNS";
 
     private static final Logger LOG = LogUtils.getL7dLogger(MustUnderstandInterceptor.class);
 
@@ -83,35 +83,25 @@ public class MustUnderstandInterceptor e
         checkUnderstand(mustUnderstandHeaders, mustUnderstandQNames, notUnderstandHeaders);
         
         if (!notUnderstandHeaders.isEmpty()) {
-            SoapFault soapFault = new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, notUnderstandHeaders),
-                                                soapVersion.getMustUnderstand());
             if (!isRequestor(soapMessage)) {
-                soapMessage.put(MustUnderstandInterceptor.FAULT, soapFault);
+                soapMessage.put(MustUnderstandInterceptor.UNKNOWNS, notUnderstandHeaders);
                 soapMessage.getInterceptorChain().add(ending);
             } else {
-                throw soapFault;
+                throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, notUnderstandHeaders),
+                                                    soapVersion.getMustUnderstand());
             }
         }
         if (!ultimateReceiverHeaders.isEmpty() && !isRequestor(soapMessage)) {
             checkUltimateReceiverHeaders(ultimateReceiverHeaders, mustUnderstandQNames, soapMessage);
         }
     }
-    public void handleFault(SoapMessage message) {
-        SoapFault soapFault = (SoapFault)message.get(MustUnderstandInterceptor.FAULT);
-        if (soapFault != null
-            && !message.getExchange().isOneWay()
-            && soapFault != message.getContent(Exception.class)) {
-            
-            message.setContent(Exception.class, soapFault);
-        }
-    }
-
 
     private void checkUltimateReceiverHeaders(Set<Header> ultimateReceiverHeaders,
                                               Set<QName> mustUnderstandQNames, 
                                               SoapMessage soapMessage) {
         soapMessage.getInterceptorChain()
             .add(new UltimateReceiverMustUnderstandInterceptor(mustUnderstandQNames));
+
         Object o = soapMessage.getContextualProperty("endpoint-processes-headers");
         if (o == null) {
             o = Collections.EMPTY_LIST;
@@ -147,9 +137,7 @@ public class MustUnderstandInterceptor e
             if (!notFound.isEmpty()) {
                 // Defer throwing soap fault exception in SOAPHeaderInterceptor once the isOneway can
                 // be detected
-                SoapFault soapFault = new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, notFound),
-                                                    soapMessage.getVersion().getMustUnderstand());
-                soapMessage.put(MustUnderstandInterceptor.FAULT, soapFault);
+                soapMessage.put(MustUnderstandInterceptor.UNKNOWNS, notFound);
                 soapMessage.getInterceptorChain().add(ending);
             }
         }
@@ -267,9 +255,20 @@ public class MustUnderstandInterceptor e
         
         public void handleMessage(SoapMessage message) throws Fault {
             // throws soapFault after the response code 202 is set in OneWayProcessorInterceptor
-            if (message.get(MustUnderstandInterceptor.FAULT) != null) {
-                SoapFault soapFault = (SoapFault)message.get(MustUnderstandInterceptor.FAULT);
-                throw soapFault;
+            if (message.get(MustUnderstandInterceptor.UNKNOWNS) != null) {
+                //we may not have known the Operation in the main interceptor and thus may not 
+                //have been able to get the parameter based headers.   We now know the
+                //operation and thus can remove those.
+                Set<QName> unknowns = CastUtils.cast((Set<?>)message.get(MustUnderstandInterceptor.UNKNOWNS));
+                Set<QName> paramHeaders = HeaderUtil.getHeaderQNameInOperationParam(message);
+                unknowns.removeAll(paramHeaders);
+                
+                if (!unknowns.isEmpty()) {
+                    throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, unknowns),
+                                        message.getVersion().getMustUnderstand());
+                } else {
+                    message.remove(MustUnderstandInterceptor.UNKNOWNS);
+                }
             }
         }
     }

Modified: cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java (original)
+++ cxf/branches/2.6.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java Fri Feb 15 19:21:47 2013
@@ -229,8 +229,12 @@ public class ReadHeadersInterceptor exte
                                                            dataBinding);
                         String mu = hel.getAttributeNS(soapVersion.getNamespace(),
                                                       soapVersion.getAttrNameMustUnderstand());
+                        hel.removeAttributeNS(soapVersion.getNamespace(),
+                                           soapVersion.getAttrNameMustUnderstand());
                         String act = hel.getAttributeNS(soapVersion.getNamespace(),
                                                         soapVersion.getAttrNameRole());
+                        hel.removeAttributeNS(soapVersion.getNamespace(),
+                                              soapVersion.getAttrNameRole());
 
                         if (!StringUtils.isEmpty(act)) {
                             shead.setActor(act);

Modified: cxf/branches/2.6.x-fixes/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/MustUnderstandInterceptorTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/MustUnderstandInterceptorTest.java?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/MustUnderstandInterceptorTest.java (original)
+++ cxf/branches/2.6.x-fixes/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/MustUnderstandInterceptorTest.java Fri Feb 15 19:21:47 2013
@@ -37,6 +37,7 @@ import org.apache.cxf.binding.soap.inter
 import org.apache.cxf.binding.soap.interceptor.MustUnderstandInterceptor;
 import org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor;
 import org.apache.cxf.binding.soap.interceptor.StartBodyInterceptor;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.message.Attachment;
 import org.apache.cxf.service.model.BindingInfo;
 import org.apache.cxf.service.model.BindingOperationInfo;
@@ -99,12 +100,11 @@ public class MustUnderstandInterceptorTe
         assertEquals("DummaySoapInterceptor getUnderstood has been called!", true, dsi
             .isCalledGetUnderstood());
 
-        SoapFault ie = (SoapFault)soapMessage.get(MustUnderstandInterceptor.FAULT);
+        Set<QName> ie = CastUtils.cast((Set<?>)soapMessage.get(MustUnderstandInterceptor.UNKNOWNS));
         if (ie == null) {
-            fail("InBound Exception Missing! Exception should be Can't understands QNames: " + PASSENGER);
+            fail("InBound unknowns missing! Exception should be Can't understands QNames: " + PASSENGER);
         } else {
-            assertEquals(soapMessage.getVersion().getMustUnderstand(), ie.getFaultCode());
-            assertTrue(ie.getMessage().toString().contains(PASSENGER.toString()));
+            assertTrue(ie.contains(PASSENGER));
         }
     }
 

Modified: cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/SchemaValidationImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/SchemaValidationImpl.java?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/SchemaValidationImpl.java (original)
+++ cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/SchemaValidationImpl.java Fri Feb 15 19:21:47 2013
@@ -27,8 +27,11 @@ import javax.jws.WebService;
 import org.apache.schema_validation.SchemaValidation;
 import org.apache.schema_validation.types.ComplexStruct;
 import org.apache.schema_validation.types.OccuringStruct;
+import org.apache.schema_validation.types.SomeHeader;
 import org.apache.schema_validation.types.SomeRequest;
+import org.apache.schema_validation.types.SomeRequestWithHeader;
 import org.apache.schema_validation.types.SomeResponse;
+import org.apache.schema_validation.types.SomeResponseWithHeader;
 
 @WebService(serviceName = "SchemaValidationService", 
             portName = "SoapPort",
@@ -76,4 +79,11 @@ public class SchemaValidationImpl implem
         
         return response;
     }
+
+
+    public SomeResponseWithHeader doSomethingWithHeader(SomeRequestWithHeader in,
+                                                        SomeHeader inHeader) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }

Modified: cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/ValidationClientServerTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/ValidationClientServerTest.java?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/ValidationClientServerTest.java (original)
+++ cxf/branches/2.6.x-fixes/systests/uncategorized/src/test/java/org/apache/cxf/systest/schema_validation/ValidationClientServerTest.java Fri Feb 15 19:21:47 2013
@@ -20,11 +20,16 @@
 package org.apache.cxf.systest.schema_validation;
 
 import java.io.Serializable;
+import java.io.StringReader;
 import java.net.URL;
 import java.util.List;
 
 import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
 import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Dispatch;
+import javax.xml.ws.Service.Mode;
 import javax.xml.ws.WebServiceException;
 
 import org.apache.cxf.annotations.SchemaValidation.SchemaValidationType;
@@ -179,6 +184,24 @@ public class ValidationClientServerTest 
         assertIgnoredResponseValidation(SchemaValidationType.OUT.name());
     }
 
+    @Test
+    public void testHeaderValidation() throws Exception {
+        URL wsdl = getClass().getResource("/wsdl/schema_validation.wsdl");
+        assertNotNull(wsdl);
+        SchemaValidationService service = new SchemaValidationService(wsdl, serviceName);
+        assertNotNull(service);
+
+        
+        String smsg = "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Header>"
+            + "<SomeHeader soap:mustUnderstand='1' xmlns='http://apache.org/schema_validation/types'>"
+            + "<id>1111111111</id></SomeHeader>"
+            + "</soap:Header><soap:Body><SomeRequestWithHeader xmlns='http://apache.org/schema_validation/types'>"
+            + "<id>1111111111</id></SomeRequestWithHeader></soap:Body></soap:Envelope>";
+        Dispatch<Source> dsp = service.createDispatch(SchemaValidationService.SoapPort, Source.class, Mode.MESSAGE);
+        updateAddressPort(dsp, PORT);
+        dsp.invoke(new StreamSource(new StringReader(smsg)));
+    }
+    
     private SomeResponse execute(SchemaValidation service, String id) throws Exception { 
         SomeRequest request = new SomeRequest();
         request.setId(id);

Modified: cxf/branches/2.6.x-fixes/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/ProtocolVariationsTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/ProtocolVariationsTest.java?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/ProtocolVariationsTest.java (original)
+++ cxf/branches/2.6.x-fixes/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/ProtocolVariationsTest.java Fri Feb 15 19:21:47 2013
@@ -287,12 +287,8 @@ public class ProtocolVariationsTest exte
             fail("invalid wsrm header");
         } catch (Exception e) {
             assertTrue(e.getCause() instanceof SoapFault);
-            // verify a partial error text match to exclude an unexpected exception
-            // because there is a mustUnderstand header that is not understood,
-            // the corresponding error is returned.
-            final String text = "MustUnderstand headers: " 
-                                + "[{http://cxf.apache.org/invalid}Sequence] are not understood.";
-            assertTrue(e.getCause().getMessage() != null 
+            final String text = "WS-ReliableMessaging is required";
+            assertTrue(e.getCause().getMessage(), e.getCause().getMessage() != null 
                 && e.getCause().getMessage().indexOf(text) >= 0);
         }
     }

Modified: cxf/branches/2.6.x-fixes/testutils/src/main/resources/wsdl/schema_validation.wsdl
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/testutils/src/main/resources/wsdl/schema_validation.wsdl?rev=1446734&r1=1446733&r2=1446734&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/testutils/src/main/resources/wsdl/schema_validation.wsdl (original)
+++ cxf/branches/2.6.x-fixes/testutils/src/main/resources/wsdl/schema_validation.wsdl Fri Feb 15 19:21:47 2013
@@ -56,7 +56,30 @@
 	            	</sequence>
     	        </complexType>
 	    	</element>
+            <element name="SomeRequestWithHeader">
+                <complexType>
+                    <sequence>
+                        <element name="id" type="x1:RequestIdType"/>
+                    </sequence>
+                </complexType>
+            </element>
+                        
+            <element name="SomeResponseWithHeader">
+                <complexType>
+                    <sequence>
+                        <element name="transactionId" type="x1:ResponseTransactionType"/>
+                    </sequence>
+                </complexType>
+            </element>   
+            <element name="SomeHeader">
+                <complexType>
+                    <sequence>
+                        <element name="id" type="x1:RequestIdType"/>
+                    </sequence>
+                </complexType>
+            </element>
             
+
             <complexType name="ComplexStruct">
                 <sequence>
                     <element name="elem1" type="string"/>
@@ -137,6 +160,14 @@
         <wsdl:part element="x1:SomeResponse" name="in"/>
     </wsdl:message>
     
+    <wsdl:message name="doSomethingRequestWithHeader">
+        <wsdl:part element="x1:SomeRequestWithHeader" name="in"/>
+        <wsdl:part element="x1:SomeHeader" name="inHeader"/>
+    </wsdl:message>
+    <wsdl:message name="doSomethingResponseWithHeader">
+        <wsdl:part element="x1:SomeResponseWithHeader" name="in"/>
+    </wsdl:message>
+
     <wsdl:message name="setComplexStructRequest">
         <wsdl:part element="x1:setComplexStruct" name="in"/>
     </wsdl:message>
@@ -188,6 +219,10 @@
             <wsdl:input message="tns:getOccuringStructRequest" name="getOccuringStructRequest"/>
             <wsdl:output message="tns:getOccuringStructResponse" name="getOccuringStructResponse"/>
         </wsdl:operation>
+        <wsdl:operation name="doSomethingWithHeader">
+            <wsdl:input message="tns:doSomethingRequestWithHeader" name="doSomethingRequestWithHeader"/>
+            <wsdl:output message="tns:doSomethingResponseWithHeader" name="doSomethingResponseWithHeader"/>
+        </wsdl:operation>
     </wsdl:portType>
 
     <wsdl:binding name="SchemaValidationBinding" type="tns:SchemaValidation">
@@ -202,6 +237,16 @@
                 <soap:body use="literal"/>
             </wsdl:output>
         </wsdl:operation>
+        <wsdl:operation name="doSomethingWithHeader">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:header message="tns:doSomethingRequestWithHeader" part="inHeader" use="literal"/>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
         
         <wsdl:operation name="setComplexStruct">
             <soap:operation style="document"/>