package com.fasterxml.jackson.databind.util;
import java.util.*;
import com.fasterxml.jackson.core.io.SerializedString;
import com.fasterxml.jackson.databind.*;
/**
* 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());
}
public SerializedString serializedValueFor(Enum<?> key)
{
return _values.get(key);
}
public Collection<SerializedString> values() {
return _values.values();
}
/**
* Method used for serialization and introspection by core Jackson
* code.
*
* @since 2.1
*/
public EnumMap<?,SerializedString> internalMap() {
return _values;
}
}