final String key = method.getAnnotation(Key.class).value();
if (method.getParameters().length == 0) {
// assume this is a getter
definition.addMemberMapping(new ReadMapping(key, method.getReturnType(), method.getName()));
readKeys.add(key);
}
else if (method.getParameters().length == 1) {
// assume this is a setter
definition.addMemberMapping(new WriteMapping(key, method.getParameters()[0].getType(), method.getName()));
writeKeys.add(key);
}
else {
throw new InvalidMappingException("annotated @Key method is unrecognizable as a setter or getter: "
+ toMap.getFullyQualifiedName() + "#" + method.getName());
}
}
}
MetaClass c = toMap;
do {
for (final MetaField field : c.getDeclaredFields()) {
if (definitionsFactory.hasDefinition(field.getDeclaringClass())
|| field.isTransient() || field.isStatic()) {
continue;
}
try {
final Field fld = field.asField();
fld.setAccessible(true);
}
catch (IllegalStateException e) {
// field is not known to the current classloader. continue anyway.
}
if (writeKeys.contains(field.getName()) && readKeys.contains(field.getName())) {
continue;
}
final MetaClass type = field.getType().getErased();
final MetaClass compType = type.isArray() ? type.getOuterComponentType().asBoxed() : type.asBoxed();
if (!(compType.isAbstract() || compType.isInterface() || compType.isEnum()) && !definitionsFactory.isExposedClass(compType)) {
throw new InvalidMappingException("portable entity " + toMap.getFullyQualifiedName()
+ " contains a field (" + field.getName() + ") that is not known to the marshaller: "
+ compType.getFullyQualifiedName());
}
/**
* This case handles the case where a constructor mapping has mapped the value, and there is no manually mapped
* reader on the key.
*/
if (writeKeys.contains(field.getName()) && !readKeys.contains(field.getName())) {
final MetaMethod getterMethod = MarshallingGenUtil.findGetterMethod(toMap, field.getName());
if (getterMethod != null) {
definition.addMemberMapping(new ReadMapping(field.getName(), field.getType(), getterMethod.getName()));
continue;
}
}
definition.addMemberMapping(new MemberMapping() {