From 95730a94404d9ec0bb26a03b3faf36fd40d6eb5e Mon Sep 17 00:00:00 2001 From: "Brian M. Long" Date: Tue, 8 Mar 2022 13:29:04 -0500 Subject: [PATCH 1/2] 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()) { From b4d7d2a1544a1e35b457e816fcc8360a6ffc0690 Mon Sep 17 00:00:00 2001 From: "Brian M. Long" Date: Tue, 8 Mar 2022 13:29:14 -0500 Subject: [PATCH 2/2] more extensible oauth filter --- .../java/com/inteligr8/rs/OAuthAuthorizationFilter.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/inteligr8/rs/OAuthAuthorizationFilter.java b/src/main/java/com/inteligr8/rs/OAuthAuthorizationFilter.java index efab17c..328b49e 100755 --- a/src/main/java/com/inteligr8/rs/OAuthAuthorizationFilter.java +++ b/src/main/java/com/inteligr8/rs/OAuthAuthorizationFilter.java @@ -101,6 +101,7 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter { form.param("client_secret", this.clientSecret); if (this.scope != null) form.param("scope", this.scope); + this.extendRefreshTokenForm(form); Entity
entity = Entity.form(form); @@ -118,6 +119,7 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter { this.accessToken = (String)response.get("access_token"); this.expiration = System.currentTimeMillis() + ((Number)response.get("expires_in")).longValue() * 1000L; this.refreshToken = (String)response.get("refresh_token"); + this.extendRefreshTokenResponse(response); } protected Form createRefreshForm() { @@ -126,5 +128,11 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter { } protected abstract Form createForm(); + + protected void extendRefreshTokenForm(Form form) { + } + + protected void extendRefreshTokenResponse(Map response) { + } }