/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* Licensed 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.seasar.framework.container.external.servlet;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.seasar.framework.container.ExternalContext;
/**
* Servlet用の {@link ExternalContext}です。
*
* @author higa
*
*/
public class HttpServletExternalContext implements ExternalContext {
/** 遅延ロードするためのマーク */
static final Map LAZY_MARK = new HashMap();
ThreadLocal requests = new ThreadLocal();
ThreadLocal responses = new ThreadLocal();
ThreadLocal requestMaps = new ThreadLocal();
ThreadLocal requestHeaderMaps = new ThreadLocal();
ThreadLocal requestHeaderValuesMaps = new ThreadLocal();
ThreadLocal requestParameterMaps = new ThreadLocal();
ThreadLocal requestParameterValuesMaps = new ThreadLocal();
ThreadLocal requestCookieMaps = new ThreadLocal();
ThreadLocal sessionMaps = new ThreadLocal();
ServletContext application;
public Object getRequest() {
return getHttpServletRequest();
}
/**
* {@link HttpServletRequest}を返します。
*
* @return {@link HttpServletRequest}
*/
protected HttpServletRequest getHttpServletRequest() {
return (HttpServletRequest) requests.get();
}
public void setRequest(Object request) {
requests.set(request);
if (request == null) {
requestMaps.set(new HashMap());
requestHeaderMaps.set(Collections.EMPTY_MAP);
requestHeaderValuesMaps.set(Collections.EMPTY_MAP);
requestCookieMaps.set(Collections.EMPTY_MAP);
requestParameterMaps.set(Collections.EMPTY_MAP);
requestParameterValuesMaps.set(Collections.EMPTY_MAP);
sessionMaps.set(new HashMap());
} else {
final HttpServletRequest req = (HttpServletRequest) request;
requestMaps.set(new ServletRequestMap(req));
requestHeaderMaps.set(new ServletRequestHeaderMap(req));
requestHeaderValuesMaps.set(new ServletRequestHeaderValuesMap(req));
requestCookieMaps.set(new CookieMap(req));
requestParameterMaps.set(LAZY_MARK); // lazy initialize
requestParameterValuesMaps.set(LAZY_MARK); // lazy initialize
sessionMaps.set(LAZY_MARK); // lazy initialize
}
}
public Object getResponse() {
return responses.get();
}
public void setResponse(Object response) {
responses.set(response);
}
public Object getSession() {
return getHttpSession();
}
/**
* {@link HttpSession}を返します。
*
* @return {@link HttpSession}
*/
protected HttpSession getHttpSession() {
HttpServletRequest request = getHttpServletRequest();
if (request == null) {
return null;
}
return request.getSession();
}
public Object getApplication() {
return application;
}
public void setApplication(Object application) {
if (!(application instanceof ServletContext)) {
throw new IllegalArgumentException("application:" + application);
}
this.application = (ServletContext) application;
}
public Map getApplicationMap() {
return new ServletApplicationMap(application);
}
public Map getInitParameterMap() {
return new ServletInitParameterMap(application);
}
public Map getRequestCookieMap() {
Map requestCookieMap = (Map) requestCookieMaps.get();
if (requestCookieMap == null) {
requestCookieMap = Collections.EMPTY_MAP;
requestCookieMaps.set(requestCookieMap);
}
return requestCookieMap;
}
public Map getRequestHeaderMap() {
Map requestHeaderMap = (Map) requestHeaderMaps.get();
if (requestHeaderMap == null) {
requestHeaderMap = Collections.EMPTY_MAP;
requestCookieMaps.set(requestHeaderMap);
}
return requestHeaderMap;
}
public Map getRequestHeaderValuesMap() {
Map requestHeaderMap = (Map) requestHeaderValuesMaps.get();
if (requestHeaderMap == null) {
requestHeaderMap = Collections.EMPTY_MAP;
requestHeaderMaps.set(requestHeaderMap);
}
return requestHeaderMap;
}
public Map getRequestMap() {
Map requestMap = (Map) requestMaps.get();
if (requestMap == null) {
requestMap = new HashMap();
requestMaps.set(requestMap);
}
return requestMap;
}
public Map getRequestParameterMap() {
Map requestParameterMap = (Map) requestParameterMaps.get();
if (requestParameterMap == null) {
requestParameterMap = Collections.EMPTY_MAP;
requestParameterMaps.set(requestParameterMap);
} else if (requestParameterMap == LAZY_MARK) {
requestParameterMap = new ServletRequestParameterMap(
getHttpServletRequest());
requestParameterMaps.set(requestParameterMap);
}
return requestParameterMap;
}
public Map getRequestParameterValuesMap() {
Map requestParameterValuesMap = (Map) requestParameterValuesMaps.get();
if (requestParameterValuesMap == null) {
requestParameterValuesMap = Collections.EMPTY_MAP;
requestParameterValuesMaps.set(requestParameterValuesMap);
} else if (requestParameterValuesMap == LAZY_MARK) {
requestParameterValuesMap = new ServletRequestParameterValuesMap(
getHttpServletRequest());
requestParameterValuesMaps.set(requestParameterValuesMap);
}
return requestParameterValuesMap;
}
public Map getSessionMap() {
Map sessionMap = (Map) sessionMaps.get();
if (sessionMap == null) {
sessionMap = new HashMap();
sessionMaps.set(sessionMap);
} else if (sessionMap == LAZY_MARK) {
sessionMap = new HttpSessionMap(getHttpServletRequest());
sessionMaps.set(sessionMap);
}
return sessionMap;
}
}