/*
* 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.extension.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.seasar.extension.filter.util.RequestDumpUtil;
import org.seasar.framework.util.BooleanConversionUtil;
/**
* {@link HttpServletRequest}の内容をサーブレットが処理する前後にダンプ出力するフィルタです。
*
* @author manhole
*/
public class RequestDumpFilter implements Filter {
private static final Log log = LogFactory.getLog(RequestDumpFilter.class);
private FilterConfig config = null;
private boolean beforeRequestParameter;
private boolean afterRequestParameter;
private boolean beforeRequestAttribute;
private boolean afterRequestAttribute;
private boolean beforeCookies;
private boolean afterCookies;
private boolean beforeRequestHeader;
private boolean afterRequestHeader;
private boolean beforeSessionAttribute;
private boolean afterSessionAttribute;
private boolean beforeContextAttribute;
private boolean afterContextAttribute;
private boolean afterResponse;
private static final String INDENT = " ";
private static final String LF = System.getProperty("line.separator");
public void init(final FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
beforeRequestParameter = getBooleanParameter(filterConfig,
"beforeRequestParameter", true);
afterRequestParameter = getBooleanParameter(filterConfig,
"afterRequestParameter", false);
beforeRequestAttribute = getBooleanParameter(filterConfig,
"beforeRequestAttribute", true);
afterRequestAttribute = getBooleanParameter(filterConfig,
"afterRequestAttribute", true);
beforeRequestHeader = getBooleanParameter(filterConfig,
"beforeRequestHeader", true);
afterRequestHeader = getBooleanParameter(filterConfig,
"afterRequestHeader", false);
beforeContextAttribute = getBooleanParameter(filterConfig,
"beforeContextAttribute", true);
afterContextAttribute = getBooleanParameter(filterConfig,
"afterContextAttribute", true);
beforeCookies = getBooleanParameter(filterConfig, "beforeCookies", true);
afterCookies = getBooleanParameter(filterConfig, "afterCookies", true);
beforeSessionAttribute = getBooleanParameter(filterConfig,
"beforeSessionAttribute", true);
afterSessionAttribute = getBooleanParameter(filterConfig,
"afterSessionAttribute", true);
afterResponse = getBooleanParameter(filterConfig, "afterResponse", true);
final StringBuffer sb = new StringBuffer();
RequestDumpUtil.dumpContextProperties(sb, filterConfig
.getServletContext(), LF, INDENT);
log.debug(sb.toString());
}
public void destroy() {
config = null;
}
public void doFilter(final ServletRequest request,
final ServletResponse response, final FilterChain chain)
throws IOException, ServletException {
if (config == null) {
return;
}
if (!(request instanceof HttpServletRequest)
|| !(response instanceof HttpServletResponse)) {
chain.doFilter(request, response);
return;
}
final HttpServletRequest hrequest = (HttpServletRequest) request;
final HttpServletResponse hresponse = (HttpServletResponse) response;
dumpBefore(hrequest);
try {
chain.doFilter(request, response);
} finally {
dumpAfter(hrequest, hresponse);
}
}
private void dumpBefore(final HttpServletRequest request) {
final ServletContext context = config.getServletContext();
final StringBuffer sb = new StringBuffer();
sb.append(LF);
sb.append(LF);
sb.append("** before *****************************************: ");
sb.append(getServletPath(request));
sb.append(LF);
RequestDumpUtil.dumpRequestProperties(sb, request, LF, INDENT);
RequestDumpUtil.dumpSessionProperties(sb, request, LF, INDENT);
if (beforeRequestParameter) {
RequestDumpUtil.dumpRequestParameters(sb, request, LF, INDENT);
}
if (beforeRequestAttribute) {
RequestDumpUtil.dumpRequestAttributes(sb, request, LF, INDENT);
}
if (beforeCookies) {
RequestDumpUtil.dumpCookies(sb, request, LF, INDENT);
}
if (beforeRequestHeader) {
RequestDumpUtil.dumpRequestHeaders(sb, request, LF, INDENT);
}
if (beforeSessionAttribute) {
RequestDumpUtil.dumpSessionAttributes(sb, request, LF, INDENT);
}
if (beforeContextAttribute) {
RequestDumpUtil.dumpContextAttributes(sb, context, LF, INDENT);
}
log.debug(sb.toString());
}
private void dumpAfter(final HttpServletRequest request,
final HttpServletResponse response) {
final StringBuffer sb = new StringBuffer();
sb.append(LF);
sb.append(LF);
sb.append("** after *****************************************: ");
sb.append(getServletPath(request));
sb.append(LF);
if (afterResponse) {
RequestDumpUtil.dumpResponseProperties(sb, response, LF, INDENT);
}
if (afterRequestParameter) {
RequestDumpUtil.dumpRequestParameters(sb, request, LF, INDENT);
}
if (afterRequestAttribute) {
RequestDumpUtil.dumpRequestAttributes(sb, request, LF, INDENT);
}
if (afterCookies) {
RequestDumpUtil.dumpCookies(sb, request, LF, INDENT);
}
if (afterRequestHeader) {
RequestDumpUtil.dumpRequestHeaders(sb, request, LF, INDENT);
}
if (afterSessionAttribute) {
RequestDumpUtil.dumpSessionAttributes(sb, request, LF, INDENT);
}
if (afterContextAttribute) {
RequestDumpUtil.dumpContextAttributes(sb, config
.getServletContext(), LF, INDENT);
}
log.debug(sb.toString());
}
private String getServletPath(final ServletRequest request) {
if (request instanceof HttpServletRequest) {
return ((HttpServletRequest) request).getServletPath();
}
return "";
}
public String toString() {
if (config == null) {
return ("RequestDumpFilter()");
}
final StringBuffer sb = new StringBuffer("RequestDumpFilter(");
sb.append(config);
sb.append(")");
return (sb.toString());
}
private boolean getBooleanParameter(final FilterConfig filterConfig,
final String name, final boolean defaultValue) {
final String value = filterConfig.getInitParameter(name);
if (value == null) {
return defaultValue;
}
return BooleanConversionUtil.toPrimitiveBoolean(value);
}
}