You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/10/28 11:06:03 UTC

svn commit: r1536299 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java webapps/docs/changelog.xml

Author: markt
Date: Mon Oct 28 10:06:03 2013
New Revision: 1536299

URL: http://svn.apache.org/r1536299
Log:
Use application class loader when calling ReadListener and WriteListener methods

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java
    tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1536298

Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java?rev=1536299&r1=1536298&r2=1536299&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java Mon Oct 28 10:06:03 2013
@@ -35,7 +35,7 @@ public abstract class AbstractServletInp
     // Start in blocking-mode
     private volatile Boolean ready = Boolean.TRUE;
     private volatile ReadListener listener = null;
-
+    private volatile ClassLoader applicationLoader = null;
 
     /**
      * New Servlet 3.1 method.
@@ -68,7 +68,14 @@ public abstract class AbstractServletInp
         try {
             ready = Boolean.valueOf(doIsReady());
         } catch (IOException e) {
-            listener.onError(e);
+            Thread thread = Thread.currentThread();
+            ClassLoader originalClassLoader = thread.getContextClassLoader();
+            try {
+                thread.setContextClassLoader(applicationLoader);
+                listener.onError(e);
+            } finally {
+                thread.setContextClassLoader(originalClassLoader);
+            }
             ready = Boolean.FALSE;
         }
         return ready.booleanValue();
@@ -84,6 +91,7 @@ public abstract class AbstractServletInp
                     sm.getString("upgrade.sis.readListener.null"));
         }
         this.listener = listener;
+        this.applicationLoader = Thread.currentThread().getContextClassLoader();
         // Switching to non-blocking. Don't know if data is available.
         ready = null;
     }
@@ -151,11 +159,10 @@ public abstract class AbstractServletInp
     private int readInternal() throws IOException {
         // Single byte reads for non-blocking need special handling so all
         // single byte reads run through this method.
-        ReadListener readListener = this.listener;
         byte[] b = new byte[1];
         int result;
         try {
-            result = doRead(readListener == null, b, 0, 1);
+            result = doRead(listener == null, b, 0, 1);
         } catch (IOException ioe) {
             closeRequired = true;
             throw ioe;
@@ -175,7 +182,14 @@ public abstract class AbstractServletInp
 
     protected final void onDataAvailable() throws IOException {
         ready = Boolean.TRUE;
-        listener.onDataAvailable();
+        Thread thread = Thread.currentThread();
+        ClassLoader originalClassLoader = thread.getContextClassLoader();
+        try {
+            thread.setContextClassLoader(applicationLoader);
+            listener.onDataAvailable();
+        } finally {
+            thread.setContextClassLoader(originalClassLoader);
+        }
     }
 
 

Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java?rev=1536299&r1=1536298&r2=1536299&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java Mon Oct 28 10:06:03 2013
@@ -39,6 +39,7 @@ public abstract class AbstractServletOut
     // Start in blocking-mode
     private volatile WriteListener listener = null;
     private volatile boolean fireListener = false;
+    private volatile ClassLoader applicationLoader = null;
     private volatile byte[] buffer;
 
     /**
@@ -68,6 +69,7 @@ public abstract class AbstractServletOut
                     sm.getString("upgrade.sos.writeListener.null"));
         }
         this.listener = listener;
+        this.applicationLoader = Thread.currentThread().getContextClassLoader();
     }
 
     protected final boolean isCloseRequired() {
@@ -139,7 +141,14 @@ public abstract class AbstractServletOut
                 writeInternal(buffer, 0, buffer.length);
             } catch (Throwable t) {
                 ExceptionUtils.handleThrowable(t);
-                listener.onError(t);
+                Thread thread = Thread.currentThread();
+                ClassLoader originalClassLoader = thread.getContextClassLoader();
+                try {
+                    thread.setContextClassLoader(applicationLoader);
+                    listener.onError(t);
+                } finally {
+                    thread.setContextClassLoader(originalClassLoader);
+                }
                 if (t instanceof IOException) {
                     throw (IOException) t;
                 } else {
@@ -158,7 +167,14 @@ public abstract class AbstractServletOut
                 }
             }
             if (fire) {
-                listener.onWritePossible();
+                Thread thread = Thread.currentThread();
+                ClassLoader originalClassLoader = thread.getContextClassLoader();
+                try {
+                    thread.setContextClassLoader(applicationLoader);
+                    listener.onWritePossible();
+                } finally {
+                    thread.setContextClassLoader(originalClassLoader);
+                }
             }
         }
     }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1536299&r1=1536298&r2=1536299&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Mon Oct 28 10:06:03 2013
@@ -96,6 +96,12 @@
         WebSocket) when using the APR/native connector that resulted in the
         unexpected closure of the connection. (markt)
       </fix>
+      <fix>
+        Ensure that the application class loader is used when calling the
+        <code>ReadListener</code> and <code>WriteListener</code> methods when
+        using non-blocking IO. A side effect of not doing this was that JNDI was
+        not available when processing WebSocket events. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Cluster">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org