You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/04/13 10:52:50 UTC

svn commit: r528393 - in /mina/trunk/core/src: main/java/org/apache/mina/filter/reqres/ test/java/org/apache/mina/filter/reqres/

Author: trustin
Date: Fri Apr 13 01:52:50 2007
New Revision: 528393

URL: http://svn.apache.org/viewvc?view=rev&rev=528393
Log:
* Added Request.awaitResponse methods to allow easy blocking operation

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java
    mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java
    mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java
    mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java Fri Apr 13 01:52:50 2007
@@ -19,7 +19,10 @@
  */
 package org.apache.mina.filter.reqres;
 
+import java.util.NoSuchElementException;
 import java.util.TimerTask;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -28,10 +31,14 @@
  * @version $Rev$, $Date$
  */
 public class Request {
+    private static final Object END = new Object();
+
     private final Object id;
     private final Object message;
     private final long timeoutMillis;
     private volatile TimerTask timerTask;
+
+    private final BlockingQueue<Object> responses = new LinkedBlockingQueue<Object>();
     
     public Request(Object id, Object message, long timeoutMillis) {
         this(id, message, timeoutMillis, TimeUnit.MILLISECONDS);
@@ -70,6 +77,56 @@
 
     public long getTimeoutMillis() {
         return timeoutMillis;
+    }
+    
+    public Response awaitResponse() throws RequestTimeoutException, InterruptedException {
+        return convertToResponse(responses.take());
+    }
+    
+    public Response awaitResponse(long timeout, TimeUnit unit) throws RequestTimeoutException, InterruptedException {
+        return convertToResponse(responses.poll(timeout, unit));
+    }
+
+    private Response convertToResponse(Object o) {
+        if (o instanceof Response) {
+            return (Response) o;
+        }
+        
+        if (o == null) {
+            return null;
+        }
+        
+        if (o == END) {
+            throw new NoSuchElementException(
+                    "All responses has been retrieved already.");
+        }
+        
+        throw (RequestTimeoutException) o;
+    }
+
+    public Response awaitResponseUninterruptibly() throws RequestTimeoutException {
+        for (;;) {
+            try {
+                return awaitResponse();
+            } catch (InterruptedException e) {
+            }
+        }
+    }
+    
+    void signal(Response response) {
+        signal0(response);
+        if (response.getType() != ResponseType.PARTIAL) {
+            signal0(END);
+        }
+    }
+    
+    void signal(RequestTimeoutException e) {
+        signal0(e);
+        signal0(END);
+    }
+    
+    private void signal0(Object answer) {
+        responses.offer(answer);
     }
     
     @Override

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java Fri Apr 13 01:52:50 2007
@@ -135,7 +135,9 @@
             }
 
             // And forward the event.
-            nextFilter.messageReceived(session, new Response(request, message, type));
+            Response response = new Response(request, message, type);
+            request.signal(response);
+            nextFilter.messageReceived(session, response);
         }
     }
 
@@ -148,6 +150,12 @@
         }
         
         Request request = (Request) message;
+        if (request.getTimerTask() != null) {
+            nextFilter.exceptionCaught(
+                    session,
+                    new IllegalArgumentException("Request can not be reused."));
+        }
+        
         ConcurrentMap<Object, Request> requestStore = getRequestStore(session);
         Object oldValue = requestStore.putIfAbsent(request.getId(), request);
         if (oldValue != null) {
@@ -252,7 +260,9 @@
             ConcurrentMap<Object, Request> requestStore = getRequestStore(session);
             if (requestStore.remove(request.getId(), request)) {
                 // Throw the exception only when it's really timed out.
-                filter.exceptionCaught(session, new RequestTimeoutException(request));
+                RequestTimeoutException e = new RequestTimeoutException(request);
+                request.signal(e);
+                filter.exceptionCaught(session, e);
             }
         }
     }

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java Fri Apr 13 01:52:50 2007
@@ -19,15 +19,15 @@
  */
 package org.apache.mina.filter.reqres;
 
-import java.io.IOException;
+import org.apache.mina.common.RuntimeIOException;
 
 /**
- * An {@link IOException} which is thrown when a {@link Request} is timed out.
+ * An {@link RuntimeIOException} which is thrown when a {@link Request} is timed out.
  * 
  * @author The Apache MINA Project (dev@mina.apache.org)
  * @version $Rev$, $Date$, 
  */
-public class RequestTimeoutException extends IOException {
+public class RequestTimeoutException extends RuntimeIOException {
     private static final long serialVersionUID = 5546784978950631652L;
 
     private final Request request;

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java Fri Apr 13 01:52:50 2007
@@ -20,6 +20,7 @@
 package org.apache.mina.filter.reqres;
 
 import java.net.SocketAddress;
+import java.util.NoSuchElementException;
 
 import org.apache.mina.common.DefaultWriteRequest;
 import org.apache.mina.common.IoFilterChain;
@@ -115,6 +116,18 @@
         
         // Verify
         nextFilterControl.verify();
+        Assert.assertEquals(res, req.awaitResponse());
+        assertNoSuchElementException(req);
+    }
+
+    private void assertNoSuchElementException(Request req) throws InterruptedException {
+        // Make sure if an exception is thrown if a user waits one more time.
+        try {
+            req.awaitResponse();
+            Assert.fail();
+        } catch (NoSuchElementException e) {
+            // OK
+        }
     }
     
     @Test
@@ -142,6 +155,9 @@
         
         // Verify
         nextFilterControl.verify();
+        Assert.assertEquals(res1, req.awaitResponse());
+        Assert.assertEquals(res2, req.awaitResponse());
+        assertNoSuchElementException(req);
     }
     
     @Test
@@ -166,6 +182,17 @@
         
         // Verify
         nextFilterControl.verify();
+        assertRequestTimeoutException(req);
+        assertNoSuchElementException(req);
+    }
+
+    private void assertRequestTimeoutException(Request req) throws InterruptedException {
+        try {
+            req.awaitResponse();
+            Assert.fail();
+        } catch (RequestTimeoutException e) {
+            // OK
+        }
     }
     
     @Test
@@ -194,6 +221,9 @@
         
         // Verify
         nextFilterControl.verify();
+        Assert.assertEquals(res1, req.awaitResponse());
+        assertRequestTimeoutException(req);
+        assertNoSuchElementException(req);
     }
     
     @Test
@@ -229,6 +259,8 @@
         
         // Verify
         nextFilterControl.verify();
+        assertRequestTimeoutException(req1);
+        assertRequestTimeoutException(req2);
     }
     
     private static class Message {