DCAE-D be initial commit
[sdc/dcae-d/dt-be-main.git] / dcaedt_be / src / main / java / org / onap / sdc / dcae / filter / LoggingFilter.java
1 package org.onap.sdc.dcae.filter;
2
3 import static java.net.HttpURLConnection.HTTP_BAD_METHOD;
4 import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
5 import static java.net.HttpURLConnection.HTTP_CLIENT_TIMEOUT;
6 import static java.net.HttpURLConnection.HTTP_CONFLICT;
7 import static java.net.HttpURLConnection.HTTP_ENTITY_TOO_LARGE;
8 import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
9 import static java.net.HttpURLConnection.HTTP_GONE;
10 import static java.net.HttpURLConnection.HTTP_LENGTH_REQUIRED;
11 import static java.net.HttpURLConnection.HTTP_NOT_ACCEPTABLE;
12 import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
13 import static java.net.HttpURLConnection.HTTP_PAYMENT_REQUIRED;
14 import static java.net.HttpURLConnection.HTTP_PRECON_FAILED;
15 import static java.net.HttpURLConnection.HTTP_PROXY_AUTH;
16 import static java.net.HttpURLConnection.HTTP_REQ_TOO_LONG;
17 import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
18 import static java.net.HttpURLConnection.HTTP_UNSUPPORTED_TYPE;
19
20 import java.io.IOException;
21 import java.util.Locale;
22 import java.util.UUID;
23
24 import javax.servlet.Filter;
25 import javax.servlet.FilterChain;
26 import javax.servlet.FilterConfig;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32
33 import org.apache.http.impl.EnglishReasonPhraseCatalog;
34 import org.onap.sdc.common.onaplog.OnapLoggerAudit;
35 import org.onap.sdc.common.onaplog.OnapMDCWrapper;
36 import org.onap.sdc.common.onaplog.Enums.OnapLoggerErrorCode;
37 import org.onap.sdc.common.onaplog.Enums.LogLevel;
38
39 public class LoggingFilter implements Filter {
40         
41         private static final String serviceName = "DCAE-D-BE";
42         
43         private OnapMDCWrapper commonLoggerArgs = OnapMDCWrapper.getInstance();
44         private OnapLoggerAudit auditLogger = OnapLoggerAudit.getInstance();
45         
46         public LoggingFilter() {
47                 super();
48         }
49
50
51         @Override
52         public void destroy() {}
53
54         
55         @Override
56         public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
57                         throws IOException, ServletException {
58
59                 boolean shouldLogRequest = true;
60                 
61                 try {
62                         if (request instanceof HttpServletRequest) {
63                                 HttpServletRequest httpRequest = (HttpServletRequest) request;
64                                 if (httpRequest.getServletPath().equals("/healthCheck")) {
65                                         shouldLogRequest = false;
66                                 }
67                                 
68                                 if (shouldLogRequest) {
69                                         beforeHandle(httpRequest);
70                                 }
71                         }
72                 } catch (Exception e) {
73                         // TODO: log problem with extracting parameters or writing to log
74                 }
75                 
76                 filterChain.doFilter(request, response); // handle request
77                 
78                 try {
79                         if (response instanceof HttpServletResponse && shouldLogRequest) {
80                                 afterHandle((HttpServletResponse) response);
81                         }
82                 } catch (Exception e) {
83                         // TODO: log problem with extracting parameters or writing to log
84                 }
85         }
86         
87         
88         private void beforeHandle(HttpServletRequest request) {
89                 
90                 String requestId = getRequestId(request);
91                 request.setAttribute("requestId", requestId); // making requestId available for the API controllers
92                 commonLoggerArgs
93                         .clear()
94                         .startTimer()
95                         .setRemoteHost(request.getRemoteAddr())
96                         .setServiceName(serviceName)
97                         .setPartnerName(getPartnerName(request.getHeader("USER_ID"), request.getHeader("user-agent")))
98                         .setKeyRequestId(requestId)
99                         .setAutoServerIPAddress(request.getLocalAddr())
100                         .setOptCustomField1(request.getProtocol())
101                         .setOptCustomField2(request.getMethod())
102                         .setOptCustomField3(request.getServletPath());
103                 
104         }
105
106
107         private static String getRequestId(HttpServletRequest request) {
108                 String requestId = request.getHeader("X-ECOMP-RequestID");
109                 return isNullOrEmpty(requestId)
110                         ? UUID.randomUUID().toString()
111                         : requestId;
112         }
113
114         
115         private void afterHandle(HttpServletResponse response) {
116                 String responseDesc = EnglishReasonPhraseCatalog.INSTANCE.getReason(response.getStatus(), Locale.ENGLISH);
117                 commonLoggerArgs
118                         .stopTimer()
119                         .setResponseCode(getLoggingErrorCode(response.getStatus()).getErrorCode())
120                         .setResponseDesc(responseDesc)
121                         .setOptCustomField4(Integer.toString(response.getStatus()));
122                 
123                 auditLogger
124                         .setStatusCode(Integer.toString(response.getStatus()))
125                         .log(LogLevel.INFO, this.getClass().getName(), responseDesc);
126         }
127
128
129         private OnapLoggerErrorCode getLoggingErrorCode(int httpResponseCode) {
130                 if (isSuccessError(httpResponseCode)) {
131                         return OnapLoggerErrorCode.SUCCESS;
132                 }
133                 else if (isSchemaError(httpResponseCode)) {
134                         return OnapLoggerErrorCode.SCHEMA_ERROR;
135                 }
136                 else if (isDataError(httpResponseCode)) {
137                         return OnapLoggerErrorCode.DATA_ERROR;
138                 }
139                 else if (isPermissionsError(httpResponseCode)) {
140                         return OnapLoggerErrorCode.PERMISSION_ERROR;
141                 }
142                 else if (isTimeoutOrAvailabilityError(httpResponseCode)) {
143                         return OnapLoggerErrorCode.AVAILABILITY_TIMEOUTS_ERROR;
144                 }
145                 else if (isBusinessProcessError(httpResponseCode)) {
146                         return OnapLoggerErrorCode.BUSINESS_PROCESS_ERROR;
147                 }
148                 else {
149                         return OnapLoggerErrorCode.UNKNOWN_ERROR;
150                 }
151         }
152
153
154         private boolean isTimeoutOrAvailabilityError(int httpResponseCode) {
155
156         switch (httpResponseCode) {
157             case HTTP_BAD_REQUEST:
158             case HTTP_UNAUTHORIZED:
159             case HTTP_NOT_FOUND:
160             case HTTP_CLIENT_TIMEOUT:
161             case HTTP_GONE:
162                 return true;
163         }
164
165         return false;
166     }
167
168     private boolean isPermissionsError(int httpResponseCode) {
169
170         switch (httpResponseCode) {
171             case HTTP_PAYMENT_REQUIRED:
172             case HTTP_FORBIDDEN:
173             case HTTP_BAD_METHOD:
174             case HTTP_PROXY_AUTH:
175                 return true;
176         }
177
178         return false;
179     }
180
181     private boolean isDataError(int httpResponseCode) {
182
183         switch (httpResponseCode) {
184             case HTTP_NOT_ACCEPTABLE:
185             case HTTP_LENGTH_REQUIRED:
186             case HTTP_PRECON_FAILED:
187             case HTTP_REQ_TOO_LONG:
188             case HTTP_ENTITY_TOO_LARGE:
189             case HTTP_UNSUPPORTED_TYPE:
190                 return true;
191         }
192
193         return false;
194     }
195
196     private boolean isSchemaError(int httpResponseCode) {
197
198         switch (httpResponseCode) {
199             case HTTP_CONFLICT:
200                 return true;
201         }
202
203         return false;
204     }
205
206     private boolean isSuccessError(int httpResponseCode) {
207         return httpResponseCode < 399;
208     }
209
210     private boolean isBusinessProcessError(int httpResponseCode) {
211         return httpResponseCode > 499;
212     }
213     
214     private String getPartnerName(String userId, String userAgent) {
215         return (isNullOrEmpty(userId))
216                         ? getClientApplication(userAgent)
217                                 : userId;
218     }
219     
220     private String getClientApplication(String userAgent) {
221         if (userAgent != null && userAgent.length() > 0) {
222             if (userAgent.toLowerCase().contains("firefox")) {
223                 return "fireFox_FE";
224             }
225
226             if (userAgent.toLowerCase().contains("msie")) {
227                 return "explorer_FE";
228             }
229
230             if (userAgent.toLowerCase().contains("chrome")) {
231                 return "chrome_FE";
232             }
233
234             return userAgent;
235         }
236         return "";
237         }
238
239
240         private static boolean isNullOrEmpty(String str) {
241         return (str == null || str.isEmpty());
242     }
243
244
245         @Override
246         public void init(FilterConfig config) throws ServletException {}
247 }