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/18 11:53:34 UTC
svn commit: r1036397 - in /cxf/trunk:
rt/core/src/main/java/org/apache/cxf/endpoint/
systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/
systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/
Author: ffang
Date: Thu Nov 18 10:53:33 2010
New Revision: 1036397
URL: http://svn.apache.org/viewvc?rev=1036397&view=rev
Log:
[CXF-3132]asynchronous client can't get correct error if non-runtimeexcpetion happen
Added:
cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java
cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java
cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/stack_overflow_rs.xml
Modified:
cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java?rev=1036397&r1=1036396&r2=1036397&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java Thu Nov 18 10:53:33 2010
@@ -730,7 +730,31 @@ public class ClientImpl
} else if (message.getContent(Exception.class) != null) {
outFaultObserver.onMessage(message);
} else {
- chain.doIntercept(message);
+ callback = message.getExchange().get(ClientCallback.class);
+
+ if (callback != null && !isPartialResponse(message)) {
+ try {
+ chain.doIntercept(message);
+ } catch (Throwable error) {
+ //so that asyn callback handler get chance to
+ //handle non-runtime exceptions
+ message.getExchange().setInMessage(message);
+ Map<String, Object> resCtx = CastUtils
+ .cast((Map<?, ?>) message.getExchange()
+ .getOutMessage().get(
+ Message.INVOCATION_CONTEXT));
+ resCtx = CastUtils.cast((Map<?, ?>) resCtx
+ .get(RESPONSE_CONTEXT));
+ if (resCtx != null) {
+ responseContext.put(Thread.currentThread(), resCtx);
+ }
+ callback.handleException(resCtx, error);
+
+ }
+ } else {
+ chain.doIntercept(message);
+ }
+
}
callback = message.getExchange().get(ClientCallback.class);
Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java?rev=1036397&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java Thu Nov 18 10:53:33 2010
@@ -0,0 +1,131 @@
+/**
+ * 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.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPMessage;
+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 DispatchClientServerWithHugeResponseTest 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(DispatchClientServerWithHugeResponseTest.class);
+
+ public static class Server extends AbstractBusTestServerBase {
+
+ protected void run() {
+ Object implementor = new GreeterImpl();
+ String address = "http://localhost:"
+ + TestUtil.getPortNumber(DispatchClientServerWithHugeResponseTest.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 HugeResponseInterceptor());
+ }
+
+
+
+ @Test
+ public void testSOAPMessageWithHugeResponse() 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");
+
+
+
+ InputStream is3 = getClass().getResourceAsStream("resources/GreetMeDocLiteralReq3.xml");
+ SOAPMessage soapReqMsg3 = MessageFactory.newInstance().createMessage(null, is3);
+ assertNotNull(soapReqMsg3);
+ Response<SOAPMessage> response = disp.invokeAsync(soapReqMsg3);
+ try {
+ response.get(10, TimeUnit.SECONDS);
+ } catch (TimeoutException te) {
+ fail("We should not have encountered a timeout, "
+ + "should get some exception tell me stackoverflow");
+ } catch (Throwable e) {
+ assertTrue(e.getCause() instanceof StackOverflowError);
+ }
+
+ }
+
+
+}
Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java?rev=1036397&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java Thu Nov 18 10:53:33 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 HugeResponseInterceptor extends AbstractPhaseInterceptor<Message> {
+
+ public HugeResponseInterceptor() {
+ 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/stack_overflow_rs.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/stack_overflow_rs.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/stack_overflow_rs.xml?rev=1036397&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/stack_overflow_rs.xml (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/stack_overflow_rs.xml Thu Nov 18 10:53:33 2010
@@ -0,0 +1,4 @@
[... 5 lines stripped ...]