From 2f54a627f85d3d12239a9dfb185ef3c735afa9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 11 Apr 2011 16:49:37 +0200 Subject: [PATCH] The no longer valid allocations are marked as unsatisfied When reassining if an allocation cannot be done, for example there are no resources that match the criterions, it's marked unsatisfied. FEA: ItEr74S04BugFixing --- .../planner/entities/ResourceAllocation.java | 2 +- .../business/planner/entities/Task.java | 83 +++++++++++++++---- 2 files changed, 70 insertions(+), 15 deletions(-) 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();