com.fasterxml.jackson.databind.util.EnumResolver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ehcache Show documentation
Show all versions of ehcache Show documentation
Ehcache is an open source, standards-based cache used to boost performance,
offload the database and simplify scalability. Ehcache is robust, proven and full-featured and
this has made it the most widely-used Java-based cache.
package com.fasterxml.jackson.databind.util;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import java.lang.reflect.Method;
import java.util.*;
/**
* Helper class used to resolve String values (either JSON Object field
* names or regular String values) into Java Enum instances.
*/
public class EnumResolver>
implements java.io.Serializable
{
private static final long serialVersionUID = 1L;
protected final Class _enumClass;
protected final T[] _enums;
protected final HashMap _enumsById;
protected EnumResolver(Class enumClass, T[] enums, HashMap map)
{
_enumClass = enumClass;
_enums = enums;
_enumsById = map;
}
/**
* Factory method for constructing resolver that maps from Enum.name() into
* Enum value
*/
public static > EnumResolver constructFor(Class enumCls, AnnotationIntrospector ai)
{
ET[] enumValues = enumCls.getEnumConstants();
if (enumValues == null) {
throw new IllegalArgumentException("No enum constants for class "+enumCls.getName());
}
HashMap map = new HashMap();
for (ET e : enumValues) {
map.put(ai.findEnumValue(e), e);
}
return new EnumResolver(enumCls, enumValues, map);
}
/**
* Factory method for constructing resolver that maps from Enum.toString() into
* Enum value
*/
public static > EnumResolver constructUsingToString(Class enumCls)
{
ET[] enumValues = enumCls.getEnumConstants();
HashMap map = new HashMap();
// from last to first, so that in case of duplicate values, first wins
for (int i = enumValues.length; --i >= 0; ) {
ET e = enumValues[i];
map.put(e.toString(), e);
}
return new EnumResolver(enumCls, enumValues, map);
}
public static > EnumResolver constructUsingMethod(Class enumCls,
Method accessor)
{
ET[] enumValues = enumCls.getEnumConstants();
HashMap map = new HashMap();
// from last to first, so that in case of duplicate values, first wins
for (int i = enumValues.length; --i >= 0; ) {
ET en = enumValues[i];
try {
Object o = accessor.invoke(en);
if (o != null) {
map.put(o.toString(), en);
}
} catch (Exception e) {
throw new IllegalArgumentException("Failed to access @JsonValue of Enum value "+en+": "+e.getMessage());
}
}
return new EnumResolver(enumCls, enumValues, map);
}
/**
* This method is needed because of the dynamic nature of constructing Enum
* resolvers.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static EnumResolver> constructUnsafe(Class> rawEnumCls, AnnotationIntrospector ai)
{
/* This is oh so wrong... but at least ugliness is mostly hidden in just
* this one place.
*/
Class enumCls = (Class) rawEnumCls;
return constructFor(enumCls, ai);
}
/**
* Method that needs to be used instead of {@link #constructUsingToString}
* if static type of enum is not known.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static EnumResolver> constructUnsafeUsingToString(Class> rawEnumCls)
{
// oh so wrong... not much that can be done tho
Class enumCls = (Class) rawEnumCls;
return constructUsingToString(enumCls);
}
/**
* Method used when actual String serialization is indicated using @JsonValue
* on a method.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static EnumResolver> constructUnsafeUsingMethod(Class> rawEnumCls, Method accessor)
{
// wrong as ever but:
Class enumCls = (Class) rawEnumCls;
return constructUsingMethod(enumCls, accessor);
}
public T findEnum(String key)
{
return _enumsById.get(key);
}
public T getEnum(int index)
{
if (index < 0 || index >= _enums.length) {
return null;
}
return _enums[index];
}
public List getEnums()
{
ArrayList enums = new ArrayList(_enums.length);
for (T e : _enums) {
enums.add(e);
}
return enums;
}
public Class getEnumClass() { return _enumClass; }
public int lastValidIndex() { return _enums.length-1; }
}