diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingResponseFilter.java')
-rw-r--r-- | openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingResponseFilter.java | 133 |
1 files changed, 31 insertions, 102 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingResponseFilter.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingResponseFilter.java index 4609620be1..fa9e815db8 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingResponseFilter.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingResponseFilter.java @@ -16,19 +16,22 @@ package org.openecomp.sdc.logging.servlet.jaxrs; -import org.openecomp.sdc.logging.api.*; +import static javax.ws.rs.core.Response.Status.Family.REDIRECTION; +import static javax.ws.rs.core.Response.Status.Family.SUCCESSFUL; +import static org.openecomp.sdc.logging.api.StatusCode.COMPLETE; +import static org.openecomp.sdc.logging.api.StatusCode.ERROR; +import static org.openecomp.sdc.logging.servlet.jaxrs.LoggingRequestFilter.LOGGING_TRACKER_KEY; -import javax.servlet.http.HttpServletRequest; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.container.ResourceInfo; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.ext.Provider; - -import static org.openecomp.sdc.logging.api.StatusCode.COMPLETE; -import static org.openecomp.sdc.logging.api.StatusCode.ERROR; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.api.StatusCode; +import org.openecomp.sdc.logging.servlet.RequestProcessingResult; +import org.openecomp.sdc.logging.servlet.Tracker; /** * <p>Takes care of logging when an HTTP request leaves the application. This includes writing to audit and clearing @@ -44,123 +47,49 @@ import static org.openecomp.sdc.logging.api.StatusCode.ERROR; * due to unhandled application or container exceptions.</i></p> * * @author evitaliy - * @since 29 Oct 17 - * * @see ContainerResponseFilter + * @since 29 Oct 17 */ @Provider public class LoggingResponseFilter implements ContainerResponseFilter { - private static final int UNKNOWN_START_TIME = 0; - private static final Logger LOGGER = LoggerFactory.getLogger(LoggingResponseFilter.class); - /** - * Tracks reporting configuration problems to the log. We want to report them only once, and not to write to log - * upon every request, as the configuration will not change in runtime. - */ - private boolean reportBadConfiguration = true; - - private HttpServletRequest httpRequest; - - private ResourceInfo resource; - - /** - * Injection of HTTP request object from JAX-RS context. - * - * @param httpRequest automatically injected by JAX-RS container - */ - @Context - public void setHttpRequest(HttpServletRequest httpRequest) { - this.httpRequest = httpRequest; - } - - /** - * Injection of a resource that matches the request from JAX-RS context. - * - * @param resource automatically injected by JAX-RS container - */ - @Context - public void setResource(ResourceInfo resource) { - this.resource = resource; - } - @Override - public void filter(ContainerRequestContext containerRequestContext, - ContainerResponseContext containerResponseContext) { + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { - try { + Tracker tracker = (Tracker) requestContext.getProperty(LOGGING_TRACKER_KEY); - if ((resource == null) || (resource.getResourceClass() == null)) { - LOGGER.debug("No matching resource, skipping audit."); - return; - } - - writeAudit(containerRequestContext, containerResponseContext); - - } finally { - LoggingContext.clear(); - } - } - - private void writeAudit(ContainerRequestContext containerRequestContext, - ContainerResponseContext containerResponseContext) { - - Logger resourceLogger = LoggerFactory.getLogger(resource.getResourceMethod().getDeclaringClass()); - if (!resourceLogger.isAuditEnabled()) { + if (tracker == null) { + LOGGER.debug("No logging tracker received"); return; } - long start = readStartTime(containerRequestContext); - long end = System.currentTimeMillis(); - - Response.StatusType statusInfo = containerResponseContext.getStatusInfo(); - int responseCode = statusInfo.getStatusCode(); - StatusCode statusCode = isSuccess(responseCode) ? COMPLETE : ERROR; - - AuditData auditData = AuditData.builder().startTime(start).endTime(end).statusCode(statusCode) - .responseCode(Integer.toString(responseCode)) - .responseDescription(statusInfo.getReasonPhrase()) - .clientIpAddress(httpRequest.getRemoteAddr()).build(); - resourceLogger.audit(auditData); + tracker.postRequest(new ContainerResponseResult(responseContext.getStatusInfo())); } - private boolean isSuccess(int responseCode) { - return responseCode > 199 && responseCode < 400; - } + private static class ContainerResponseResult implements RequestProcessingResult { - private long readStartTime(ContainerRequestContext containerRequestContext) { + private final Response.StatusType statusInfo; - Object startTime = containerRequestContext.getProperty(LoggingRequestFilter.START_TIME_KEY); - if (startTime == null) { - return handleMissingStartTime(); + private ContainerResponseResult(Response.StatusType statusInfo) { + this.statusInfo = statusInfo; } - return parseStartTime(startTime); - } - - private long handleMissingStartTime() { - reportConfigProblem("{} key was not found in JAX-RS request context. " - + "Make sure you configured a request filter", LoggingRequestFilter.START_TIME_KEY); - return UNKNOWN_START_TIME; - } - - private long parseStartTime(Object startTime) { - - try { - return Long.class.cast(startTime); - } catch (ClassCastException e) { - reportConfigProblem("{} key in JAX-RS request context contains an object of type '{}', but 'java.lang.Long'" - + " is expected", LoggingRequestFilter.START_TIME_KEY, startTime.getClass().getName(), e); - return 0; + @Override + public int getStatus() { + return statusInfo.getStatusCode(); } - } - private void reportConfigProblem(String message, Object... arguments) { + @Override + public StatusCode getStatusCode() { + Response.Status.Family family = statusInfo.getFamily(); + return family.equals(SUCCESSFUL) || family.equals(REDIRECTION) ? COMPLETE : ERROR; + } - if (reportBadConfiguration) { - reportBadConfiguration = false; - LOGGER.error(message, arguments); + @Override + public String getStatusPhrase() { + return statusInfo.getReasonPhrase(); } } } |