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 2023/01/19 08:38:39 UTC

[tomcat] branch main updated: Deprecate SecurityManager references in ContextBind

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 5ce4262fed Deprecate SecurityManager references in ContextBind
5ce4262fed is described below

commit 5ce4262fededa6effcd5bdaebd0b8a4911bcda5c
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Jan 19 08:38:24 2023 +0000

    Deprecate SecurityManager references in ContextBind
---
 .../apache/catalina/connector/CoyoteAdapter.java   | 16 +++---
 .../catalina/core/ApplicationDispatcher.java       |  4 +-
 .../org/apache/catalina/core/AsyncContextImpl.java | 12 ++---
 java/org/apache/catalina/core/ContainerBase.java   |  4 +-
 java/org/apache/catalina/core/StandardContext.java | 12 +++++
 .../apache/catalina/core/StandardHostValve.java    |  4 +-
 .../apache/catalina/session/DataSourceStore.java   |  8 +--
 java/org/apache/catalina/session/FileStore.java    |  4 +-
 .../apache/catalina/session/StandardSession.java   |  8 +--
 .../org/apache/catalina/startup/FailedContext.java | 10 ++++
 .../apache/catalina/valves/PersistentValve.java    |  4 +-
 java/org/apache/coyote/AbstractProtocol.java       |  8 +--
 .../http11/upgrade/UpgradeServletInputStream.java  |  8 +--
 .../http11/upgrade/UpgradeServletOutputStream.java |  8 +--
 java/org/apache/tomcat/ContextBind.java            | 58 +++++++++++++++++-----
 test/org/apache/tomcat/unittest/TesterContext.java | 10 ++++
 16 files changed, 121 insertions(+), 57 deletions(-)

diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java
index 0fd2a482ff..9efcce07e6 100644
--- a/java/org/apache/catalina/connector/CoyoteAdapter.java
+++ b/java/org/apache/catalina/connector/CoyoteAdapter.java
@@ -153,7 +153,7 @@ public class CoyoteAdapter implements Adapter {
                 Context context = request.getContext();
                 ClassLoader oldCL = null;
                 try {
-                    oldCL = context.bind(false, null);
+                    oldCL = context.bind(null);
                     if (req.getReadListener() != null) {
                         req.getReadListener().onError(t);
                     }
@@ -163,7 +163,7 @@ public class CoyoteAdapter implements Adapter {
                     res.action(ActionCode.CLOSE_NOW, t);
                     asyncConImpl.setErrorState(t, true);
                 } finally {
-                    context.unbind(false, oldCL);
+                    context.unbind(oldCL);
                 }
             }
 
@@ -175,7 +175,7 @@ public class CoyoteAdapter implements Adapter {
                     Context context = request.getContext();
                     ClassLoader oldCL = null;
                     try {
-                        oldCL = context.bind(false, null);
+                        oldCL = context.bind(null);
                         res.onWritePossible();
                         if (request.isFinished() && req.sendAllDataReadEvent() &&
                                 readListener != null) {
@@ -196,13 +196,13 @@ public class CoyoteAdapter implements Adapter {
                         res.action(ActionCode.CLOSE_NOW, t);
                         asyncConImpl.setErrorState(t, true);
                     } finally {
-                        context.unbind(false, oldCL);
+                        context.unbind(oldCL);
                     }
                 } else if (readListener != null && status == SocketEvent.OPEN_READ) {
                     Context context = request.getContext();
                     ClassLoader oldCL = null;
                     try {
-                        oldCL = context.bind(false, null);
+                        oldCL = context.bind(null);
                         // If data is being read on a non-container thread a
                         // dispatch with status OPEN_READ will be used to get
                         // execution back on a container thread for the
@@ -229,7 +229,7 @@ public class CoyoteAdapter implements Adapter {
                         res.action(ActionCode.CLOSE_NOW, t);
                         asyncConImpl.setErrorState(t, true);
                     } finally {
-                        context.unbind(false, oldCL);
+                        context.unbind(oldCL);
                     }
                 }
             }
@@ -365,12 +365,12 @@ public class CoyoteAdapter implements Adapter {
                     // method so this needs to be checked here
                     ClassLoader oldCL = null;
                     try {
-                        oldCL = request.getContext().bind(false, null);
+                        oldCL = request.getContext().bind(null);
                         if (req.sendAllDataReadEvent()) {
                             req.getReadListener().onAllDataRead();
                         }
                     } finally {
-                        request.getContext().unbind(false, oldCL);
+                        request.getContext().unbind(oldCL);
                     }
                 }
 
diff --git a/java/org/apache/catalina/core/ApplicationDispatcher.java b/java/org/apache/catalina/core/ApplicationDispatcher.java
index 03568af66d..2e0d80ac32 100644
--- a/java/org/apache/catalina/core/ApplicationDispatcher.java
+++ b/java/org/apache/catalina/core/ApplicationDispatcher.java
@@ -517,7 +517,7 @@ final class ApplicationDispatcher implements AsyncDispatcher, RequestDispatcher
         // Checking to see if the context classloader is the current context
         // classloader. If it's not, we're saving it, and setting the context
         // classloader to the Context classloader
-        ClassLoader oldCCL = context.bind(false, null);
+        ClassLoader oldCCL = context.bind(null);
 
         // Initialize local variables we may need
         HttpServletResponse hresponse = state.hresponse;
@@ -619,7 +619,7 @@ final class ApplicationDispatcher implements AsyncDispatcher, RequestDispatcher
         }
 
         // Reset the old context class loader
-        context.unbind(false, oldCCL);
+        context.unbind(oldCCL);
 
         // Unwrap request/response if needed
         // See Bugzilla 30949
diff --git a/java/org/apache/catalina/core/AsyncContextImpl.java b/java/org/apache/catalina/core/AsyncContextImpl.java
index 776aa8acf9..3b0fbd0b57 100644
--- a/java/org/apache/catalina/core/AsyncContextImpl.java
+++ b/java/org/apache/catalina/core/AsyncContextImpl.java
@@ -98,7 +98,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
         }
         List<AsyncListenerWrapper> listenersCopy = new ArrayList<>(listeners);
 
-        ClassLoader oldCL = context.bind(false, null);
+        ClassLoader oldCL = context.bind(null);
         try {
             for (AsyncListenerWrapper listener : listenersCopy) {
                 try {
@@ -112,7 +112,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
         } finally {
             context.fireRequestDestroyEvent(request.getRequest());
             clearServletRequestResponse();
-            context.unbind(false, oldCL);
+            context.unbind(oldCL);
         }
     }
 
@@ -127,7 +127,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
             if (log.isDebugEnabled()) {
                 log.debug(sm.getString("asyncContextImpl.fireOnTimeout"));
             }
-            ClassLoader oldCL = context.bind(false, null);
+            ClassLoader oldCL = context.bind(null);
             try {
                 List<AsyncListenerWrapper> listenersCopy = new ArrayList<>(listeners);
                 for (AsyncListenerWrapper listener : listenersCopy) {
@@ -142,7 +142,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
                 request.getCoyoteRequest().action(
                         ActionCode.ASYNC_IS_TIMINGOUT, result);
             } finally {
-                context.unbind(false, oldCL);
+                context.unbind(oldCL);
             }
         }
         return !result.get();
@@ -543,7 +543,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
 
         @Override
         public void run() {
-            ClassLoader oldCL = context.bind(false, null);
+            ClassLoader oldCL = context.bind(null);
             try {
                 wrapped.run();
             } catch (Throwable t) {
@@ -554,7 +554,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
                 coyoteResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                 coyoteResponse.setError();
             } finally {
-                context.unbind(false, oldCL);
+                context.unbind(oldCL);
             }
 
             // Since this runnable is not executing as a result of a socket
diff --git a/java/org/apache/catalina/core/ContainerBase.java b/java/org/apache/catalina/core/ContainerBase.java
index c3167f9055..67b4354bc3 100644
--- a/java/org/apache/catalina/core/ContainerBase.java
+++ b/java/org/apache/catalina/core/ContainerBase.java
@@ -1320,7 +1320,7 @@ public abstract class ContainerBase extends LifecycleMBeanBase implements Contai
 
                     // Ensure background processing for Contexts and Wrappers
                     // is performed under the web app's class loader
-                    originalClassLoader = ((Context) container).bind(false, null);
+                    originalClassLoader = ((Context) container).bind(null);
                 }
                 container.backgroundProcess();
                 Container[] children = container.findChildren();
@@ -1334,7 +1334,7 @@ public abstract class ContainerBase extends LifecycleMBeanBase implements Contai
                 log.error(sm.getString("containerBase.backgroundProcess.error"), t);
             } finally {
                 if (container instanceof Context) {
-                    ((Context) container).unbind(false, originalClassLoader);
+                    ((Context) container).unbind(originalClassLoader);
                 }
             }
         }
diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java
index eb51979e16..1a3c33bdb5 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -5761,6 +5761,12 @@ public class StandardContext extends ContainerBase
 
     @Override
     public ClassLoader bind(boolean usePrivilegedAction, ClassLoader originalClassLoader) {
+        return bind(originalClassLoader);
+    }
+
+
+    @Override
+    public ClassLoader bind(ClassLoader originalClassLoader) {
         Loader loader = getLoader();
         ClassLoader webApplicationClassLoader = null;
         if (loader != null) {
@@ -5797,6 +5803,12 @@ public class StandardContext extends ContainerBase
 
     @Override
     public void unbind(boolean usePrivilegedAction, ClassLoader originalClassLoader) {
+        unbind(originalClassLoader);
+    }
+
+
+    @Override
+    public void unbind(ClassLoader originalClassLoader) {
         if (originalClassLoader == null) {
             return;
         }
diff --git a/java/org/apache/catalina/core/StandardHostValve.java b/java/org/apache/catalina/core/StandardHostValve.java
index 159eb26296..76250cd173 100644
--- a/java/org/apache/catalina/core/StandardHostValve.java
+++ b/java/org/apache/catalina/core/StandardHostValve.java
@@ -100,7 +100,7 @@ final class StandardHostValve extends ValveBase {
         boolean asyncAtStart = request.isAsync();
 
         try {
-            context.bind(false, MY_CLASSLOADER);
+            context.bind(MY_CLASSLOADER);
 
             if (!asyncAtStart && !context.fireRequestInitEvent(request.getRequest())) {
                 // Don't fire listeners during async processing (the listener
@@ -167,7 +167,7 @@ final class StandardHostValve extends ValveBase {
                 request.getSession(false);
             }
 
-            context.unbind(false, MY_CLASSLOADER);
+            context.unbind(MY_CLASSLOADER);
         }
     }
 
diff --git a/java/org/apache/catalina/session/DataSourceStore.java b/java/org/apache/catalina/session/DataSourceStore.java
index 7bd8957a1e..c46aa2b17c 100644
--- a/java/org/apache/catalina/session/DataSourceStore.java
+++ b/java/org/apache/catalina/session/DataSourceStore.java
@@ -465,7 +465,7 @@ public class DataSourceStore extends StoreBase {
                 return null;
             }
 
-            ClassLoader oldThreadContextCL = context.bind(false, null);
+            ClassLoader oldThreadContextCL = context.bind(null);
 
             try (PreparedStatement preparedLoadSql = _conn.prepareStatement(loadSql)){
                 preparedLoadSql.setString(1, id);
@@ -492,7 +492,7 @@ public class DataSourceStore extends StoreBase {
             } catch (SQLException e) {
                 contextLog.error(sm.getString(getStoreName() + ".SQLException", e));
             } finally {
-                context.unbind(false, oldThreadContextCL);
+                context.unbind(oldThreadContextCL);
                 release(_conn);
             }
             numberOfTries--;
@@ -697,7 +697,7 @@ public class DataSourceStore extends StoreBase {
             org.apache.catalina.Context context = getManager().getContext();
             ClassLoader oldThreadContextCL = null;
             if (localDataSource) {
-                oldThreadContextCL = context.bind(false, null);
+                oldThreadContextCL = context.bind(null);
             }
 
             Context initCtx;
@@ -711,7 +711,7 @@ public class DataSourceStore extends StoreBase {
                                 this.dataSourceName), e);
             } finally {
                 if (localDataSource) {
-                    context.unbind(false, oldThreadContextCL);
+                    context.unbind(oldThreadContextCL);
                 }
             }
         }
diff --git a/java/org/apache/catalina/session/FileStore.java b/java/org/apache/catalina/session/FileStore.java
index 22107f3141..c4002048bf 100644
--- a/java/org/apache/catalina/session/FileStore.java
+++ b/java/org/apache/catalina/session/FileStore.java
@@ -225,7 +225,7 @@ public final class FileStore extends StoreBase {
             contextLog.debug(sm.getString(getStoreName()+".loading", id, file.getAbsolutePath()));
         }
 
-        ClassLoader oldThreadContextCL = context.bind(false, null);
+        ClassLoader oldThreadContextCL = context.bind(null);
 
         try (FileInputStream fis = new FileInputStream(file.getAbsolutePath());
                 ObjectInputStream ois = getObjectInputStream(fis)) {
@@ -240,7 +240,7 @@ public final class FileStore extends StoreBase {
             }
             return null;
         } finally {
-            context.unbind(false, oldThreadContextCL);
+            context.unbind(oldThreadContextCL);
         }
     }
 
diff --git a/java/org/apache/catalina/session/StandardSession.java b/java/org/apache/catalina/session/StandardSession.java
index 13b7d2af7d..54b5927e7d 100644
--- a/java/org/apache/catalina/session/StandardSession.java
+++ b/java/org/apache/catalina/session/StandardSession.java
@@ -763,7 +763,7 @@ public class StandardSession implements HttpSession, Session, Serializable {
             if (notify) {
                 ClassLoader oldContextClassLoader = null;
                 try {
-                    oldContextClassLoader = context.bind(false, null);
+                    oldContextClassLoader = context.bind(null);
                     Object listeners[] = context.getApplicationLifecycleListeners();
                     if (listeners != null && listeners.length > 0) {
                         HttpSessionEvent event =
@@ -795,7 +795,7 @@ public class StandardSession implements HttpSession, Session, Serializable {
                         }
                     }
                 } finally {
-                    context.unbind(false, oldContextClassLoader);
+                    context.unbind(oldContextClassLoader);
                 }
             }
 
@@ -831,12 +831,12 @@ public class StandardSession implements HttpSession, Session, Serializable {
             String keys[] = keys();
             ClassLoader oldContextClassLoader = null;
             try {
-                oldContextClassLoader = context.bind(false, null);
+                oldContextClassLoader = context.bind(null);
                 for (String key : keys) {
                     removeAttributeInternal(key, notify);
                 }
             } finally {
-                context.unbind(false, oldContextClassLoader);
+                context.unbind(oldContextClassLoader);
             }
         }
 
diff --git a/java/org/apache/catalina/startup/FailedContext.java b/java/org/apache/catalina/startup/FailedContext.java
index d24dfd135b..f892b61298 100644
--- a/java/org/apache/catalina/startup/FailedContext.java
+++ b/java/org/apache/catalina/startup/FailedContext.java
@@ -745,11 +745,21 @@ public class FailedContext extends LifecycleMBeanBase implements Context {
         return null;
     }
 
+    @Override
+    public ClassLoader bind(ClassLoader originalClassLoader) {
+        return null;
+    }
+
     @Override
     public void unbind(boolean usePrivilegedAction, ClassLoader originalClassLoader) {
         // NO-OP
     }
 
+    @Override
+    public void unbind(ClassLoader originalClassLoader) {
+        // NO-OP
+    }
+
     @Override
     public Object getNamingToken() { return null; }
 
diff --git a/java/org/apache/catalina/valves/PersistentValve.java b/java/org/apache/catalina/valves/PersistentValve.java
index cd36b1386d..bdf11da313 100644
--- a/java/org/apache/catalina/valves/PersistentValve.java
+++ b/java/org/apache/catalina/valves/PersistentValve.java
@@ -230,14 +230,14 @@ public class PersistentValve extends ValveBase {
 
     private void bind(Context context) {
         if (clBindRequired) {
-            context.bind(false, MY_CLASSLOADER);
+            context.bind(MY_CLASSLOADER);
         }
     }
 
 
     private void unbind(Context context) {
         if (clBindRequired) {
-            context.unbind(false, MY_CLASSLOADER);
+            context.unbind(MY_CLASSLOADER);
         }
     }
 
diff --git a/java/org/apache/coyote/AbstractProtocol.java b/java/org/apache/coyote/AbstractProtocol.java
index 55eb2a7b3c..29881aacd3 100644
--- a/java/org/apache/coyote/AbstractProtocol.java
+++ b/java/org/apache/coyote/AbstractProtocol.java
@@ -901,11 +901,11 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
                             if (upgradeToken.getInstanceManager() == null) {
                                 httpUpgradeHandler.init((WebConnection) processor);
                             } else {
-                                ClassLoader oldCL = upgradeToken.getContextBind().bind(false, null);
+                                ClassLoader oldCL = upgradeToken.getContextBind().bind(null);
                                 try {
                                     httpUpgradeHandler.init((WebConnection) processor);
                                 } finally {
-                                    upgradeToken.getContextBind().unbind(false, oldCL);
+                                    upgradeToken.getContextBind().unbind(oldCL);
                                 }
                             }
                             if (httpUpgradeHandler instanceof InternalHttpUpgradeHandler) {
@@ -965,7 +965,7 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
                         if (instanceManager == null) {
                             httpUpgradeHandler.destroy();
                         } else {
-                            ClassLoader oldCL = upgradeToken.getContextBind().bind(false, null);
+                            ClassLoader oldCL = upgradeToken.getContextBind().bind(null);
                             try {
                                 httpUpgradeHandler.destroy();
                             } finally {
@@ -975,7 +975,7 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
                                     ExceptionUtils.handleThrowable(e);
                                     getLog().error(sm.getString("abstractConnectionHandler.error"), e);
                                 }
-                                upgradeToken.getContextBind().unbind(false, oldCL);
+                                upgradeToken.getContextBind().unbind(oldCL);
                             }
                         }
                     }
diff --git a/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java b/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
index 63ad3f473d..562ec5e3f4 100644
--- a/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
+++ b/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
@@ -223,7 +223,7 @@ public class UpgradeServletInputStream extends ServletInputStream {
             onError(e);
         }
         ready = Boolean.TRUE;
-        ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(false, null);
+        ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(null);
         try {
             if (!eof) {
                 listener.onDataAvailable();
@@ -235,7 +235,7 @@ public class UpgradeServletInputStream extends ServletInputStream {
             ExceptionUtils.handleThrowable(t);
             onError(t);
         } finally {
-            processor.getUpgradeToken().getContextBind().unbind(false, oldCL);
+            processor.getUpgradeToken().getContextBind().unbind(oldCL);
         }
     }
 
@@ -244,14 +244,14 @@ public class UpgradeServletInputStream extends ServletInputStream {
         if (listener == null) {
             return;
         }
-        ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(false, null);
+        ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(null);
         try {
             listener.onError(t);
         } catch (Throwable t2) {
             ExceptionUtils.handleThrowable(t2);
             log.warn(sm.getString("upgrade.sis.onErrorFail"), t2);
         } finally {
-            processor.getUpgradeToken().getContextBind().unbind(false, oldCL);
+            processor.getUpgradeToken().getContextBind().unbind(oldCL);
         }
         try {
             close();
diff --git a/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java b/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
index 62d44eb05f..74ade3025d 100644
--- a/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
+++ b/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
@@ -249,14 +249,14 @@ public class UpgradeServletOutputStream extends ServletOutputStream {
         }
 
         if (fire) {
-            ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(false, null);
+            ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(null);
             try {
                 listener.onWritePossible();
             } catch (Throwable t) {
                 ExceptionUtils.handleThrowable(t);
                 onError(t);
             } finally {
-                processor.getUpgradeToken().getContextBind().unbind(false, oldCL);
+                processor.getUpgradeToken().getContextBind().unbind(oldCL);
             }
         }
     }
@@ -266,14 +266,14 @@ public class UpgradeServletOutputStream extends ServletOutputStream {
         if (listener == null) {
             return;
         }
-        ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(false, null);
+        ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(null);
         try {
             listener.onError(t);
         } catch (Throwable t2) {
             ExceptionUtils.handleThrowable(t2);
             log.warn(sm.getString("upgrade.sos.onErrorFail"), t2);
         } finally {
-            processor.getUpgradeToken().getContextBind().unbind(false, oldCL);
+            processor.getUpgradeToken().getContextBind().unbind(oldCL);
         }
         try {
             close();
diff --git a/java/org/apache/tomcat/ContextBind.java b/java/org/apache/tomcat/ContextBind.java
index ab9a1d7db3..2fb868a6f7 100644
--- a/java/org/apache/tomcat/ContextBind.java
+++ b/java/org/apache/tomcat/ContextBind.java
@@ -27,19 +27,14 @@ public interface ContextBind {
      * {@link org.apache.catalina.ThreadBindingListener#bind()} will be called
      * after the change has been made.
      *
-     * @param usePrivilegedAction
-     *          Should a {@link java.security.PrivilegedAction} be used when
-     *          obtaining the current thread context class loader and setting
-     *          the new one?
-     * @param originalClassLoader
-     *          The current class loader if known to save this method having to
-     *          look it up
+     * @param originalClassLoader The current class loader if known to save this
+     *     method having to look it up
      *
      * @return If the class loader has been changed by the method it will return
-     *         the thread context class loader in use when the method was
-     *         called. If no change was made then this method returns null.
+     *     the thread context class loader in use when the method was called. If
+     *     no change was made then this method returns null.
      */
-    ClassLoader bind(boolean usePrivilegedAction, ClassLoader originalClassLoader);
+    ClassLoader bind(ClassLoader originalClassLoader);
 
     /**
      * Restore the current thread context class loader to the original class
@@ -50,11 +45,48 @@ public interface ContextBind {
      * {@link org.apache.catalina.ThreadBindingListener#unbind()} will be called
      * before the change is made.
      *
-     * @param usePrivilegedAction
-     *          Should a {@link java.security.PrivilegedAction} be used when
-     *          setting the current thread context class loader?
      * @param originalClassLoader
      *          The class loader to restore as the thread context class loader
      */
+    void unbind(ClassLoader originalClassLoader);
+
+    /**
+     * Change the current thread context class loader to the web application
+     * class loader. If no web application class loader is defined, or if the
+     * current thread is already using the web application class loader then no
+     * change will be made. If the class loader is changed and a
+     * {@link org.apache.catalina.ThreadBindingListener} is configured then
+     * {@link org.apache.catalina.ThreadBindingListener#bind()} will be called
+     * after the change has been made.
+     *
+     * @param usePrivilegedAction Unused
+     * @param originalClassLoader The current class loader if known to save this
+     *     method having to look it up
+     *
+     * @return If the class loader has been changed by the method it will return
+     *     the thread context class loader in use when the method was called. If
+     *     no change was made then this method returns null.
+     *
+     * @deprecated Unused. Will be removed in Tomcat 12 onwards.
+     */
+    @Deprecated
+    ClassLoader bind(boolean usePrivilegedAction, ClassLoader originalClassLoader);
+
+    /**
+     * Restore the current thread context class loader to the original class
+     * loader in used before {@link #bind(boolean, ClassLoader)} was called. If
+     * no original class loader is passed to this method then no change will be
+     * made. If the class loader is changed and a
+     * {@link org.apache.catalina.ThreadBindingListener} is configured then
+     * {@link org.apache.catalina.ThreadBindingListener#unbind()} will be called
+     * before the change is made.
+     *
+     * @param usePrivilegedAction Unused
+     * @param originalClassLoader The class loader to restore as the thread
+     *     context class loader
+     *
+     * @deprecated Unused. Will be removed in Tomcat 12 onwards.
+     */
+    @Deprecated
     void unbind(boolean usePrivilegedAction, ClassLoader originalClassLoader);
 }
diff --git a/test/org/apache/tomcat/unittest/TesterContext.java b/test/org/apache/tomcat/unittest/TesterContext.java
index 16c22425fc..9c2e10754c 100644
--- a/test/org/apache/tomcat/unittest/TesterContext.java
+++ b/test/org/apache/tomcat/unittest/TesterContext.java
@@ -1210,11 +1210,21 @@ public class TesterContext implements Context {
         return null;
     }
 
+    @Override
+    public ClassLoader bind(ClassLoader originalClassLoader) {
+        return null;
+    }
+
     @Override
     public void unbind(boolean usePrivilegedAction, ClassLoader originalClassLoader) {
         // NO-OP
     }
 
+    @Override
+    public void unbind(ClassLoader originalClassLoader) {
+        // NO-OP
+    }
+
     @Override
     public Object getNamingToken() { return null; }
 


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