Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / util / enums / EnumName.java
diff --git a/core/src/net/sf/openrocket/util/enums/EnumName.java b/core/src/net/sf/openrocket/util/enums/EnumName.java
new file mode 100644 (file)
index 0000000..7821061
--- /dev/null
@@ -0,0 +1,63 @@
+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>> {
+       
+       public 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);
+       }
+       
+       
+}