diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java index 8fc27dff8..188bd1912 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java @@ -214,8 +214,7 @@ public class GenericResourceAllocation extends return GenericDayAssignment.class; } - @Override - protected List createAssignmentsAtDay( + public List createAssignmentsAtDay( List resources, LocalDate day, ResourcesPerDay resourcesPerDay, final int maxLimit) { final int hours = Math.min(calculateTotalToDistribute(day, diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java index 9c5474919..647a18636 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java @@ -169,11 +169,9 @@ public abstract class ResourceAllocation extends @Override protected List createAssignmentsAtDay( - ResourceAllocation resourceAllocation, - List resources, LocalDate day, - ResourcesPerDay resourcesPerDay, Integer limit) { - return resourceAllocation.createAssignmentsAtDay(resources, - day, resourcesPerDay, limit); + AllocationBeingModified allocation, LocalDate day, + Integer limit) { + return allocation.createAssignmentsAtDay(day, limit); } @Override @@ -212,10 +210,6 @@ public abstract class ResourceAllocation extends public abstract List getAssociatedResources(); - protected abstract List createAssignmentsAtDay( - List resources, LocalDate day, - ResourcesPerDay resourcesPerDay, int limit); - protected void setResourcesPerDay(ResourcesPerDay resourcesPerDay) { Validate.notNull(resourcesPerDay); this.resourcesPerDay = resourcesPerDay; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java index 478af77da..d02247c51 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java @@ -149,9 +149,7 @@ public class SpecificResourceAllocation extends return SpecificDayAssignment.class; } - @Override - protected List createAssignmentsAtDay( - List resources, LocalDate day, + public List createAssignmentsAtDay(LocalDate day, ResourcesPerDay resourcesPerDay, int limit) { int hours = calculateTotalToDistribute(day, resourcesPerDay); SpecificDayAssignment specific = SpecificDayAssignment.create(day, Math diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationBeingModified.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationBeingModified.java index 902f927b9..c74ec6b95 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationBeingModified.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationBeingModified.java @@ -26,33 +26,65 @@ import java.util.Collections; import java.util.List; import org.apache.commons.lang.Validate; +import org.joda.time.LocalDate; +import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.ResourcesPerDay; import org.navalplanner.business.planner.entities.SpecificResourceAllocation; import org.navalplanner.business.resources.entities.Resource; -public class AllocationBeingModified { +public abstract class AllocationBeingModified { private static class GenericAllocationBeingModified extends AllocationBeingModified { + private final GenericResourceAllocation genericAllocation; + GenericAllocationBeingModified( - ResourceAllocation resourceAllocation, + GenericResourceAllocation resourceAllocation, ResourcesPerDay resourcesPerDay, Collection resources) { super(resourceAllocation, resourcesPerDay, resources); Validate.isTrue(!resources.isEmpty()); + this.genericAllocation = resourceAllocation; + } + + @Override + public void applyOnTaskDuration() { + genericAllocation.forResources(getResources()).allocate(getGoal()); + } + + @Override + public List createAssignmentsAtDay(LocalDate day, + int limit) { + return genericAllocation.createAssignmentsAtDay(getResources(), + day, getGoal(), limit); } } private static class SpecificAllocationBeingModified extends AllocationBeingModified { + private final SpecificResourceAllocation resourceAllocation; + SpecificAllocationBeingModified( - ResourceAllocation resourceAllocation, + SpecificResourceAllocation resourceAllocation, ResourcesPerDay resourcesPerDay, Collection resources) { super(resourceAllocation, resourcesPerDay, resources); + this.resourceAllocation = resourceAllocation; + } + + @Override + public void applyOnTaskDuration() { + resourceAllocation.allocate(getGoal()); + } + + @Override + public List createAssignmentsAtDay(LocalDate day, + int limit) { + return resourceAllocation.createAssignmentsAtDay(day, getGoal(), + limit); } } @@ -134,4 +166,9 @@ public class AllocationBeingModified { public List getResources() { return resourcesOnWhichApplyAllocation; } + + public abstract void applyOnTaskDuration(); + + public abstract List createAssignmentsAtDay(LocalDate day, + int limit); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java index 118d0b54e..a8aa6143b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java @@ -34,7 +34,6 @@ import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.ResourcesPerDay; import org.navalplanner.business.planner.entities.Task; -import org.navalplanner.business.resources.entities.Resource; public abstract class AllocatorForSpecifiedResourcesPerDayAndHours { @@ -88,23 +87,16 @@ public abstract class AllocatorForSpecifiedResourcesPerDayAndHours { List dayAssignments); protected abstract List createAssignmentsAtDay( - ResourceAllocation resourceAllocation, List resources, - LocalDate day, ResourcesPerDay resourcesPerDay, Integer limit); + AllocationBeingModified allocation, LocalDate day, Integer limit); private int assignForDay(LocalDate day, int toBeAssigned) { int i = 0; int total = 0; List maxPerAllocations = calculateLimits(toBeAssigned); - for (AllocationBeingModified withResourcesPerDay : allocations) { - ResourceAllocation resourceAllocation = withResourcesPerDay - .getBeingModified(); - ResourcesPerDay resourcesPerDay = withResourcesPerDay - .getGoal(); - List assignments = createAssignmentsAtDay( - resourceAllocation, withResourcesPerDay.getResources(), - day, - resourcesPerDay, maxPerAllocations.get(i)); - resultAssignments.get(withResourcesPerDay).addAll(assignments); + for (AllocationBeingModified each : allocations) { + List assignments = createAssignmentsAtDay(each, day, + maxPerAllocations.get(i)); + resultAssignments.get(each).addAll(assignments); total += DayAssignment.sum(assignments); i++; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForTaskDurationAndSpecifiedResourcesPerDay.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForTaskDurationAndSpecifiedResourcesPerDay.java index 460a42397..8e6da34ff 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForTaskDurationAndSpecifiedResourcesPerDay.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForTaskDurationAndSpecifiedResourcesPerDay.java @@ -22,12 +22,6 @@ package org.navalplanner.business.planner.entities.allocationalgorithms; import java.util.List; -import org.navalplanner.business.planner.entities.GenericResourceAllocation; -import org.navalplanner.business.planner.entities.ResourceAllocation; -import org.navalplanner.business.planner.entities.ResourcesPerDay; -import org.navalplanner.business.planner.entities.SpecificResourceAllocation; -import org.navalplanner.business.resources.entities.Resource; - public class AllocatorForTaskDurationAndSpecifiedResourcesPerDay { private List allocations; @@ -39,32 +33,7 @@ public class AllocatorForTaskDurationAndSpecifiedResourcesPerDay { public void allocateOnTaskLength() { for (AllocationBeingModified allocation : allocations) { - doAllocationForFixedTask(allocation); + allocation.applyOnTaskDuration(); } } - - private void doAllocationForFixedTask( - AllocationBeingModified allocationBeingModified) { - ResourceAllocation allocation = allocationBeingModified - .getBeingModified(); - ResourcesPerDay resourcesPerDay = allocationBeingModified.getGoal(); - if (allocation instanceof GenericResourceAllocation) { - doAllocation((GenericResourceAllocation) allocation, - resourcesPerDay, allocationBeingModified.getResources()); - } else { - SpecificResourceAllocation specific = (SpecificResourceAllocation) allocation; - doAllocation(specific, resourcesPerDay); - } - } - - private void doAllocation(SpecificResourceAllocation specific, - ResourcesPerDay resourcesPerDay) { - specific.allocate(resourcesPerDay); - } - - private void doAllocation(GenericResourceAllocation generic, - ResourcesPerDay resourcesPerDay, List resources) { - generic.forResources(resources).allocate(resourcesPerDay); - } - } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/AllocationUntilFillingHoursTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/AllocationUntilFillingHoursTest.java index 6440230ab..0d2757fc3 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/AllocationUntilFillingHoursTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/AllocationUntilFillingHoursTest.java @@ -203,19 +203,26 @@ public class AllocationUntilFillingHoursTest { } private void givenAllocationsWithoutTask() { - allocations.add(AllocationBeingModified.create(createStubAllocationReturning(null), ResourcesPerDay.amount(2), resources)); - allocations.add(AllocationBeingModified.create(createStubAllocationReturning(null), ResourcesPerDay.amount(2), resources)); + allocations.add(AllocationBeingModified.create( + createStubAllocationReturning(SpecificResourceAllocation.class, + null), ResourcesPerDay.amount(2), resources)); + allocations.add(AllocationBeingModified.create( + createStubAllocationReturning(SpecificResourceAllocation.class, + null), ResourcesPerDay.amount(2), resources)); } private void givenAllocationsBelongingToDifferentTasks() { Task task = createStubTask(); - allocations - .add(AllocationBeingModified.create(createStubAllocationReturning(task), ResourcesPerDay.amount(2), resources)); - allocations - .add(AllocationBeingModified.create(createStubAllocationReturning(task), ResourcesPerDay.amount(2), resources)); + allocations.add(AllocationBeingModified.create( + createStubAllocationReturning(SpecificResourceAllocation.class, + task), ResourcesPerDay.amount(2), resources)); + allocations.add(AllocationBeingModified.create( + createStubAllocationReturning(SpecificResourceAllocation.class, + task), ResourcesPerDay.amount(2), resources)); Task other = createStubTask(); - allocations - .add(AllocationBeingModified.create(createStubAllocationReturning(other), ResourcesPerDay.amount(2), resources)); + allocations.add(AllocationBeingModified.create( + createStubAllocationReturning(SpecificResourceAllocation.class, + other), ResourcesPerDay.amount(2), resources)); } private Task createStubTask() { @@ -238,8 +245,9 @@ public class AllocationUntilFillingHoursTest { return result; } - private ResourceAllocation createStubAllocationReturning(Task task) { - ResourceAllocation resourceAllocation = createNiceMock(ResourceAllocation.class); + private ResourceAllocation createStubAllocationReturning( + Class> allocationClass, Task task) { + ResourceAllocation resourceAllocation = createNiceMock(allocationClass); expect(resourceAllocation.getTask()).andReturn(task).anyTimes(); replay(resourceAllocation); return resourceAllocation;