blob: 9d21c8c7150c9b9b232d41386673390a1dbff238 [file] [log] [blame]
package org.codehaus.jackson.map.util;
import java.util.*;
import org.codehaus.jackson.io.SerializedString;
import org.codehaus.jackson.map.*;
/**
* Helper class used for storing String serializations of
* enumerations.
*/
public final class EnumValues
{
/**
* Since 1.7, we are storing values as SerializedStrings, to further
* speed up serialization.
*/
private final EnumMap<?,SerializedString> _values;
@SuppressWarnings({ "unchecked", "rawtypes" })
private EnumValues(Map<Enum<?>,SerializedString> v) {
_values = new EnumMap(v);
}
public static EnumValues construct(Class<Enum<?>> enumClass, AnnotationIntrospector intr)
{
return constructFromName(enumClass, intr);
}
public static EnumValues constructFromName(Class<Enum<?>> enumClass, AnnotationIntrospector intr)
{
/* [JACKSON-214]: Enum types with per-instance sub-classes
* need special handling
*/
Class<? extends Enum<?>> cls = ClassUtil.findEnumType(enumClass);
Enum<?>[] values = cls.getEnumConstants();
if (values != null) {
// Type juggling... unfortunate
Map<Enum<?>,SerializedString> map = new HashMap<Enum<?>,SerializedString>();
for (Enum<?> en : values) {
String value = intr.findEnumValue(en);
map.put(en, new SerializedString(value));
}
return new EnumValues(map);
}
throw new IllegalArgumentException("Can not determine enum constants for Class "+enumClass.getName());
}
public static EnumValues constructFromToString(Class<Enum<?>> enumClass, AnnotationIntrospector intr)
{
Class<? extends Enum<?>> cls = ClassUtil.findEnumType(enumClass);
Enum<?>[] values = cls.getEnumConstants();
if (values != null) {
// Type juggling... unfortunate
Map<Enum<?>,SerializedString> map = new HashMap<Enum<?>,SerializedString>();
for (Enum<?> en : values) {
map.put(en, new SerializedString(en.toString()));
}
return new EnumValues(map);
}
throw new IllegalArgumentException("Can not determine enum constants for Class "+enumClass.getName());
}
/**
* @deprecated since 1.7, use {@link #serializedValueFor} instead
*/
@Deprecated
public String valueFor(Enum<?> key)
{
SerializedString sstr = _values.get(key);
return (sstr == null) ? null : sstr.getValue();
}
public SerializedString serializedValueFor(Enum<?> key)
{
return _values.get(key);
}
public Collection<SerializedString> values() {
return _values.values();
}
}