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