package org.zbus.common.json.parser.deserializer;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.zbus.common.json.JSONException;
import org.zbus.common.json.parser.DefaultJSONParser;
import org.zbus.common.json.util.FieldInfo;
public abstract class FieldDeserializer {
protected final FieldInfo fieldInfo;
protected final Class<?> clazz;
public FieldDeserializer(Class<?> clazz, FieldInfo fieldInfo){
this.clazz = clazz;
this.fieldInfo = fieldInfo;
}
public Method getMethod() {
return fieldInfo.getMethod();
}
public Field getField() {
return fieldInfo.getField();
}
public Class<?> getFieldClass() {
return fieldInfo.getFieldClass();
}
public Type getFieldType() {
return fieldInfo.getFieldType();
}
public abstract void parseField(DefaultJSONParser parser, Object object, Type objectType,
Map<String, Object> fieldValues);
public int getFastMatchToken() {
return 0;
}
public void setValue(Object object, boolean value) {
setValue(object, Boolean.valueOf(value));
}
public void setValue(Object object, int value) {
setValue(object, Integer.valueOf(value));
}
public void setValue(Object object, long value) {
setValue(object, Long.valueOf(value));
}
public void setValue(Object object, String value) {
setValue(object, (Object) value);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void setValue(Object object, Object value) {
Method method = fieldInfo.getMethod();
if (method != null) {
try {
if (fieldInfo.isGetOnly()) {
if (fieldInfo.getFieldClass() == AtomicInteger.class) {
AtomicInteger atomic = (AtomicInteger) method.invoke(object);
if (atomic != null) {
atomic.set(((AtomicInteger) value).get());
}
} else if (fieldInfo.getFieldClass() == AtomicLong.class) {
AtomicLong atomic = (AtomicLong) method.invoke(object);
if (atomic != null) {
atomic.set(((AtomicLong) value).get());
}
} else if (fieldInfo.getFieldClass() == AtomicBoolean.class) {
AtomicBoolean atomic = (AtomicBoolean) method.invoke(object);
if (atomic != null) {
atomic.set(((AtomicBoolean) value).get());
}
} else if (Map.class.isAssignableFrom(method.getReturnType())) {
Map map = (Map) method.invoke(object);
if (map != null) {
map.putAll((Map) value);
}
} else {
Collection collection = (Collection) method.invoke(object);
if (collection != null) {
collection.addAll((Collection) value);
}
}
} else {
method.invoke(object, value);
}
} catch (Exception e) {
throw new JSONException("set property error, " + fieldInfo.getName(), e);
}
return;
}
final Field field = fieldInfo.getField();
if (field != null) {
try {
field.set(object, value);
} catch (Exception e) {
throw new JSONException("set property error, " + fieldInfo.getName(), e);
}
}
}
}