[Demonstration 1]

[Buggy Method]
@RequestMapping("register")
public String register(@ModelAttribute UserVo user, HttpServletRequest request, HttpServletResponse response) {
    log.info("UserAction.register 参数:{}", user);
    List<String> erroList = UserInfoValidate.checkRegisterParam(user);
    if (erroList.isEmpty()) {
        ServiceResponse<UserVo> resp = userService.saveUser(user);
        if (ShoppingContants.RESP_CODE_SUCESS.equals(resp.getCode())) {
            //成功，返回到主頁
            request.getSession().setAttribute(ShoppingContants.USER_SESSION_KEY, user);
            return "redirect:/unlogin/home/index.do";
        }
    }
    //失败，返回到注册页
    request.setAttribute("erroList", erroList);
    request.setAttribute("user", user);
    return webPage("user/register");
}

[Buggy Hunk]
List<String> erroList=UserInfoValidate.checkRegisterParam(user);

[Patch]
Map<String,String> erroList=UserInfoValidate.checkRegisterParam(user);

[Demonstration 2]

[Buggy Method]
private ContentValues getValuesFromAttachment(Attachment attachment) {
    ContentValues values = new ContentValues();
    values.put(RemindyContract.AttachmentTable.COLUMN_NAME_TASK_FK.getName(), attachment.getTaskId());
    values.put(RemindyContract.AttachmentTable.COLUMN_NAME_TYPE.getName(), attachment.getType().name());
    switch(attachment.getType()) {
        case AUDIO:
            values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((AudioAttachment) attachment).getAudioFilename());
            break;
        case IMAGE:
            values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_BLOB.getName(), ((ImageAttachment) attachment).getThumbnail());
            values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((ImageAttachment) attachment).getFullImagePath());
            break;
        case TEXT:
            values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((TextAttachment) attachment).getText());
            break;
        case LIST:
            values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((ListAttachment) attachment).getText());
            break;
        case LINK:
            values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((LinkAttachment) attachment).getLink());
            break;
        default:
            throw new InvalidParameterException("AttachmentType is invalid. Value = " + attachment.getType());
    }
    return values;
}

[Buggy Hunk]
values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((ListAttachment) attachment).getText());

[Patch]
values.put(RemindyContract.AttachmentTable.COLUMN_NAME_CONTENT_TEXT.getName(), ((ListAttachment) attachment).getItemsJson());

[Demonstration 3]

[Buggy Method]
@VisibleForTesting
protected void saveIssue(SensorContext context, XmlSourceCode sourceCode) {
    for (XmlIssue xmlIssue : sourceCode.getXmlIssues()) {
        NewIssue newIssue = context.newIssue().forRule(xmlIssue.getRuleKey());
        NewIssueLocation location = newIssue.newLocation().on(sourceCode.getInputFile()).at(newTextRange(xmlIssue.getLine())).message(xmlIssue.getMessage());
        newIssue.at(location).save();
    }
}

[Buggy Hunk]
.at(newTextRange(xmlIssue.getLine()))

[Patch]
.at(sourceCode.getInputFile().selectLine(xmlIssue.getLine()))