[Demonstration 1]

[Buggy Method]
@Override
public Group updateGroup(Group oldGroup, Group newGroup) throws CharonException {
    //if operating in dumb mode, do not persist the operation, only provision to providers
    if (getServiceProvider(isBulkUserAdd).getInboundProvisioningConfig().isDumbMode()) {
        if (log.isDebugEnabled()) {
            log.debug("This instance is operating in dumb mode. " + "Hence, operation is not persisted, it will only be provisioned.");
        }
        this.provision(ProvisioningOperation.PUT, newGroup);
        return newGroup;
    }
    try {
        String userStoreDomainFromSP = getUserStoreDomainFromSP();
        if (userStoreDomainFromSP != null && !userStoreDomainFromSP.equalsIgnoreCase(IdentityUtil.extractDomainFromName(oldGroup.getDisplayName()))) {
            throw new CharonException("Group :" + oldGroup.getDisplayName() + "is not belong to user store " + userStoreDomainFromSP + "Hence group updating fail");
        }
    } catch (IdentityApplicationManagementException e) {
        throw new CharonException("Error retrieving User Store name. ", e);
    }
    oldGroup.setDisplayName(UserCoreUtil.addDomainToName(UserCoreUtil.removeDomainFromName(oldGroup.getDisplayName()), IdentityUtil.extractDomainFromName(oldGroup.getDisplayName())));
    newGroup.setDisplayName(UserCoreUtil.addDomainToName(UserCoreUtil.removeDomainFromName(newGroup.getDisplayName()), IdentityUtil.extractDomainFromName(newGroup.getDisplayName())));
    try {
        String primaryDomain = IdentityUtil.getPrimaryDomainName();
        if (IdentityUtil.extractDomainFromName(newGroup.getDisplayName()).equals(primaryDomain) && !(IdentityUtil.extractDomainFromName(oldGroup.getDisplayName()).equals(primaryDomain))) {
            String userStoreDomain = IdentityUtil.extractDomainFromName(oldGroup.getDisplayName());
            newGroup.setDisplayName(UserCoreUtil.addDomainToName(newGroup.getDisplayName(), userStoreDomain));
        } else if (!IdentityUtil.extractDomainFromName(oldGroup.getDisplayName()).equals(IdentityUtil.extractDomainFromName(newGroup.getDisplayName()))) {
            throw new IdentitySCIMException("User store domain of the group is not matching with the given SCIM group Id.");
        }
        newGroup.setDisplayName(SCIMCommonUtils.getGroupNameWithDomain(newGroup.getDisplayName()));
        oldGroup.setDisplayName(SCIMCommonUtils.getGroupNameWithDomain(oldGroup.getDisplayName()));
        if (log.isDebugEnabled()) {
            log.debug("Updating group: " + oldGroup.getDisplayName());
        }
        String groupName = newGroup.getDisplayName();
        String userStoreDomainForGroup = IdentityUtil.extractDomainFromName(groupName);
        if (newGroup.getMembers() != null && !(newGroup.getMembers().isEmpty()) && !isInternalOrApplicationGroup(userStoreDomainForGroup)) {
            newGroup = addDomainToUserMembers(newGroup, userStoreDomainForGroup);
        }
        /*set thread local property to signal the downstream SCIMUserOperationListener
                about the provisioning route.*/
        SCIMCommonUtils.setThreadLocalIsManagedThroughSCIMEP(true);
        boolean updated = false;
        /*set thread local property to signal the downstream SCIMUserOperationListener
                about the provisioning route.*/
        SCIMCommonUtils.setThreadLocalIsManagedThroughSCIMEP(true);
        //check if the user ids sent in updated group exist in the user store and the associated user name
        //also a matching one.
        List<String> userIds = newGroup.getMembers();
        List<String> userDisplayNames = newGroup.getMembersWithDisplayName();
        /* compare user store domain of group and user store domain of user name , if there is a mismatch do not
                 update the group */
        if (userDisplayNames != null && userDisplayNames.size() > 0) {
            for (String userDisplayName : userDisplayNames) {
                String userStoreDomainForUser = IdentityUtil.extractDomainFromName(userDisplayName);
                if (!isInternalOrApplicationGroup(userStoreDomainForGroup) && !userStoreDomainForGroup.equalsIgnoreCase(userStoreDomainForUser)) {
                    throw new IdentitySCIMException(userDisplayName + " does not " + "belongs to user store " + userStoreDomainForGroup);
                }
            }
        }
        if (CollectionUtils.isNotEmpty(userIds)) {
            String[] userNames = null;
            for (String userId : userIds) {
                userNames = carbonUM.getUserList(SCIMConstants.ID_URI, UserCoreUtil.addDomainToName(userId, userStoreDomainForGroup), UserCoreConstants.DEFAULT_PROFILE);
                if (userNames == null || userNames.length == 0) {
                    String error = "User: " + userId + " doesn't exist in the user store. " + "Hence, can not update the group: " + oldGroup.getDisplayName();
                    throw new IdentitySCIMException(error);
                } else {
                    if (!UserCoreUtil.isContain(UserCoreUtil.removeDomainFromName(userNames[0]), UserCoreUtil.removeDomainFromNames(userDisplayNames.toArray(new String[userDisplayNames.size()])))) {
                        throw new IdentitySCIMException("Given SCIM user Id and name not matching..");
                    }
                }
            }
        }
        //we do not update Identity_SCIM DB here since it is updated in SCIMUserOperationListener's methods.
        //update name if it is changed
        if (!(oldGroup.getDisplayName().equalsIgnoreCase(newGroup.getDisplayName()))) {
            //update group name in carbon UM
            carbonUM.updateRoleName(oldGroup.getDisplayName(), newGroup.getDisplayName());
            updated = true;
        }
        //find out added members and deleted members..
        List<String> oldMembers = oldGroup.getMembersWithDisplayName();
        List<String> newMembers = newGroup.getMembersWithDisplayName();
        if (newMembers != null) {
            List<String> addedMembers = new ArrayList<>();
            List<String> deletedMembers = new ArrayList<>();
            //check for deleted members
            if (CollectionUtils.isNotEmpty(oldMembers)) {
                for (String oldMember : oldMembers) {
                    if (newMembers != null && newMembers.contains(oldMember)) {
                        continue;
                    }
                    deletedMembers.add(oldMember);
                }
            }
            //check for added members
            if (CollectionUtils.isNotEmpty(newMembers)) {
                for (String newMember : newMembers) {
                    if (oldMembers != null && oldMembers.contains(newMember)) {
                        continue;
                    }
                    addedMembers.add(newMember);
                }
            }
            if (CollectionUtils.isNotEmpty(addedMembers) || CollectionUtils.isNotEmpty(deletedMembers)) {
                carbonUM.updateUserListOfRole(newGroup.getDisplayName(), deletedMembers.toArray(new String[deletedMembers.size()]), addedMembers.toArray(new String[addedMembers.size()]));
                updated = true;
            }
        }
        if (updated) {
            log.info("Group: " + newGroup.getDisplayName() + " is updated through SCIM.");
        } else {
            log.warn("There is no updated field in the group: " + oldGroup.getDisplayName() + ". Therefore ignoring the provisioning.");
        }
    } catch (UserStoreException | IdentitySCIMException e) {
        throw new CharonException("Error occurred while updating old group : " + oldGroup.getDisplayName(), e);
    }
    return newGroup;
}

[Buggy Hunk]
if (newMembers != null && newMembers.contains(oldMember)) {

[Patch]
if (newMembers.contains(oldMember)) {

[Demonstration 2]

[Buggy Method]
public int addAbsence(DisciplineVo disciplineVo) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues disciplineTableValues = new ContentValues();
    disciplineTableValues.put(KEY_FALTAS, disciplineVo.totalFaults + 1);
    Calendar c = Calendar.getInstance();
    String currentDate = String.valueOf(c.get(Calendar.DAY_OF_MONTH)) + "/" + String.valueOf(c.get(Calendar.MONTH)) + "/" + String.valueOf(c.get(Calendar.YEAR));
    ContentValues absenceTableValues = new ContentValues();
    absenceTableValues.put(KEY_FOREIGN_ID, disciplineVo.hash);
    absenceTableValues.put(KEY_DATE, currentDate);
    int update_discipline_status = db.update(TABLE_DISCIPLINE, disciplineTableValues, KEY_ID + " = ?", new String[] { String.valueOf(disciplineVo.id) });
    db.insert(TABLE_ABSENCES, null, absenceTableValues);
    db.close();
    return update_discipline_status;
}

[Buggy Hunk]
String currentDate = String.valueOf(c.get(Calendar.DAY_OF_MONTH)) + "/" + String.valueOf(c.get(Calendar.MONTH)) + "/" + String.valueOf(c.get(Calendar.YEAR));

[Patch]
String currentDate = String.valueOf(c.get(Calendar.DAY_OF_MONTH)) + "/" + String.valueOf(c.get(Calendar.MONTH) + 1) + "/" + String.valueOf(c.get(Calendar.YEAR));

[Demonstration 3]

[Buggy Method]
public Result editGet(int patientId) {
    CurrentUser currentUserSession = sessionService.retrieveCurrentUserSession();
    EditViewModelGet viewModelGet = new EditViewModelGet();
    String message;
    // Get settings
    ServiceResponse<SettingItem> response = searchService.getSystemSettings();
    if (response.hasErrors()) {
        throw new RuntimeException();
    }
    viewModelGet.setSettings(response.getResponseObject());
    //Get Patient
    ServiceResponse<PatientItem> patientItemServiceResponse = searchService.retrievePatientItemByPatientId(patientId);
    if (patientItemServiceResponse.hasErrors()) {
        message = patientItemServiceResponse.getErrors().get("");
        return ok(index.render(currentUserSession, message, 0));
    }
    PatientItem patient = patientItemServiceResponse.getResponseObject();
    viewModelGet.setPatient(patient);
    // Convert patients attributes to Metric if metric setting is on
    if (viewModelGet.getSettings().isMetric()) {
        patient = LocaleUnitConverter.toMetric(patient);
    }
    //get the patient encounter item
    ServiceResponse<PatientEncounterItem> patientEncounterItemServiceResponse = searchService.retrieveRecentPatientEncounterItemByPatientId(patient.getId());
    if (patientEncounterItemServiceResponse.hasErrors()) {
        message = patientEncounterItemServiceResponse.getErrors().get("");
        return ok(index.render(currentUserSession, message, 0));
    }
    PatientEncounterItem patientEncounterItem = patientEncounterItemServiceResponse.getResponseObject();
    //check for encounter closed
    if (patientEncounterItem.getIsClosed()) {
        return ok(index.render(currentUserSession, "That patient's encounter has been closed.", 0));
    }
    viewModelGet.setPatientEncounterItem(patientEncounterItem);
    //find patient prescriptions, they do have to exist
    ServiceResponse<List<PrescriptionItem>> prescriptionItemServiceResponse = searchService.retrieveUnreplacedPrescriptionItems(patientEncounterItem.getId());
    if (prescriptionItemServiceResponse.hasErrors()) {
        throw new RuntimeException();
    } else if (prescriptionItemServiceResponse.getResponseObject().size() < 1) {
        return ok(index.render(currentUserSession, "No prescriptions found for that patient", 0));
    }
    viewModelGet.setMedications(prescriptionItemServiceResponse.getResponseObject());
    //find patient problems, they do not have to exist.
    ServiceResponse<List<ProblemItem>> problemItemServiceResponse = encounterService.retrieveProblemItems(patientEncounterItem.getId());
    if (problemItemServiceResponse.hasErrors()) {
        throw new RuntimeException();
    } else {
        if (problemItemServiceResponse.getResponseObject().size() > 0) {
            viewModelGet.setProblems(problemItemServiceResponse.getResponseObject());
        }
    }
    return ok(edit.render(currentUserSession, viewModelGet, false));
}

[Buggy Hunk]
ServiceResponse<SettingItem> response = searchService.getSystemSettings();

[Patch]
ServiceResponse<SettingItem> response = searchService.retrieveSystemSettings();