From be70db9c8a886c870e91c1af12d6ff17c1af295f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 11 Oct 2010 19:29:50 +0200 Subject: [PATCH] Remove use of method generateDayAssignments daysUntil is used with its improved condition support FEA: ItEr61S08TimeUnitConfigurablePlanning --- .../entities/LimitingResourceAllocator.java | 111 ++++++++---------- 1 file changed, 51 insertions(+), 60 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/LimitingResourceAllocator.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/LimitingResourceAllocator.java index 07207d986..f4a29c728 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/LimitingResourceAllocator.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/LimitingResourceAllocator.java @@ -41,6 +41,9 @@ import org.navalplanner.business.planner.entities.SpecificResourceAllocation; import org.navalplanner.business.resources.entities.LimitingResourceQueue; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.workingday.EffortDuration; +import org.navalplanner.business.workingday.IntraDayDate; +import org.navalplanner.business.workingday.IntraDayDate.PartialDay; +import org.navalplanner.business.workingday.IntraDayDate.UntilEnd; import org.navalplanner.business.workingday.ResourcesPerDay; /** @@ -57,6 +60,27 @@ import org.navalplanner.business.workingday.ResourcesPerDay; */ public class LimitingResourceAllocator { + private static final class UntilEndAndEffort extends UntilEnd { + + private final EffortDuration goal; + private EffortDuration currentDuration = zero(); + + private UntilEndAndEffort(IntraDayDate endExclusive, EffortDuration goal) { + super(endExclusive); + this.goal = goal; + } + + @Override + protected boolean hasNext(boolean currentDateIsLessThanEnd) { + return currentDateIsLessThanEnd + || currentDuration.compareTo(goal) <= 0; + } + + public void setCurrent(EffortDuration currentDuration) { + this.currentDuration = currentDuration; + } + } + private final static ResourcesPerDay ONE_RESOURCE_PER_DAY = ResourcesPerDay .amount(new BigDecimal(1)); @@ -270,27 +294,21 @@ public class LimitingResourceAllocator { DateAndHour startTime, DateAndHour endsAfter) { List assignments = new LinkedList(); - - LocalDate date = startTime.getDate(); + ResourceCalendar calendar = resource.getCalendar(); final EffortDuration totalEffort = hours(resourceAllocation .getIntendedTotalHours()); EffortDuration effortAssigned = zero(); - // Generate first day assignment - EffortDuration effortCanAllocate = effortCanWorkOnDay(resource, date, - startTime.getHour()); - EffortDuration effortToAllocate = min(totalEffort, effortCanAllocate); - DayAssignment dayAssignment = createDayAssignment(resourceAllocation, - resource, date, effortToAllocate); - effortAssigned = effortAssigned.plus(addDayAssignment(assignments, - dayAssignment)); - - // Generate rest of day assignments - for (date = date.plusDays(1); effortAssigned.compareTo(totalEffort) < 0 - || endsAfter.isAfter(date); date = date.plusDays(1)) { - effortAssigned = effortAssigned.plus(addDayAssignment( - assignments, - generateDayAssignment(resourceAllocation, resource, date, - totalEffort))); + UntilEndAndEffort condition = new UntilEndAndEffort( + endsAfter.toIntraDayDate(), totalEffort); + for (PartialDay each : startTime.toIntraDayDate().daysUntil(condition)) { + EffortDuration effortForDay = EffortDuration.min( + calendar.asDurationOn(each, + ONE_RESOURCE_PER_DAY), totalEffort); + DayAssignment dayAssignment = createDayAssignment( + resourceAllocation, resource, each.getDate(), effortForDay); + effortAssigned = effortAssigned.plus(addDayAssignment(assignments, + dayAssignment)); + condition.setCurrent(effortAssigned); } if (effortAssigned.compareTo(totalEffort) > 0) { stripStartAssignments(assignments, @@ -318,34 +336,36 @@ public class LimitingResourceAllocator { private static List generateDayAssignmentsStartingFromEnd(ResourceAllocation resourceAllocation, Resource resource, DateAndHour endTime) { - - List assignments = new ArrayList(); + ResourceCalendar calendar = resource.getCalendar(); + List result = new ArrayList(); LocalDate date = endTime.getDate(); EffortDuration totalIntended = hours(resourceAllocation .getIntendedTotalHours()); // Generate last day assignment - EffortDuration effortCanAllocate = effortCanWorkOnDay(resource, date, - endTime.getHour()); + PartialDay firstDay = new PartialDay(IntraDayDate.startOfDay(date), + IntraDayDate.create(date, hours(endTime.getHour()))); + EffortDuration effortCanAllocate = min(totalIntended, + calendar.asDurationOn(firstDay, ONE_RESOURCE_PER_DAY)); if (effortCanAllocate.compareTo(zero()) > 0) { - EffortDuration effortToAllocate = min(totalIntended, - effortCanAllocate); DayAssignment dayAssignment = createDayAssignment( - resourceAllocation, resource, date, effortToAllocate); - totalIntended = totalIntended.minus(addDayAssignment(assignments, + resourceAllocation, resource, date, effortCanAllocate); + totalIntended = totalIntended.minus(addDayAssignment(result, dayAssignment)); } // Generate rest of day assignments for (date = date.minusDays(1); totalIntended.compareTo(zero()) > 0; date = date .minusDays(1)) { - totalIntended = totalIntended.minus(addDayAssignment( - assignments, - generateDayAssignment(resourceAllocation, resource, date, - totalIntended))); + EffortDuration duration = min(totalIntended, calendar.asDurationOn( + PartialDay.wholeDay(date), ONE_RESOURCE_PER_DAY)); + DayAssignment dayAssigment = createDayAssignment( + resourceAllocation, resource, date, duration); + totalIntended = totalIntended.minus(addDayAssignment(result, + dayAssigment)); } - return assignments; + return result; } private static DayAssignment createDayAssignment( @@ -368,35 +388,6 @@ public class LimitingResourceAllocator { return zero(); } - private static EffortDuration effortCanWorkOnDay(final Resource resource, - final LocalDate date, int alreadyWorked) { - final ResourceCalendar calendar = resource.getCalendar(); - EffortDuration durationCanAllocate = calendar - .asDurationOn(date, ONE_RESOURCE_PER_DAY); - EffortDuration alreadyWorkedAsDuration = hours(alreadyWorked); - if (durationCanAllocate.compareTo(alreadyWorkedAsDuration) <= 0) { - return zero(); - } - return durationCanAllocate.minus(alreadyWorkedAsDuration); - } - - private static DayAssignment generateDayAssignment( - final ResourceAllocation resourceAllocation, - Resource resource, - final LocalDate date, EffortDuration intendedEffort) { - - final ResourceCalendar calendar = resource.getCalendar(); - - EffortDuration effortCanAllocate = calendar.asDurationOn(date, - ONE_RESOURCE_PER_DAY); - if (effortCanAllocate.compareTo(zero()) > 0) { - EffortDuration toAllocate = min(intendedEffort, effortCanAllocate); - return createDayAssignment(resourceAllocation, resource, date, - toAllocate); - } - return null; - } - public static DateAndHour startTimeToAllocateStartingFromEnd( ResourceAllocation resourceAllocation, Resource resource, Gap gap) {