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