[Demonstration 1]

[Buggy Method]
private FfItem handleChakram(final FfBookInformations info, final HttpSessionWrapper wrapper) {
    final int[] rollResult = generator.getRandomNumber(2);
    final ParagraphData data = wrapper.getParagraph().getData();
    final SorCharacter character = (SorCharacter) wrapper.getCharacter();
    final FfCharacterHandler characterHandler = info.getCharacterHandler();
    final FfAttributeHandler attributeHandler = characterHandler.getAttributeHandler();
    final FfEnemy enemy = getEnemy(wrapper, info);
    final FfItem item = (FfItem) characterHandler.getItemHandler().getItem(character, THROWING_DARTS_ID);
    if (attributeHandler.resolveValue(character, "skill") > rollResult[0]) {
        recordRollResult(rollResult, data, "success");
        appendText(data, "page.sor.chakramHit", enemy.getCommonName());
        enemy.setStamina(enemy.getStamina() - 2);
    } else {
        recordRollResult(rollResult, data, "failure");
        appendText(data, "page.sor.chakramMissed", enemy.getCommonName());
    }
    return item;
}

[Buggy Hunk]
final FfItem item = (FfItem) characterHandler.getItemHandler().getItem(character, THROWING_DARTS_ID);

[Patch]
final FfItem item = (FfItem) characterHandler.getItemHandler().getItem(character, CHAKRAM_ID);

[Demonstration 2]

[Buggy Method]
@Override
protected String deserializeResponseData(Node responseNode, SOAPMessage message) throws SOAPException {
    // Look for the "processingTime" node, ignore all the other elements
    for (int i = 0; i < responseNode.getChildNodes().getLength(); i++) {
        if (responseNode.getChildNodes().item(i).getNodeType() == Node.ELEMENT_NODE && responseNode.getChildNodes().item(i).getLocalName().equals("processingTime")) {
            return responseNode.getChildNodes().item(i).getTextContent();
        }
    }
    return null;
}

[Buggy Hunk]
&& responseNode.getChildNodes().item(i).getLocalName().equals("processingTime")) {

[Patch]
&& "processingTime".equals(responseNode.getChildNodes().item(i).getLocalName())) {

[Demonstration 3]

[Buggy Method]
public ServerResponse tryAnswerFromCache(UserRequest request) {
    // Only get requests are supported for caching
    if (!"GET".equals(request.getMethod())) {
        return null;
    }
    MaxAgeCacheData data = expirationData.get(request.getQuery());
    if (data == null) {
        return null;
    }
    if (data.getExpiration() < System.currentTimeMillis()) {
        expirationData.remove(request.getQuery());
        return null;
    }
    // We need to send response with the remaining time
    data.getServerResponse().updateMaxAge(data.getExpiration());
    return data.getServerResponse();
}

[Buggy Hunk]
data.getServerResponse().updateMaxAge(data.getExpiration());

[Patch]
data.getServerResponse().updateMaxAge((data.getExpiration() - System.currentTimeMillis()) / 1000);