package org.openecomp.sdc.logging.api;
+import java.util.Objects;
+
/**
* Builder to populate logging <i>context</i> data, i.e. data that should be available to any log writing event
* throughout an application. This includes only data known at some point to the application (e.g. at an API call),
return partnerName;
}
+ @Override
+ public boolean equals(Object o) {
+
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ ContextData that = (ContextData) o;
+ return Objects.equals(requestId, that.requestId) && Objects.equals(serviceName, that.serviceName)
+ && Objects.equals(partnerName, that.partnerName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(requestId, serviceName, partnerName);
+ }
+
@Override
public String toString() {
return "ContextData{responseCode=" + requestId + ", responseDescription=" + serviceName
- + ", clientIpAddress=" + partnerName + '}';
+ + ", clientIpAddress=" + partnerName + '}';
}
public static ContextDataBuilder builder() {
public class LoggingContext {
private static final LoggingContextService SERVICE =
- ServiceBinder.getContextServiceBinding().orElse(
- new NoOpLoggingContextService());
+ ServiceBinder.getContextServiceBinding().orElse(new NoOpLoggingContextService());
private LoggingContext() {
// prevent instantiation
SERVICE.put(contextData);
}
+ public static ContextData get() {
+ return SERVICE.get();
+ }
+
public static void clear() {
SERVICE.clear();
}
private static class NoOpLoggingContextService implements LoggingContextService {
+ private static final ContextData EMPTY_CONTEXT = ContextData.builder().build();
+
@Override
public void put(ContextData contextData) {
Objects.requireNonNull(contextData, "Context data cannot be null");
}
+ @Override
+ public ContextData get() {
+ return EMPTY_CONTEXT;
+ }
+
@Override
public void clear() {
// no-op
*/
void put(ContextData contextData);
+ /**
+ * Return logging context's data.
+ */
+ ContextData get();
+
/**
* Clear logging thread context.
*/
return copy;
}
+ /**
+ * Reads all context fields from MDC.
+ */
+ static Map<ContextField, String> get() {
+ return get(ContextField.values());
+ }
+
+ /**
+ * Reads selected fields from MDC.
+ */
+ static Map<ContextField, String> get(ContextField... fields) {
+
+ Map<ContextField, String> values = new EnumMap<>(ContextField.class);
+
+ for (ContextField key : fields) {
+ values.put(key, MDC.get(key.asKey()));
+ }
+
+ return values;
+ }
+
/**
* Entirely replaces the logging MDC context with the content of the argument. Logging keys that are not present in
* the input map will be cleared from MDC.
private final ContextData data;
- RequestContextProvider(ContextData contextData) {
+ private RequestContextProvider(ContextData contextData) {
this.data = contextData;
}
+ static RequestContextProvider from(ContextData contextData) {
+ return new RequestContextProvider(contextData);
+ }
+
+ static ContextData to(Map<ContextField, String> values) {
+ return ContextData.builder()
+ .requestId(values.get(ContextField.REQUEST_ID))
+ .serviceName(values.get(ContextField.SERVICE_NAME))
+ .partnerName(values.get(ContextField.PARTNER_NAME)).build();
+ }
+
@Override
public Map<ContextField, String> values() {
@Override
public void put(ContextData contextData) {
Objects.requireNonNull(contextData, "Context data cannot be null");
- MDCDelegate.put(new RequestContextProvider(contextData), new GlobalContextProvider());
+ MDCDelegate.put(RequestContextProvider.from(contextData), new GlobalContextProvider());
+ }
+
+ @Override
+ public ContextData get() {
+ return RequestContextProvider.to(MDCDelegate.get());
}
@Override
@Test
public void returnMdcWrapperWhenToRunnableCalled() {
- assertEquals(LoggingContext.copyToRunnable(() -> {}).getClass(), MDCRunnableWrapper.class);
+ assertEquals(LoggingContext.copyToRunnable(() -> { }).getClass(), MDCRunnableWrapper.class);
}
@Test(expectedExceptions = NullPointerException.class)
LoggingContext.put(context);
assertNotNull(MDC.get(ContextField.INSTANCE_ID.asKey()));
}
+
+ @Test
+ public void contextReturnsServiceNameWhenPut() {
+
+ String random = UUID.randomUUID().toString();
+ ContextData context = ContextData.builder().serviceName(random).build();
+ LoggingContext.put(context);
+ assertEquals(context, LoggingContext.get());
+ }
+
+ @Test
+ public void contextReturnsRequestIdWhenPut() {
+
+ String random = UUID.randomUUID().toString();
+ ContextData context = ContextData.builder().requestId(random).build();
+ LoggingContext.put(context);
+ assertEquals(context, LoggingContext.get());
+ }
+
+ @Test
+ public void contextReturnsPartnerNameWhenPut() {
+
+ String random = UUID.randomUUID().toString();
+ ContextData context = ContextData.builder().partnerName(random).build();
+ LoggingContext.put(context);
+ assertEquals(context, LoggingContext.get());
+ }
+
}
package org.openecomp.sdc.logging.slf4j;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
+import java.util.HashMap;
import org.openecomp.sdc.logging.api.ContextData;
import org.testng.annotations.Test;
public class RequestContextProviderTest {
@Test
- public void valuesEmptyWhenInputEmpty() {
- RequestContextProvider provider = new RequestContextProvider(ContextData.builder().build());
+ public void valuesEmptyWhenInputDataEmpty() {
+ RequestContextProvider provider = RequestContextProvider.from(ContextData.builder().build());
assertTrue(provider.values().isEmpty());
}
@Test
- public void serviceNameReturnedWhenSupplied() {
+ public void serviceNameReturnedWhenSuppliedInData() {
final String service = "supplied-service-name";
RequestContextProvider provider =
- new RequestContextProvider(ContextData.builder().serviceName(service).build());
+ RequestContextProvider.from(ContextData.builder().serviceName(service).build());
assertEquals(provider.values().get(ContextField.SERVICE_NAME), service);
}
@Test
- public void partnerNameReturnedWhenSupplied() {
+ public void partnerNameReturnedWhenSuppliedInData() {
final String partner = "supplied-partner-name";
RequestContextProvider provider =
- new RequestContextProvider(ContextData.builder().partnerName(partner).build());
+ RequestContextProvider.from(ContextData.builder().partnerName(partner).build());
assertEquals(provider.values().get(ContextField.PARTNER_NAME), partner);
}
@Test
- public void requestIdReturnedWhenSupplied() {
+ public void requestIdReturnedWhenSuppliedInData() {
final String request = "supplied-request-id";
RequestContextProvider provider =
- new RequestContextProvider(ContextData.builder().requestId(request).build());
+ RequestContextProvider.from(ContextData.builder().requestId(request).build());
assertEquals(provider.values().get(ContextField.REQUEST_ID), request);
}
+
+ @Test
+ public void dataEmptyWhenValuesEmpty() {
+ ContextData data = RequestContextProvider.to(new HashMap<>());
+ assertNull(data.getPartnerName());
+ assertNull(data.getRequestId());
+ assertNull(data.getServiceName());
+ }
+
+ @Test
+ public void serviceNameInDataWhenSuppliedInValues() {
+ final String service = "values-service-name";
+ HashMap<ContextField, String> values = new HashMap<>();
+ values.put(ContextField.SERVICE_NAME, service);
+ ContextData data = RequestContextProvider.to(values);
+ assertEquals(data.getServiceName(), service);
+ }
+
+ @Test
+ public void partnerNameInDataWhenSuppliedInValues() {
+ final String partner = "values-partner-name";
+ HashMap<ContextField, String> values = new HashMap<>();
+ values.put(ContextField.PARTNER_NAME, partner);
+ ContextData data = RequestContextProvider.to(values);
+ assertEquals(data.getPartnerName(), partner);
+ }
+
+ @Test
+ public void requestIdInDataWhenSuppliedInValues() {
+ final String request = "values-request-id";
+ HashMap<ContextField, String> values = new HashMap<>();
+ values.put(ContextField.REQUEST_ID, request);
+ ContextData data = RequestContextProvider.to(values);
+ assertEquals(data.getRequestId(), request);
+ }
}