/*
* 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.util;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Locale;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* {@link HttpServletRequest}の内容を編集するユーティリティです。
*
* @author manhole
*/
public class RequestDumpUtil {
/**
* リクエストヘッダの内容を文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpRequestHeaders(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
for (final Iterator it = toSortedSet(request.getHeaderNames())
.iterator(); it.hasNext();) {
final String name = (String) it.next();
final String value = request.getHeader(name);
sb.append(indent);
sb.append("[header]").append(name);
sb.append("=").append(value);
sb.append(lf);
}
}
/**
* コンテキスト属性の内容を文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param context
* コンテキスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpContextAttributes(final StringBuffer sb,
final ServletContext context, final String lf, final String indent) {
if (context == null) {
return;
}
for (final Iterator it = toSortedSet(context.getAttributeNames())
.iterator(); it.hasNext();) {
final String name = (String) it.next();
final Object attr = context.getAttribute(name);
sb.append(indent);
sb.append("[context]").append(name).append("=").append(attr);
sb.append(lf);
}
}
/**
* クッキーの内容を文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpCookies(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
final Cookie cookies[] = request.getCookies();
if (cookies == null) {
return;
}
for (int i = 0; i < cookies.length; i++) {
sb.append(indent);
sb.append("[cookie]").append(cookies[i].getName());
sb.append("=").append(cookies[i].getValue());
sb.append(lf);
}
}
/**
* リクエスト属性の内容を文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpRequestAttributes(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
for (final Iterator it = toSortedSet(request.getAttributeNames())
.iterator(); it.hasNext();) {
final String name = (String) it.next();
final Object attr = request.getAttribute(name);
sb.append(indent);
sb.append("[request]").append(name).append("=").append(attr);
sb.append(lf);
}
}
/**
* セッション属性の内容を文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpSessionAttributes(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
final HttpSession session = request.getSession(false);
if (session == null) {
return;
}
for (final Iterator it = toSortedSet(session.getAttributeNames())
.iterator(); it.hasNext();) {
final String name = (String) it.next();
final Object attr = session.getAttribute(name);
sb.append(indent);
sb.append("[session]").append(name).append("=").append(attr);
sb.append(lf);
}
}
private static SortedSet toSortedSet(final Enumeration enu) {
final SortedSet set = new TreeSet();
set.addAll(Collections.list(enu));
return set;
}
/**
* リクエストパラメータの内容を文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpRequestParameters(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
for (final Iterator it = toSortedSet(request.getParameterNames())
.iterator(); it.hasNext();) {
final String name = (String) it.next();
sb.append(indent);
sb.append("[param]").append(name).append("=");
final String values[] = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
if (i > 0) {
sb.append(", ");
}
sb.append(values[i]);
}
sb.append(lf);
}
}
/**
* リクエストのプロパティを文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpRequestProperties(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
sb.append(indent);
sb.append("Request class=" + request.getClass().getName()).append(
", instance=").append(request.toString().trim());
sb.append(lf);
sb.append(indent);
sb.append("RequestedSessionId=")
.append(request.getRequestedSessionId());
sb.append(lf);
sb.append(indent);
sb.append("REQUEST_URI=").append(request.getRequestURI());
sb.append(", SERVLET_PATH=").append(request.getServletPath());
sb.append(lf);
sb.append(indent);
sb.append("CharacterEncoding=" + request.getCharacterEncoding());
sb.append(", ContentLength=").append(request.getContentLength());
sb.append(", ContentType=").append(request.getContentType());
sb.append(", Locale=").append(request.getLocale());
sb.append(", Locales=");
final Enumeration locales = request.getLocales();
boolean first = true;
while (locales.hasMoreElements()) {
final Locale locale = (Locale) locales.nextElement();
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(locale.toString());
}
sb.append(", Scheme=").append(request.getScheme());
sb.append(", isSecure=").append(request.isSecure());
sb.append(lf).append(indent);
sb.append("SERVER_PROTOCOL=").append(request.getProtocol());
sb.append(", REMOTE_ADDR=").append(request.getRemoteAddr());
sb.append(", REMOTE_HOST=").append(request.getRemoteHost());
sb.append(", SERVER_NAME=").append(request.getServerName());
sb.append(", SERVER_PORT=").append(request.getServerPort());
sb.append(lf).append(indent);
sb.append("ContextPath=").append(request.getContextPath());
sb.append(", REQUEST_METHOD=").append(request.getMethod());
sb.append(", QUERY_STRING=").append(request.getQueryString());
sb.append(", PathInfo=").append(request.getPathInfo());
sb.append(", RemoteUser=").append(request.getRemoteUser());
sb.append(lf);
}
/**
* コンテキストのプロパティを文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param context
* コンテキスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpContextProperties(final StringBuffer sb,
final ServletContext context, final String lf, final String indent) {
sb.append(indent);
sb.append("ContextRealPath=").append(context.getRealPath("/"));
sb.append(lf).append(indent);
sb.append("SERVER_SOFTWARE=").append(context.getServerInfo());
sb.append(", ServletContextName=").append(
context.getServletContextName());
sb.append(", MajorVersion=").append(context.getMajorVersion());
sb.append(", MinorVersion=").append(context.getMinorVersion());
}
/**
* セッションのプロパティを文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param request
* リクエスト
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpSessionProperties(final StringBuffer sb,
final HttpServletRequest request, final String lf,
final String indent) {
final HttpSession session = request.getSession(false);
if (session == null) {
return;
}
sb.append(indent);
sb.append("Session SessionId=").append(session.getId());
sb.append(lf).append(indent);
sb.append("Session :: CreationTime=").append(session.getCreationTime());
sb.append(", LastAccessedTime=").append(session.getLastAccessedTime());
sb.append(", MaxInactiveInterval=").append(
session.getMaxInactiveInterval());
sb.append(lf);
}
/**
* レスポンスのプロパティを文字列バッファに編集します。
*
* @param sb
* 文字列バッファ
* @param response
* レスポンス
* @param lf
* 改行文字
* @param indent
* インデント
*/
public static void dumpResponseProperties(final StringBuffer sb,
final HttpServletResponse response, final String lf,
final String indent) {
sb.append(indent);
sb.append("Response class=" + response.getClass().getName()).append(
", instance=").append(response.toString().trim());
sb.append(lf);
}
}