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 2012/10/22 12:31:36 UTC

svn commit: r1400835 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/

Author: sergeyb
Date: Mon Oct 22 10:31:36 2012
New Revision: 1400835

URL: http://svn.apache.org/viewvc?rev=1400835&view=rev
Log:
Initial support for AsyncResponse ResumeCallback

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.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=1400835&r1=1400834&r2=1400835&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 Oct 22 10:31:36 2012
@@ -88,8 +88,6 @@ public class JAXRSInvoker extends Abstra
                     if (asyncObj instanceof Throwable) {
                         return handleFault(new Fault((Throwable)asyncObj), 
                                            exchange.getInMessage(), null, null);    
-                    } else if (!(asyncObj instanceof Response)) {
-                        response = Response.ok().entity(asyncObj).build();
                     } else {
                         response = (Response)asyncObj;
                     }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java?rev=1400835&r1=1400834&r2=1400835&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java Mon Oct 22 10:31:36 2012
@@ -21,8 +21,10 @@ package org.apache.cxf.jaxrs.impl;
 import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.CompletionCallback;
+import javax.ws.rs.container.ResumeCallback;
 import javax.ws.rs.container.TimeoutHandler;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
@@ -31,6 +33,7 @@ import javax.ws.rs.core.Response.Respons
 import org.apache.cxf.continuations.Continuation;
 import org.apache.cxf.continuations.ContinuationCallback;
 import org.apache.cxf.continuations.ContinuationProvider;
+import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
 import org.apache.cxf.message.Message;
 
@@ -41,12 +44,13 @@ public class AsyncResponseImpl implement
     private long timeout = AsyncResponse.NO_TIMEOUT;
     private Message inMessage;
     private boolean cancelled;
-    private boolean done;
+    private volatile boolean done;
     private boolean newTimeoutRequested;
     private boolean resumedByApplication;
     private TimeoutHandler timeoutHandler;
     
     private CompletionCallback completionCallback;
+    private ResumeCallback resumeCallback;
     
     public AsyncResponseImpl(Message inMessage) {
         inMessage.put(AsyncResponse.class, this);
@@ -113,7 +117,7 @@ public class AsyncResponseImpl implement
     }
 
     @Override
-    public synchronized boolean isDone() {
+    public boolean isDone() {
         return done;
     }
 
@@ -147,9 +151,10 @@ public class AsyncResponseImpl implement
         
     }
 
+    //TODO: API bug, boolean[] needs to be returned...
     @Override
     public boolean register(Object callback) throws NullPointerException {
-        return register(callback, CompletionCallback.class)[0];
+        return register(callback, CompletionCallback.class, ResumeCallback.class)[0];
     }
 
     //TODO: API bug, has to be Class<?>...
@@ -163,9 +168,12 @@ public class AsyncResponseImpl implement
                 throw new NullPointerException();
             }
             Class<?> cls = (Class<?>)interf;
-            if (cls == CompletionCallback.class) {
+            if (cls == CompletionCallback.class && callback instanceof CompletionCallback) {
                 completionCallback = (CompletionCallback)callback;
                 result[i] = true;
+            } else if (cls == ResumeCallback.class && callback instanceof ResumeCallback) {
+                resumeCallback = (ResumeCallback)callback;
+                result[i] = true;
             } else {
                 result[i] = false;
             }
@@ -192,9 +200,18 @@ public class AsyncResponseImpl implement
     }
     
     public synchronized Object getResponseObject() {
-        // it may have to be set to true only after a continuation-specific onComplete event
-        done = true;
-        return cont.getObject();
+        Object obj = cont.getObject();
+        if (!(obj instanceof Response) && !(obj instanceof Throwable)) {
+            obj = Response.ok().entity(obj).build();    
+        }
+        if (resumeCallback != null) {    
+            if (obj instanceof Response) {
+                resumeCallback.onResume(this, (Response)obj);
+            } else {
+                resumeCallback.onResume(this, (Throwable)obj);
+            }
+        }
+        return obj;
     }
     
     public synchronized boolean isResumedByApplication() {
@@ -211,16 +228,19 @@ public class AsyncResponseImpl implement
                 suspend();
                 timeoutHandler.handleTimeout(this);
                 return true;
-            } else {
-                done = true;
+            } else if (resumeCallback != null) {
+                resumeCallback.onResume(this, new WebApplicationException(503));    
             }
         }
         return false;
         
     }
 
+    
+    
     @Override
     public void onComplete() {
+        done = true;
         if (completionCallback != null) {
             completionCallback.onComplete();
         }
@@ -229,7 +249,8 @@ public class AsyncResponseImpl implement
     @Override
     public void onError(Throwable error) {
         if (completionCallback != null) {
-            completionCallback.onError(error);
+            Throwable actualError = error instanceof Fault ? ((Fault)error).getCause() : error;
+            completionCallback.onError(actualError);
         }
         
     }

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=1400835&r1=1400834&r2=1400835&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 Oct 22 10:31:36 2012
@@ -32,7 +32,9 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.CompletionCallback;
+import javax.ws.rs.container.ResumeCallback;
 import javax.ws.rs.container.TimeoutHandler;
+import javax.ws.rs.core.Response;
 
 @Path("/bookstore")
 public class BookContinuationStore {
@@ -48,7 +50,7 @@ public class BookContinuationStore {
     @GET
     @Path("/books/defaulttimeout")
     public void getBookDescriptionWithHandler(AsyncResponse async) {
-        async.register(new CompletionCallbackImpl());
+        async.register(new CallbackImpl());
         async.setTimeout(2000, TimeUnit.MILLISECONDS);
     }
     
@@ -118,18 +120,27 @@ public class BookContinuationStore {
         
     }
     
-    private class CompletionCallbackImpl implements CompletionCallback {
+    private class CallbackImpl implements CompletionCallback, ResumeCallback {
 
         @Override
         public void onComplete() {
-            System.out.println("CompletionCallbackImpl: onComplete");
+            System.out.println("CompletionCallback: onComplete");
             
         }
 
         @Override
         public void onError(Throwable throwable) {
-            // TODO Auto-generated method stub
-            
+            System.out.println("CompletionCallback: onError");
+        }
+
+        @Override
+        public void onResume(AsyncResponse resuming, Response response) {
+            System.out.println("ResumeCallback: onResume");
+        }
+
+        @Override
+        public void onResume(AsyncResponse resuming, Throwable error) {
+            System.out.println("ResumeCallback: onResumeError");
         }
         
     }