[Demonstration 1]

[Buggy Method]
private void doSubTag(Object object, StringBuilder sbStr) {
    Node node = getNode(object.getClass());
    String[] subTags = node.getTags();
    for (String tag : subTags) {
        Field field = node.getTagField(tag);
        if (field != null) {
            try {
                Object value = field.get(object);
                if (value != null) {
                    Class<?> clazz = value.getClass();
                    if (ConverterUtil.isConvertable(clazz)) {
                        appendTag(sbStr, tag, value);
                    } else if (clazz.isArray()) {
                        appendTagBegin(sbStr, tag);
                        Object[] array = (Object[]) value;
                        for (Object subVal : array) {
                            doClass(subVal, sbStr, null);
                        }
                        appendTagEnd(sbStr, tag);
                    } else if (List.class.isAssignableFrom(clazz)) {
                        appendTagBegin(sbStr, tag);
                        List<?> list = (List<?>) value;
                        for (Object subVal : list) {
                            doClass(subVal, sbStr, null);
                        }
                        appendTagEnd(sbStr, tag);
                    } else if (Map.class.isAssignableFrom(clazz)) {
                        XmlMap fieldTag = field.getAnnotation(XmlMap.class);
                        boolean isItemVisible = true, isKeyTag = false, isValueTag = false;
                        String itemTagName = "item", keyName = "key", valueName = "value";
                        if (fieldTag != null) {
                            tag = ifEmpty(fieldTag.name(), tag);
                            itemTagName = ifEmpty(fieldTag.itemTag(), itemTagName);
                            valueName = fieldTag.valueName();
                            isItemVisible = fieldTag.isItemVisible();
                            isKeyTag = fieldTag.isKeyTag();
                            isValueTag = fieldTag.isValueTag();
                            if (StringUtils.isEmpty(valueName)) {
                                isValueTag = true;
                                keyName = ifEmpty(fieldTag.keyName(), keyName);
                            }
                            // 如果key是属性，不允许空
                            if (!isKeyTag) {
                                keyName = ifEmpty(fieldTag.keyName(), keyName);
                            }
                            // 调整isItemVisible
                            isItemVisible = isItemVisible || (!isKeyTag && !isValueTag);
                            appendTagBegin(sbStr, tag);
                            Map<?, ?> map = (Map<?, ?>) value;
                            for (Entry<?, ?> entry : map.entrySet()) {
                                if (isItemVisible) {
                                    sbStr.append(ANGLE_BRACKET[0] + itemTagName);
                                    if (!isKeyTag) {
                                        appendAttribute(sbStr, keyName, entry.getKey());
                                        if (!isValueTag) {
                                            appendAttribute(sbStr, valueName, entry.getValue());
                                        }
                                    }
                                    sbStr.append(ANGLE_BRACKET[2]);
                                    if (isKeyTag) {
                                        if (!isValueTag) {
                                            sbStr.append(ANGLE_BRACKET[0] + entry.getKey());
                                            appendAttribute(sbStr, valueName, entry.getValue());
                                            sbStr.append(ANGLE_BRACKET[2]);
                                            appendTagEnd(sbStr, entry.getKey() + "");
                                        } else {
                                            appendTagBegin(sbStr, entry.getKey() + "");
                                            appendTag(sbStr, valueName, entry.getValue());
                                            appendTagEnd(sbStr, entry.getKey() + "");
                                        }
                                    }
                                    if (isValueTag) {
                                        appendTag(sbStr, valueName, entry.getValue());
                                    }
                                    appendTagEnd(sbStr, itemTagName);
                                } else {
                                    if (!isValueTag) {
                                        sbStr.append(ANGLE_BRACKET[0] + entry.getKey());
                                        appendAttribute(sbStr, valueName, entry.getValue());
                                        sbStr.append(ANGLE_BRACKET[2]);
                                        appendTagEnd(sbStr, entry.getKey() + "");
                                    } else {
                                        appendTagBegin(sbStr, entry.getKey() + "");
                                        appendTag(sbStr, valueName, entry.getValue());
                                        appendTagEnd(sbStr, entry.getKey() + "");
                                    }
                                }
                            }
                            appendTagEnd(sbStr, tag);
                        }
                    } else {
                        doClass(value, sbStr, tag);
                    }
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                logger.error(e.getMessage(), e);
            }
        }
    }
}

[Buggy Hunk]
if(isValueTag) {

[Patch]
if(!isKeyTag && isValueTag) {

[Demonstration 2]

[Buggy Method]
private boolean isNextAcronym(char c, char nc) {
    return ((Character.isLowerCase(c) && Character.isUpperCase(nc)) || (Character.isLetter(c) && Character.isLetter(nc)));
}

[Buggy Hunk]
return ((Character.isLowerCase(c) && Character.isUpperCase(nc)) || (Character.isLetter(c) && Character.isLetter(nc)));

[Patch]
return ((Character.isLowerCase(c) && Character.isUpperCase(nc)) || (!Character.isLetter(c) && Character.isLetter(nc)));

[Demonstration 3]

[Buggy Method]
private String getSuspectName() {
    String suspect = null;
    // Find suspect name in contacts db
    if (mCrime.getSuspectId() != null) {
        // dafault in case no permission to read name
        suspect = mCrime.getSuspectId();
        int permissionToReadContacts = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS);
        if (PackageManager.PERMISSION_GRANTED == permissionToReadContacts) {
            // TODO make a generic code to query without so much boilerplate
            String[] queryFields = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
            // TODO make this in some utils
            String selection = ContactsContract.Contacts._ID + " = ?";
            String[] selectionArgs = new String[] { mCrime.getSuspectId() };
            Cursor c = getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, queryFields, selection, selectionArgs, null);
            try {
                if (c.getCount() > 0) {
                    c.moveToFirst();
                    suspect = c.getString(0);
                }
            } finally {
                c.close();
            }
        } else {
            askForReadContactsPermission();
        }
    }
    return suspect;
}

[Buggy Hunk]
String suspect = null;

[Patch]
String suspect = getString(R.string.crime_suspect_text);