MdcUtils.java

  1. package no.nav.data.common.utils;

  2. import no.nav.data.common.security.SecurityUtils;
  3. import no.nav.data.common.security.dto.UserInfo;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.slf4j.MDC;

  6. import java.util.Optional;
  7. import java.util.UUID;

  8. public final class MdcUtils {

  9.     private MdcUtils() {
  10.     }

  11.     private static final String CORRELATION_ID = "correlationId";
  12.     private static final String CALL_ID = "callId";
  13.     private static final String USER_ID = "userId";
  14.     private static final String CONSUMER_ID = "consumerId";
  15.     private static final String CALLER_APP_ID = "callerAppId";

  16.     private static final String REQUEST_PATH = "RequestPath";
  17.     private static final String REQUEST_METHOD = "RequestMethod";

  18.     private static String createUUID() {
  19.         return UUID.randomUUID().toString();
  20.     }

  21.     public static String getOrGenerateCorrelationId() {
  22.         return Optional.ofNullable(MDC.get(CORRELATION_ID)).orElse(createUUID());
  23.     }

  24.     public static void createCorrelationId() {
  25.         MDC.put(CORRELATION_ID, createUUID());
  26.     }

  27.     public static void clearCorrelationId() {
  28.         MDC.remove(USER_ID);
  29.     }

  30.     public static String getCallId() {
  31.         return MDC.get(CALL_ID);
  32.     }

  33.     public static void setCallId(String correlationId) {
  34.         MDC.put(CALL_ID, correlationId);
  35.     }

  36.     public static void clearCallId() {
  37.         MDC.remove(CALL_ID);
  38.     }

  39.     public static String getUser() {
  40.         return MDC.get(USER_ID);
  41.     }

  42.     public static void setCallerFromSecurity() {
  43.         setUser(getCurrentSecurityContextUser());
  44.         setCallerAppId(getCurrentSecurityContextCallerApp());
  45.     }

  46.     public static void setUser(String user) {
  47.         MDC.put(USER_ID, user);
  48.     }

  49.     public static void clearUser() {
  50.         MDC.remove(USER_ID);
  51.     }

  52.     public static void setConsumerId(String consumer) {
  53.         MDC.put(CONSUMER_ID, consumer);
  54.     }

  55.     public static void clearConsumerId() {
  56.         MDC.remove(CONSUMER_ID);
  57.     }

  58.     public static void setRequestPath(String path) {
  59.         MDC.put(REQUEST_PATH, path);
  60.     }

  61.     public static void clearRequestPath() {
  62.         MDC.remove(REQUEST_PATH);
  63.     }

  64.     public static void setRequestMethod(String method) {
  65.         MDC.put(REQUEST_METHOD, method);
  66.     }

  67.     public static void clearRequestMethod() {
  68.         MDC.remove(REQUEST_METHOD);
  69.     }

  70.     public static void setCallerAppId(String callerAppId){
  71.         MDC.put(CALLER_APP_ID, callerAppId);

  72.     }
  73.     public static void clearCallerAppId(){
  74.         MDC.remove(CALLER_APP_ID);
  75.     }

  76.     public static Runnable wrapAsync(Runnable runnable, String user) {
  77.         return () -> {
  78.             setUser(user);
  79.             setConsumerId(Constants.APP_ID);
  80.             createCorrelationId();
  81.             try {
  82.                 runnable.run();
  83.             } finally {
  84.                 clearMdc();
  85.             }
  86.         };
  87.     }

  88.     private static String getCurrentSecurityContextUser() {
  89.         return SecurityUtils.getCurrentUser()
  90.                 .map(userInfo -> StringUtils.isBlank(userInfo.getName()) ? userInfo.getAppName() : userInfo.getIdentName())
  91.                 .orElse("no-auth");
  92.     }

  93.     private static String getCurrentSecurityContextCallerApp() {
  94.         return SecurityUtils.getCurrentUser()
  95.                 .map(UserInfo::getAppName)
  96.                 .orElse("no-caller-app-id");
  97.     }

  98.     private static void clearMdc() {
  99.         clearCorrelationId();
  100.         clearCallId();
  101.         clearUser();
  102.         clearConsumerId();
  103.         clearRequestPath();
  104.         clearRequestMethod();
  105.         clearCallerAppId();
  106.     }
  107. }