Merge "Promise Request-id header: Check MDC value if no header"
authorEylon Malin <eylon.malin@intl.att.com>
Thu, 23 Jan 2020 09:26:25 +0000 (09:26 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 23 Jan 2020 09:26:25 +0000 (09:26 +0000)
vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java
vid-app-common/src/test/java/org/onap/vid/controller/filter/PromiseRequestIdFilterTest.java

index faaf55a..1c96819 100644 (file)
@@ -41,8 +41,10 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.NotNull;
+import org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs;
 import org.onap.vid.logging.Headers;
 import org.onap.vid.logging.RequestIdHeader;
+import org.slf4j.MDC;
 import org.springframework.web.filter.GenericFilterBean;
 
 @WebFilter(urlPatterns = "/*")
@@ -82,12 +84,17 @@ public class PromiseRequestIdFilter extends GenericFilterBean {
 
         if (isWrapNeeded(highestPriorityHeader, originalRequestId)) {
             // Copy originalRequestId to the promised header value
-            request = new PromiseRequestIdRequestWrapper(httpRequest, toUuidOrElse(originalRequestId, UUID::randomUUID));
+            request = new PromiseRequestIdRequestWrapper(httpRequest,
+                firstValidUuidOrElse(originalRequestId, requestIdFromMDC(), UUID::randomUUID));
         }
 
         return request;
     }
 
+    private String requestIdFromMDC() {
+        return MDC.get(MDCs.REQUEST_ID);
+    }
+
     private boolean verifyAndValidateUuid(String value) {
         return isNotEmpty(value) && uuidRegex.matcher(value).matches();
     }
@@ -99,6 +106,10 @@ public class PromiseRequestIdFilter extends GenericFilterBean {
         return !headerExistsAndValid;
     }
 
+    UUID firstValidUuidOrElse(String uuid1, String uuid2, Supplier<UUID> uuidSupplier) {
+        return toUuidOrElse(uuid1, () -> toUuidOrElse(uuid2, uuidSupplier));
+    }
+
     UUID toUuidOrElse(String uuid, Supplier<UUID> uuidSupplier) {
         if (verifyAndValidateUuid(uuid)) {
             try {
index d67bd61..f415bfb 100644 (file)
@@ -51,9 +51,12 @@ import javax.servlet.http.HttpServletResponse;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 import org.mockito.stubbing.Answer;
+import org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs;
 import org.onap.portalsdk.core.web.support.UserUtils;
 import org.onap.vid.logging.RequestIdHeader;
+import org.slf4j.MDC;
 import org.springframework.mock.web.MockHttpServletResponse;
+import org.testng.annotations.AfterMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -70,10 +73,18 @@ public class PromiseRequestIdFilterTest {
 
     private final PromiseRequestIdFilter promiseRequestIdFilter = new PromiseRequestIdFilter();
 
+    @AfterMethod
+    public void tearDown() {
+        MDC.remove(MDCs.REQUEST_ID);
+    }
+
     @Test
-    public void givenRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
+    public void givenMdcValueAndRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
 
         final String someTxId = "863850e2-8545-4efd-94b8-afba5f52b3d5";
+        final String mdcTxId = "ed752ff1-3970-4f18-8219-2d821fa4eaea";
+
+        MDC.put(MDCs.REQUEST_ID, mdcTxId);
 
         final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
                 anotherHeader, anotherValue,
@@ -121,6 +132,20 @@ public class PromiseRequestIdFilterTest {
         buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, UserUtils::getRequestId);
     }
 
+    @Test
+    public void givenMdcValueAndNoRequestIdHeader_headerValueWasFromMDC() throws IOException, ServletException {
+
+        final String mdcTxId = "ed752ff1-3970-4f18-8219-2d821fa4eaea";
+
+        MDC.put(MDCs.REQUEST_ID, mdcTxId);
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                anotherHeader, anotherValue
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(mdcTxId));
+    }
+
     @Test
     public void givenTwoRequestIdHeader_onapHeaderValueIsUsed() throws IOException, ServletException {