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 f2a65f35e..913f8d215 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 @@ -21,8 +21,6 @@ package org.navalplanner.business.planner.entities; -import static org.navalplanner.business.workingday.EffortDuration.min; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -51,7 +49,6 @@ import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.business.util.deepcopy.OnCopy; import org.navalplanner.business.util.deepcopy.Strategy; import org.navalplanner.business.workingday.EffortDuration; -import org.navalplanner.business.workingday.IntraDayDate.PartialDay; import org.navalplanner.business.workingday.ResourcesPerDay; /** @@ -214,7 +211,7 @@ public class GenericResourceAllocation extends } @Override - protected List distributeForDay(LocalDate day, + public List distributeForDay(LocalDate day, EffortDuration effort) { List result = new ArrayList(); for (ResourceWithAssignedDuration each : hoursDistributor @@ -267,16 +264,6 @@ public class GenericResourceAllocation extends return GenericDayAssignment.class; } - public List createAssignmentsAtDay(List resources, - PartialDay day, ResourcesPerDay resourcesPerDay, - final EffortDuration maxLimit) { - final EffortDuration durations = min( - calculateTotalToDistribute(day, resourcesPerDay), maxLimit); - GenericAllocation genericAllocation = new GenericAllocation(resources); - return new ArrayList(genericAllocation.distributeForDay( - day.getDate(), durations)); - } - @Override public List getAssociatedResources() { return new ArrayList(DayAssignment @@ -392,4 +379,9 @@ public class GenericResourceAllocation extends return super.getAssignedDuration(start, endExclusive); } + public IEffortDistributor createEffortDistributor( + List resources) { + return new GenericAllocation(resources); + } + } 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 979f32a64..2626ac4da 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 @@ -597,7 +597,17 @@ public abstract class ResourceAllocation extends public abstract IAllocatable withPreviousAssociatedResources(); - protected abstract class AssignmentsAllocator implements IAllocatable { + public interface IEffortDistributor { + /** + * It does not add the created assigments to the underlying allocation. + * It just distributes them. + * + */ + List distributeForDay(LocalDate day, EffortDuration effort); + } + + protected abstract class AssignmentsAllocator implements IAllocatable, + IEffortDistributor { @Override public final void allocate(ResourcesPerDay resourcesPerDay) { @@ -845,9 +855,6 @@ public abstract class ResourceAllocation extends } } - protected abstract List distributeForDay(LocalDate day, - EffortDuration effort); - } private void markAsUnsatisfied() { @@ -1030,7 +1037,7 @@ public abstract class ResourceAllocation extends getDayAssignmentsState().removingAssignments(assignments); } - final EffortDuration calculateTotalToDistribute(PartialDay day, + public final EffortDuration calculateTotalToDistribute(PartialDay day, ResourcesPerDay resourcesPerDay) { return getAllocationCalendar().asDurationOn(day, 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 b819f54b6..f0afc3a2e 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 @@ -21,8 +21,6 @@ package org.navalplanner.business.planner.entities; -import static org.navalplanner.business.workingday.EffortDuration.min; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -53,7 +51,6 @@ import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.business.util.deepcopy.OnCopy; import org.navalplanner.business.util.deepcopy.Strategy; import org.navalplanner.business.workingday.EffortDuration; -import org.navalplanner.business.workingday.IntraDayDate.PartialDay; import org.navalplanner.business.workingday.ResourcesPerDay; /** @@ -190,7 +187,7 @@ public class SpecificResourceAllocation extends AssignmentsAllocator { @Override - protected List distributeForDay(LocalDate day, + public List distributeForDay(LocalDate day, EffortDuration effort) { return Arrays.asList(SpecificDayAssignment.create(day, effort, resource)); @@ -202,6 +199,10 @@ public class SpecificResourceAllocation extends } } + public IEffortDistributor createEffortDistributor() { + return new SpecificAssignmentsAllocator(); + } + @Override public IAllocateHoursOnInterval onIntervalWithinTask(LocalDate start, LocalDate end) { return new SpecificAssignmentsAllocator().onIntervalWithinTask(start, end); @@ -225,16 +226,6 @@ public class SpecificResourceAllocation extends return SpecificDayAssignment.class; } - public List createAssignmentsAtDay(PartialDay day, - ResourcesPerDay resourcesPerDay, EffortDuration limit) { - EffortDuration effort = calculateTotalToDistribute(day, resourcesPerDay); - SpecificDayAssignment specific = SpecificDayAssignment.create( - day.getDate(), min(limit, effort), resource); - List result = new ArrayList(); - result.add(specific); - return result; - } - @Override public IAllocatable withPreviousAssociatedResources() { return this; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java index c5d4fc9e2..65b6f8f1e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java @@ -22,6 +22,7 @@ package org.navalplanner.business.planner.entities.allocationalgorithms; import static org.navalplanner.business.i18n.I18nHelper._; +import static org.navalplanner.business.workingday.EffortDuration.min; import java.util.ArrayList; import java.util.Collection; @@ -38,7 +39,9 @@ import org.navalplanner.business.planner.entities.AvailabilityCalculator; 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.ResourceAllocation.IEffortDistributor; import org.navalplanner.business.planner.entities.SpecificResourceAllocation; +import org.navalplanner.business.planner.entities.allocationalgorithms.UntilFillingHoursAllocator.IAssignmentsCreator; import org.navalplanner.business.resources.daos.IResourceDAO; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; @@ -79,13 +82,6 @@ public abstract class ResourcesPerDayModification extends .resourcesPerDayFromEndUntil(start).allocate(getGoal()); } - @Override - public List createAssignmentsAtDay(PartialDay day, - EffortDuration limit) { - return genericAllocation.createAssignmentsAtDay(getResources(), - day, getGoal(), limit); - } - @Override public AvailabilityTimeLine getAvailability() { return AvailabilityCalculator.buildSumOfAvailabilitiesFor( @@ -120,6 +116,16 @@ public abstract class ResourcesPerDayModification extends return calendar; } + @Override + protected ResourceAllocation getResourceAllocation() { + return genericAllocation; + } + + @Override + protected IEffortDistributor toEffortDistributor() { + return genericAllocation.createEffortDistributor(getResources()); + } + } private static class OnSpecificAllocation extends @@ -152,13 +158,6 @@ public abstract class ResourcesPerDayModification extends getGoal()); } - @Override - public List createAssignmentsAtDay(PartialDay day, - EffortDuration limit) { - return resourceAllocation.createAssignmentsAtDay(day, getGoal(), - limit); - } - @Override public AvailabilityTimeLine getAvailability() { Resource resource = getAssociatedResource(); @@ -184,6 +183,16 @@ public abstract class ResourcesPerDayModification extends return calendarFor(getAssociatedResource()); } + @Override + protected ResourceAllocation getResourceAllocation() { + return resourceAllocation; + } + + @Override + protected IEffortDistributor toEffortDistributor() { + return resourceAllocation.createEffortDistributor(); + } + } public static ResourcesPerDayModification create( @@ -249,8 +258,28 @@ public abstract class ResourcesPerDayModification extends public abstract void applyAllocationFromEndUntil(LocalDate start); - public abstract List createAssignmentsAtDay(PartialDay day, - EffortDuration limit); + public IAssignmentsCreator createAssignmentsCreator() { + + return new IAssignmentsCreator() { + + final IEffortDistributor effortDistributor = toEffortDistributor(); + + @Override + public List createAssignmentsAtDay( + PartialDay day, + EffortDuration limit) { + EffortDuration toDistribute = getResourceAllocation() + .calculateTotalToDistribute(day, getGoal()); + EffortDuration effortLimited = min(limit, toDistribute); + return effortDistributor.distributeForDay(day.getDate(), + effortLimited); + } + }; + } + + protected abstract ResourceAllocation getResourceAllocation(); + + protected abstract IEffortDistributor toEffortDistributor(); public abstract AvailabilityTimeLine getAvailability(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/UntilFillingHoursAllocator.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/UntilFillingHoursAllocator.java index 507a9c1d1..4cd35e357 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/UntilFillingHoursAllocator.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/UntilFillingHoursAllocator.java @@ -110,6 +110,12 @@ public abstract class UntilFillingHoursAllocator { toBeAssigned); } + public interface IAssignmentsCreator { + + List createAssignmentsAtDay(PartialDay day, + EffortDuration limit); + } + /** * * @param dateFromWhichToAllocate @@ -123,10 +129,13 @@ public abstract class UntilFillingHoursAllocator { EffortDuration taken = zero(); EffortDuration biggestLastAssignment = zero(); IntraDayDate current = dateFromWhichToAllocate; + IAssignmentsCreator assignmentsCreator = resourcesPerDayModification + .createAssignmentsCreator(); while (effortRemaining.compareTo(zero()) > 0) { PartialDay day = calculateDay(current); Pair pair = assignForDay( - resourcesPerDayModification, day, effortRemaining); + resourcesPerDayModification, assignmentsCreator, day, + effortRemaining); taken = pair.getFirst(); biggestLastAssignment = pair.getSecond(); effortRemaining = effortRemaining.minus(taken); @@ -244,27 +253,24 @@ public abstract class UntilFillingHoursAllocator { /** * + * @param resourcesPerDayModification * @return a pair composed of the effort assigned and the biggest assignment * done. */ private Pair assignForDay( ResourcesPerDayModification resourcesPerDayModification, + IAssignmentsCreator assignmentsCreator, PartialDay day, EffortDuration remaining) { - List newAssignments = createAssignmentsAtDay( - resourcesPerDayModification, day, remaining); + List newAssignments = assignmentsCreator + .createAssignmentsAtDay(day, remaining); resultAssignments.get(resourcesPerDayModification).addAll( newAssignments); return Pair.create(DayAssignment.sum(newAssignments), getMaxAssignment(newAssignments)); } - private List createAssignmentsAtDay( - ResourcesPerDayModification allocation, PartialDay day, - EffortDuration limit) { - return allocation.createAssignmentsAtDay(day, limit); - } - - private EffortDuration getMaxAssignment(List newAssignments) { + private EffortDuration getMaxAssignment( + List newAssignments) { if (newAssignments.isEmpty()) { return zero(); }