From 95730a94404d9ec0bb26a03b3faf36fd40d6eb5e Mon Sep 17 00:00:00 2001 From: "Brian M. Long" Date: Tue, 8 Mar 2022 13:29:04 -0500 Subject: [PATCH] added CXF logging/multipart support --- .../java/com/inteligr8/rs/ClientCxfImpl.java | 3 ++ .../com/inteligr8/rs/CxfLoggingFilter.java | 30 ++++++++++++++ .../java/com/inteligr8/rs/LoggingFilter.java | 41 ++++++++++++------- 3 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/inteligr8/rs/CxfLoggingFilter.java diff --git a/src/main/java/com/inteligr8/rs/ClientCxfImpl.java b/src/main/java/com/inteligr8/rs/ClientCxfImpl.java index 57871b0..9e4f8f0 100644 --- a/src/main/java/com/inteligr8/rs/ClientCxfImpl.java +++ b/src/main/java/com/inteligr8/rs/ClientCxfImpl.java @@ -9,6 +9,7 @@ import org.apache.cxf.BusFactory; import org.apache.cxf.jaxrs.client.JAXRSClientFactory; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl; +import org.apache.cxf.jaxrs.provider.MultipartProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -66,6 +67,8 @@ public abstract class ClientCxfImpl extends Client implements InitializingBean { public WebClient getCxfClient(AuthorizationFilter authFilter) { List providersAndFilters = new LinkedList(); providersAndFilters.add(new JacksonJaxbJsonProvider()); + providersAndFilters.add(new CxfLoggingFilter()); + providersAndFilters.add(new MultipartProvider()); if (authFilter == null) authFilter = this.getConfig().createAuthorizationFilter(); diff --git a/src/main/java/com/inteligr8/rs/CxfLoggingFilter.java b/src/main/java/com/inteligr8/rs/CxfLoggingFilter.java new file mode 100644 index 0000000..317932a --- /dev/null +++ b/src/main/java/com/inteligr8/rs/CxfLoggingFilter.java @@ -0,0 +1,30 @@ +package com.inteligr8.rs; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.core.MediaType; + +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; +import org.slf4j.Logger; + +public class CxfLoggingFilter extends LoggingFilter { + + @Override + protected void logUnhandledRequest(ClientRequestContext requestContext, Logger logger) throws IOException { + if (MediaType.MULTIPART_FORM_DATA_TYPE.equals(requestContext.getMediaType())) { + if (requestContext.getEntity() instanceof MultipartBody) { + List attIds = new LinkedList<>(); + for (Attachment att : ((MultipartBody)requestContext.getEntity()).getAllAttachments()) + attIds.add(att.getContentId()); + logger.trace("request: {} {}: {}", requestContext.getMethod(), requestContext.getUri(), attIds); + } else { + logger.trace("request: {} {}: failed to output form", requestContext.getMethod(), requestContext.getUri()); + } + } + } + +} diff --git a/src/main/java/com/inteligr8/rs/LoggingFilter.java b/src/main/java/com/inteligr8/rs/LoggingFilter.java index a0cf2f5..3338631 100644 --- a/src/main/java/com/inteligr8/rs/LoggingFilter.java +++ b/src/main/java/com/inteligr8/rs/LoggingFilter.java @@ -12,6 +12,7 @@ import javax.ws.rs.core.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; public class LoggingFilter implements ClientRequestFilter, ClientResponseFilter { @@ -19,29 +20,39 @@ public class LoggingFilter implements ClientRequestFilter, ClientResponseFilter private final Logger loggerRequest = LoggerFactory.getLogger("jaxrs.request"); private final Logger loggerResponse = LoggerFactory.getLogger("jaxrs.response"); - private final ObjectMapper om = new ObjectMapper(); + protected final ObjectMapper om = new ObjectMapper().setSerializationInclusion(Include.NON_NULL); @Override public void filter(ClientRequestContext requestContext) throws IOException { - if (this.loggerRequest.isTraceEnabled()) { - if (MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType())) { - this.loggerRequest.trace("request: {} {}: {}", requestContext.getMethod(), requestContext.getUri(), - this.om.writeValueAsString(requestContext.getEntity())); - } else if (MediaType.APPLICATION_FORM_URLENCODED_TYPE.equals(requestContext.getMediaType())) { - if (requestContext.getEntity() instanceof Form) { - this.loggerRequest.trace("request: {} {}: {}", requestContext.getMethod(), requestContext.getUri(), - ((Form)requestContext.getEntity()).asMap()); - } else { - this.loggerRequest.trace("request: {} {}: failed to output form", requestContext.getMethod(), requestContext.getUri()); - } - } else if (requestContext.getMediaType() != null) { - this.loggerRequest.trace("request '{}': {} {}", requestContext.getMediaType(), requestContext.getMethod(), requestContext.getUri()); + if (this.loggerRequest.isTraceEnabled()) + this.logAnyRequest(requestContext, this.loggerRequest); + } + + protected void logAnyRequest(ClientRequestContext requestContext, Logger logger) throws IOException { + if (MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType())) { + logger.trace("request: {} {}: {}", requestContext.getMethod(), requestContext.getUri(), + this.om.writeValueAsString(requestContext.getEntity())); + } else if (MediaType.APPLICATION_FORM_URLENCODED_TYPE.equals(requestContext.getMediaType())) { + if (requestContext.getEntity() instanceof Form) { + logger.trace("request: {} {}: {}", requestContext.getMethod(), requestContext.getUri(), + ((Form)requestContext.getEntity()).asMap()); } else { - this.loggerRequest.trace("request: {} {}", requestContext.getMethod(), requestContext.getUri()); + this.loggerRequest.trace("request: {} {}: failed to output form", requestContext.getMethod(), requestContext.getUri()); } + } else { + this.logUnhandledRequest(requestContext, logger); } } + protected void logUnhandledRequest(ClientRequestContext requestContext, Logger logger) throws IOException { + if (requestContext.getMediaType() != null) { + logger.trace("request '{}': {} {}", requestContext.getMediaType(), requestContext.getMethod(), requestContext.getUri()); + } else { + logger.trace("request: {} {}", requestContext.getMethod(), requestContext.getUri()); + } + + } + @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { if (this.loggerResponse.isTraceEnabled()) {