in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java [71:144]
public Map<String, Reader> doFindReaders(final Class<?> clazz) {
final Map<String, Reader> methodReaders = this.methods.findReaders(clazz);
final boolean record = isRecord(clazz);
if (record) {
return methodReaders;
}
final Map<String, Reader> fieldsReaders = this.fields.findReaders(clazz);
final Map<String, Reader> readers = new HashMap<>();
for (final Map.Entry<String, Reader> entry : fieldsReaders.entrySet()) {
final String key = entry.getKey();
Method m = record ?
getMethod(key, clazz) :
getMethod("get" + Character.toUpperCase(key.charAt(0)) + (key.length() > 1 ? key.substring(1) : ""), clazz);
if (m == null && !record && (boolean.class == entry.getValue().getType() || Boolean.class == entry.getValue().getType())) {
m = getMethod("is" + Character.toUpperCase(key.charAt(0)) + (key.length() > 1 ? key.substring(1) : ""), clazz);
}
boolean skip = false;
if (m != null && (ignoreVisibilityFilter || Modifier.isPublic(m.getModifiers()))) {
for (final Reader w : methodReaders.values()) {
if (MethodAccessMode.MethodDecoratedType.class.cast(w).getMethod().equals(m)) {
if (w.getAnnotation(JohnzonProperty.class) != null || w.getAnnotation(JohnzonIgnore.class) != null) {
skip = true;
}
break;
}
}
} else if (!ignoreVisibilityFilter && m != null) {
continue;
}
if (skip) {
continue;
}
readers.put(entry.getKey(), entry.getValue());
}
for (final Map.Entry<String, Reader> entry : methodReaders.entrySet()) {
final Method mr = MethodAccessMode.MethodDecoratedType.class.cast(entry.getValue()).getMethod();
final String fieldName = record ?
mr.getName() :
BeanUtil.decapitalize(mr.getName().startsWith("is") ?
mr.getName().substring(2) : mr.getName().substring(3));
final Field f = getField(fieldName, clazz);
boolean skip = false;
if (f != null) {
for (final Reader w : fieldsReaders.values()) {
if (FieldAccessMode.FieldDecoratedType.class.cast(w).getField().equals(f)) {
if (w.getAnnotation(JohnzonProperty.class) != null || w.getAnnotation(JohnzonIgnore.class) != null) {
skip = true;
}
break;
}
}
}
if (skip) {
continue;
}
final Reader existing = readers.get(entry.getKey());
if (existing == null) {
if (f != null) { // useful to hold the Field and transient state for example, just as fallback
readers.put(entry.getKey(), new CompositeReader(
entry.getValue(), new FieldAccessMode.FieldReader(f, f.getType())));
} else {
readers.put(entry.getKey(), entry.getValue());
}
} else {
readers.put(entry.getKey(), new CompositeReader(entry.getValue(), existing));
}
}
return readers;
}