Buggy code:
public class EngineThread implements Runnable { private RosterExceptionListener listener ; private CopyOnWriteArrayList < TaskProfile > taskList = null ; private CopyOnWriteArrayList < Staff > staffList = null ; private CopyOnWriteArrayList < Rule > ruleList = null ; private LocalDate currentDate ; private final Shift leaveShift ; private final Shift dayOffShift ; private List < Schedule > schedule = new ArrayList < Schedule > ( ) ; private String log = "" ; public EngineThread ( CopyOnWriteArrayList < TaskProfile > threadSafeTaskList , CopyOnWriteArrayList < Staff > threadSafeStaffList , CopyOnWriteArrayList < Rule > threadSafeRuleList , Shift leaveShift , Shift dayOffShift , LocalDate currentDate , RosterExceptionListener listener ) { } public List < Schedule > getSchedule ( ) { } public String getLog ( ) { } @ Override public void run ( ) { boolean error = true ; while ( error ) { try { log += ( "THREAD<seq2seq4repair_space>STARTED:<seq2seq4repair_space>" + ( Thread . currentThread ( ) . getName ( ) ) ) + "\n" ; Schedule sch = null ; List < Schedule > softRuleViolated = null ; List < Integer > violatedStaffIndexes = null ; int numStaffLeft = 0 ; LocalDate effectDate = null ; LocalDate expireDate = null ; boolean [ ] isBusyStaff = new boolean [ staffList . size ( ) ] ; for ( boolean b : isBusyStaff ) { b = false ; } log += ( "\n==========================<seq2seq4repair_space>CURRENT<seq2seq4repair_space>DATE:<seq2seq4repair_space>" + ( currentDate ) ) + "<seq2seq4repair_space>============================<seq2seq4repair_space>\n\n" ; Iterator < TaskProfile > taskIterator = taskList . iterator ( ) ; Task task = null ; TaskProfile taskProfile = null ; nextTask : while ( taskIterator . hasNext ( ) ) { taskProfile = taskIterator . next ( ) ; log += ( "\n------------------Task:<seq2seq4repair_space>" + taskProfile ) + "<seq2seq4repair_space>--------------------\n\n" ; softRuleViolated = new ArrayList < Schedule > ( ) ; violatedStaffIndexes = new ArrayList < Integer > ( ) ; task = taskProfile . getTask ( ) ; int numOfStaffNeeded = task . getHeadcount ( ) ; numStaffLeft = numOfStaffNeeded ; effectDate = task . getStartDate ( ) ; expireDate = task . getEndDate ( ) ; <START_BUG> if ( ( ( effectDate . compareTo ( currentDate ) ) >= 0 ) || ( ( expireDate . compareTo ( currentDate ) ) <= 0 ) ) { <END_BUG> log += ( ( ( ( ( "Task<seq2seq4repair_space>does<seq2seq4repair_space>not<seq2seq4repair_space>need<seq2seq4repair_space>to<seq2seq4repair_space>be<seq2seq4repair_space>peformed<seq2seq4repair_space>for<seq2seq4repair_space>current<seq2seq4repair_space>date.<seq2seq4repair_space>Current<seq2seq4repair_space>date:<seq2seq4repair_space>" + ( currentDate ) ) + "<seq2seq4repair_space>task<seq2seq4repair_space>dates:<seq2seq4repair_space>from<seq2seq4repair_space>" ) + effectDate ) + "<seq2seq4repair_space>to<seq2seq4repair_space>" ) + expireDate ) + "\n" ; continue ; } List < DayOfWeek > daysOfWeek = task . getDayOfWeekSet ( ) ; boolean isPerformedForCurrentDayOfWeek = false ; if ( ( ( daysOfWeek . size ( ) ) == 1 ) && ( ( daysOfWeek . get ( 0 ) . getNumber ( ) ) == 0 ) ) { log += "Task<seq2seq4repair_space>should<seq2seq4repair_space>be<seq2seq4repair_space>performed<seq2seq4repair_space>for<seq2seq4repair_space>the<seq2seq4repair_space>whole<seq2seq4repair_space>week\n" ; isPerformedForCurrentDayOfWeek = true ; } if ( ! isPerformedForCurrentDayOfWeek ) { int dayOfWeek = currentDate . dayOfWeek ( ) . get ( ) ; for ( DayOfWeek day : daysOfWeek ) { if ( ( day . getNumber ( ) ) == dayOfWeek ) { log += ( "Task<seq2seq4repair_space>should<seq2seq4repair_space>be<seq2seq4repair_space>performed<seq2seq4repair_space>for<seq2seq4repair_space>the<seq2seq4repair_space>current<seq2seq4repair_space>day:<seq2seq4repair_space>" + dayOfWeek ) + "\n" ; isPerformedForCurrentDayOfWeek = true ; break ; } else { log += ( "Task<seq2seq4repair_space>should<seq2seq4repair_space>be<seq2seq4repair_space>performed<seq2seq4repair_space>for<seq2seq4repair_space>the<seq2seq4repair_space>day:<seq2seq4repair_space>" + day ) + "\n" ; } } if ( ! isPerformedForCurrentDayOfWeek ) { log += ( "Task<seq2seq4repair_space>shouldn't<seq2seq4repair_space>be<seq2seq4repair_space>performed<seq2seq4repair_space>for<seq2seq4repair_space>the<seq2seq4repair_space>current<seq2seq4repair_space>day:<seq2seq4repair_space>" + dayOfWeek ) + "\n" ; continue ; } } Iterator < Staff > staffIterator = staffList . iterator ( ) ; Staff staff = null ; int index = - 1 ; staff : while ( staffIterator . hasNext ( ) ) { ++ index ; staff = staffIterator . next ( ) ; if ( isBusyStaff [ index ] ) { continue ; } log += ( "\n\n+++++++++++++++++++++++" + staff ) + "++++++++++++++++++++++++++++\n" ; char shiftForTheDay = '0' ; Set < StaffShift > staffShieftSet = staff . getStaffShiftSet ( ) ; for ( StaffShift staffShift : staffShieftSet ) { effectDate = staffShift . getEffectiveDate ( ) ; expireDate = staffShift . getExpireDate ( ) ; if ( staffShift . checkExpired ( currentDate ) ) { log += ( ( ( ( ( "Staff<seq2seq4repair_space>shieft<seq2seq4repair_space>is<seq2seq4repair_space>out<seq2seq4repair_space>of<seq2seq4repair_space>date.<seq2seq4repair_space>Current<seq2seq4repair_space>date:<seq2seq4repair_space>" + ( currentDate ) ) + "<seq2seq4repair_space>shift<seq2seq4repair_space>effective<seq2seq4repair_space>date<seq2seq4repair_space>" ) + effectDate ) + "<seq2seq4repair_space>expire<seq2seq4repair_space>" ) + expireDate ) + "\n" ; continue ; } else { ShiftPattern shiftPattern = staffShift . getShiftPattern ( ) ; int days = Days . daysBetween ( effectDate , currentDate ) . getDays ( ) ; String pattern = shiftPattern . getName ( ) ; int numOfDay = days % ( pattern . length ( ) ) ; shiftForTheDay = pattern . charAt ( numOfDay ) ; if ( shiftForTheDay == 'O' ) { log += ( "Staff<seq2seq4repair_space>has<seq2seq4repair_space>day<seq2seq4repair_space>off<seq2seq4repair_space>in<seq2seq4repair_space>the<seq2seq4repair_space>date:<seq2seq4repair_space>" + ( currentDate ) ) + "\n" ; sch = new Schedule ( null , staff , currentDate , dayOffShift , "Draft" , false ) ; schedule . add ( sch ) ; isBusyStaff [ index ] = true ; continue staff ; } break ; } } Set < StaffLeave > staffLeaveSet = staff . getStaffLeaveSet ( ) ; for ( StaffLeave staffLeave : staffLeaveSet ) { if ( currentDate . equals ( staffLeave . getDate ( ) ) ) { log += "Staff<seq2seq4repair_space>has<seq2seq4repair_space>annual<seq2seq4repair_space>leave<seq2seq4repair_space>today\n" ; if ( staffLeave . getStatus ( ) . equalsIgnoreCase ( "approved" ) ) { log += "leave<seq2seq4repair_space>is<seq2seq4repair_space>approved\n" ; sch = new Schedule ( null , staff , currentDate , leaveShift , "Draft" , false ) ; schedule . add ( sch ) ; isBusyStaff [ index ] = true ; continue staff ; } break ; } } boolean violatesSoftRule = false ; Iterator < Rule > ruleIterator = ruleList . iterator ( ) ; Rule rule = null ; while ( ruleIterator . hasNext ( ) ) { rule = ruleIterator . next ( ) ; SetupOption option = rule . getSetupOption ( ) ; Reference reference = rule . getReference ( ) ; Criteria criteria = rule . getCriteria ( ) ; String staffAttributeName = null ; String taskAttributeName = null ;

Fix:
if ( ( ( effectDate . compareTo ( currentDate ) ) > 0 ) || ( ( expireDate . compareTo ( currentDate ) ) < 0 ) ) {