Author: remm Date: Tue Nov 10 21:46:22 2015 New Revision: 1713733 URL: http://svn.apache.org/viewvc?rev=1713733&view=rev Log: - Port instance manager support for upgrade handlers. - Remove set context CL from websockets (since it is now done for all user calls).
Added: tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java (with props) Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/Processor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java tomcat/tc8.0.x/trunk/res/checkstyle/org-import-control.xml tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java Tue Nov 10 21:46:22 2015 @@ -80,8 +80,10 @@ import org.apache.catalina.core.AsyncCon import org.apache.catalina.mapper.MappingData; import org.apache.catalina.util.ParameterMap; import org.apache.coyote.ActionCode; +import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.InstanceManager; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.ByteChunk; @@ -1881,15 +1883,18 @@ public class Request @Override public <T extends HttpUpgradeHandler> T upgrade( Class<T> httpUpgradeHandlerClass) throws java.io.IOException, ServletException { - T handler; + InstanceManager instanceManager = null; try { - handler = (T) getContext().getInstanceManager().newInstance(httpUpgradeHandlerClass); + instanceManager = getContext().getInstanceManager(); + handler = (T) instanceManager.newInstance(httpUpgradeHandlerClass); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NamingException e) { throw new ServletException(e); } + UpgradeToken upgradeToken = new UpgradeToken(handler, + getContext().getLoader().getClassLoader(), instanceManager); - coyoteRequest.action(ActionCode.UPGRADE, handler); + coyoteRequest.action(ActionCode.UPGRADE, upgradeToken); // Output required by RFC2616. Protocol specific headers should have // already been set. Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProcessor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProcessor.java Tue Nov 10 21:46:22 2015 @@ -19,8 +19,6 @@ package org.apache.coyote; import java.io.IOException; import java.util.concurrent.Executor; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; @@ -214,7 +212,7 @@ public abstract class AbstractProcessor< public abstract SocketState upgradeDispatch(SocketStatus status) throws IOException; @Override - public abstract HttpUpgradeHandler getHttpUpgradeHandler(); + public abstract UpgradeToken getUpgradeToken(); /** Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java Tue Nov 10 21:46:22 2015 @@ -35,6 +35,7 @@ import javax.servlet.http.HttpUpgradeHan import javax.servlet.http.WebConnection; import org.apache.juli.logging.Log; +import org.apache.tomcat.InstanceManager; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.modeler.Registry; @@ -679,15 +680,15 @@ public abstract class AbstractProtocol<S if (state == SocketState.UPGRADING) { // Get the HTTP upgrade handler - HttpUpgradeHandler httpUpgradeHandler = - processor.getHttpUpgradeHandler(); + UpgradeToken upgradeToken = processor.getUpgradeToken(); + HttpUpgradeHandler httpUpgradeHandler = upgradeToken.getHttpUpgradeHandler(); // Retrieve leftover input ByteBuffer leftoverInput = processor.getLeftoverInput(); // Release the Http11 processor to be re-used release(wrapper, processor, false, false); // Create the upgrade processor processor = createUpgradeProcessor( - wrapper, leftoverInput, httpUpgradeHandler); + wrapper, leftoverInput, upgradeToken); // Mark the connection as upgraded wrapper.setUpgraded(true); // Associate with the processor with the connection @@ -698,7 +699,19 @@ public abstract class AbstractProtocol<S // This cast should be safe. If it fails the error // handling for the surrounding try/catch will deal with // it. - httpUpgradeHandler.init((WebConnection) processor); + if (upgradeToken.getInstanceManager() == null) { + httpUpgradeHandler.init((WebConnection) processor); + } else { + Thread thread = Thread.currentThread(); + // Set context class loader environment for user class call + ClassLoader originalClassLoader = thread.getContextClassLoader(); + try { + thread.setContextClassLoader(upgradeToken.getApplicationClassLoader()); + httpUpgradeHandler.init((WebConnection) processor); + } finally { + thread.setContextClassLoader(originalClassLoader); + } + } } if (getLog().isDebugEnabled()) { getLog().debug("Socket: [" + wrapper + @@ -745,7 +758,23 @@ public abstract class AbstractProtocol<S // processors are not recycled. connections.remove(socket); if (processor.isUpgrade()) { - processor.getHttpUpgradeHandler().destroy(); + UpgradeToken upgradeToken = processor.getUpgradeToken(); + HttpUpgradeHandler httpUpgradeHandler = upgradeToken.getHttpUpgradeHandler(); + InstanceManager instanceManager = upgradeToken.getInstanceManager(); + if (instanceManager == null) { + httpUpgradeHandler.destroy(); + } else { + Thread thread = Thread.currentThread(); + // Set context class loader environment for user class call + ClassLoader originalClassLoader = thread.getContextClassLoader(); + try { + thread.setContextClassLoader(upgradeToken.getApplicationClassLoader()); + httpUpgradeHandler.destroy(); + instanceManager.destroyInstance(httpUpgradeHandler); + } finally { + thread.setContextClassLoader(originalClassLoader); + } + } } else { release(wrapper, processor, true, false); } @@ -794,7 +823,7 @@ public abstract class AbstractProtocol<S boolean addToPoller); protected abstract Processor<S> createUpgradeProcessor( SocketWrapper<S> socket, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor) throws IOException; + UpgradeToken upgradeToken) throws IOException; protected void register(AbstractProcessor<S> processor) { if (getProtocol().getDomain() != null) { Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/Processor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/Processor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/Processor.java Tue Nov 10 21:46:22 2015 @@ -20,8 +20,6 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.concurrent.Executor; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.SocketStatus; @@ -41,7 +39,7 @@ public interface Processor<S> { SocketState asyncDispatch(SocketStatus status); SocketState asyncPostProcess(); - HttpUpgradeHandler getHttpUpgradeHandler(); + UpgradeToken getUpgradeToken(); SocketState upgradeDispatch(SocketStatus status) throws IOException; void errorDispatch(); Added: tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java?rev=1713733&view=auto ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java (added) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java Tue Nov 10 21:46:22 2015 @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.coyote; + +import javax.servlet.http.HttpUpgradeHandler; + +import org.apache.tomcat.InstanceManager; + +/** + * Token used during the upgrade process. + */ +public final class UpgradeToken { + + private final ClassLoader applicationClassLoader; + private final HttpUpgradeHandler httpUpgradeHandler; + private final InstanceManager instanceManager; + + public UpgradeToken(HttpUpgradeHandler httpUpgradeHandler, + ClassLoader applicationClassLoader, InstanceManager instanceManager) { + this.applicationClassLoader = applicationClassLoader; + this.httpUpgradeHandler = httpUpgradeHandler; + this.instanceManager = instanceManager; + } + + public final ClassLoader getApplicationClassLoader() { + return applicationClassLoader; + } + + public final HttpUpgradeHandler getHttpUpgradeHandler() { + return httpUpgradeHandler; + } + + public final InstanceManager getInstanceManager() { + return instanceManager; + } + +} Propchange: tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Tue Nov 10 21:46:22 2015 @@ -30,7 +30,6 @@ import java.util.concurrent.atomic.Atomi import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpUpgradeHandler; import org.apache.coyote.AbstractProcessor; import org.apache.coyote.ActionCode; @@ -42,6 +41,7 @@ import org.apache.coyote.OutputBuffer; import org.apache.coyote.Request; import org.apache.coyote.RequestInfo; import org.apache.coyote.Response; +import org.apache.coyote.UpgradeToken; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.HexUtils; @@ -929,7 +929,7 @@ public abstract class AbstractAjpProcess @Override - public HttpUpgradeHandler getHttpUpgradeHandler() { + public UpgradeToken getUpgradeToken() { // Should never reach this code but in case we do... throw new IllegalStateException( sm.getString("ajpprocessor.httpupgrade.notsupported")); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java Tue Nov 10 21:46:22 2015 @@ -18,10 +18,9 @@ package org.apache.coyote.ajp; import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.UpgradeToken; import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; @@ -114,7 +113,7 @@ public abstract class AbstractAjpProtoco @Override protected P createUpgradeProcessor(SocketWrapper<S> socket, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeHandler) { + UpgradeToken upgradeToken) { // TODO should fail - throw IOE return null; } Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Tue Nov 10 21:46:22 2015 @@ -27,13 +27,13 @@ import java.util.regex.Pattern; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpUpgradeHandler; import org.apache.coyote.AbstractProcessor; import org.apache.coyote.ActionCode; import org.apache.coyote.AsyncContextCallback; import org.apache.coyote.ErrorState; import org.apache.coyote.RequestInfo; +import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.filters.BufferedInputFilter; import org.apache.coyote.http11.filters.ChunkedInputFilter; import org.apache.coyote.http11.filters.ChunkedOutputFilter; @@ -231,7 +231,7 @@ public abstract class AbstractHttp11Proc * Instance of the new protocol to use after the HTTP connection has been * upgraded. */ - protected HttpUpgradeHandler httpUpgradeHandler = null; + protected UpgradeToken upgradeToken = null; public AbstractHttp11Processor(AbstractEndpoint<S> endpoint) { @@ -867,7 +867,7 @@ public abstract class AbstractHttp11Proc break; } case UPGRADE: { - httpUpgradeHandler = (HttpUpgradeHandler) param; + upgradeToken = (UpgradeToken) param; // Stop further HTTP output getOutputBuffer().finished = true; break; @@ -1001,7 +1001,7 @@ public abstract class AbstractHttp11Proc } while (!getErrorState().isError() && keepAlive && !comet && !isAsync() && - httpUpgradeHandler == null && !endpoint.isPaused()) { + upgradeToken == null && !endpoint.isPaused()) { // Parsing the request header try { @@ -1753,7 +1753,7 @@ public abstract class AbstractHttp11Proc @Override public boolean isUpgrade() { - return httpUpgradeHandler != null; + return upgradeToken != null; } @@ -1767,8 +1767,8 @@ public abstract class AbstractHttp11Proc @Override - public HttpUpgradeHandler getHttpUpgradeHandler() { - return httpUpgradeHandler; + public UpgradeToken getUpgradeToken() { + return upgradeToken; } @@ -1841,7 +1841,7 @@ public abstract class AbstractHttp11Proc if (asyncStateMachine != null) { asyncStateMachine.recycle(); } - httpUpgradeHandler = null; + upgradeToken = null; comet = false; resetErrorState(); recycleInternal(); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Tue Nov 10 21:46:22 2015 @@ -19,10 +19,9 @@ package org.apache.coyote.http11; import java.io.IOException; import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.AprProcessor; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -304,10 +303,10 @@ public class Http11AprProtocol extends A @Override protected Processor<Long> createUpgradeProcessor( SocketWrapper<Long> socket, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor) + UpgradeToken upgradeToken) throws IOException { return new AprProcessor(socket, leftoverInput, - httpUpgradeProcessor, (AprEndpoint) proto.endpoint, + upgradeToken, (AprEndpoint) proto.endpoint, proto.getUpgradeAsyncWriteBufferSize()); } } Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java Tue Nov 10 21:46:22 2015 @@ -20,10 +20,9 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadPendingException; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.Nio2Processor; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -239,10 +238,10 @@ public class Http11Nio2Protocol extends @Override protected Processor<Nio2Channel> createUpgradeProcessor( SocketWrapper<Nio2Channel> socket, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor) + UpgradeToken upgradeToken) throws IOException { return new Nio2Processor(proto.endpoint, socket, leftoverInput, - httpUpgradeProcessor, proto.getUpgradeAsyncWriteBufferSize()); + upgradeToken, proto.getUpgradeAsyncWriteBufferSize()); } @Override Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Tue Nov 10 21:46:22 2015 @@ -21,10 +21,9 @@ import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.Iterator; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.NioProcessor; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -274,9 +273,9 @@ public class Http11NioProtocol extends A @Override protected Processor<NioChannel> createUpgradeProcessor( SocketWrapper<NioChannel> socket, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor) + UpgradeToken upgradeToken) throws IOException { - return new NioProcessor(socket, leftoverInput, httpUpgradeProcessor, + return new NioProcessor(socket, leftoverInput, upgradeToken, proto.getEndpoint().getSelectorPool(), proto.getUpgradeAsyncWriteBufferSize()); } Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java Tue Nov 10 21:46:22 2015 @@ -20,10 +20,9 @@ import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.BioProcessor; import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.AbstractEndpoint; @@ -179,9 +178,9 @@ public class Http11Protocol extends Abst @Override protected Processor<Socket> createUpgradeProcessor( SocketWrapper<Socket> socket, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor) + UpgradeToken upgradeToken) throws IOException { - return new BioProcessor(socket, leftoverInput, httpUpgradeProcessor, + return new BioProcessor(socket, leftoverInput, upgradeToken, proto.getUpgradeAsyncWriteBufferSize()); } Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java Tue Nov 10 21:46:22 2015 @@ -22,11 +22,11 @@ import java.util.concurrent.Executor; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.WebConnection; import org.apache.coyote.Processor; import org.apache.coyote.Request; +import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; @@ -41,14 +41,14 @@ public abstract class AbstractProcessor< StringManager.getManager(Constants.Package); protected abstract Log getLog(); - private final HttpUpgradeHandler httpUpgradeHandler; + private final UpgradeToken upgradeToken; private final AbstractServletInputStream upgradeServletInputStream; private final AbstractServletOutputStream<S> upgradeServletOutputStream; - protected AbstractProcessor (HttpUpgradeHandler httpUpgradeHandler, + protected AbstractProcessor(UpgradeToken upgradeToken, AbstractServletInputStream upgradeServletInputStream, AbstractServletOutputStream<S> upgradeServletOutputStream) { - this.httpUpgradeHandler = httpUpgradeHandler; + this.upgradeToken = upgradeToken; this.upgradeServletInputStream = upgradeServletInputStream; this.upgradeServletOutputStream = upgradeServletOutputStream; } @@ -84,8 +84,8 @@ public abstract class AbstractProcessor< } @Override - public HttpUpgradeHandler getHttpUpgradeHandler() { - return httpUpgradeHandler; + public UpgradeToken getUpgradeToken() { + return upgradeToken; } @Override Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java Tue Nov 10 21:46:22 2015 @@ -18,8 +18,7 @@ package org.apache.coyote.http11.upgrade import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.jni.Socket; @@ -35,9 +34,9 @@ public class AprProcessor extends Abstra private static final int INFINITE_TIMEOUT = -1; public AprProcessor(SocketWrapper<Long> wrapper, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor, AprEndpoint endpoint, + UpgradeToken upgradeToken, AprEndpoint endpoint, int asyncWriteBufferSize) { - super(httpUpgradeProcessor, + super(upgradeToken, new AprServletInputStream(wrapper, leftoverInput), new AprServletOutputStream(wrapper, asyncWriteBufferSize, endpoint)); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java Tue Nov 10 21:46:22 2015 @@ -20,8 +20,7 @@ import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.SocketWrapper; @@ -35,9 +34,9 @@ public class BioProcessor extends Abstra private static final int INFINITE_TIMEOUT = 0; public BioProcessor(SocketWrapper<Socket> wrapper, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor, + UpgradeToken upgradeToken, int asyncWriteBufferSize) throws IOException { - super(httpUpgradeProcessor, new BioServletInputStream(wrapper, leftoverInput), + super(upgradeToken, new BioServletInputStream(wrapper, leftoverInput), new BioServletOutputStream(wrapper, asyncWriteBufferSize)); wrapper.getSocket().setSoTimeout(INFINITE_TIMEOUT); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java Tue Nov 10 21:46:22 2015 @@ -18,8 +18,7 @@ package org.apache.coyote.http11.upgrade import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.AbstractEndpoint; @@ -36,9 +35,9 @@ public class Nio2Processor extends Abstr public Nio2Processor(AbstractEndpoint<Nio2Channel> endpoint, SocketWrapper<Nio2Channel> wrapper, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor, + UpgradeToken upgradeToken, int asyncWriteBufferSize) { - super(httpUpgradeProcessor, + super(upgradeToken, new Nio2ServletInputStream(wrapper, endpoint), new Nio2ServletOutputStream(wrapper, asyncWriteBufferSize, endpoint)); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java Tue Nov 10 21:46:22 2015 @@ -18,8 +18,7 @@ package org.apache.coyote.http11.upgrade import java.nio.ByteBuffer; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.NioChannel; @@ -35,9 +34,9 @@ public class NioProcessor extends Abstra private static final int INFINITE_TIMEOUT = -1; public NioProcessor(SocketWrapper<NioChannel> wrapper, ByteBuffer leftoverInput, - HttpUpgradeHandler httpUpgradeProcessor, NioSelectorPool pool, + UpgradeToken upgradeToken, NioSelectorPool pool, int asyncWriteBufferSize) { - super(httpUpgradeProcessor, + super(upgradeToken, new NioServletInputStream(wrapper, pool), new NioServletOutputStream(wrapper, asyncWriteBufferSize, pool)); Modified: tomcat/tc8.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Tue Nov 10 21:46:22 2015 @@ -52,8 +52,6 @@ public class WsHttpUpgradeHandler implem private static final StringManager sm = StringManager.getManager(Constants.PACKAGE_NAME); - private final ClassLoader applicationClassLoader; - private Endpoint ep; private EndpointConfig endpointConfig; private WsServerContainer webSocketContainer; @@ -68,11 +66,6 @@ public class WsHttpUpgradeHandler implem private WsSession wsSession; - public WsHttpUpgradeHandler() { - applicationClassLoader = Thread.currentThread().getContextClassLoader(); - } - - public void preInit(Endpoint ep, EndpointConfig endpointConfig, WsServerContainer wsc, WsHandshakeRequest handshakeRequest, List<Extension> negotiatedExtensionsPhase2, String subProtocol, @@ -117,9 +110,6 @@ public class WsHttpUpgradeHandler implem // Need to call onOpen using the web application's class loader // Create the frame using the application's class loader so it can pick // up application specific config from the ServerContainerImpl - Thread t = Thread.currentThread(); - ClassLoader cl = t.getContextClassLoader(); - t.setContextClassLoader(applicationClassLoader); try { WsRemoteEndpointImplServer wsRemoteEndpointServer = new WsRemoteEndpointImplServer(sos, webSocketContainer); @@ -140,8 +130,6 @@ public class WsHttpUpgradeHandler implem sis.setReadListener(new WsReadListener(this, wsFrame)); } catch (DeploymentException e) { throw new IllegalArgumentException(e); - } finally { - t.setContextClassLoader(cl); } } @@ -159,15 +147,7 @@ public class WsHttpUpgradeHandler implem private void onError(Throwable throwable) { - // Need to call onError using the web application's class loader - Thread t = Thread.currentThread(); - ClassLoader cl = t.getContextClassLoader(); - t.setContextClassLoader(applicationClassLoader); - try { - ep.onError(wsSession, throwable); - } finally { - t.setContextClassLoader(cl); - } + ep.onError(wsSession, throwable); } Modified: tomcat/tc8.0.x/trunk/res/checkstyle/org-import-control.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/res/checkstyle/org-import-control.xml?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/res/checkstyle/org-import-control.xml (original) +++ tomcat/tc8.0.x/trunk/res/checkstyle/org-import-control.xml Tue Nov 10 21:46:22 2015 @@ -87,6 +87,7 @@ <allow pkg="javax.servlet"/> <allow pkg="org.apache.coyote"/> <allow pkg="org.apache.juli"/> + <allow pkg="org.apache.tomcat"/> <allow pkg="org.apache.tomcat.jni"/> <allow pkg="org.apache.tomcat.util"/> </subpackage> Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1713733&r1=1713732&r2=1713733&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Tue Nov 10 21:46:22 2015 @@ -175,6 +175,10 @@ Cancel pending blocking IO operation following a timeout in the NIO2 connector. (remm) </fix> + <fix> + Add instance manager support for upgrade handlers, and set context + class loader. (remm) + </fix> </changelog> </subsection> <subsection name="Jasper"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org