diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java index d5327452f..cf9a0842c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java @@ -139,15 +139,12 @@ public class InsertionRequirements { Task task = element.getTask(); for (Dependency each : task.getDependenciesWithThisOrigin()) { - if (each.getType().modifiesDestinationEnd()) { - TaskElement destination = each.getDestination(); - result = (result == null) ? destination.getIntraDayStartDate() - : IntraDayDate.min(result, - destination.getIntraDayStartDate()); - } + TaskElement destination = each.getDestination(); + result = (result == null) ? destination.getIntraDayStartDate() + : IntraDayDate.min(result, + destination.getIntraDayStartDate()); } - return (result != null) ? DateAndHour.from(result) : DateAndHour.from(new LocalDate( - element.getEarliestEndDateBecauseOfGantt())); + return (result != null) ? DateAndHour.from(result) : null; } public boolean isPotentiallyValid(Gap gap) { @@ -284,4 +281,4 @@ public class InsertionRequirements { return earliestPossibleStart; } -} +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/GapsMergeSort.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/GapsMergeSort.java index 071df5f91..1946a0176 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/GapsMergeSort.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/GapsMergeSort.java @@ -101,18 +101,27 @@ public class GapsMergeSort { public static List sort( List> orderedListsOfGaps) { + + List result = new ArrayList(); + + if (orderedListsOfGaps.isEmpty()) { + return result; + } if (orderedListsOfGaps.size() == 1) { return orderedListsOfGaps.get(0); } - List result = new ArrayList(); + List currentGaps = CurrentGap.convert(iteratorsFor(orderedListsOfGaps)); - CurrentGap min = null; - do { - min = Collections.min(currentGaps); - if (!min.hasFinished()) { - result.add(min.consume()); + CurrentGap min = Collections.min(currentGaps); + while (!currentGaps.isEmpty() && !min.hasFinished()) { + result.add(min.consume()); + if (min.hasFinished()) { + currentGaps.remove(min); + if (!currentGaps.isEmpty()) { + min = Collections.min(currentGaps); + } } - } while (!min.hasFinished()); + } return result; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java index b6efe97ed..53dfd8f24 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java @@ -238,16 +238,20 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { for (ResourceAllocation each: task.getAllResourceAllocations()) { Hibernate.initialize(each); } - for (Dependency each: task.getDependenciesWithThisOrigin()) { - Hibernate.initialize(each); - } - for (Dependency each: task.getDependenciesWithThisDestination()) { - Hibernate.initialize(each); - } + initializeDependencies(task); initializeTaskSource(task.getTaskSource()); initializeRootOrder(task); } + private void initializeDependencies(Task task) { + for (Dependency each: task.getDependenciesWithThisOrigin()) { + Hibernate.initialize(each.getDestination()); + } + for (Dependency each: task.getDependenciesWithThisDestination()) { + Hibernate.initialize(each.getOrigin()); + } + } + private boolean hasResourceAllocation(Task task) { return !task.getLimitingResourceAllocations().isEmpty(); } @@ -688,8 +692,8 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { InsertionRequirements requirements, AllocationSpec allocation) { LimitingResourceQueueElement element = requirements.getElement(); - LimitingResourceQueue queue = queuesState.getQueueFor(element - .getResource()); + List potentiallyValidQueues = getAssignableQueues(element); + LimitingResourceQueue queue = earliestQueue(potentiallyValidQueues); List unscheduled = new ArrayList(); allocation = unscheduleElementsFor(queue, requirements, unscheduled); @@ -697,6 +701,32 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { return allocation; } + /** + * Returns queue which last element is at a earliest date + * + * @param potentiallyValidQueues + * @return + */ + private LimitingResourceQueue earliestQueue( + List potentiallyValidQueues) { + + LimitingResourceQueue result = null; + LocalDate latestDate = null; + + for (LimitingResourceQueue each : potentiallyValidQueues) { + SortedSet elements = each + .getLimitingResourceQueueElements(); + if (!elements.isEmpty()) { + LocalDate date = elements.last().getEndDate(); + if (latestDate == null || date.isAfter(latestDate)) { + latestDate = date; + result = each; + } + } + } + return result; + } + private void checkAllocationIsAppropriative(boolean value) { checkAllocationIsAppropriative = value; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java index 5d56e1553..401e6d670 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java @@ -195,10 +195,6 @@ public class QueuesState { unassignedElements.remove(queueElement); } - public LimitingResourceQueue getQueueFor(Resource resource) { - return queuesByResourceId.get(resource.getId()); - } - public List getAssignableQueues( LimitingResourceQueueElement element) { final ResourceAllocation resourceAllocation = element @@ -216,6 +212,10 @@ public class QueuesState { throw new RuntimeException("unexpected type of: " + resourceAllocation); } + private LimitingResourceQueue getQueueFor(Resource resource) { + return queuesByResourceId.get(resource.getId()); + } + public InsertionRequirements getRequirementsFor( LimitingResourceQueueElement element) { List dependenciesStart = new ArrayList();