All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jfirer.dson.reader.impl.MapReader Maven / Gradle / Ivy

package com.jfirer.dson.reader.impl;

import com.jfirer.baseutil.reflect.ReflectUtil;
import com.jfirer.dson.reader.JsonReader;
import com.jfirer.dson.reader.Stream;
import com.jfirer.dson.reader.TypeReader;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class MapReader implements TypeReader
{
    private TypeReader valueReader;
    private JsonReader jsonReader;
    private Type       type;
    private Class      ckass;

    @Override
    public void init(Type type, JsonReader jsonReader)
    {
        this.type = type;
        this.jsonReader = jsonReader;
        if (type instanceof Class)
        {
            ckass = (Class) type;
        }
        else if (type instanceof ParameterizedType)
        {
            ckass = (Class) ((ParameterizedType) type).getRawType();
            Type[] typeArguments = ((ParameterizedType) type).getActualTypeArguments();
            if (typeArguments[0] != String.class)
            {
                throw new IllegalArgumentException(type.toString());
            }
        }
        else
        {
            throw new IllegalArgumentException(type.toString());
        }
        if (ckass.isInterface())
        {
            ckass = HashMap.class;
        }
    }

    @Override
    public Object fromString(Stream stream)
    {
        TypeReader valueReader = this.valueReader;
        if (valueReader == null)
        {
            if (type instanceof Class)
            {
                this.valueReader = valueReader = jsonReader.get(Object.class);
            }
            else if (type instanceof ParameterizedType)
            {
                Type[] typeArguments = ((ParameterizedType) type).getActualTypeArguments();
                this.valueReader = valueReader = jsonReader.get(typeArguments[1]);
            }
        }
        stream.startParseObject();
        try
        {
            Map map = (Map) ckass.newInstance();
            while (stream.parseObjectEnd() == false)
            {
                String name = stream.getName();
                stream.skipColon();
                map.put(name, valueReader.fromString(stream));
                stream.skipComma();
            }
            return map;
        }
        catch (Exception e)
        {
            ReflectUtil.throwException(e);
            return null;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy