You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2010/11/15 11:12:29 UTC

svn commit: r1035203 - in /cxf/trunk: rt/core/src/main/java/org/apache/cxf/interceptor/ systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/ systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/

Author: ffang
Date: Mon Nov 15 10:12:28 2010
New Revision: 1035203

URL: http://svn.apache.org/viewvc?rev=1035203&view=rev
Log:
[CXF-3122]Async Handler for dispatch client is called twice in case of bad response message

Added:
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithMalformedResponseTest.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/MalformedResponseInterceptor.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/GreetMeDocLiteralRespMalformed.xml
Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientOutFaultObserver.java

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientOutFaultObserver.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientOutFaultObserver.java?rev=1035203&r1=1035202&r2=1035203&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientOutFaultObserver.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientOutFaultObserver.java Mon Nov 15 10:12:28 2010
@@ -45,6 +45,10 @@ public class ClientOutFaultObserver exte
      * override the super class method
      */
     public void onMessage(Message m) {
+        if (m.get(Message.INBOUND_MESSAGE).equals(Boolean.TRUE)) {
+            //it's outbound fault observer so only take care of outbound fault
+            return;
+        }
         Exception ex = m.getContent(Exception.class);
         ClientCallback callback = m.getExchange().get(ClientCallback.class);
 

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithMalformedResponseTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithMalformedResponseTest.java?rev=1035203&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithMalformedResponseTest.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithMalformedResponseTest.java Mon Nov 15 10:12:28 2010
@@ -0,0 +1,160 @@
+/**
+ * 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.systest.dispatch;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.concurrent.Future;
+
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Dispatch;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Response;
+import javax.xml.ws.Service;
+
+
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.cxf.testutil.common.TestUtil;
+import org.apache.hello_world_soap_http.GreeterImpl;
+import org.apache.hello_world_soap_http.SOAPService;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class DispatchClientServerWithMalformedResponseTest extends AbstractBusClientServerTestBase {
+
+    private static final QName SERVICE_NAME 
+        = new QName("http://apache.org/hello_world_soap_http", "SOAPDispatchService");
+    private static final QName PORT_NAME 
+        = new QName("http://apache.org/hello_world_soap_http", "SoapDispatchPort");
+
+    private static String greeterPort = 
+        TestUtil.getPortNumber(DispatchClientServerWithMalformedResponseTest.class); 
+    private int asyncHandlerInvokedCount;
+    
+    public static class Server extends AbstractBusTestServerBase {        
+
+        protected void run() {
+            Object implementor = new GreeterImpl();
+            String address = "http://localhost:"
+                + TestUtil.getPortNumber(DispatchClientServerWithMalformedResponseTest.class)
+                + "/SOAPDispatchService/SoapDispatchPort";
+            Endpoint.publish(address, implementor);
+
+        }
+
+        public static void main(String[] args) {
+            try {
+                Server s = new Server();
+                s.start();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                System.exit(-1);
+            } finally {
+                System.out.println("done!");
+            }
+        }
+    }
+
+    @BeforeClass
+    public static void startServers() throws Exception {
+        assertTrue("server did not launch correctly", launchServer(Server.class));
+    }
+    
+    @org.junit.Before
+    public void setUp() {
+        BusFactory.getDefaultBus().getOutInterceptors().add(new LoggingOutInterceptor());
+        BusFactory.getDefaultBus().getInInterceptors().add(new LoggingInInterceptor());
+        BusFactory.getDefaultBus().getInInterceptors().add(new MalformedResponseInterceptor());
+    }
+    
+    private void waitForFuture(Future fd) throws Exception {
+        int count = 0;
+        while (!fd.isDone()) {
+            ++count;
+            if (count > 500) {
+                fail("Did not finish in 10 seconds");
+            }
+            Thread.sleep(20);
+        }
+    }
+    
+   
+    @Test
+    public void testSOAPMessageWithMalformedResponse() throws Exception {
+
+        URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+        assertNotNull(wsdl);
+
+        SOAPService service = new SOAPService(wsdl, SERVICE_NAME);
+        assertNotNull(service);
+
+        Dispatch<SOAPMessage> disp = service
+            .createDispatch(PORT_NAME, SOAPMessage.class, Service.Mode.MESSAGE);
+        disp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                                     "http://localhost:" 
+                                     + greeterPort
+                                     + "/SOAPDispatchService/SoapDispatchPort");
+        
+        
+
+        // Test async callback
+        InputStream is3 = getClass().getResourceAsStream("resources/GreetMeDocLiteralReq3.xml");
+        SOAPMessage soapReqMsg3 = MessageFactory.newInstance().createMessage(null, is3);
+        assertNotNull(soapReqMsg3);
+        TestSOAPMessageHandler tsmh = new TestSOAPMessageHandler();
+        Future f = disp.invokeAsync(soapReqMsg3, tsmh);
+        assertNotNull(f);
+        waitForFuture(f);
+        assertEquals("AsyncHandler shouldn't get invoked more than once", asyncHandlerInvokedCount, 1);
+       
+    }
+    
+   
+
+    class TestSOAPMessageHandler implements AsyncHandler<SOAPMessage> {
+
+        String replyBuffer;
+
+        public void handleResponse(Response<SOAPMessage> response) {
+            try {
+                asyncHandlerInvokedCount++;
+                SOAPMessage reply = response.get();
+                replyBuffer = reply.getSOAPBody().getTextContent();
+            } catch (Exception e) {
+                System.out.println("the exception is :");
+                e.printStackTrace();
+            }
+        }
+
+        public String getReplyBuffer() {
+            return replyBuffer;
+        }
+    }
+
+}

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/MalformedResponseInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/MalformedResponseInterceptor.java?rev=1035203&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/MalformedResponseInterceptor.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/MalformedResponseInterceptor.java Mon Nov 15 10:12:28 2010
@@ -0,0 +1,63 @@
+/**
+ * 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.systest.dispatch;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.io.CachedOutputStream;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+public class MalformedResponseInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    public MalformedResponseInterceptor() {
+        super(Phase.RECEIVE);
+        addAfter(LoggingInInterceptor.class.getName());
+    }
+
+    public void handleMessage(Message message) throws Fault {
+        InputStream is = message.getContent(InputStream.class);
+        if (is != null) {
+            CachedOutputStream bos = new CachedOutputStream();
+            try {
+                //intend to change response as malformed message
+                is = getClass().getClassLoader().getResourceAsStream(
+                        "org/apache/cxf/systest/dispatch/resources/GreetMeDocLiteralRespMalformed.xml");
+                IOUtils.copy(is, bos);
+
+                bos.flush();
+                is.close();
+                message.setContent(InputStream.class, bos.getInputStream());
+                bos.close();
+                message.setContent(InputStream.class, bos.getInputStream());
+                
+            } catch (IOException e) {
+                throw new Fault(e);
+            }
+        }
+
+    }
+
+}
+

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/GreetMeDocLiteralRespMalformed.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/GreetMeDocLiteralRespMalformed.xml?rev=1035203&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/GreetMeDocLiteralRespMalformed.xml (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/GreetMeDocLiteralRespMalformed.xml Mon Nov 15 10:12:28 2010
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><ns4:greetMeResponse xmlns:ns4="http://apache.org/hello_world_soap_http/types"><ns4:responseType>TestSOAPOutputPMessage</ns4:responseType></ns4:greetMeResponse>