package net.sf.openrocket.util.enums; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import net.sf.openrocket.util.BugException; public class EnumName<E extends Enum<E>> { private static final EnumConversion NAME = new EnumConversion() { @Override public String convert(Enum<?> e) { return e.name(); } }; private final Class<E> type; private final Map<E, String> map; private final Map<String, E> reverse; public EnumName(Class<E> type) { this(type, NAME); } public EnumName(Class<E> type, EnumConversion conversion) { this.type = type; map = new EnumMap<E, String>(type); reverse = new HashMap<String, E>(); E[] keys = type.getEnumConstants(); if (keys == null) { throw new IllegalArgumentException("Type " + type + " is not of enum type"); } for (E key : keys) { String value = conversion.convert(key); if (reverse.containsKey(value)) { throw new BugException("Two enum constants were converted to have the name value: " + reverse.get(value) + " and " + key + " both convert to '" + value + "'"); } map.put(key, value); reverse.put(value, key); } } public String getName(E key) { String name = map.get(key); if (name == null) { throw new IllegalArgumentException("No name found for enum " + key + " from map of type " + type); } return name; } public E getEnum(String name) { return reverse.get(name); } }