create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / util / enums / EnumName.java
1 package net.sf.openrocket.util.enums;
2
3 import java.util.EnumMap;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import net.sf.openrocket.util.BugException;
8
9 public class EnumName<E extends Enum<E>> {
10         
11         public static final EnumConversion NAME = new EnumConversion() {
12                 @Override
13                 public String convert(Enum<?> e) {
14                         return e.name();
15                 }
16         };
17         
18         
19         private final Class<E> type;
20         private final Map<E, String> map;
21         private final Map<String, E> reverse;
22         
23         public EnumName(Class<E> type) {
24                 this(type, NAME);
25         }
26         
27         public EnumName(Class<E> type, EnumConversion conversion) {
28                 this.type = type;
29                 map = new EnumMap<E, String>(type);
30                 reverse = new HashMap<String, E>();
31                 
32                 E[] keys = type.getEnumConstants();
33                 if (keys == null) {
34                         throw new IllegalArgumentException("Type " + type + " is not of enum type");
35                 }
36                 for (E key : keys) {
37                         String value = conversion.convert(key);
38                         if (reverse.containsKey(value)) {
39                                 throw new BugException("Two enum constants were converted to have the name value: " + reverse.get(value)
40                                                 + " and " + key + " both convert to '" + value + "'");
41                         }
42                         map.put(key, value);
43                         reverse.put(value, key);
44                         
45                 }
46         }
47         
48         
49         
50         public String getName(E key) {
51                 String name = map.get(key);
52                 if (name == null) {
53                         throw new IllegalArgumentException("No name found for enum " + key + " from map of type " + type);
54                 }
55                 return name;
56         }
57         
58         public E getEnum(String name) {
59                 return reverse.get(name);
60         }
61         
62         
63 }