Subversion Repositories bacoAlunos

Rev

Rev 1969 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.owlike.genson.reflect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

import com.owlike.genson.*;
import com.owlike.genson.stream.ObjectReader;

public abstract class PropertyMutator extends BeanProperty implements Comparable<PropertyMutator> {
  Deserializer<Object> propertyDeserializer;

  protected PropertyMutator(1.5.0/docs/api/java/lang/String.html">String name, 1.5.0/docs/api/java/lang/reflect/Type.html">Type type, Class<?> declaringClass, Class<?> concreteClass,
                            5+0%2Fdocs%2Fapi+Annotation">Annotation[] annotations, int modifiers) {
    super(name, type, declaringClass, concreteClass, annotations, modifiers);
  }

  public 5+0%2Fdocs%2Fapi+Object">Object deserialize(ObjectReader reader, 5+0%2Fdocs%2Fapi+Context">Context ctx) {
    try {
      return propertyDeserializer.deserialize(reader, ctx);
    } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable th) {
      throw couldNotDeserialize(th);
    }
  }

  public void deserialize(5+0%2Fdocs%2Fapi+Object">Object into, ObjectReader reader, 5+0%2Fdocs%2Fapi+Context">Context ctx) {
    5+0%2Fdocs%2Fapi+Object">Object propValue = null;
    try {
      propValue = propertyDeserializer.deserialize(reader, ctx);
    } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable th) {
      throw couldNotDeserialize(th);
    }
    mutate(into, propValue);
  }

  public abstract void mutate(5+0%2Fdocs%2Fapi+Object">Object target, 5+0%2Fdocs%2Fapi+Object">Object value);

  public int compareTo(PropertyMutator o) {
    return o.priority() - priority();
  }

  protected JsonBindingException couldNotMutate(1.5.0/docs/api/java/lang/Exception.html">Exception e) {
    return new JsonBindingException("Could not mutate value of property named '"
      + name + "' using mutator " + signature(), e);
  }

  protected JsonBindingException couldNotDeserialize(1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
    return new JsonBindingException("Could not deserialize to property '" + name + "' of class " + declaringClass, e);
  }

  public static class MethodMutator extends PropertyMutator {
    protected final 1.5.0/docs/api/java/lang/reflect/Method.html">Method _setter;

    public MethodMutator(1.5.0/docs/api/java/lang/String.html">String name, 1.5.0/docs/api/java/lang/reflect/Method.html">Method setter, 1.5.0/docs/api/java/lang/reflect/Type.html">Type type, Class<?> concreteClass) {
      super(name, type, setter.getDeclaringClass(), concreteClass, setter.getAnnotations(), setter.getModifiers());
      this._setter = setter;
      if (!_setter.isAccessible()) {
        _setter.setAccessible(true);
      }
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public void mutate(5+0%2Fdocs%2Fapi+Object">Object target, 5+0%2Fdocs%2Fapi+Object">Object value) {
      try {
        _setter.invoke(target, value);
      } catch (1.5.0/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException e) {
        throw couldNotMutate(e);
      } catch (1.5.0/docs/api/java/lang/IllegalAccessException.html">IllegalAccessException e) {
        throw couldNotMutate(e);
      } catch (1.5.0/docs/api/java/lang/reflect/InvocationTargetException.html">InvocationTargetException e) {
        throw couldNotMutate(e);
      }
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public 1.5.0/docs/api/java/lang/String.html">String signature() {
      return _setter.toGenericString();
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public int priority() {
      return 100;
    }
  }

  public static class FieldMutator extends PropertyMutator {
    protected final 1.5.0/docs/api/java/lang/reflect/Field.html">Field _field;

    public FieldMutator(1.5.0/docs/api/java/lang/String.html">String name, 1.5.0/docs/api/java/lang/reflect/Field.html">Field field, 1.5.0/docs/api/java/lang/reflect/Type.html">Type type, Class<?> concreteClass) {
      super(name, type, field.getDeclaringClass(), concreteClass, field.getAnnotations(), field.getModifiers());
      this._field = field;
      if (!_field.isAccessible()) {
        _field.setAccessible(true);
      }
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public void mutate(5+0%2Fdocs%2Fapi+Object">Object target, 5+0%2Fdocs%2Fapi+Object">Object value) {
      try {
        _field.set(target, value);
      } catch (1.5.0/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException e) {
        throw couldNotMutate(e);
      } catch (1.5.0/docs/api/java/lang/IllegalAccessException.html">IllegalAccessException e) {
        throw couldNotMutate(e);
      }
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public 1.5.0/docs/api/java/lang/String.html">String signature() {
      return _field.toGenericString();
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public int priority() {
      return 0;
    }
  }
}