Author: markt
Date: Mon Oct 28 10:03:25 2013
New Revision: 1536298
URL: http://svn.apache.org/r1536298
Log:
Use application class loader when calling ReadListener and WriteListener methods
Modified:
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
Modified:
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java?rev=1536298&r1=1536297&r2=1536298&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java
(original)
+++
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java
Mon Oct 28 10:03:25 2013
@@ -32,7 +32,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;
@Override
public final boolean isFinished() {
@@ -61,7 +61,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();
@@ -75,6 +82,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;
}
@@ -142,11 +150,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;
@@ -166,7 +173,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/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java?rev=1536298&r1=1536297&r2=1536298&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
(original)
+++
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
Mon Oct 28 10:03:25 2013
@@ -36,6 +36,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;
@Override
@@ -61,6 +62,7 @@ public abstract class AbstractServletOut
sm.getString("upgrade.sos.writeListener.null"));
}
this.listener = listener;
+ this.applicationLoader =
Thread.currentThread().getContextClassLoader();
}
protected final boolean isCloseRequired() {
@@ -132,7 +134,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 t;
} else {
@@ -151,7 +160,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);
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]