package net.nullschool.grains.jackson.datatype;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.introspect.*;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
import com.fasterxml.jackson.databind.type.TypeFactory;
import net.nullschool.grains.GrainProperty;
import java.lang.annotation.Annotation;
import static net.nullschool.grains.GrainProperty.Flag.IS_PROPERTY;
import static net.nullschool.util.StringTools.capitalize;
/**
* 2013-06-10<p/>
*
* @author Cameron Beccario
*/
final class JacksonGrainProperty implements BeanProperty { // UNDONE: Serializable
private static final AnnotationMap[] EMPTY = new AnnotationMap[0];
private final String name;
private final JavaType type;
private final AnnotatedMember member;
JacksonGrainProperty(GrainProperty prop, TypeFactory typeFactory, Class<?> grainClass) {
this.name = prop.getName();
this.type = typeFactory.constructType(prop.getType());
try {
String getterName = (prop.getFlags().contains(IS_PROPERTY) ? "is" : "get") + capitalize(prop.getName());
// UNDONE: annotations
this.member = new AnnotatedMethod(grainClass.getMethod(getterName), new AnnotationMap(), EMPTY);
}
catch (NoSuchMethodException e) {
throw new IllegalArgumentException(e);
}
}
@Override public String getName() {
return name;
}
@Override public JavaType getType() {
return type;
}
@Override public PropertyName getWrapperName() {
return null;
}
@Override public boolean isRequired() {
return false;
}
@Override public <A extends Annotation> A getAnnotation(Class<A> acls) {
return member.getAnnotation(acls);
}
@Override public <A extends Annotation> A getContextAnnotation(Class<A> acls) {
return member.getDeclaringClass().getAnnotation(acls);
}
@Override public AnnotatedMember getMember() {
return member;
}
@Override public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor) throws JsonMappingException {
// UNDONE
throw new UnsupportedOperationException("NYI");
}
@Override public String toString() {
return String.format("%s(%s, %s)", getClass().getSimpleName(), name, type);
}
}