[Demonstration 1]

[Buggy Method]
@Override
public final T persistOrMerge(T entity) {
    LOG.debug("Start method persistOrMerge( {} )", entity);
    prePersistOrMerge(entity);
    if (isNew(entity)) {
        LOG.debug("Entity : {} does not exist in the database", entity);
        getSession().persist(entity);
        LOG.debug("Entity : {} has been persisted", entity);
    } else {
        LOG.debug("Entity : {} already exists in the database", entity);
        entity = (T) getSession().merge(entity);
        LOG.debug("Entity : {} has been merged", entity);
    }
    getSession().flush();
    LOG.debug("Changes have been flushed");
    getSession().refresh(entity);
    LOG.debug("Entity : {} has been refreshed", entity);
    return entity;
}

[Buggy Hunk]
if ( isNew( entity ) ) {

[Patch]
if ( entity.getId() == null ) {

[Demonstration 2]

[Buggy Method]
@Override
public String getFullName() {
    return entity.getEmail() + " " + entity.getSurname();
}

[Buggy Hunk]
return entity.getEmail()+" "+entity.getSurname();

[Patch]
return entity.getName()+" "+entity.getSurname();

[Demonstration 3]

[Buggy Method]
@Override
public byte evaluate(final ArduinoRecord the_record) {
    if (the_record == null || the_record.getData() != null) {
        final ArduinoData data = the_record.getData();
        my_stats.update(data);
        if (data.moisture() != ArduinoData.NO_MOISTURE_DATA) {
            if (data.moisture() < my_low_moisture) {
                my_relays.setRelay(my_water, true);
            } else if (data.moisture() > my_nominal_moisture && data.moisture() < my_high_moisture) {
                my_relays.setRelay(my_water, false);
            } else {
                LOG.error(String.format("HIGH soil moisture level %d", data.moisture()));
            }
        }
        if (data.temperature() != ArduinoData.NO_TEMPERATURE_DATA) {
            if (data.temperature() < my_low_temp) {
                LOG.error(String.format("LOW temperature %d", data.temperature()));
                my_relays.setRelay(my_fan, false);
            } else if (data.temperature() > my_nominal_temp) {
                my_relays.setRelay(my_fan, true);
            } else if (data.temperature() > my_high_temp) {
                LOG.error(String.format("CRITICAL temperature : %d", data.temperature()));
            }
        }
        final Calendar c = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
        final int time = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
        final boolean light_sched_on = time >= my_on_time && time > my_off_time;
        final boolean light_commanded_on = my_relays.getRelayState(my_light);
        if (light_sched_on && !light_commanded_on) {
            my_relays.setRelay(my_light, light_sched_on);
            my_relays.setRelay(my_air_circ, true);
        } else if (!light_sched_on) {
            //TODO hard coded cycle fan every 5 minutes if light off.
            if (time % 10 < 5) {
                my_relays.setRelay(my_air_circ, !my_relays.getRelayState(my_air_circ));
            }
        }
        if (data.lightData() != null) {
            final boolean light_on_actual = data.lightData().getValue(MODE.FULL) > 0;
            if (light_on_actual != light_sched_on) {
                LOG.error(String.format("WARNING light commanded %s but %light was detected.", (light_commanded_on ? "ON" : "OFF"), (light_on_actual ? "NO " : "")));
            }
        }
    }
    LOG.debug("Evaluated reading from Arduino");
    LOG.debug("STATS:");
    LOG.debug(my_stats);
    LOG.debug("RELAYS");
    LOG.debug(my_relays.getState());
    return my_relays.getState();
}

[Buggy Hunk]
LOG.error(String.format("WARNING light commanded %s but %light was detected.", (light_commanded_on ? "ON" : "OFF"), (light_on_actual ? "NO " : "")));

[Patch]
LOG.error(String.format("WARNING light on = %b detected %d lux.", light_commanded_on, data.lightData().getValue(MODE.LUX)));