in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java [178:238]
public Map<String, Writer> doFindWriters(final Class<?> clazz) {
final Map<String, Writer> fieldWriters = this.fields.findWriters(clazz);
final Map<String, Writer> methodWriters = this.methods.findWriters(clazz);
final Map<String, Writer> writers = new HashMap<String, Writer>();
for (final Map.Entry<String, Writer> entry : fieldWriters.entrySet()) {
final String key = entry.getKey();
final Method m = getMethod("set" + Character.toUpperCase(key.charAt(0)) + (key.length() > 1 ? key.substring(1) : ""), clazz, toType(entry.getValue().getType()));
boolean skip = false;
if (m != null && (ignoreVisibilityFilter || Modifier.isPublic(m.getModifiers()))) {
for (final Writer w : methodWriters.values()) {
if (MethodAccessMode.MethodDecoratedType.class.cast(w).getMethod().equals(m)) {
if (w.getAnnotation(JohnzonProperty.class) != null) {
skip = true;
}
break;
}
}
} else if (!ignoreVisibilityFilter && m != null) {
continue;
}
if (skip) {
continue;
}
writers.put(entry.getKey(), entry.getValue());
}
for (final Map.Entry<String, Writer> entry : methodWriters.entrySet()) {
final Method mr = MethodAccessMode.MethodDecoratedType.class.cast(entry.getValue()).getMethod();
final String fieldName = 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 Writer w : fieldWriters.values()) {
if (FieldAccessMode.FieldDecoratedType.class.cast(w).getField().equals(f)) {
if (w.getAnnotation(JohnzonProperty.class) != null) {
skip = true;
}
break;
}
}
}
if (skip) {
continue;
}
final Writer existing = writers.get(entry.getKey());
if (existing == null) {
if (f != null) { // useful to hold the Field and transient state for example, just as fallback
writers.put(entry.getKey(), new CompositeWriter(
entry.getValue(), new FieldAccessMode.FieldWriter(f, f.getType())));
} else {
writers.put(entry.getKey(), entry.getValue());
}
} else {
writers.put(entry.getKey(), new CompositeWriter(entry.getValue(), existing));
}
}
return writers;
}