001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.web.context.request;
018:
019: /**
020: * Holder class to expose the web request in the form of a thread-bound
021: * {@link RequestAttributes} object.
022: *
023: * <p>Use {@link RequestContextListener} or
024: * {@link org.springframework.web.filter.RequestContextFilter} to expose
025: * the current web request. Note that
026: * {@link org.springframework.web.servlet.DispatcherServlet} and
027: * {@link org.springframework.web.portlet.DispatcherPortlet} already
028: * expose the current request by default.
029: *
030: * @author Juergen Hoeller
031: * @author Rod Johnson
032: * @since 2.0
033: * @see RequestContextListener
034: * @see org.springframework.web.filter.RequestContextFilter
035: * @see org.springframework.web.servlet.DispatcherServlet
036: * @see org.springframework.web.portlet.DispatcherPortlet
037: */
038: public abstract class RequestContextHolder {
039:
040: private static final ThreadLocal requestAttributesHolder = new ThreadLocal();
041:
042: private static final ThreadLocal inheritableRequestAttributesHolder = new InheritableThreadLocal();
043:
044: /**
045: * Reset the RequestAttributes for the current thread.
046: */
047: public static void resetRequestAttributes() {
048: requestAttributesHolder.set(null);
049: inheritableRequestAttributesHolder.set(null);
050: }
051:
052: /**
053: * Bind the given RequestAttributes to the current thread,
054: * <i>not</i> exposing it as inheritable for child threads.
055: * @param attributes the RequestAttributes to expose
056: * @see #setRequestAttributes(RequestAttributes, boolean)
057: */
058: public static void setRequestAttributes(RequestAttributes attributes) {
059: setRequestAttributes(attributes, false);
060: }
061:
062: /**
063: * Bind the given RequestAttributes to the current thread.
064: * @param attributes the RequestAttributes to expose
065: * @param inheritable whether to expose the RequestAttributes as inheritable
066: * for child threads (using an {@link java.lang.InheritableThreadLocal})
067: */
068: public static void setRequestAttributes(
069: RequestAttributes attributes, boolean inheritable) {
070: if (inheritable) {
071: inheritableRequestAttributesHolder.set(attributes);
072: requestAttributesHolder.set(null);
073: } else {
074: requestAttributesHolder.set(attributes);
075: inheritableRequestAttributesHolder.set(null);
076: }
077: }
078:
079: /**
080: * Return the RequestAttributes currently bound to the thread.
081: * @return the RequestAttributes currently bound to the thread,
082: * or <code>null</code> if none bound
083: */
084: public static RequestAttributes getRequestAttributes() {
085: RequestAttributes attributes = (RequestAttributes) requestAttributesHolder
086: .get();
087: if (attributes == null) {
088: attributes = (RequestAttributes) inheritableRequestAttributesHolder
089: .get();
090: }
091: return attributes;
092: }
093:
094: /**
095: * Return the RequestAttributes currently bound to the thread.
096: * @return the RequestAttributes currently bound to the thread
097: * @throws IllegalStateException if no RequestAttributes object
098: * is bound to the current thread
099: */
100: public static RequestAttributes currentRequestAttributes()
101: throws IllegalStateException {
102: RequestAttributes attributes = getRequestAttributes();
103: if (attributes == null) {
104: throw new IllegalStateException(
105: "No thread-bound request found: "
106: + "Are you referring to request attributes outside of an actual web request? "
107: + "If you are actually operating within a web request and still receive this message,"
108: + "your code is probably running outside of DispatcherServlet/DispatcherPortlet: "
109: + "In this case, use RequestContextListener or RequestContextFilter to expose the current request.");
110: }
111: return attributes;
112: }
113:
114: }
|