package com.constellio.data.utils.dev;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.data.utils.ImpossibleRuntimeException;
public class Toggle {
public static AvailableToggle USE_LATEST_BATCH_INSTEAD_OF_EXCEPTION = newToggle();
public static AvailableToggle NEW_USERCREDENTIAL_SERVICES = newToggle();
public static AvailableToggle AGREGATED_METADATAS = newToggle();
public static AvailableToggle ADD_EXISTING_TASK = newToggle();
public static AvailableToggle SIMULATE_CONNECTOR_DOWNLOAD_CONTENT = newToggle();
public static AvailableToggle FORCE_ROLLBACK = newToggle();
public static AvailableToggle LOST_PRIVATE_KEY = newToggle();
public static AvailableToggle EXTERNAL_TOKENS_DISABLED = newToggle();
public static AvailableToggle NO_WEBSERVICES_PASSWORDS_VALIDATIONS = newToggle();
public static AvailableToggle STORAGE_SPACE_CAPACITIY_VALIDATION = newToggle(true);
public static AvailableToggle CACHES_ENABLED = newToggle(true);
// ------------------------------------------------
private static Map<String, AvailableToggle> toggleMap = new HashMap<>();
static {
for (Field field : Toggle.class.getDeclaredFields()) {
if (AvailableToggle.class.equals(field.getType())) {
try {
AvailableToggle availableToggle = (AvailableToggle) field.get(null);
availableToggle.id = field.getName();
toggleMap.put(field.getName(), availableToggle);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}
public static void toggleAll() {
for (AvailableToggle toggle : toggles) {
toggle.enable();
}
}
public static AvailableToggle getToggle(String id) {
return toggleMap.get(id);
}
private static List<AvailableToggle> toggles;
private static AvailableToggle newToggle(boolean value) {
if (toggles == null) {
toggles = new ArrayList<>();
}
AvailableToggle toggle = new AvailableToggle();
toggle.enabled = value;
toggles.add(toggle);
return toggle;
}
private static AvailableToggle newToggle() {
if (toggles == null) {
toggles = new ArrayList<>();
}
AvailableToggle toggle = new AvailableToggle();
toggles.add(toggle);
return toggle;
}
public static void resetToggles() {
for (AvailableToggle toggle : toggles) {
toggle.disable();
}
}
public static List<AvailableToggle> getAllAvailable() {
return toggles;
}
public static class AvailableToggle {
private boolean enabled;
private String id;
public boolean isEnabled() {
return enabled;
}
public void ensureDisabled() {
if (enabled) {
throw new ImpossibleRuntimeException("Unsupported with toggle '" + id + "'");
}
}
public void ensureEnabled() {
if (!enabled) {
throw new ImpossibleRuntimeException("Only supported with toggle '" + id + "'");
}
}
public void enable() {
enabled = true;
}
public void disable() {
enabled = false;
}
}
}