SHIRO-498: applied patch git-svn-id: https://svn.apache.org/repos/asf/shiro/branches/2.0-api-design-changes@1672973 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/src/main/java/org/apache/shiro/util/ThreadContext.java b/core/src/main/java/org/apache/shiro/util/ThreadContext.java index e52ec4e..e6237e1 100644 --- a/core/src/main/java/org/apache/shiro/util/ThreadContext.java +++ b/core/src/main/java/org/apache/shiro/util/ThreadContext.java
@@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import org.slf4j.MDC; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -74,7 +75,11 @@ * @return the map of bound resources */ public static Map<Object, Object> getResources() { - return resources != null ? new HashMap<Object, Object>(resources.get()) : null; + if (resources.get() == null){ + return Collections.emptyMap(); + } else { + return new HashMap<Object, Object>(resources.get()); + } } /** @@ -89,6 +94,7 @@ if (CollectionUtils.isEmpty(newResources)) { return; } + ensureResourcesInitialized(); resources.get().clear(); resources.get().putAll(newResources); } @@ -103,7 +109,14 @@ * @since 1.0 */ private static Object getValue(Object key) { - return resources.get().get(key); + Map<Object, Object> perThreadResources = resources.get(); + return perThreadResources != null ? perThreadResources.get(key) : null; + } + + private static void ensureResourcesInitialized(){ + if (resources.get() == null){ + resources.set(new HashMap<Object, Object>()); + } } /** @@ -154,6 +167,7 @@ return; } + ensureResourcesInitialized(); resources.get().put(key, value); if (log.isTraceEnabled()) { @@ -172,7 +186,8 @@ * under the specified <tt>key</tt> name. */ public static Object remove(Object key) { - Object value = resources.get().remove(key); + Map<Object, Object> perThreadResources = resources.get(); + Object value = perThreadResources != null ? perThreadResources.remove(key) : null; if ((value != null) && log.isTraceEnabled()) { String msg = "Removed value of type [" + value.getClass().getName() + "] for key [" + @@ -316,9 +331,6 @@ } private static final class InheritableThreadLocalMap<T extends Map<Object, Object>> extends InheritableThreadLocal<Map<Object, Object>> { - protected Map<Object, Object> initialValue() { - return new HashMap<Object, Object>(); - } /** * This implementation was added to address a