ch.qos.logback.access.sift.AccessEventDiscriminator Maven / Gradle / Ivy
/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.access.sift;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import ch.qos.logback.access.spi.IAccessEvent;
import ch.qos.logback.core.sift.AbstractDiscriminator;
/**
*
* AccessEventDiscriminator's job is to return the value of a designated field
* in an {@link IAccessEvent} instance.
*
* The field is specified via the {@link FieldName} property.
*
* @author Ceki Gülcü
*
*/
public class AccessEventDiscriminator extends AbstractDiscriminator {
/**
* At present time the followed fields can be designated: COOKIE,
* REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS,
* LOCAL_PORT,REQUEST_URI
*
* The first three fields require an additional key. For the
* SESSION_ATTRIBUTE field, the additional key named "id" has special meaning
* as it is mapped to the session id of the current http request.
*/
public enum FieldName {
COOKIE, REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT, REQUEST_URI
}
String defaultValue;
String key;
FieldName fieldName;
String additionalKey;
@Override
public String getDiscriminatingValue(IAccessEvent acccessEvent) {
String rawValue = getRawDiscriminatingValue(acccessEvent);
if (rawValue == null || rawValue.length() == 0) {
return defaultValue;
} else {
return rawValue;
}
}
public String getRawDiscriminatingValue(IAccessEvent acccessEvent) {
switch (fieldName) {
case COOKIE:
// tested
return acccessEvent.getCookie(additionalKey);
case LOCAL_PORT:
return String.valueOf(acccessEvent.getLocalPort());
case REQUEST_ATTRIBUTE:
// tested
return getRequestAttribute(acccessEvent);
case SESSION_ATTRIBUTE:
return getSessionAttribute(acccessEvent);
case REMOTE_ADDRESS:
return acccessEvent.getRemoteAddr();
case REQUEST_URI:
// tested
return getRequestURI(acccessEvent);
default:
return null;
}
}
private String getRequestAttribute(IAccessEvent acccessEvent) {
String attr = acccessEvent.getAttribute(additionalKey);
if (IAccessEvent.NA.equals(attr)) {
return null;
} else {
return attr;
}
}
private String getRequestURI(IAccessEvent acccessEvent) {
String uri = acccessEvent.getRequestURI();
if (uri != null && uri.length() >= 1 && uri.charAt(0) == '/') {
return uri.substring(1);
} else {
return uri;
}
}
private String getSessionAttribute(IAccessEvent acccessEvent) {
HttpServletRequest req = acccessEvent.getRequest();
if (req != null) {
HttpSession session = req.getSession(false);
if (session != null) {
if ("id".equalsIgnoreCase(additionalKey)) {
return session.getId();
} else {
Object v = session.getAttribute(additionalKey);
if (v != null) {
return v.toString();
}
}
}
}
return null;
}
@Override
public void start() {
int errorCount = 0;
if (defaultValue == null) {
addError("\"DefaultValue\" property must be set.");
}
if (fieldName == null) {
addError("\"FieldName\" property must be set.");
errorCount++;
}
switch (fieldName) {
case SESSION_ATTRIBUTE:
case REQUEST_ATTRIBUTE:
case COOKIE:
if (additionalKey == null) {
addError("\"OptionalKey\" property is mandatory for field name " + fieldName.toString());
errorCount++;
}
}
if (errorCount == 0) {
started = true;
}
}
public void setFieldName(FieldName fieldName) {
this.fieldName = fieldName;
}
public FieldName getFieldName() {
return fieldName;
}
public String getAdditionalKey() {
return additionalKey;
}
public void setAdditionalKey(String additionalKey) {
this.additionalKey = additionalKey;
}
/**
* @see #setDefaultValue(String)
* @return
*/
public String getDefaultValue() {
return defaultValue;
}
/**
* The default value returned by this discriminator in case it cannot compute
* the discriminating value from the access event.
*
* @param defaultValue
*/
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}