nablarch.fw.web.servlet.NablarchHttpServletRequestWrapper Maven / Gradle / Ivy
package nablarch.fw.web.servlet;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import nablarch.core.log.Logger;
import nablarch.core.log.LoggerManager;
import nablarch.core.util.annotation.Published;
import nablarch.core.util.map.CaseInsensitiveMap;
import nablarch.core.util.map.EnumerableIterator;
import nablarch.fw.results.BadRequest;
/**
* Nablarchのスコープオブジェクトを使用できるサーブレットリクエストのラッパー。
*
* @author Iwauo Tajima
*/
public class NablarchHttpServletRequestWrapper extends HttpServletRequestWrapper {
/**
* コンストラクタ
* @param delegate ラップ対象のリクエストオブジェクト
*/
public NablarchHttpServletRequestWrapper(HttpServletRequest delegate) {
super(delegate);
origReq = delegate;
scope = new RequestAttributeMap(delegate);
createHeaderMap();
}
/**
* 委譲対象のHttpServletRequest
*/
private final HttpServletRequest origReq;
/**
* HTTPヘッダーのMapを返す。
* @return HTTPヘッダーのMap
*/
public Map getHeaderMap() {
return headerMap;
}
/**
* HTTPヘッダーを設定する。
* @param headerMap HTTPヘッダーのMap
* @return このオブジェクト自体。
*/
public NablarchHttpServletRequestWrapper setHeaderMap(Map headerMap) {
this.headerMap = headerMap;
return this;
}
/**
* リクエストパラメータを設定する。
* @param params リクエストパラメータ
* @return このオブジェクト自体
*/
public NablarchHttpServletRequestWrapper setParamMap(Map params) {
paramMap = params;
return this;
}
/** リクエストスコープ */
private Map scope;
/**
* リクエストスコープへの参照を返す。
* @return リクエストスコープへの参照
*/
public Map getScope() {
return scope;
}
/**
* リクエストスコープを設定する。
* @param scope リクエストスコープ
* @return このオブジェクト自体
*/
public NablarchHttpServletRequestWrapper setScope(Map scope) {
this.scope = scope;
return this;
}
/** {@inheritDoc} */
@Published(tag = "architect")
public HttpSessionWrapper getSession() {
return getSession(true);
}
/** {@inheritDoc} */
@Published(tag = "architect")
public HttpSessionWrapper getSession(boolean create) {
HttpSession session = origReq.getSession(false);
if (session == null) {
if (create) {
sessionWrapper = new HttpSessionWrapper(origReq.getSession(true));
return sessionWrapper;
}
return null;
}
if (sessionWrapper == null) {
sessionWrapper = new HttpSessionWrapper(session);
}
return sessionWrapper;
}
/** セッションラッパー */
private HttpSessionWrapper sessionWrapper = null;
/** {@inheritDoc} */
@Published(tag = "architect")
public String getHeader(String name) {
return headerMap.get(name);
}
/** {@inheritDoc} */
public Enumeration getHeaderNames() {
return new EnumerableIterator(headerMap.keySet().iterator());
}
/**
* HttpServletRequestのHTTPヘッダを格納したMapを作成する。
*/
@SuppressWarnings("unchecked")
private void createHeaderMap() {
headerMap = new CaseInsensitiveMap();
Enumeration headerNames = origReq.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = origReq.getHeader(headerName);
headerMap.put(headerName, headerValue);
}
}
/** HttpServletRequestのHTTPヘッダを格納したMap */
private Map headerMap;
/** {@inheritDoc} */
public String getParameter(String name) {
String[] values = getParameterMap().get(name);
return (values == null || values.length == 0) ? super.getParameter(name)
: values[0];
}
/** {@inheritDoc} */
public Map getParameterMap() {
if (paramMap == null) {
createParamMap();
}
return paramMap;
}
/** {@inheritDoc} */
public Enumeration getParameterNames() {
return new EnumerableIterator(getParameterMap().keySet().iterator());
}
/** {@inheritDoc} */
public String[] getParameterValues(String name) {
return getParameterMap().get(name);
}
/**
* リクエストパラメータを格納したMapを作成する。
* 特に、ポストパラメータの読み込み時に何らかのエラーが発生した場合は、
* 内部ステータスコード400(BadRequest)の実行時例外を送出する。
*/
@SuppressWarnings("unchecked")
private void createParamMap() {
paramMap = new HashMap();
Map postParams = null;
try {
postParams = origReq.getParameterMap();
} catch (Exception e) {
// 一部のサーバではポストパラメータの初回読み込み時に実行時例外を
// 送出するので、ここで捕捉して再送出する。
if (LOGGER.isWarnEnabled()) {
LOGGER.logWarn(POST_PARAM_READ_ERROR_MESSAGE, e);
}
throw new PostParameterReadError(POST_PARAM_READ_ERROR_MESSAGE, e);
}
paramMap.putAll(postParams);
}
/**
* ポストパラメータが読み込めなかった場合のメッセージ
*/
private static final String POST_PARAM_READ_ERROR_MESSAGE
= "Could not read the post parameters"
+ " due to improperly formatted message body"
+ " or some network problems.";
/** リクエストパラメータを格納したMap */
private Map paramMap;
/**
* {@inheritDoc}
*/
public ServletRequest getRequest() {
return origReq;
}
/** ロガー */
private static final Logger
LOGGER = LoggerManager.get(NablarchHttpServletRequestWrapper.class);
// ------------------------------------------------------ Custom errors
/**
* ポストパラメータの読み込みに失敗したことを表す実行時例外。
*/
@Published(tag = "architect")
public static class PostParameterReadError extends BadRequest {
/**
* コンストラクタ。
* @param message メッセージ
* @param e 起因例外
*/
public PostParameterReadError(String message, Throwable e) {
super(message, e);
}
}
// ---------------------------------------------- A wrapper to HttpSession
/**
* サーブレットセッションのラッパー
*/
public static class HttpSessionWrapper implements HttpSession {
/**
* コンストラクター
* @param delegate 委譲対象のセッションオブジェクト
*/
public HttpSessionWrapper(HttpSession delegate) {
this.delegate = delegate;
scope = new SessionAttributeMap(delegate);
}
/** 委譲対象のセッションオブジェクト */
private final HttpSession delegate;
/** セッションスコープ */
private Map scope;
/**
* セッションスコープへの参照を返す。
* @return セッションスコープへの参照
*/
public Map getScope() {
return scope;
}
/**
* セッションスコープを設定する。
* @param scope セッションスコープ
* @return このオブジェクト自体
*/
public HttpSessionWrapper setScope(Map scope) {
this.scope = scope;
return this;
}
/** {@inheritDoc} */
public Object getAttribute(String name) {
return scope.get(name);
}
/** {@inheritDoc} */
public Enumeration getAttributeNames() {
return new EnumerableIterator(scope.keySet().iterator());
}
/** {@inheritDoc} */
public void setAttribute(String name, Object value) {
scope.put(name, value);
}
/** {@inheritDoc} */
public void removeAttribute(String name) {
scope.remove(name);
}
/** {@inheritDoc} */
public Object getValue(String name) {
return getAttribute(name);
}
/** {@inheritDoc} */
public String[] getValueNames() {
return scope.keySet().toArray(new String[]{});
}
/** {@inheritDoc} */
public void putValue(String name, Object value) {
setAttribute(name, value);
}
/** {@inheritDoc} */
public void removeValue(String name) {
removeAttribute(name);
}
/** {@inheritDoc} */
public long getCreationTime() {
return delegate.getCreationTime();
}
/** {@inheritDoc} */
@Published(tag = "architect")
public String getId() {
return delegate.getId();
}
/** {@inheritDoc} */
public long getLastAccessedTime() {
return delegate.getLastAccessedTime();
}
/** {@inheritDoc} */
public int getMaxInactiveInterval() {
return delegate.getMaxInactiveInterval();
}
/** {@inheritDoc} */
public ServletContext getServletContext() {
return delegate.getServletContext();
}
/** {@inheritDoc} */
@SuppressWarnings("deprecation")
public javax.servlet.http.HttpSessionContext getSessionContext() {
return delegate.getSessionContext();
}
/** {@inheritDoc} */
public void invalidate() {
delegate.invalidate();
}
/** {@inheritDoc} */
public boolean isNew() {
return delegate.isNew();
}
/** {@inheritDoc} */
public void setMaxInactiveInterval(int interval) {
delegate.setMaxInactiveInterval(interval);
}
/**
* 委譲対象のセッションオブジェクトを取得する。
*
* @return 委譲対象のセッションオブジェクト
*/
public HttpSession getDelegate() {
return delegate;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy