package com.jd.glowworm.deserializer;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import com.jd.glowworm.PBException;
public class CollectionDeserializer implements ObjectDeserializer {
public final static CollectionDeserializer instance = new CollectionDeserializer();
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> T deserialze(PBDeserializer parser, Type type, Object fieldName) {
if (fieldName != null)
{
try
{
byte tmpIsNull = parser.getTheCodedInputStream().readRawByte();
if (tmpIsNull == 1)
{
return null;
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
Class<?> rawClass = getRawClass(type);
Collection list;
if (rawClass == AbstractCollection.class) {
list = new ArrayList();
} else if (rawClass.isAssignableFrom(HashSet.class)) {
list = new HashSet();
} else if (rawClass.isAssignableFrom(LinkedHashSet.class)) {
list = new LinkedHashSet();
} else if (rawClass.isAssignableFrom(ArrayList.class)) {
list = new ArrayList();
} else {
try {
list = (Collection) rawClass.newInstance();
} catch (Exception e) {
throw new PBException("create instane error, class " + rawClass.getName());
}
}
Type itemType;
if (type instanceof ParameterizedType) {
itemType = ((ParameterizedType) type).getActualTypeArguments()[0];
} else {
itemType = Object.class;
}
parser.parseArray(itemType, list, fieldName);
return (T) list;
}
public Class<?> getRawClass(Type type) {
if (type instanceof Class<?>) {
return (Class<?>) type;
} else if (type instanceof ParameterizedType) {
return getRawClass(((ParameterizedType) type).getRawType());
} else {
throw new PBException("TODO");
}
}
}