ObjectTracingService.java

package emissary.spi;

import emissary.core.IBaseDataObject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;
import javax.annotation.Nullable;

import static net.logstash.logback.marker.Markers.appendEntries;

public class ObjectTracingService {

    @Nullable
    @SuppressWarnings("NonFinalStaticField")
    private static ServiceLoader<ObjectTracing> loader = null;
    private static final Logger objectTraceLogger = LoggerFactory.getLogger("objectTrace");

    private ObjectTracingService() {}

    public static synchronized void emitLifecycleEvent(IBaseDataObject d, String filename, ObjectTracing.Stage stage, boolean useObjectTracing) {
        if (useObjectTracing) {
            if (loader == null) {
                loader = ServiceLoader.load(ObjectTracing.class);
            }

            // have the appropriate providers add fields
            Map<String, String> jsonFieldMap = new HashMap<>();
            for (ObjectTracing tracing : loader) {
                tracing.getObjectTraceFields(d, filename, stage, jsonFieldMap);
            }
            // once we have added fields from all providers, perform remapping of field names as appropriate
            for (ObjectTracing tracing : loader) {
                tracing.mapFieldNames(jsonFieldMap);
            }
            objectTraceLogger.info(appendEntries(jsonFieldMap), "");
        }
    }
}