package pluginbase.config.properties;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
public enum PropertyHandlers {
;
private static final Map<Class<? extends PropertyHandler>, PropertyHandler> HANDLER_MAP = new HashMap<Class<? extends PropertyHandler>, PropertyHandler>();
public static <T extends PropertyHandler> PropertyHandler getHandler(Class<T> handlerClass) {
if (HANDLER_MAP.containsKey(handlerClass)) {
return HANDLER_MAP.get(handlerClass);
}
try {
Constructor<T> constructor = handlerClass.getDeclaredConstructor();
boolean accessible = constructor.isAccessible();
if (!accessible) {
constructor.setAccessible(true);
}
T handler = constructor.newInstance();
registerHandlerInstance(handlerClass, handler);
if (!accessible) {
constructor.setAccessible(false);
}
return handler;
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
public static PropertyHandler<Object> getDefaultHandler() {
return getHandler(DefaultPropertyHandler.class);
}
public static void setDefaultHandler(PropertyHandler<Object> handler) {
HANDLER_MAP.put(DefaultPropertyHandler.class, handler);
}
public static <T extends PropertyHandler> void registerHandlerInstance(Class<T> handlerClass, T handler) {
HANDLER_MAP.put(handlerClass, handler);
}
}