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

Reply via email to