Author: fhanik
Date: Thu May 24 08:47:29 2007
New Revision: 541337

URL: http://svn.apache.org/viewvc?view=rev&rev=541337
Log:
Add in support to check if the current thread is a Tomcat 'worker' thread or 
not, that way we can decide if the invokations are appropriate or not

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
    tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java?view=diff&rev=541337&r1=541336&r2=541337
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java Thu May 
24 08:47:29 2007
@@ -19,7 +19,7 @@
 package org.apache.catalina.connector;
 
 import java.io.IOException;
-
+import java.util.HashSet;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -29,7 +29,6 @@
 
 public class CometEventImpl implements CometEvent {
 
-
     /**
      * The string manager for this package.
      */
@@ -69,7 +68,14 @@
      */
     protected EventSubType eventSubType = null;
     
+    /**
+     * Current set of operations
+     */
+    protected HashSet<CometOperation> cometOperations = new 
HashSet<CometOperation>(3);
+    
+    protected WorkerThreadCheck threadCheck = new WorkerThreadCheck();
 
+    private static final Object threadCheckHolder = new Object();
     // --------------------------------------------------------- Public Methods
 
     /**
@@ -136,7 +142,13 @@
 
     public void register(CometEvent.CometOperation... operations)
         throws IOException, IllegalStateException {
-        throw new UnsupportedOperationException();
+        //add it to the registered set
+        for (CometEvent.CometOperation co : operations ) {
+            if ( !cometOperations.contains(co) ) {
+                cometOperations.add(co);
+                //TODO notify poller
+            }
+        }
     }
 
     public void unregister(CometOperation... operations)
@@ -150,6 +162,25 @@
     
     public CometOperation[] getRegisteredOps() {
         throw new UnsupportedOperationException();        
+    }
+    
+    protected void setWorkerThread() {
+        threadCheck.set(threadCheckHolder);
+    }
+    
+    protected void unsetWorkerThread() {
+        threadCheck.set(null);
+    }
+
+    protected void checkWorkerThread() throws IllegalStateException {
+        //throw exception if not on worker thread
+        if ( !(threadCheck.get() == threadCheckHolder) ) 
+            throw new IllegalStateException("The operation can only be 
performed when invoked by a Tomcat worker thread.");
+    }
+    
+    //inner class used to keep track if the current thread is a worker thread.
+    private static class WorkerThreadCheck extends ThreadLocal {
+        
     }
 
 }

Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?view=diff&rev=541337&r1=541336&r2=541337
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu May 
24 08:47:29 2007
@@ -119,7 +119,10 @@
             
             boolean error = false;
             boolean read = false;
+            CometEvent event = request.getEvent();
             try {
+                if ( event!=null && (event instanceof CometEventImpl)) 
+                    ((CometEventImpl)event).setWorkerThread();
                 if (status == SocketStatus.OPEN) {
                     if (response.isClosed()) {
                         // The event has been closed asynchronously, so call 
end instead of
@@ -198,6 +201,9 @@
                 error = true;
                 return false;
             } finally {
+                if ( event!=null && (event instanceof CometEventImpl)) 
+                    ((CometEventImpl)event).unsetWorkerThread();
+
                 req.getRequestProcessor().setWorkerThreadName(null);
                 // Recycle the wrapper request and response
                 if (error || response.isClosed() || !request.isComet()) {
@@ -250,7 +256,7 @@
         }
 
         boolean comet = false;
-        
+        CometEvent event = null;
         try {
 
             // Parse and set Catalina and configuration specific 
@@ -261,6 +267,10 @@
                 
connector.getContainer().getPipeline().getFirst().invoke(request, response);
 
                 if (request.isComet()) {
+                    event = request.getEvent();
+                    if ( event!=null && (event instanceof CometEventImpl)) 
+                        ((CometEventImpl)event).setWorkerThread();
+
                     if (!response.isClosed() && !response.isError()) {
                         if (request.getAvailable()) {
                             // Invoke a read event right away if there are 
available bytes
@@ -291,6 +301,9 @@
         } catch (Throwable t) {
             log.error(sm.getString("coyoteAdapter.service"), t);
         } finally {
+            if ( event!=null && (event instanceof CometEventImpl)) 
+                ((CometEventImpl)event).unsetWorkerThread();
+
             req.getRequestProcessor().setWorkerThreadName(null);
             // Recycle the wrapper request and response
             if (!comet) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to