diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java index a3cb7f590..e98f14460 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -325,29 +325,64 @@ public class Task extends TaskElement { return startConstraint; } + private static abstract class AllocationModificationStrategy { + + public abstract List getResourcesPerDayModified( + List> allocations); + + public abstract List getHoursModified( + List> allocations); + + } + + private static class WithTheSameHoursAndResourcesPerDay extends + AllocationModificationStrategy { + + @Override + public List getHoursModified( + List> allocations) { + return HoursModification.fromExistent(allocations); + } + + @Override + public List getResourcesPerDayModified( + List> allocations) { + return ResourcesPerDayModification.fromExistent(allocations); + } + + } + @Override protected void moveAllocations() { + reassign(new WithTheSameHoursAndResourcesPerDay()); + } + + private void reassign(AllocationModificationStrategy strategy) { List copied = ModifiedAllocation .copy(getResourceAllocations()); - List allocations = ResourcesPerDayModification - .fromExistent(ModifiedAllocation.modified(copied)); + List> toBeModified = ModifiedAllocation + .modified(copied); + List allocations = strategy + .getResourcesPerDayModified(toBeModified); if (allocations.isEmpty()) { return; } switch (calculatedValue) { case NUMBER_OF_HOURS: - ResourceAllocation.allocating(allocations).allocateOnTaskLength(); + ResourceAllocation.allocating(allocations) + .allocateOnTaskLength(); break; case END_DATE: - LocalDate end = ResourceAllocation.allocating(allocations) - .untilAllocating(getAssignedHours()); + LocalDate end = ResourceAllocation + .allocating(allocations) + .untilAllocating(getAssignedHours()); setEndDate(end.toDateTimeAtStartOfDay().toDate()); break; case RESOURCES_PER_DAY: - ResourceAllocation.allocatingHours( - HoursModification.fromExistent(ModifiedAllocation - .modified(copied))).allocateUntil( - new LocalDate(getEndDate())); + List hoursModified = strategy + .getHoursModified(toBeModified); + ResourceAllocation.allocatingHours(hoursModified) + .allocateUntil(new LocalDate(getEndDate())); break; default: throw new RuntimeException("cant handle: " + calculatedValue);