[Demonstration 1]

[Buggy Method]
@MotechListener(subjects = { EventSubjects.CREATE_AND_ENROLL })
public void handleCreateAndEnroll(MotechEvent event) {
    Map<String, Object> params = new HashMap<>();
    params.put(EventParams.PROGRAM, event.getParameters().remove(EventParams.PROGRAM));
    params.put(EventParams.DATE, event.getParameters().remove(EventParams.DATE));
    params.put(EventParams.EXTERNAL_ID, event.getParameters().get(EventParams.EXTERNAL_ID));
    TrackedEntityInstanceDto instance = createTrackedEntityInstanceFromParams(event.getParameters());
    dhisWebService.createTrackedEntityInstance(instance);
    MotechEvent newEvent = new MotechEvent(EventSubjects.ENROLL_IN_PROGRAM, params);
    EnrollmentDto enrollmentDto = createEnrollmentFromParams(event.getParameters());
    dhisWebService.createEnrollment(enrollmentDto);
}

[Buggy Hunk]
EnrollmentDto enrollmentDto = createEnrollmentFromParams(event.getParameters());

[Patch]
EnrollmentDto enrollmentDto = createEnrollmentFromParams(newEvent.getParameters());

[Demonstration 2]

[Buggy Method]
private void payFromAccount(final Map<String, Object> params, final CallbackBuilder callbackBuilder, final Object id) {
    PinTransaction pin = JSONParser.createJsonPinTransaction((String) params.get("sourceIBAN"), (String) params.get("targetIBAN"), "", (String) params.get("pinCode"), Long.parseLong((String) params.get("pinCard")), Double.parseDouble((String) params.get("amount")), false);
    System.out.printf("%s Sending pin transaction.\n", PREFIX);
    pinClient.putFormAsyncWith1Param("/services/pin/transaction", "request", jsonConverter.toJson(pin), (code, contentType, body) -> {
        if (code == HTTP_OK) {
            Transaction reply = jsonConverter.fromJson(JSONParser.removeEscapeCharacters(body), Transaction.class);
            if (reply.isSuccessful() && reply.isProcessed()) {
                System.out.printf("%s Pin transaction successfull.\n\n\n", PREFIX);
                Map<String, Object> result = new HashMap<>();
                JSONRPC2Response response = new JSONRPC2Response(result, id);
                callbackBuilder.build().reply(response.toJSONString());
            } else if (!reply.isProcessed()) {
                System.out.printf("%s Pin transaction couldn't be processed.\n\n\n", PREFIX);
                //todo figure out how to fetch what cause the failed processing.
            } else {
                System.out.printf("%s Pin transaction was not successfull.\n\n\n", PREFIX);
                //todo send unsuccessfull reply, find way to fetch cause of this.
            }
        } else {
            System.out.printf("%s Pin transaction request failed.\n\n\n", PREFIX);
            //todo figure out a way to find out what made the request fail.
        }
    });
}

[Buggy Hunk]
Long.parseLong((String) params.get("pinCard")), Double.parseDouble((String) params.get("amount")), false);

[Patch]
Long.parseLong((String) params.get("pinCard")), (Double) params.get("amount"), false);

[Demonstration 3]

[Buggy Method]
private static Date parseToUTC(String format, String dateString) {
    DateTimeFormatter formatter = DateTimeFormat.forPattern(format).withOffsetParsed();
    DateTime dateTime = formatter.withZoneUTC().parseDateTime(dateString);
    GregorianCalendar cal = dateTime.toGregorianCalendar();
    return cal.getTime();
}

[Buggy Hunk]
DateTime dateTime = formatter.withZoneUTC().parseDateTime(dateString);

[Patch]
DateTime dateTime = formatter.withZone(DateTimeZone.UTC).parseDateTime(dateString);