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 14528ee42..5e28469d1 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 @@ -927,7 +927,7 @@ public abstract class ResourceAllocation extends } - private void markAsUnsatisfied() { + public void markAsUnsatisfied() { removingAssignments(getAssignments()); assert isUnsatisfied(); } 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 a42ffe90d..e20ff8c41 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 @@ -48,6 +48,7 @@ import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.entities.DerivedAllocationGenerator.IWorkerFinder; import org.navalplanner.business.planner.entities.ResourceAllocation.Direction; +import org.navalplanner.business.planner.entities.allocationalgorithms.AllocationModification; import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification; import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification; import org.navalplanner.business.planner.entities.consolidations.Consolidation; @@ -429,6 +430,41 @@ public class Task extends TaskElement implements ITaskPositionConstrained { return positionConstraint; } + private static class ModificationsResult { + + static ModificationsResult create( + List> original, List canBeModified) { + + List> beingModified = AllocationModification + .getBeingModified(canBeModified); + List> noLongerValid = new ArrayList>(); + for (ResourceAllocation each : original) { + if (!beingModified.contains(each)) { + noLongerValid.add(each); + } + } + return new ModificationsResult(canBeModified, noLongerValid); + } + + private final List valid; + + private final List> noLongerValid; + + private ModificationsResult(List valid, List> noLongerValid) { + this.valid = Collections.unmodifiableList(valid); + this.noLongerValid = Collections.unmodifiableList(noLongerValid); + } + + public List getBeingModified() { + return valid; + } + + public List> getNoLongerValid() { + return noLongerValid; + } + + } + private static abstract class AllocationModificationStrategy { protected final IResourceDAO resourceDAO; @@ -438,10 +474,10 @@ public class Task extends TaskElement implements ITaskPositionConstrained { this.resourceDAO = resourceDAO; } - public abstract List getResourcesPerDayModified( + public abstract ModificationsResult getResourcesPerDayModified( List> allocations); - public abstract List getHoursModified( + public abstract ModificationsResult getHoursModified( List> allocations); } @@ -454,16 +490,19 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } @Override - public List getHoursModified( + public ModificationsResult getHoursModified( List> allocations) { - return HoursModification.fromExistent(allocations, resourceDAO); + List canBeModified = HoursModification + .fromExistent(allocations, resourceDAO); + return ModificationsResult.create(allocations, canBeModified); } @Override - public List getResourcesPerDayModified( + public ModificationsResult getResourcesPerDayModified( List> allocations) { - return ResourcesPerDayModification.fromExistent(allocations, - resourceDAO); + List canBeModified = ResourcesPerDayModification + .fromExistent(allocations, resourceDAO); + return ModificationsResult.create(allocations, canBeModified); } } @@ -476,16 +515,19 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } @Override - public List getHoursModified( + public ModificationsResult getHoursModified( List> allocations) { - return HoursModification.withNewResources(allocations, resourceDAO); + List canBeModified = HoursModification + .withNewResources(allocations, resourceDAO); + return ModificationsResult.create(allocations, canBeModified); } @Override - public List getResourcesPerDayModified( + public ModificationsResult getResourcesPerDayModified( List> allocations) { - return ResourcesPerDayModification.withNewResources(allocations, - resourceDAO); + List canBeModified = ResourcesPerDayModification + .withNewResources(allocations, resourceDAO); + return ModificationsResult.create(allocations, canBeModified); } } @@ -744,8 +786,11 @@ public class Task extends TaskElement implements ITaskPositionConstrained { private void doAllocation(AllocationModificationStrategy strategy, Direction direction, List> toBeModified) { - List allocations = strategy + ModificationsResult modificationsResult = strategy .getResourcesPerDayModified(toBeModified); + markAsUnsatisfied(modificationsResult.getNoLongerValid()); + List allocations = modificationsResult + .getBeingModified(); if (allocations.isEmpty()) { LOG.warn("all allocations for task " + this + " have no valid data that could be used"); @@ -765,8 +810,11 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } break; case RESOURCES_PER_DAY: - List hoursModified = strategy + ModificationsResult hoursModificationResult = strategy .getHoursModified(toBeModified); + markAsUnsatisfied(hoursModificationResult.getNoLongerValid()); + List hoursModified = hoursModificationResult + .getBeingModified(); if (hoursModified.isEmpty()) { LOG.warn("all allocations for task " + this + " can't be used"); return; @@ -779,6 +827,13 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } } + private void markAsUnsatisfied( + Collection> noLongerValid) { + for (ResourceAllocation each : noLongerValid) { + each.markAsUnsatisfied(); + } + } + private void updateDerived(List allocations) { for (ModifiedAllocation each : allocations) { ResourceAllocation original = each.getOriginal();