
Author: ceki Date: Wed Jan 23 10:52:19 2008 New Revision: 1605 Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestParameterConverter.java logback/trunk/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java Log: - request parameters can be multi-valued as observed in bug 110 http://bugzilla.qos.ch/show_bug.cgi?id=110 Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestParameterConverter.java ============================================================================== --- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestParameterConverter.java (original) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestParameterConverter.java Wed Jan 23 10:52:19 2008 @@ -1,9 +1,10 @@ package ch.qos.logback.access.pattern; +import java.util.Arrays; + import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.core.util.OptionHelper; - public class RequestParameterConverter extends AccessConverter { String key; @@ -22,7 +23,14 @@ return "INACTIVE_REQUEST_PARAM_CONV"; } - return accessEvent.getRequestParameter(key); + String[] paramArray = accessEvent.getRequestParameter(key); + if (paramArray.length == 1) { + return paramArray[0]; + } else { + // for an array string {"a", "b"} named 'sa', Array.toString(sa) returns the string + // "[a, b]". + return Arrays.toString(paramArray); + } } } Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java ============================================================================== --- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java (original) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java Wed Jan 23 10:52:19 2008 @@ -14,6 +14,8 @@ import ch.qos.logback.access.pattern.AccessConverter; import ch.qos.logback.access.servlet.Util; +// Contributors: Joern Huxhorn (see also bug #110) + /** * The Access module's internal representation of logging events. When the * logging component instance is called in the container to log then a @@ -28,6 +30,8 @@ private static final long serialVersionUID = -3118194368414470960L; public final static String NA = "-"; + public final static String[] NA_STRING_ARRAY = new String[] {AccessEvent.NA}; + public final static String EMPTY = ""; public static final int SENTINEL = -1; @@ -46,7 +50,7 @@ String responseContent; Map<String, String> requestHeaderMap; - Map<String, Object> requestParameterMap; + Map<String, String[]> requestParameterMap; long contentLength = SENTINEL; int statusCode = SENTINEL; @@ -235,17 +239,24 @@ } public void buildRequestParameterMap() { - requestParameterMap = new HashMap<String, Object>(); + requestParameterMap = new HashMap<String, String[]>(); Enumeration e = httpRequest.getParameterNames(); if (e == null) { return; } while (e.hasMoreElements()) { String key = (String) e.nextElement(); - requestParameterMap.put(key, httpRequest.getParameter(key)); + requestParameterMap.put(key, httpRequest.getParameterValues(key)); } } + public Map<String, String[]> getRequestParameterMap() { + if (requestParameterMap == null) { + buildRequestParameterMap(); + } + return requestParameterMap; +} + public String getResponseHeader(String key) { return serverAdapter.getResponseHeader(key); } @@ -273,16 +284,16 @@ } } - public String getRequestParameter(String key) { + public String[] getRequestParameter(String key) { if (httpRequest != null) { - Object value = httpRequest.getParameter(key); + String[] value = httpRequest.getParameterValues(key); if (value == null) { - return AccessEvent.NA; + return NA_STRING_ARRAY; } else { - return value.toString(); + return value; } } else { - return AccessEvent.NA; + return NA_STRING_ARRAY; } }