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); } } } }