Search in sources :

Example 1 with ListTypeHandler

use of org.terasology.persistence.typeHandling.coreTypes.ListTypeHandler in project Terasology by MovingBlocks.

the class TypeSerializationLibrary method getHandlerFor.

// TODO: Refactor
@SuppressWarnings("unchecked")
public TypeHandler<?> getHandlerFor(Type genericType) {
    Class<?> typeClass = ReflectionUtil.getClassOfType(genericType);
    if (typeClass == null) {
        logger.error("Unabled to get class from type {}", genericType);
        return null;
    }
    if (Enum.class.isAssignableFrom(typeClass)) {
        return new EnumTypeHandler(typeClass);
    } else if (List.class.isAssignableFrom(typeClass)) {
        // For lists, createEntityRef the handler for the contained type and wrap in a list type handler
        Type parameter = ReflectionUtil.getTypeParameter(genericType, 0);
        if (parameter != null) {
            TypeHandler<?> innerHandler = getHandlerFor(parameter);
            if (innerHandler != null) {
                return new ListTypeHandler<>(innerHandler);
            }
        }
        logger.error("List field is not parametrized, or holds unsupported type");
        return null;
    } else if (Set.class.isAssignableFrom(typeClass)) {
        // For sets:
        Type parameter = ReflectionUtil.getTypeParameter(genericType, 0);
        if (parameter != null) {
            TypeHandler<?> innerHandler = getHandlerFor(parameter);
            if (innerHandler != null) {
                return new SetTypeHandler<>(innerHandler);
            }
        }
        logger.error("Set field is not parametrized, or holds unsupported type");
        return null;
    } else if (Map.class.isAssignableFrom(typeClass)) {
        // For Maps, createEntityRef the handler for the value type (and maybe key too?)
        Type keyParameter = ReflectionUtil.getTypeParameter(genericType, 0);
        Type contentsParameter = ReflectionUtil.getTypeParameter(genericType, 1);
        if (keyParameter != null && contentsParameter != null && String.class == keyParameter) {
            TypeHandler<?> valueHandler = getHandlerFor(contentsParameter);
            if (valueHandler != null) {
                return new StringMapTypeHandler<>(valueHandler);
            }
        }
        logger.error("Map field is not parametrized, does not have a String key, or holds unsupported values");
    } else if (typeHandlers.containsKey(typeClass)) {
        // For known types, just use the handler
        return typeHandlers.get(typeClass);
    } else if (typeClass.getAnnotation(MappedContainer.class) != null && !Modifier.isAbstract(typeClass.getModifiers()) && !typeClass.isLocalClass() && !(typeClass.isMemberClass() && !Modifier.isStatic(typeClass.getModifiers()))) {
        try {
            ClassMetadata<?, ?> metadata = new DefaultClassMetadata<>(new SimpleUri(), typeClass, reflectFactory, copyStrategies);
            MappedContainerTypeHandler<?> mappedHandler = new MappedContainerTypeHandler(typeClass, getFieldHandlerMap(metadata));
            typeHandlers.put(typeClass, mappedHandler);
            return mappedHandler;
        } catch (NoSuchMethodException e) {
            logger.error("Unable to register field of type {}: no publicly accessible default constructor", typeClass.getSimpleName());
            return null;
        }
    } else {
        logger.error("Unable to register field of type {}: not a supported type or MappedContainer", typeClass.getSimpleName());
    }
    return null;
}
Also used : ClassMetadata(org.terasology.reflection.metadata.ClassMetadata) DefaultClassMetadata(org.terasology.reflection.metadata.DefaultClassMetadata) SimpleUri(org.terasology.engine.SimpleUri) SetTypeHandler(org.terasology.persistence.typeHandling.coreTypes.SetTypeHandler) EnumTypeHandler(org.terasology.persistence.typeHandling.coreTypes.EnumTypeHandler) Type(java.lang.reflect.Type) List(java.util.List) Vector2fTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Vector2fTypeHandler) Vector4fTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Vector4fTypeHandler) Vector3iTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Vector3iTypeHandler) StringTypeHandler(org.terasology.persistence.typeHandling.coreTypes.StringTypeHandler) Vector2iTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Vector2iTypeHandler) BooleanTypeHandler(org.terasology.persistence.typeHandling.coreTypes.BooleanTypeHandler) ColorTypeHandler(org.terasology.persistence.typeHandling.extensionTypes.ColorTypeHandler) StringMapTypeHandler(org.terasology.persistence.typeHandling.coreTypes.StringMapTypeHandler) Vector3fTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Vector3fTypeHandler) EnumTypeHandler(org.terasology.persistence.typeHandling.coreTypes.EnumTypeHandler) NumberTypeHandler(org.terasology.persistence.typeHandling.coreTypes.NumberTypeHandler) ByteTypeHandler(org.terasology.persistence.typeHandling.coreTypes.ByteTypeHandler) SetTypeHandler(org.terasology.persistence.typeHandling.coreTypes.SetTypeHandler) Rect2iTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Rect2iTypeHandler) FloatTypeHandler(org.terasology.persistence.typeHandling.coreTypes.FloatTypeHandler) AssetTypeHandler(org.terasology.persistence.typeHandling.extensionTypes.AssetTypeHandler) Quat4fTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Quat4fTypeHandler) MappedContainerTypeHandler(org.terasology.persistence.typeHandling.coreTypes.MappedContainerTypeHandler) TextureRegionTypeHandler(org.terasology.persistence.typeHandling.extensionTypes.TextureRegionTypeHandler) NameTypeHandler(org.terasology.persistence.typeHandling.extensionTypes.NameTypeHandler) PrefabTypeHandler(org.terasology.persistence.typeHandling.extensionTypes.PrefabTypeHandler) IntTypeHandler(org.terasology.persistence.typeHandling.coreTypes.IntTypeHandler) Region3iTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Region3iTypeHandler) ListTypeHandler(org.terasology.persistence.typeHandling.coreTypes.ListTypeHandler) LongTypeHandler(org.terasology.persistence.typeHandling.coreTypes.LongTypeHandler) Rect2fTypeHandler(org.terasology.persistence.typeHandling.mathTypes.Rect2fTypeHandler) DoubleTypeHandler(org.terasology.persistence.typeHandling.coreTypes.DoubleTypeHandler) Map(java.util.Map) MappedContainerTypeHandler(org.terasology.persistence.typeHandling.coreTypes.MappedContainerTypeHandler) MappedContainer(org.terasology.reflection.MappedContainer)

Aggregations

Type (java.lang.reflect.Type)1 List (java.util.List)1 Map (java.util.Map)1 SimpleUri (org.terasology.engine.SimpleUri)1 BooleanTypeHandler (org.terasology.persistence.typeHandling.coreTypes.BooleanTypeHandler)1 ByteTypeHandler (org.terasology.persistence.typeHandling.coreTypes.ByteTypeHandler)1 DoubleTypeHandler (org.terasology.persistence.typeHandling.coreTypes.DoubleTypeHandler)1 EnumTypeHandler (org.terasology.persistence.typeHandling.coreTypes.EnumTypeHandler)1 FloatTypeHandler (org.terasology.persistence.typeHandling.coreTypes.FloatTypeHandler)1 IntTypeHandler (org.terasology.persistence.typeHandling.coreTypes.IntTypeHandler)1 ListTypeHandler (org.terasology.persistence.typeHandling.coreTypes.ListTypeHandler)1 LongTypeHandler (org.terasology.persistence.typeHandling.coreTypes.LongTypeHandler)1 MappedContainerTypeHandler (org.terasology.persistence.typeHandling.coreTypes.MappedContainerTypeHandler)1 NumberTypeHandler (org.terasology.persistence.typeHandling.coreTypes.NumberTypeHandler)1 SetTypeHandler (org.terasology.persistence.typeHandling.coreTypes.SetTypeHandler)1 StringMapTypeHandler (org.terasology.persistence.typeHandling.coreTypes.StringMapTypeHandler)1 StringTypeHandler (org.terasology.persistence.typeHandling.coreTypes.StringTypeHandler)1 AssetTypeHandler (org.terasology.persistence.typeHandling.extensionTypes.AssetTypeHandler)1 ColorTypeHandler (org.terasology.persistence.typeHandling.extensionTypes.ColorTypeHandler)1 NameTypeHandler (org.terasology.persistence.typeHandling.extensionTypes.NameTypeHandler)1