1 package org.onap.sdc.dcae.filter;
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;
20 import java.io.IOException;
21 import java.util.Locale;
22 import java.util.UUID;
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;
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;
39 public class LoggingFilter implements Filter {
41 private static final String serviceName = "DCAE-D-BE";
43 private OnapMDCWrapper commonLoggerArgs = OnapMDCWrapper.getInstance();
44 private OnapLoggerAudit auditLogger = OnapLoggerAudit.getInstance();
46 public LoggingFilter() {
52 public void destroy() {}
56 public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
57 throws IOException, ServletException {
59 boolean shouldLogRequest = true;
62 if (request instanceof HttpServletRequest) {
63 HttpServletRequest httpRequest = (HttpServletRequest) request;
64 if (httpRequest.getServletPath().equals("/healthCheck")) {
65 shouldLogRequest = false;
68 if (shouldLogRequest) {
69 beforeHandle(httpRequest);
72 } catch (Exception e) {
73 // TODO: log problem with extracting parameters or writing to log
76 filterChain.doFilter(request, response); // handle request
79 if (response instanceof HttpServletResponse && shouldLogRequest) {
80 afterHandle((HttpServletResponse) response);
82 } catch (Exception e) {
83 // TODO: log problem with extracting parameters or writing to log
88 private void beforeHandle(HttpServletRequest request) {
90 String requestId = getRequestId(request);
91 request.setAttribute("requestId", requestId); // making requestId available for the API controllers
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());
107 private static String getRequestId(HttpServletRequest request) {
108 String requestId = request.getHeader("X-ECOMP-RequestID");
109 return isNullOrEmpty(requestId)
110 ? UUID.randomUUID().toString()
115 private void afterHandle(HttpServletResponse response) {
116 String responseDesc = EnglishReasonPhraseCatalog.INSTANCE.getReason(response.getStatus(), Locale.ENGLISH);
119 .setResponseCode(getLoggingErrorCode(response.getStatus()).getErrorCode())
120 .setResponseDesc(responseDesc)
121 .setOptCustomField4(Integer.toString(response.getStatus()));
124 .setStatusCode(Integer.toString(response.getStatus()))
125 .log(LogLevel.INFO, this.getClass().getName(), responseDesc);
129 private OnapLoggerErrorCode getLoggingErrorCode(int httpResponseCode) {
130 if (isSuccessError(httpResponseCode)) {
131 return OnapLoggerErrorCode.SUCCESS;
133 else if (isSchemaError(httpResponseCode)) {
134 return OnapLoggerErrorCode.SCHEMA_ERROR;
136 else if (isDataError(httpResponseCode)) {
137 return OnapLoggerErrorCode.DATA_ERROR;
139 else if (isPermissionsError(httpResponseCode)) {
140 return OnapLoggerErrorCode.PERMISSION_ERROR;
142 else if (isTimeoutOrAvailabilityError(httpResponseCode)) {
143 return OnapLoggerErrorCode.AVAILABILITY_TIMEOUTS_ERROR;
145 else if (isBusinessProcessError(httpResponseCode)) {
146 return OnapLoggerErrorCode.BUSINESS_PROCESS_ERROR;
149 return OnapLoggerErrorCode.UNKNOWN_ERROR;
154 private boolean isTimeoutOrAvailabilityError(int httpResponseCode) {
156 switch (httpResponseCode) {
157 case HTTP_BAD_REQUEST:
158 case HTTP_UNAUTHORIZED:
160 case HTTP_CLIENT_TIMEOUT:
168 private boolean isPermissionsError(int httpResponseCode) {
170 switch (httpResponseCode) {
171 case HTTP_PAYMENT_REQUIRED:
173 case HTTP_BAD_METHOD:
174 case HTTP_PROXY_AUTH:
181 private boolean isDataError(int httpResponseCode) {
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:
196 private boolean isSchemaError(int httpResponseCode) {
198 switch (httpResponseCode) {
206 private boolean isSuccessError(int httpResponseCode) {
207 return httpResponseCode < 399;
210 private boolean isBusinessProcessError(int httpResponseCode) {
211 return httpResponseCode > 499;
214 private String getPartnerName(String userId, String userAgent) {
215 return (isNullOrEmpty(userId))
216 ? getClientApplication(userAgent)
220 private String getClientApplication(String userAgent) {
221 if (userAgent != null && userAgent.length() > 0) {
222 if (userAgent.toLowerCase().contains("firefox")) {
226 if (userAgent.toLowerCase().contains("msie")) {
227 return "explorer_FE";
230 if (userAgent.toLowerCase().contains("chrome")) {
240 private static boolean isNullOrEmpty(String str) {
241 return (str == null || str.isEmpty());
246 public void init(FilterConfig config) throws ServletException {}