Subversion Repositories bacoAlunos

Rev

Blame | 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.JsonWriter;
import com.owlike.genson.stream.ObjectWriter;

public abstract class PropertyAccessor extends BeanProperty implements Comparable<PropertyAccessor> {
  Serializer<Object> propertySerializer;
  private final char[] escapedName;

  protected PropertyAccessor(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);
    escapedName = JsonWriter.escapeString(name);
  }

  public void serialize(5+0%2Fdocs%2Fapi+Object">Object propertySource, ObjectWriter writer, 5+0%2Fdocs%2Fapi+Context">Context ctx) {
    5+0%2Fdocs%2Fapi+Object">Object propertyValue = access(propertySource);
    writer.writeEscapedName(escapedName);
    try {
      propertySerializer.serialize(propertyValue, writer, ctx);
    } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable th) {
      throw couldNotSerialize(th);
    }
  }

  public abstract 5+0%2Fdocs%2Fapi+Object">Object access(final 5+0%2Fdocs%2Fapi+Object">Object target);

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

  protected JsonBindingException couldNotAccess(1.5.0/docs/api/java/lang/Exception.html">Exception e) {
    return new JsonBindingException("Could not access value of property named '"
      + name + "' using accessor " + signature() + " from class "
      + declaringClass.getName(), e);
  }

  protected JsonBindingException couldNotSerialize(1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
    return new JsonBindingException("Could not serialize property '" + name
      + "' from class " + declaringClass.getName(), e);
  }

  public static class MethodAccessor extends PropertyAccessor {
    protected final 1.5.0/docs/api/java/lang/reflect/Method.html">Method _getter;

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

    @1.5.0/docs/api/java/lang/Override.html">Override
    public 5+0%2Fdocs%2Fapi+Object">Object access(final 5+0%2Fdocs%2Fapi+Object">Object target) {
      try {
        return _getter.invoke(target);
      } catch (1.5.0/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException e) {
        throw couldNotAccess(e);
      } catch (1.5.0/docs/api/java/lang/IllegalAccessException.html">IllegalAccessException e) {
        throw couldNotAccess(e);
      } catch (1.5.0/docs/api/java/lang/reflect/InvocationTargetException.html">InvocationTargetException e) {
        throw couldNotAccess(e);
      }
    }

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

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

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

    public FieldAccessor(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 5+0%2Fdocs%2Fapi+Object">Object access(final 5+0%2Fdocs%2Fapi+Object">Object target) {
      try {
        return _field.get(target);
      } catch (1.5.0/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException e) {
        throw couldNotAccess(e);
      } catch (1.5.0/docs/api/java/lang/IllegalAccessException.html">IllegalAccessException e) {
        throw couldNotAccess(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 50;
    }
  }
}