1710 Rebase - Second Attempt
[so.git] / bpmn / MSOCommonBPMN / src / main / java / org / openecomp / mso / client / policy / LoggingFilter.java
1 package org.openecomp.mso.client.policy;\r
2 \r
3 import java.io.BufferedInputStream;\r
4 \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
21 \r
22 @Priority(Integer.MIN_VALUE)\r
23 public class LoggingFilter implements ClientRequestFilter, ClientResponseFilter, WriterInterceptor {\r
24 \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
29 \r
30         private void log(StringBuilder sb) {\r
31                 logger.info(sb.toString());\r
32         }\r
33 \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
38                 }\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
45                 }\r
46                 b.append('\n');\r
47                 stream.reset();\r
48                 return stream;\r
49         }\r
50 \r
51         @Override\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
57                 }\r
58         }\r
59 \r
60         @Override\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
65                         log(sb);\r
66                 }\r
67 \r
68         }\r
69 \r
70         @Override\r
71         public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {\r
72                 final LoggingStream stream = (LoggingStream) context.getProperty(ENTITY_STREAM_PROPERTY);\r
73                 context.proceed();\r
74                 if (stream != null) {\r
75                         log(stream.getStringBuilder(DEFAULT_CHARSET));\r
76                 }\r
77         }\r
78 \r
79         private class LoggingStream extends FilterOutputStream {\r
80 \r
81                 private final StringBuilder sb = new StringBuilder();\r
82                 private final ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
83 \r
84                 LoggingStream(OutputStream out) {\r
85                         super(out);\r
86                 }\r
87 \r
88                 StringBuilder getStringBuilder(Charset charset) {\r
89                         // write entity to the builder\r
90                         final byte[] entity = baos.toByteArray();\r
91 \r
92                         sb.append(new String(entity, 0, entity.length, charset));\r
93                         if (entity.length > maxEntitySize) {\r
94                                 sb.append("...more...");\r
95                         }\r
96                         sb.append('\n');\r
97 \r
98                         return sb;\r
99                 }\r
100 \r
101                 @Override\r
102                 public void write(final int i) throws IOException {\r
103                         if (baos.size() <= maxEntitySize) {\r
104                                 baos.write(i);\r
105                         }\r
106                         out.write(i);\r
107                 }\r
108         }\r
109 }