package com.hwlcn.ldap.ldap.sdk.persist;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Set;
final class TypeInfo
{
private final boolean isArray;
private final boolean isEnum;
private final boolean isList;
private final boolean isSet;
private final boolean isSupported;
private final Class<?> baseClass;
private final Class<?> componentType;
private final Type type;
TypeInfo(final Type type)
{
this.type = type;
if (type instanceof Class)
{
isSupported = true;
baseClass = (Class<?>) type;
isArray = baseClass.isArray();
isEnum = baseClass.isEnum();
if (isArray)
{
componentType = baseClass.getComponentType();
isList = false;
isSet = false;
}
else if (List.class.isAssignableFrom(baseClass))
{
componentType = Object.class;
isList = true;
isSet = false;
}
else if (Set.class.isAssignableFrom(baseClass))
{
componentType = Object.class;
isList = false;
isSet = true;
}
else
{
componentType = null;
isList = false;
isSet = false;
}
}
else if (type instanceof ParameterizedType)
{
final ParameterizedType pt = (ParameterizedType) type;
final Type rawType = pt.getRawType();
final Type[] typeParams = pt.getActualTypeArguments();
if ((rawType instanceof Class) && (typeParams.length == 1) &&
(typeParams[0] instanceof Class))
{
baseClass = (Class<?>) rawType;
componentType = (Class<?>) typeParams[0];
if (List.class.isAssignableFrom(baseClass))
{
isSupported = true;
isArray = false;
isEnum = false;
isList = true;
isSet = false;
}
else if (Set.class.isAssignableFrom(baseClass))
{
isSupported = true;
isArray = false;
isEnum = false;
isList = false;
isSet = true;
}
else
{
isSupported = false;
isArray = false;
isEnum = false;
isList = false;
isSet = false;
}
}
else
{
isSupported = false;
isArray = false;
isEnum = false;
isList = false;
isSet = false;
baseClass = null;
componentType = null;
}
}
else
{
isSupported = false;
isArray = false;
isEnum = false;
isList = false;
isSet = false;
baseClass = null;
componentType = null;
}
}
public Type getType()
{
return type;
}
public boolean isSupported()
{
return isSupported;
}
public Class<?> getBaseClass()
{
return baseClass;
}
public Class<?> getComponentType()
{
return componentType;
}
public boolean isArray()
{
return isArray;
}
public boolean isEnum()
{
return isEnum;
}
public boolean isList()
{
return isList;
}
public boolean isSet()
{
return isSet;
}
public boolean isMultiValued()
{
return (isArray || isList || isSet);
}
}