1 package org.openecomp.mso.client.policy;
\r
3 import java.io.BufferedInputStream;
\r
5 import java.io.ByteArrayOutputStream;
\r
6 import java.io.FilterOutputStream;
\r
7 import java.io.IOException;
\r
8 import java.io.InputStream;
\r
9 import java.io.OutputStream;
\r
10 import java.nio.charset.Charset;
\r
11 import java.nio.charset.StandardCharsets;
\r
12 import java.util.logging.Logger;
\r
13 import javax.annotation.Priority;
\r
14 import javax.ws.rs.WebApplicationException;
\r
15 import javax.ws.rs.client.ClientRequestContext;
\r
16 import javax.ws.rs.client.ClientRequestFilter;
\r
17 import javax.ws.rs.client.ClientResponseContext;
\r
18 import javax.ws.rs.client.ClientResponseFilter;
\r
19 import javax.ws.rs.ext.WriterInterceptor;
\r
20 import javax.ws.rs.ext.WriterInterceptorContext;
\r
22 @Priority(Integer.MIN_VALUE)
\r
23 public class LoggingFilter implements ClientRequestFilter, ClientResponseFilter, WriterInterceptor {
\r
25 private static final Logger logger = Logger.getLogger(LoggingFilter.class.getName());
\r
26 private static final String ENTITY_STREAM_PROPERTY = "LoggingFilter.entityStream";
\r
27 private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
\r
28 private final int maxEntitySize = 1024 * 8;
\r
30 private void log(StringBuilder sb) {
\r
31 logger.info(sb.toString());
\r
34 private InputStream logInboundEntity(final StringBuilder b, InputStream stream, final Charset charset)
\r
35 throws IOException {
\r
36 if (!stream.markSupported()) {
\r
37 stream = new BufferedInputStream(stream);
\r
39 stream.mark(maxEntitySize + 1);
\r
40 final byte[] entity = new byte[maxEntitySize + 1];
\r
41 final int entitySize = stream.read(entity);
\r
42 b.append(new String(entity, 0, Math.min(entitySize, maxEntitySize), charset));
\r
43 if (entitySize > maxEntitySize) {
\r
44 b.append("...more...");
\r
52 public void filter(ClientRequestContext requestContext) throws IOException {
\r
53 if (requestContext.hasEntity()) {
\r
54 final OutputStream stream = new LoggingStream(requestContext.getEntityStream());
\r
55 requestContext.setEntityStream(stream);
\r
56 requestContext.setProperty(ENTITY_STREAM_PROPERTY, stream);
\r
61 public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
\r
62 final StringBuilder sb = new StringBuilder();
\r
63 if (responseContext.hasEntity()) {
\r
64 responseContext.setEntityStream(logInboundEntity(sb, responseContext.getEntityStream(), DEFAULT_CHARSET));
\r
71 public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
\r
72 final LoggingStream stream = (LoggingStream) context.getProperty(ENTITY_STREAM_PROPERTY);
\r
74 if (stream != null) {
\r
75 log(stream.getStringBuilder(DEFAULT_CHARSET));
\r
79 private class LoggingStream extends FilterOutputStream {
\r
81 private final StringBuilder sb = new StringBuilder();
\r
82 private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
\r
84 LoggingStream(OutputStream out) {
\r
88 StringBuilder getStringBuilder(Charset charset) {
\r
89 // write entity to the builder
\r
90 final byte[] entity = baos.toByteArray();
\r
92 sb.append(new String(entity, 0, entity.length, charset));
\r
93 if (entity.length > maxEntitySize) {
\r
94 sb.append("...more...");
\r
102 public void write(final int i) throws IOException {
\r
103 if (baos.size() <= maxEntitySize) {
\r