diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/filters/BeServletFilter.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/filters/BeServletFilter.java | 348 |
1 files changed, 172 insertions, 176 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/filters/BeServletFilter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/filters/BeServletFilter.java index d24743534c..60409b3ee0 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/filters/BeServletFilter.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/filters/BeServletFilter.java @@ -20,20 +20,7 @@ package org.openecomp.sdc.be.filters; -import java.io.IOException; -import java.util.UUID; - -import javax.annotation.Priority; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.Provider; - +import com.google.gson.GsonBuilder; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.config.Configuration; import org.openecomp.sdc.be.config.ConfigurationManager; @@ -50,171 +37,180 @@ import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.web.context.WebApplicationContext; -import com.google.gson.GsonBuilder; +import javax.annotation.Priority; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.Provider; +import java.io.IOException; +import java.util.UUID; @Provider @Priority(1) public class BeServletFilter implements ContainerRequestFilter, ContainerResponseFilter { - @Context - private HttpServletRequest sr; - - private static Logger log = LoggerFactory.getLogger(BeServletFilter.class.getName()); - - @Override - public void filter(ContainerRequestContext requestContext) throws IOException { - try { - - MDC.clear(); - - // In case of 405 response code, this function is not entered, then - // we'll process - // the MDC fields and UUID during the response - ThreadLocalsHolder.setMdcProcessed(true); - - // Timing HTTP request - ThreadLocalsHolder.setRequestStartTime(System.currentTimeMillis()); - - String uuid = processMdcFields(requestContext); - - ThreadLocalsHolder.setUuid(uuid); - - inHttpRequest(); - - } catch (Exception e) { - BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Error during request filter"); - BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Error during request filter"); - log.debug("Error during request filter: {} ", e); - } - } - - @Override - public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { - try { - // Formatting the response in case of 405 - if (responseContext.getStatus() == Response.Status.METHOD_NOT_ALLOWED.getStatusCode()) { - ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.NOT_ALLOWED); - responseContext.setEntity(new GsonBuilder().setPrettyPrinting().create().toJson(responseFormat.getRequestError())); - } - - if (ThreadLocalsHolder.isMdcProcessed()) { - // filter() was executed during request - this is the regular - // flow - responseContext.getHeaders().add(Constants.X_ECOMP_REQUEST_ID_HEADER, ThreadLocalsHolder.getUuid()); - Long startTime = ThreadLocalsHolder.getRequestStartTime(); - if (startTime != null) { - long endTime = System.currentTimeMillis(); - MDC.put("timer", Long.toString(endTime - startTime)); - } - } else { - // this is the 405 response code case - // we have no MDC fields since filter() wasn't executed during - // request - String uuid = processMdcFields(requestContext); - responseContext.getHeaders().add(Constants.X_ECOMP_REQUEST_ID_HEADER, uuid); - } - - outHttpResponse(responseContext); - - log.debug("Close transaction from filter"); - TitanDao titanDao = getTitanDao(); - if ( titanDao != null ){ - if (responseContext.getStatus() == Response.Status.OK.getStatusCode() || responseContext.getStatus() == Response.Status.CREATED.getStatusCode() ){ - titanDao.commit(); - log.debug("Doing commit from filter"); - }else{ - titanDao.rollback(); - log.debug("Doing rollback from filter"); - } - } - // Cleaning up - MDC.clear(); - ThreadLocalsHolder.cleanup(); - } catch (Exception e) { - BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Error during request filter"); - BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Error during request filter"); - log.debug("Error during response filter: {} ", e); - } - } - - private String processMdcFields(ContainerRequestContext requestContext) { - // UserId for logging - String userId = requestContext.getHeaderString(Constants.USER_ID_HEADER); - MDC.put("userId", userId); - - String serviceInstanceID = requestContext.getHeaderString(Constants.X_ECOMP_SERVICE_ID_HEADER); - MDC.put("serviceInstanceID", serviceInstanceID); - - MDC.put("remoteAddr", sr.getRemoteAddr()); - MDC.put("localAddr", sr.getLocalAddr()); - - // UUID - String uuid = requestContext.getHeaderString(Constants.X_ECOMP_REQUEST_ID_HEADER); - if (uuid == null) { - // Generate the UUID - uuid = UUID.randomUUID().toString(); - - // Add to MDC for logging - MDC.put("uuid", uuid); - - // This log message should already be with the UUID - uuidGeneration(uuid); - - } else { - // According to Ella, in case this header exists, we don't have to - // perform any validations - // since it's not our responsibilty, so we log the UUID just as it - // was received. - MDC.put("uuid", uuid); - } - return uuid; - } - - private ComponentsUtils getComponentsUtils() { - ServletContext context = this.sr.getSession().getServletContext(); - - WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR); - WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context); - return webApplicationContext.getBean(ComponentsUtils.class); - } - private TitanDao getTitanDao() { - ServletContext context = this.sr.getSession().getServletContext(); - - WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR); - WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context); - return webApplicationContext.getBean(TitanDao.class); - } - // Extracted for purpose of clear method name, for logback %M parameter - private void inHttpRequest() { - if (isInfoLog()) { - log.info("{} {} {}", sr.getMethod(), sr.getRequestURI(), sr.getProtocol()); - } else { - log.debug("{} {} {}", sr.getMethod(), sr.getRequestURI(), sr.getProtocol()); - } - } - - // Extracted for purpose of clear method name, for logback %M parameter - private void outHttpResponse(ContainerResponseContext responseContext) { - if (isInfoLog()) { - log.info("{} {} {} SC=\"{}\"", sr.getMethod(), sr.getRequestURI(), sr.getProtocol(), responseContext.getStatus()); - } else { - log.debug("{} {} {} SC=\"{}\"", sr.getMethod(), sr.getRequestURI(), sr.getProtocol(), responseContext.getStatus()); - } - } - - private boolean isInfoLog() { - boolean logRequest = true; - Configuration configuration = ConfigurationManager.getConfigurationManager().getConfiguration(); - String requestURI = sr.getRequestURI(); - if (requestURI != null && configuration.getUnLoggedUrls() != null) { - logRequest = !configuration.getUnLoggedUrls().contains(requestURI); - } - - return logRequest; - } - - // Extracted for purpose of clear method name, for logback %M parameter - private void uuidGeneration(String uuid) { - log.info("No requestID provided -> Generated UUID {}", uuid); - } + @Context + private HttpServletRequest sr; + + private static final Logger log = LoggerFactory.getLogger(BeServletFilter.class); + + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + try { + + MDC.clear(); + + // In case of 405 response code, this function is not entered, then + // we'll process + // the MDC fields and UUID during the response + ThreadLocalsHolder.setMdcProcessed(true); + + // Timing HTTP request + ThreadLocalsHolder.setRequestStartTime(System.currentTimeMillis()); + + String uuid = processMdcFields(requestContext); + + ThreadLocalsHolder.setUuid(uuid); + + inHttpRequest(); + + } catch (Exception e) { + BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Error during request filter"); + log.debug("Error during request filter: {} ", e); + } + } + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { + try { + // Formatting the response in case of 405 + if (responseContext.getStatus() == Response.Status.METHOD_NOT_ALLOWED.getStatusCode()) { + ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.NOT_ALLOWED); + responseContext.setEntity(new GsonBuilder().setPrettyPrinting().create().toJson(responseFormat.getRequestError())); + } + + if (ThreadLocalsHolder.isMdcProcessed()) { + // filter() was executed during request - this is the regular + // flow + responseContext.getHeaders().add(Constants.X_ECOMP_REQUEST_ID_HEADER, ThreadLocalsHolder.getUuid()); + Long startTime = ThreadLocalsHolder.getRequestStartTime(); + if (startTime != null) { + long endTime = System.currentTimeMillis(); + MDC.put("timer", Long.toString(endTime - startTime)); + } + } else { + // this is the 405 response code case + // we have no MDC fields since filter() wasn't executed during + // request + String uuid = processMdcFields(requestContext); + responseContext.getHeaders().add(Constants.X_ECOMP_REQUEST_ID_HEADER, uuid); + } + + outHttpResponse(responseContext); + + log.debug("Close transaction from filter"); + TitanDao titanDao = getTitanDao(); + if ( titanDao != null ){ + if (responseContext.getStatus() == Response.Status.OK.getStatusCode() || responseContext.getStatus() == Response.Status.CREATED.getStatusCode() ){ + titanDao.commit(); + log.debug("Doing commit from filter"); + }else{ + titanDao.rollback(); + log.debug("Doing rollback from filter"); + } + } + // Cleaning up + MDC.clear(); + ThreadLocalsHolder.cleanup(); + } catch (Exception e) { + BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Error during request filter"); + log.debug("Error during response filter: {} ", e); + } + } + + private String processMdcFields(ContainerRequestContext requestContext) { + // UserId for logging + String userId = requestContext.getHeaderString(Constants.USER_ID_HEADER); + MDC.put("userId", userId); + + String serviceInstanceID = requestContext.getHeaderString(Constants.X_ECOMP_SERVICE_ID_HEADER); + MDC.put("serviceInstanceID", serviceInstanceID); + + MDC.put("remoteAddr", sr.getRemoteAddr()); + MDC.put("localAddr", sr.getLocalAddr()); + + // UUID + String uuid = requestContext.getHeaderString(Constants.X_ECOMP_REQUEST_ID_HEADER); + if (uuid == null) { + // Generate the UUID + uuid = UUID.randomUUID().toString(); + + // Add to MDC for logging + MDC.put("uuid", uuid); + + // This log message should already be with the UUID + uuidGeneration(uuid); + + } else { + // According to Ella, in case this header exists, we don't have to + // perform any validations + // since it's not our responsibilty, so we log the UUID just as it + // was received. + MDC.put("uuid", uuid); + } + return uuid; + } + + private ComponentsUtils getComponentsUtils() { + ServletContext context = this.sr.getSession().getServletContext(); + + WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR); + WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context); + return webApplicationContext.getBean(ComponentsUtils.class); + } + private TitanDao getTitanDao() { + ServletContext context = this.sr.getSession().getServletContext(); + + WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR); + WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context); + return webApplicationContext.getBean(TitanDao.class); + } + // Extracted for purpose of clear method name, for logback %M parameter + private void inHttpRequest() { + if (isInfoLog()) { + log.info("{} {} {}", sr.getMethod(), sr.getRequestURI(), sr.getProtocol()); + } else { + log.debug("{} {} {}", sr.getMethod(), sr.getRequestURI(), sr.getProtocol()); + } + } + + // Extracted for purpose of clear method name, for logback %M parameter + private void outHttpResponse(ContainerResponseContext responseContext) { + if (isInfoLog()) { + log.info("{} {} {} SC=\"{}\"", sr.getMethod(), sr.getRequestURI(), sr.getProtocol(), responseContext.getStatus()); + } else { + log.debug("{} {} {} SC=\"{}\"", sr.getMethod(), sr.getRequestURI(), sr.getProtocol(), responseContext.getStatus()); + } + } + + private boolean isInfoLog() { + boolean logRequest = true; + Configuration configuration = ConfigurationManager.getConfigurationManager().getConfiguration(); + String requestURI = sr.getRequestURI(); + if (requestURI != null && configuration.getUnLoggedUrls() != null) { + logRequest = !configuration.getUnLoggedUrls().contains(requestURI); + } + + return logRequest; + } + + // Extracted for purpose of clear method name, for logback %M parameter + private void uuidGeneration(String uuid) { + log.info("No requestID provided -> Generated UUID {}", uuid); + } } |