package com.constellio.data.io.services.facades;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.exception.ExceptionUtils;
import com.constellio.data.utils.ImpossibleRuntimeException;
public class OpenedResourcesWatcher {
public static boolean enabled = true;
public static boolean logStackTraces = false;
public static String openingStackHeader = "Where the resource was opened";
static Map<String, String> openedResourcesOpeningStack = new HashMap<String, String>();
static Map<String, Object> openedResources = new HashMap<String, Object>();
public static Map<String, Object> getOpenedResources() {
return new HashMap<>(openedResources);
}
public static String getOpeningStackTraceOf(String resource) {
if (logStackTraces) {
String stack = openedResourcesOpeningStack.get(resource);
return openingStackHeader + " - " + stack;
} else {
return openingStackHeader;
}
}
public static synchronized <T> T onOpen(T resource) {
if (openedResources.containsKey(resource.toString())) {
throw new ImpossibleRuntimeException("Resource named " + resource.toString() + " is alredy opened");
}
openedResources.put(resource.toString(), resource);
if (logStackTraces) {
String stackTrace = ExceptionUtils.getStackTrace(new RuntimeException());
openedResourcesOpeningStack.put(resource.toString(), stackTrace);
}
return resource;
}
public static synchronized void onClose(Object resource) {
String key = resource.toString();
openedResources.remove(key);
if (logStackTraces) {
openedResourcesOpeningStack.remove(key);
}
}
public static void clear() {
openedResources.clear();
if (logStackTraces) {
openedResourcesOpeningStack.clear();
}
}
}