Replaced all tabs with spaces in java and pom.xml
[so.git] / common / src / main / java / org / onap / so / logging / jaxrs / filter / JaxRsFilterLogging.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.logging.jaxrs.filter;
22
23
24 import java.io.ByteArrayOutputStream;
25 import java.io.IOException;
26 import java.lang.annotation.Annotation;
27 import java.lang.reflect.Type;
28 import java.util.UUID;
29 import javax.annotation.Priority;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.ws.rs.container.ContainerRequestContext;
32 import javax.ws.rs.container.ContainerRequestFilter;
33 import javax.ws.rs.container.ContainerResponseContext;
34 import javax.ws.rs.container.ContainerResponseFilter;
35 import javax.ws.rs.core.Context;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.MultivaluedMap;
38 import javax.ws.rs.core.Response;
39 import javax.ws.rs.ext.MessageBodyWriter;
40 import javax.ws.rs.ext.Provider;
41 import javax.ws.rs.ext.Providers;
42 import org.onap.logging.ref.slf4j.ONAPLogConstants;
43 import org.onap.so.logger.LogConstants;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.slf4j.MDC;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.stereotype.Component;
49 import com.fasterxml.jackson.databind.ObjectMapper;
50
51 @Priority(1)
52 @Provider
53 @Component
54 public class JaxRsFilterLogging implements ContainerRequestFilter, ContainerResponseFilter {
55
56     protected static Logger logger = LoggerFactory.getLogger(JaxRsFilterLogging.class);
57
58     @Context
59     private HttpServletRequest httpServletRequest;
60
61     @Context
62     private Providers providers;
63
64     @Autowired
65     private MDCSetup mdcSetup;
66
67     @Override
68     public void filter(ContainerRequestContext containerRequest) {
69         try {
70             MultivaluedMap<String, String> headers = containerRequest.getHeaders();
71             setRequestId(headers);
72             containerRequest.setProperty("requestId", MDC.get(ONAPLogConstants.MDCs.REQUEST_ID));
73             setInvocationId(headers);
74             setServiceName(containerRequest);
75             setMDCPartnerName(headers);
76             mdcSetup.setServerFQDN();
77             mdcSetup.setClientIPAddress(httpServletRequest);
78             mdcSetup.setInstanceUUID();
79             mdcSetup.setEntryTimeStamp();
80             MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
81             MDC.put(LogConstants.URI_BASE, containerRequest.getUriInfo().getBaseUri().toString());
82             logger.info(ONAPLogConstants.Markers.ENTRY, "Entering");
83         } catch (Exception e) {
84             logger.warn("Error in incoming JAX-RS Inteceptor", e);
85         }
86     }
87
88     @Override
89     public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
90             throws IOException {
91         try {
92             setResponseStatusCode(responseContext);
93             MDC.put(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION, payloadMessage(responseContext));
94             MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE, String.valueOf(responseContext.getStatus()));
95             logger.info(ONAPLogConstants.Markers.EXIT, "Exiting.");
96             MDC.clear();
97         } catch (Exception e) {
98             MDC.clear();
99             logger.warn("Error in outgoing JAX-RS Inteceptor", e);
100         }
101     }
102
103     private void setResponseStatusCode(ContainerResponseContext responseContext) {
104         String statusCode;
105         if (Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)) {
106             statusCode = ONAPLogConstants.ResponseStatus.COMPLETED.toString();
107         } else {
108             statusCode = ONAPLogConstants.ResponseStatus.ERROR.toString();
109         }
110         MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, statusCode);
111     }
112
113     private String payloadMessage(ContainerResponseContext responseContext) throws IOException {
114         String message = "";
115         if (responseContext.hasEntity()) {
116             ByteArrayOutputStream baos = new ByteArrayOutputStream();
117             Class<?> entityClass = responseContext.getEntityClass();
118             Type entityType = responseContext.getEntityType();
119             Annotation[] entityAnnotations = responseContext.getEntityAnnotations();
120             MediaType mediaType = responseContext.getMediaType();
121             @SuppressWarnings("unchecked")
122             MessageBodyWriter<Object> bodyWriter = (MessageBodyWriter<Object>) providers
123                     .getMessageBodyWriter(entityClass, entityType, entityAnnotations, mediaType);
124             bodyWriter.writeTo(responseContext.getEntity(), entityClass, entityType, entityAnnotations, mediaType,
125                     responseContext.getHeaders(), baos);
126             message = message.concat(new String(baos.toByteArray()));
127         }
128         return message;
129     }
130
131
132     private void setRequestId(MultivaluedMap<String, String> headers) {
133         String requestId = headers.getFirst(ONAPLogConstants.Headers.REQUEST_ID);
134         if (requestId == null || requestId.isEmpty())
135             requestId = UUID.randomUUID().toString();
136         MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
137     }
138
139     private void setInvocationId(MultivaluedMap<String, String> headers) {
140         MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, findInvocationId(headers));
141     }
142
143     private void setMDCPartnerName(MultivaluedMap<String, String> headers) {
144         String partnerName = headers.getFirst(ONAPLogConstants.Headers.PARTNER_NAME);
145         if (partnerName == null || partnerName.isEmpty())
146             partnerName = "";
147         MDC.put(ONAPLogConstants.MDCs.PARTNER_NAME, partnerName);
148     }
149
150     private String findInvocationId(MultivaluedMap<String, String> headers) {
151         String invocationId = headers.getFirst(ONAPLogConstants.Headers.INVOCATION_ID);
152         if (invocationId == null || invocationId.isEmpty())
153             invocationId = UUID.randomUUID().toString();
154         return invocationId;
155     }
156
157     private void setServiceName(ContainerRequestContext containerRequest) {
158         MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, containerRequest.getUriInfo().getPath());
159     }
160
161     private void clearClientMDCs() {
162         MDC.remove(ONAPLogConstants.MDCs.INVOCATION_ID);
163         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
164         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE);
165         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
166         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_CODE);
167         MDC.remove(ONAPLogConstants.MDCs.TARGET_ENTITY);
168         MDC.remove(ONAPLogConstants.MDCs.PARTNER_NAME);
169         MDC.remove(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME);
170     }
171
172
173
174 }