package core.framework.impl.db;
import core.framework.api.db.DBEnumValue;
import core.framework.api.util.Exceptions;
import core.framework.api.util.Maps;
import java.lang.reflect.Field;
import java.util.EnumMap;
import java.util.Map;
/**
* @author neo
*/
final class EnumDBMapper {
private final Map<Class<? extends Enum<?>>, Map<Enum<?>, String>> enumToDBValueMappings = Maps.newHashMap();
<T extends Enum<?>> void registerEnumClass(Class<T> enumClass) {
if (!enumToDBValueMappings.containsKey(enumClass)) {
T[] constants = enumClass.getEnumConstants();
@SuppressWarnings({"unchecked", "rawtypes"})
Map<Enum<?>, String> mappings = new EnumMap(enumClass);
for (T constant : constants) {
try {
Field field = enumClass.getField(constant.name());
String dbValue = field.getDeclaredAnnotation(DBEnumValue.class).value();
mappings.put(constant, dbValue);
} catch (NoSuchFieldException e) {
throw new Error(e);
}
}
enumToDBValueMappings.put(enumClass, mappings);
}
}
String getDBValue(Enum<? extends Enum<?>> value) {
@SuppressWarnings("unchecked")
Class<? extends Enum<?>> enumClass = (Class<? extends Enum<?>>) value.getClass();
Map<?, String> mapping = enumToDBValueMappings.get(enumClass);
if (mapping == null)
throw Exceptions.error("enum class is not registered, register in module by db().view() or db().repository(), enumClass={}", enumClass.getCanonicalName());
return mapping.get(value); // this won't return null since all fields of enum are registered
}
}