You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2010/11/22 18:30:15 UTC
svn commit: r1037786 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/
Author: sergeyb
Date: Mon Nov 22 17:30:14 2010
New Revision: 1037786
URL: http://svn.apache.org/viewvc?rev=1037786&view=rev
Log:
[CXF-3133] Support for invocations suspended from JAX-RS subresources, thanks to Willem
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1037786&r1=1037785&r2=1037786&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Mon Nov 22 17:30:14 2010
@@ -37,6 +37,7 @@ import org.apache.cxf.common.logging.Log
import org.apache.cxf.common.util.ClassHelper;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.InterceptorChain.State;
import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
@@ -60,6 +61,8 @@ public class JAXRSInvoker extends Abstra
private static final String SERVICE_LOADER_AS_CONTEXT = "org.apache.cxf.serviceloader-context";
private static final String SERVICE_OBJECT_SCOPE = "org.apache.cxf.service.scope";
private static final String REQUEST_SCOPE = "request";
+ private static final String LAST_SERVICE_OBJECT = "org.apache.cxf.service.object.last";
+ private static final String REQUEST_WAS_SUSPENDED = "org.apache.cxf.service.request.suspended";
public JAXRSInvoker() {
}
@@ -77,45 +80,62 @@ public class JAXRSInvoker extends Abstra
return new MessageContentsList(response);
}
ResourceProvider provider = getResourceProvider(exchange);
- Object serviceObject = getServiceObject(exchange);
+ Object rootInstance = getServiceObject(exchange);
+ Object serviceObject = getActualServiceObject(exchange, rootInstance);
+
try {
return invoke(exchange, request, serviceObject);
} finally {
- if (exchange.isOneWay()) {
- ProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
- }
- if (!isServiceObjectRequestScope(exchange.getInMessage())) {
- provider.releaseInstance(exchange.getInMessage(), serviceObject);
+ boolean suspended = exchange.getInMessage().getInterceptorChain().getState() == State.SUSPENDED;
+ if (!suspended) {
+ if (exchange.isOneWay()) {
+ ProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
+ }
+ if (!isServiceObjectRequestScope(exchange.getInMessage())) {
+ provider.releaseInstance(exchange.getInMessage(), rootInstance);
+ } else {
+ persistRoots(exchange, rootInstance, provider);
+ }
} else {
- exchange.put(JAXRSUtils.ROOT_INSTANCE, serviceObject);
- exchange.put(JAXRSUtils.ROOT_PROVIDER, provider);
+ persistRoots(exchange, rootInstance, provider);
+ exchange.put(REQUEST_WAS_SUSPENDED, true);
}
}
}
+ private void persistRoots(Exchange exchange, Object rootInstance, Object provider) {
+ exchange.put(JAXRSUtils.ROOT_INSTANCE, rootInstance);
+ exchange.put(JAXRSUtils.ROOT_PROVIDER, provider);
+ }
+
@SuppressWarnings("unchecked")
public Object invoke(Exchange exchange, Object request, Object resourceObject) {
OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
ClassResourceInfo cri = ori.getClassResourceInfo();
-
- pushOntoStack(ori, ClassHelper.getRealClass(resourceObject), exchange.getInMessage());
-
- Method methodToInvoke = InjectionUtils.checkProxy(
- cri.getMethodDispatcher().getMethod(ori), resourceObject);
- if (cri.isRoot()) {
- JAXRSUtils.handleSetters(ori, resourceObject,
- exchange.getInMessage());
-
- InjectionUtils.injectContextFields(resourceObject,
- ori.getClassResourceInfo(),
- exchange.getInMessage());
- InjectionUtils.injectResourceFields(resourceObject,
- ori.getClassResourceInfo(),
- exchange.getInMessage());
+ boolean wasSuspended = exchange.remove(REQUEST_WAS_SUSPENDED) != null;
+
+ if (!wasSuspended) {
+ pushOntoStack(ori, ClassHelper.getRealClass(resourceObject), exchange.getInMessage());
+
+ if (cri.isRoot()) {
+ JAXRSUtils.handleSetters(ori, resourceObject,
+ exchange.getInMessage());
+
+ InjectionUtils.injectContextFields(resourceObject,
+ ori.getClassResourceInfo(),
+ exchange.getInMessage());
+ InjectionUtils.injectResourceFields(resourceObject,
+ ori.getClassResourceInfo(),
+ exchange.getInMessage());
+ }
}
+
+ Method methodToInvoke = InjectionUtils.checkProxy(
+ cri.getMethodDispatcher().getMethod(ori), resourceObject);
+
List<Object> params = null;
if (request instanceof List) {
params = CastUtils.cast((List<?>)request);
@@ -147,6 +167,7 @@ public class JAXRSInvoker extends Abstra
}
return new MessageContentsList(excResponse);
} finally {
+ exchange.put(LAST_SERVICE_OBJECT, resourceObject);
if (contextLoader != null) {
Thread.currentThread().setContextClassLoader(contextLoader);
}
@@ -230,18 +251,37 @@ public class JAXRSInvoker extends Abstra
}
private ResourceProvider getResourceProvider(Exchange exchange) {
- OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
- ClassResourceInfo cri = ori.getClassResourceInfo();
- return cri.getResourceProvider();
+ Object provider = exchange.remove(JAXRSUtils.ROOT_PROVIDER);
+ if (provider == null) {
+ OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
+ ClassResourceInfo cri = ori.getClassResourceInfo();
+ return cri.getResourceProvider();
+ } else {
+ return (ResourceProvider)provider;
+ }
}
public Object getServiceObject(Exchange exchange) {
+
+ Object root = exchange.remove(JAXRSUtils.ROOT_INSTANCE);
+ if (root != null) {
+ return root;
+ }
+
OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
ClassResourceInfo cri = ori.getClassResourceInfo();
return cri.getResourceProvider().getInstance(exchange.getInMessage());
}
-
+
+ public Object getActualServiceObject(Exchange exchange, Object rootInstance) {
+
+ Object last = exchange.get(LAST_SERVICE_OBJECT);
+ return last != null ? last : rootInstance;
+ }
+
+
+
private static Object checkResultObject(Object result, String subResourcePath) {
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java?rev=1037786&r1=1037785&r2=1037786&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java Mon Nov 22 17:30:14 2010
@@ -56,6 +56,20 @@ public class BookContinuationStore {
@Path("/books/{id}")
public String getBookDescription(@PathParam("id") String id) {
+ return handleContinuationRequest(id);
+
+ }
+
+ @Path("/books/subresources/")
+ public BookContinuationStore getBookStore() {
+
+ return this;
+
+ }
+
+ @GET
+ @Path("{id}")
+ public String handleContinuationRequest(@PathParam("id") String id) {
Continuation continuation = getContinuation(id);
if (continuation == null) {
throw new RuntimeException("Failed to get continuation");
@@ -76,7 +90,6 @@ public class BookContinuationStore {
return null;
}
-
private void resumeRequest(final String name) {
Continuation suspendedCont = null;
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1037786&r1=1037785&r2=1037786&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Mon Nov 22 17:30:14 2010
@@ -50,7 +50,6 @@ import org.apache.cxf.jaxrs.ext.xml.XMLS
import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
import org.apache.cxf.jaxrs.provider.XSLTJaxbProvider;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
-import org.apache.cxf.transport.http.HTTPConduit;
import org.junit.BeforeClass;
import org.junit.Ignore;
@@ -666,9 +665,6 @@ public class JAXRSClientServerBookTest e
WebClient wc = WebClient.create("http://localhost:" + PORT + "/bookstore/books/adapter-list",
Collections.singletonList(provider));
- HTTPConduit conduit = WebClient.getConfig(wc).getHttpConduit();
- conduit.getClient().setReceiveTimeout(1000000);
- conduit.getClient().setConnectionTimeout(1000000);
Collection<? extends Book> books = wc.type("application/xml").accept("application/xml")
.postAndGetCollection(new Books(new Book("CXF", 123L)), Book.class);
assertEquals(1, books.size());
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsTest.java?rev=1037786&r1=1037785&r2=1037786&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsTest.java Mon Nov 22 17:30:14 2010
@@ -45,24 +45,35 @@ public class JAXRSContinuationsTest exte
@Test
public void testContinuation() throws Exception {
+
+ doTestContinuation("books");
+ }
+
+ @Test
+ public void testContinuationSubresource() throws Exception {
+
+ doTestContinuation("books/subresources");
+ }
+
+ private void doTestContinuation(String pathSegment) throws Exception {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(10));
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(5);
- executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/books/1",
+ executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/" + pathSegment + "/1",
"1",
"CXF in Action1", startSignal, doneSignal));
- executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/books/2",
+ executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/" + pathSegment + "/2",
"2",
"CXF in Action2", startSignal, doneSignal));
- executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/books/3",
+ executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/" + pathSegment + "/3",
"3",
"CXF in Action3", startSignal, doneSignal));
- executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/books/4",
+ executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/" + pathSegment + "/4",
"4",
"CXF in Action4", startSignal, doneSignal));
- executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/books/5",
+ executor.execute(new BookWorker("http://localhost:" + PORT + "/bookstore/" + pathSegment + "/5",
"5",
"CXF in Action5", startSignal, doneSignal));
@@ -70,7 +81,6 @@ public class JAXRSContinuationsTest exte
doneSignal.await(60, TimeUnit.SECONDS);
executor.shutdownNow();
assertEquals("Not all invocations have completed", 0, doneSignal.getCount());
-
}
private void checkBook(String address, String id, String expected) throws Exception {