You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shiro.apache.org by lh...@apache.org on 2010/05/14 21:03:50 UTC

svn commit: r944400 - in /incubator/shiro/trunk: core/src/main/java/org/apache/shiro/subject/support/ core/src/main/java/org/apache/shiro/util/ core/src/test/java/org/apache/shiro/mgt/ core/src/test/java/org/apache/shiro/realm/activedirectory/ core/src...

Author: lhazlewood
Date: Fri May 14 19:03:50 2010
New Revision: 944400

URL: http://svn.apache.org/viewvc?rev=944400&view=rev
Log:
SHIRO-159: Modified ThreadContext and ThreadState implementations to use remove() instead of clear() in all cases.  Most of the changes are in Test cases setUp/tearDown - core code/web code was modified very little.

Modified:
    incubator/shiro/trunk/core/src/main/java/org/apache/shiro/subject/support/SubjectThreadState.java
    incubator/shiro/trunk/core/src/main/java/org/apache/shiro/util/ThreadContext.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/AbstractSecurityManagerTest.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/VMSingletonDefaultSecurityManagerTest.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/realm/activedirectory/ActiveDirectoryRealmTest.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DefaultSessionManagerTest.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DelegatingSessionTest.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/subject/DelegatingSubjectTest.java
    incubator/shiro/trunk/support/spring/src/test/java/org/apache/shiro/spring/remoting/SecureRemoteInvocationFactoryTest.java
    incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java
    incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/subject/support/WebSubjectThreadState.java
    incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/AbstractWebSecurityManagerTest.java
    incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/session/DefaultWebSessionManagerTest.java

Modified: incubator/shiro/trunk/core/src/main/java/org/apache/shiro/subject/support/SubjectThreadState.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/main/java/org/apache/shiro/subject/support/SubjectThreadState.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/main/java/org/apache/shiro/subject/support/SubjectThreadState.java (original)
+++ incubator/shiro/trunk/core/src/main/java/org/apache/shiro/subject/support/SubjectThreadState.java Fri May 14 19:03:50 2010
@@ -20,16 +20,18 @@ package org.apache.shiro.subject.support
 
 import org.apache.shiro.mgt.SecurityManager;
 import org.apache.shiro.subject.Subject;
+import org.apache.shiro.util.CollectionUtils;
 import org.apache.shiro.util.ThreadContext;
 import org.apache.shiro.util.ThreadState;
 
+import java.util.Map;
+
 /**
  * @since 1.0
  */
 public class SubjectThreadState implements ThreadState {
 
-    private Subject originalSubject;
-    private transient SecurityManager originalSecurityManager;
+    private Map<Object,Object> originalResources;
 
     private final Subject subject;
     private final transient SecurityManager securityManager;
@@ -38,16 +40,15 @@ public class SubjectThreadState implemen
         if (subject == null) {
             throw new IllegalArgumentException("Subject argument cannot be null.");
         }
-        this.originalSubject = ThreadContext.getSubject();
         this.subject = subject;
 
-        this.originalSecurityManager = ThreadContext.getSecurityManager();
+        SecurityManager originalSecurityManager = ThreadContext.getSecurityManager();
 
         //TODO - not an interface call (yuck)
         if (this.subject instanceof DelegatingSubject) {
             this.securityManager = ((DelegatingSubject) this.subject).getSecurityManager();
         } else {
-            this.securityManager = this.originalSecurityManager;
+            this.securityManager = originalSecurityManager;
         }
     }
 
@@ -56,31 +57,23 @@ public class SubjectThreadState implemen
     }
 
     public void bind() {
-        this.originalSubject = ThreadContext.getSubject();
-        this.originalSecurityManager = ThreadContext.getSecurityManager();
+        this.originalResources = ThreadContext.getResources();
+        ThreadContext.remove();
 
         ThreadContext.bind(subject);
-        if (securityManager == null) {
-            ThreadContext.unbindSecurityManager();
-        } else {
+        if ( securityManager != null ) {
             ThreadContext.bind(securityManager);
         }
     }
 
     public void restore() {
-        if (originalSubject == null) {
-            ThreadContext.unbindSubject();
-        } else {
-            ThreadContext.bind(originalSubject);
-        }
-        if (originalSecurityManager == null) {
-            ThreadContext.unbindSecurityManager();
-        } else {
-            ThreadContext.bind(originalSecurityManager);
+        ThreadContext.remove();
+        if ( !CollectionUtils.isEmpty(this.originalResources) ) {
+            ThreadContext.setResources(this.originalResources);
         }
     }
 
     public void clear() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 }

Modified: incubator/shiro/trunk/core/src/main/java/org/apache/shiro/util/ThreadContext.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/main/java/org/apache/shiro/util/ThreadContext.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/main/java/org/apache/shiro/util/ThreadContext.java (original)
+++ incubator/shiro/trunk/core/src/main/java/org/apache/shiro/util/ThreadContext.java Fri May 14 19:03:50 2010
@@ -41,7 +41,7 @@ import java.util.Map;
  * execution, respectively (i.e. individually explicitly or all via the <tt>clear</tt> method).</p>
  *
  * @author Les Hazlewood
- * @see #clear()
+ * @see #remove()
  * @since 0.1
  */
 @SuppressWarnings(value = {"unchecked", "unsafe"})
@@ -66,27 +66,7 @@ public abstract class ThreadContext {
     @Deprecated
     public static final String HOST_KEY = ThreadContext.class.getName() + "_INET_ADDRESS_KEY";
 
-    protected static ThreadLocal<Map<Object, Object>> resources =
-            new InheritableThreadLocal<Map<Object, Object>>() {
-                protected Map<Object, Object> initialValue() {
-                    return new HashMap<Object, Object>();
-                }
-
-                /**
-                 * This implementation was added to address a
-                 * <a href="http://jsecurity.markmail.org/search/?q=#query:+page:1+mid:xqi2yxurwmrpqrvj+state:results">
-                 * user-reported issue</a>.
-                 * @param parentValue the parent value, a HashMap as defined in the {@link #initialValue()} method.
-                 * @return the HashMap to be used by any parent-spawned child threads (a clone of the parent HashMap).
-                 */
-                protected Map<Object, Object> childValue(Map<Object, Object> parentValue) {
-                    if (parentValue != null) {
-                        return (Map<Object, Object>) ((HashMap<Object, Object>) parentValue).clone();
-                    } else {
-                        return null;
-                    }
-                }
-            };
+    protected static ThreadLocal<Map<Object, Object>> resources;
 
     /**
      * Default no-argument constructor.
@@ -95,13 +75,81 @@ public abstract class ThreadContext {
     }
 
     /**
+     * Returns the {@link ThreadLocal} resource {@code Map}.  If it does not yet exist, one is created,
+     * bound to the thread, and then returned.
+     *
+     * @return the ThreadLocal resource {@code Map}, possibly lazily-created.
+     * @since 1.0
+     */
+    protected static Map<Object, Object> getResourcesLazy() {
+        if (resources == null) {
+            resources = createThreadLocal();
+        }
+        return resources.get();
+    }
+
+    /**
+     * Creates a new {@link ThreadLocal} instance containing a {@link Map} to hold arbitrary key-value pairs.
+     *
+     * @return a new {@link ThreadLocal} instance containing a {@link Map} to hold arbitrary key-value pairs.
+     * @since 1.0
+     */
+    private static ThreadLocal<Map<Object, Object>> createThreadLocal() {
+        return new InheritableThreadLocal<Map<Object, Object>>() {
+            protected Map<Object, Object> initialValue() {
+                return new HashMap<Object, Object>();
+            }
+
+            /**
+             * This implementation was added to address a
+             * <a href="http://jsecurity.markmail.org/search/?q=#query:+page:1+mid:xqi2yxurwmrpqrvj+state:results">
+             * user-reported issue</a>.
+             * @param parentValue the parent value, a HashMap as defined in the {@link #initialValue()} method.
+             * @return the HashMap to be used by any parent-spawned child threads (a clone of the parent HashMap).
+             */
+            protected Map<Object, Object> childValue(Map<Object, Object> parentValue) {
+                if (parentValue != null) {
+                    return (Map<Object, Object>) ((HashMap<Object, Object>) parentValue).clone();
+                } else {
+                    return null;
+                }
+            }
+        };
+    }
+
+    /**
      * Returns the ThreadLocal Map. This Map is used internally to bind objects
      * to the current thread by storing each object under a unique key.
      *
      * @return the map of bound resources
      */
-    protected static Map<Object, Object> getResources() {
-        return resources.get();
+    public static Map<Object, Object> getResources() {
+        return resources != null ? new HashMap<Object,Object>(resources.get()) : null;
+    }
+
+    public static void setResources(Map<Object,Object> resources) {
+        if (CollectionUtils.isEmpty(resources) ) {
+            return;
+        }
+        Map<Object,Object> existing = getResourcesLazy();
+        existing.clear();
+        existing.putAll(resources);
+    }
+
+    /**
+     * Returns the value bound in the {@code ThreadContext} under the specified {@code key}, or {@code null} if there
+     * is no value for that {@code key}.
+     *
+     * @param key the map key to use to lookup the value
+     * @return the value bound in the {@code ThreadContext} under the specified {@code key}, or {@code null} if there
+     *         is no value for that {@code key}.
+     * @since 1.0
+     */
+    private static Object getValue(Object key) {
+        if (resources == null) {
+            return null;
+        }
+        return resources.get().get(key);
     }
 
     /**
@@ -117,7 +165,8 @@ public abstract class ThreadContext {
             String msg = "get() - in thread [" + Thread.currentThread().getName() + "]";
             log.trace(msg);
         }
-        Object value = getResources().get(key);
+
+        Object value = getValue(key);
         if ((value != null) && log.isTraceEnabled()) {
             String msg = "Retrieved value of type [" + value.getClass().getName() + "] for key [" +
                     key + "] " + "bound to thread [" + Thread.currentThread().getName() + "]";
@@ -151,7 +200,7 @@ public abstract class ThreadContext {
             return;
         }
 
-        getResources().put(key, value);
+        getResourcesLazy().put(key, value);
 
         if (log.isTraceEnabled()) {
             String msg = "Bound value of type [" + value.getClass().getName() + "] for key [" +
@@ -169,7 +218,10 @@ public abstract class ThreadContext {
      *         under the specified <tt>key</tt> name.
      */
     public static Object remove(Object key) {
-        Object value = getResources().remove(key);
+        if (resources == null) {
+            return null;
+        }
+        Object value = resources.get().remove(key);
 
         if ((value != null) && log.isTraceEnabled()) {
             String msg = "Removed value of type [" + value.getClass().getName() + "] for key [" +
@@ -188,25 +240,44 @@ public abstract class ThreadContext {
      *         otherwise.
      */
     public static boolean containsKey(Object key) {
-        return getResources().containsKey(key);
+        return resources != null && resources.get().containsKey(key);
     }
 
     /**
-     * Removes <em>all</em> values bound to this ThreadContext, which includes any Subject, Session, or InetAddress
-     * that may be bound by these respective objects' conveninece methods, as well as all values bound by your
+     * Clears <em>all</em> values bound to this ThreadContext, which includes any Subject, Session, or InetAddress
+     * that may be bound by these respective objects' convenience methods, as well as all values bound by your
      * application code.
      * <p/>
      * <p>This operation is meant as a clean-up operation that may be called at the end of
      * thread execution to prevent data corruption in a pooled thread environment.
      */
     public static void clear() {
-        getResources().clear();
+        if (resources != null) {
+            resources.get().clear();
+        }
         if (log.isTraceEnabled()) {
             log.trace("Removed all ThreadContext values from thread [" + Thread.currentThread().getName() + "]");
         }
     }
 
     /**
+     * First {@link #clear clears} the {@code ThreadContext} values and then
+     * {@link ThreadLocal#remove removes} the underlying {@link ThreadLocal ThreadLocal} from the thread.
+     * <p/>
+     * This method is meant to be the final 'clean up' operation that is called at the end of thread execution to
+     * prevent thread corruption in pooled thread environments.
+     *
+     * @since 1.0
+     */
+    public static void remove() {
+        if (resources != null) {
+            clear();
+            resources.remove();
+            resources = null;
+        }
+    }
+
+    /**
      * Convenience method that simplifies retrieval of the application's SecurityManager instance from the current
      * thread. If there is no SecurityManager bound to the thread (probably because framework code did not bind it
      * to the thread), this method returns <tt>null</tt>.

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/AbstractSecurityManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/AbstractSecurityManagerTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/AbstractSecurityManagerTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/AbstractSecurityManagerTest.java Fri May 14 19:03:50 2010
@@ -33,7 +33,7 @@ public abstract class AbstractSecurityMa
 
     @After
     public void tearDown() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     protected Subject newSubject(SecurityManager securityManager) {

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/VMSingletonDefaultSecurityManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/VMSingletonDefaultSecurityManagerTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/VMSingletonDefaultSecurityManagerTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/mgt/VMSingletonDefaultSecurityManagerTest.java Fri May 14 19:03:50 2010
@@ -18,17 +18,17 @@
  */
 package org.apache.shiro.mgt;
 
-import org.junit.After;
-import static org.junit.Assert.assertTrue;
-import org.junit.Before;
-import org.junit.Test;
-
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationToken;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.realm.text.PropertiesRealm;
 import org.apache.shiro.subject.Subject;
 import org.apache.shiro.util.ThreadContext;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
 
 
 /**
@@ -39,12 +39,12 @@ public class VMSingletonDefaultSecurityM
 
     @Before
     public void setUp() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     @After
     public void tearDown() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     @Test

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/realm/activedirectory/ActiveDirectoryRealmTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/realm/activedirectory/ActiveDirectoryRealmTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/realm/activedirectory/ActiveDirectoryRealmTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/realm/activedirectory/ActiveDirectoryRealmTest.java Fri May 14 19:03:50 2010
@@ -33,7 +33,6 @@ import org.apache.shiro.subject.SimplePr
 import org.apache.shiro.subject.Subject;
 import org.apache.shiro.util.ThreadContext;
 import org.junit.After;
-import static org.junit.Assert.assertTrue;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -41,6 +40,8 @@ import javax.naming.NamingException;
 import java.util.HashSet;
 import java.util.Set;
 
+import static org.junit.Assert.assertTrue;
+
 
 /**
  * Simple test case for ActiveDirectoryRealm.
@@ -64,7 +65,7 @@ public class ActiveDirectoryRealmTest {
 
     @Before
     public void setup() {
-        ThreadContext.clear();
+        ThreadContext.remove();
         realm = new TestActiveDirectoryRealm();
         securityManager = new DefaultSecurityManager(realm);
         SecurityUtils.setSecurityManager(securityManager);
@@ -74,7 +75,7 @@ public class ActiveDirectoryRealmTest {
     public void tearDown() {
         SecurityUtils.setSecurityManager(null);
         securityManager.destroy();
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     @Test

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DefaultSessionManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DefaultSessionManagerTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DefaultSessionManagerTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DefaultSessionManagerTest.java Fri May 14 19:03:50 2010
@@ -43,14 +43,14 @@ public class DefaultSessionManagerTest {
 
     @Before
     public void setup() {
-        ThreadContext.clear();
+        ThreadContext.remove();
         sm = new DefaultSessionManager();
     }
 
     @After
     public void tearDown() {
         sm.destroy();
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     public void sleep(long millis) {

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DelegatingSessionTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DelegatingSessionTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DelegatingSessionTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/session/mgt/DelegatingSessionTest.java Fri May 14 19:03:50 2010
@@ -21,13 +21,14 @@ package org.apache.shiro.session.mgt;
 import org.apache.shiro.session.ExpiredSessionException;
 import org.apache.shiro.util.ThreadContext;
 import org.junit.After;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.io.Serializable;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 /**
  * Unit test for the {@link DelegatingSession} class.
  */
@@ -38,7 +39,7 @@ public class DelegatingSessionTest {
 
     @Before
     public void setup() {
-        ThreadContext.clear();
+        ThreadContext.remove();
         sm = new DefaultSessionManager();
         Serializable sessionId = sm.start((String) null);
         this.session = new DelegatingSession(sm, sessionId);
@@ -47,7 +48,7 @@ public class DelegatingSessionTest {
     @After
     public void tearDown() {
         sm.destroy();
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     public void sleep(long millis) {

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/subject/DelegatingSubjectTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/subject/DelegatingSubjectTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/subject/DelegatingSubjectTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/subject/DelegatingSubjectTest.java Fri May 14 19:03:50 2010
@@ -48,12 +48,12 @@ public class DelegatingSubjectTest {
 
     @Before
     public void setup() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     @After
     public void tearDown() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     @Test

Modified: incubator/shiro/trunk/support/spring/src/test/java/org/apache/shiro/spring/remoting/SecureRemoteInvocationFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/support/spring/src/test/java/org/apache/shiro/spring/remoting/SecureRemoteInvocationFactoryTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/support/spring/src/test/java/org/apache/shiro/spring/remoting/SecureRemoteInvocationFactoryTest.java (original)
+++ incubator/shiro/trunk/support/spring/src/test/java/org/apache/shiro/spring/remoting/SecureRemoteInvocationFactoryTest.java Fri May 14 19:03:50 2010
@@ -43,7 +43,7 @@ public class SecureRemoteInvocationFacto
 
     @Before
     public void setup() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     protected void bind(Subject subject) {
@@ -52,7 +52,7 @@ public class SecureRemoteInvocationFacto
 
     @After
     public void tearDown() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     protected Method getMethod(String name, Class clazz) {

Modified: incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java (original)
+++ incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java Fri May 14 19:03:50 2010
@@ -234,8 +234,6 @@ public abstract class AbstractShiroFilte
         if ( threadState != null ) {
             threadState.clear();
         }
-        //just for good measure (SHIRO-159):
-        ThreadContext.clear();
     }
 
     /**

Modified: incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/subject/support/WebSubjectThreadState.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/subject/support/WebSubjectThreadState.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/subject/support/WebSubjectThreadState.java (original)
+++ incubator/shiro/trunk/web/src/main/java/org/apache/shiro/web/subject/support/WebSubjectThreadState.java Fri May 14 19:03:50 2010
@@ -30,9 +30,6 @@ import javax.servlet.ServletResponse;
  */
 public class WebSubjectThreadState extends SubjectThreadState {
 
-    private ServletRequest originalRequest;
-    private ServletResponse originalResponse;
-
     private final ServletRequest request;
     private final ServletResponse response;
 
@@ -55,33 +52,11 @@ public class WebSubjectThreadState exten
     @Override
     public void bind() {
         super.bind();
-        this.originalRequest = WebUtils.getServletRequest();
-        this.originalResponse = WebUtils.getServletResponse();
-
-        if (request == null) {
-            WebUtils.unbindServletRequest();
-        } else {
+        if (request != null) {
             WebUtils.bind(request);
         }
-        if (response == null) {
-            WebUtils.unbindServletResponse();
-        } else {
+        if (response != null) {
             WebUtils.bind(response);
         }
     }
-
-    @Override
-    public void restore() {
-        if (originalRequest == null) {
-            WebUtils.unbindServletRequest();
-        } else {
-            WebUtils.bind(originalRequest);
-        }
-        if (originalResponse == null) {
-            WebUtils.unbindServletResponse();
-        } else {
-            WebUtils.bind(originalResponse);
-        }
-        super.restore();
-    }
 }

Modified: incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/AbstractWebSecurityManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/AbstractWebSecurityManagerTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/AbstractWebSecurityManagerTest.java (original)
+++ incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/AbstractWebSecurityManagerTest.java Fri May 14 19:03:50 2010
@@ -35,7 +35,7 @@ public abstract class AbstractWebSecurit
 
     @After
     public void tearDown() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     protected Subject newSubject(SecurityManager sm, ServletRequest request, ServletResponse response) {

Modified: incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/session/DefaultWebSessionManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/session/DefaultWebSessionManagerTest.java?rev=944400&r1=944399&r2=944400&view=diff
==============================================================================
--- incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/session/DefaultWebSessionManagerTest.java (original)
+++ incubator/shiro/trunk/web/src/test/java/org/apache/shiro/web/session/DefaultWebSessionManagerTest.java Fri May 14 19:03:50 2010
@@ -45,7 +45,7 @@ public class DefaultWebSessionManagerTes
 
     @After
     public void clearThread() {
-        ThreadContext.clear();
+        ThreadContext.remove();
     }
 
     @Test