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 09a17511b..61bc7b60d 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 @@ -408,6 +408,13 @@ public class Task extends TaskElement implements ITaskPositionConstrained { private static abstract class AllocationModificationStrategy { + protected final IResourceDAO resourceDAO; + + public AllocationModificationStrategy(IResourceDAO resourceDAO) { + Validate.notNull(resourceDAO); + this.resourceDAO = resourceDAO; + } + public abstract List getResourcesPerDayModified( List> allocations); @@ -419,26 +426,30 @@ public class Task extends TaskElement implements ITaskPositionConstrained { private static class WithTheSameHoursAndResourcesPerDay extends AllocationModificationStrategy { + public WithTheSameHoursAndResourcesPerDay(IResourceDAO resourceDAO) { + super(resourceDAO); + } + @Override public List getHoursModified( List> allocations) { - return HoursModification.fromExistent(allocations); + return HoursModification.fromExistent(allocations, resourceDAO); } @Override public List getResourcesPerDayModified( List> allocations) { - return ResourcesPerDayModification.fromExistent(allocations); + return ResourcesPerDayModification.fromExistent(allocations, + resourceDAO); } } private static class WithAnotherResources extends AllocationModificationStrategy { - private final IResourceDAO resourceDAO; - WithAnotherResources(IResourceDAO resourceDAO) { - this.resourceDAO = resourceDAO; + public WithAnotherResources(IResourceDAO resourceDAO) { + super(resourceDAO); } @Override @@ -479,7 +490,7 @@ public class Task extends TaskElement implements ITaskPositionConstrained { private void doReassignment(Direction direction) { reassign(scenario, direction, - new WithTheSameHoursAndResourcesPerDay()); + new WithTheSameHoursAndResourcesPerDay(resourceDAO)); } @Override diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationModification.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationModification.java index bba5b9834..84a0b90f5 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationModification.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocationModification.java @@ -42,6 +42,25 @@ public abstract class AllocationModification { return result; } + /** + * It ensures that the provided allocations have at least one associated + * resource. A {@link AllocationModification} doesn't have associated + * resources when creating an {@link AllocationModification} from a + * unsatisfied generic allocation. + */ + protected static List ensureNoOneWithoutAssociatedResources( + Collection modifications, IResourceDAO resourceDAO) { + List result = new ArrayList(); + for (T each : modifications) { + if (each.hasNoResources()) { + each.withNewResources(resourceDAO); + } + assert !each.hasNoResources(); + result.add(each); + } + return result; + } + private final ResourceAllocation beingModified; private List resourcesOnWhichApplyAllocation; @@ -52,6 +71,10 @@ public abstract class AllocationModification { .unmodifiableList(new ArrayList(resources)); } + private boolean hasNoResources() { + return resourcesOnWhichApplyAllocation.isEmpty(); + } + protected void withNewResources(IResourceDAO resourceDAO) { resourcesOnWhichApplyAllocation = beingModified .querySuitableResources(resourceDAO); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/HoursModification.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/HoursModification.java index c1a45b6a0..99bd5e583 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/HoursModification.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/HoursModification.java @@ -99,17 +99,18 @@ public abstract class HoursModification extends AllocationModification { } public static List fromExistent( - Collection> allocations) { + Collection> allocations, + IResourceDAO resourceDAO) { List result = new ArrayList(); for (ResourceAllocation resourceAllocation : allocations) { result.add(resourceAllocation.asHoursModification()); } - return result; + return ensureNoOneWithoutAssociatedResources(result, resourceDAO); } public static List withNewResources( List> allocations, IResourceDAO resourceDAO) { - List result = fromExistent(allocations); + List result = fromExistent(allocations, resourceDAO); for (HoursModification each : result) { each.withNewResources(resourceDAO); } 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 f61abb510..fd09aa289 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 @@ -27,7 +27,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; import org.navalplanner.business.calendars.entities.CombinedWorkHours; @@ -59,7 +58,6 @@ public abstract class ResourcesPerDayModification extends ResourcesPerDay resourcesPerDay, Collection resources) { super(resourceAllocation, resourcesPerDay, resources); - Validate.isTrue(!resources.isEmpty()); this.genericAllocation = resourceAllocation; } @@ -196,7 +194,8 @@ public abstract class ResourcesPerDayModification extends public static List withNewResources( List> allocations, IResourceDAO resourceDAO) { - List result = fromExistent(allocations); + List result = fromExistent(allocations, + resourceDAO); for (ResourcesPerDayModification each : result) { each.withNewResources(resourceDAO); } @@ -212,12 +211,13 @@ public abstract class ResourcesPerDayModification extends } public static List fromExistent( - Collection> allocations) { + Collection> allocations, + IResourceDAO resourcesDAO) { List result = new ArrayList(); for (ResourceAllocation resourceAllocation : allocations) { result.add(resourceAllocation.asResourcesPerDayModification()); } - return result; + return ensureNoOneWithoutAssociatedResources(result, resourcesDAO); } protected static ICalendar calendarFor(Resource associatedResource) {