From ad2a59356308f04a6380b9cc666545aec4e2a82f Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Tue, 18 May 2010 09:18:19 +0200 Subject: [PATCH] ItEr58S10CUAsignacionRecursosLimitantesItEr57S11: Fix bug allocate queue element with a generic resource allocation into an empty queue --- .../entities/LimitingResourceAllocator.java | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceAllocator.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceAllocator.java index b6b7c2e20..f9a09831a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceAllocator.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceAllocator.java @@ -73,12 +73,12 @@ public class LimitingResourceAllocator { final int size = elements.size(); // Iterate through queue elements - for (int pos = 0; pos <= size; pos++) { - + int pos = 0; + do { LimitingResourceQueueElementGap gap = getGapInQueueAtPosition( - resource, elements, element, pos); + resource, elements, element, pos++); - // The queue cannot hold this element (perhaps queue.resource + // The queue cannot hold this element (queue.resource // doesn't meet element.criteria) if (gap == null) { return null; @@ -87,7 +87,8 @@ public class LimitingResourceAllocator { if (canFitIntoGap(element, gap, resource)) { return gap; } - } + } while (pos <= size); + return null; } @@ -153,39 +154,39 @@ public class LimitingResourceAllocator { final int size = elements.size(); final DateAndHour startTimeBecauseOfGantt = getStartTimeBecauseOfGantt(element); - if (size > 0) { - - if (pos == size) { - return createLastGap(element, elements.get(size - 1), resource); - } - - LimitingResourceQueueElement current = elements.get(pos); - // First element - if (pos == 0 - && startTimeBecauseOfGantt.getDate().isBefore( - current.getStartDate())) { - return LimitingResourceQueueElementGap.create(resource, - startTimeBecauseOfGantt, current.getStartTime()); - } - - // Rest of elements - if (pos + 1 < size) { - LimitingResourceQueueElement next = elements.get(pos + 1); - if (startTimeBecauseOfGantt.isBefore(current.getEndTime())) { - return LimitingResourceQueueElementGap.create(resource, - current.getEndTime(), next.getStartTime()); - } else { - return LimitingResourceQueueElementGap.create(resource, - DateAndHour.Max(current.getEndTime(), - startTimeBecauseOfGantt), next - .getStartTime()); - } - } else { - // Current was the last element - return createLastGap(element, current, resource); - } + if (size == 0) { + return createLastGap(element, null, resource); } - return null; + + if (pos == size) { + return createLastGap(element, elements.get(size - 1), resource); + } + + LimitingResourceQueueElement current = elements.get(pos); + // First element + if (pos == 0 + && startTimeBecauseOfGantt.getDate().isBefore( + current.getStartDate())) { + return LimitingResourceQueueElementGap.create(resource, + startTimeBecauseOfGantt, current.getStartTime()); + } + + // Rest of elements + if (pos + 1 < size) { + LimitingResourceQueueElement next = elements.get(pos + 1); + if (startTimeBecauseOfGantt.isBefore(current.getEndTime())) { + return LimitingResourceQueueElementGap.create(resource, current + .getEndTime(), next.getStartTime()); + } else { + return LimitingResourceQueueElementGap.create(resource, + DateAndHour.Max(current.getEndTime(), + startTimeBecauseOfGantt), next.getStartTime()); + } + } else { + // Current was the last element + return createLastGap(element, current, resource); + } + } private static DateAndHour getStartTimeBecauseOfGantt(LimitingResourceQueueElement element) { @@ -194,10 +195,12 @@ public class LimitingResourceAllocator { private static LimitingResourceQueueElementGap createLastGap( LimitingResourceQueueElement candidate, - LimitingResourceQueueElement element, Resource resource) { + LimitingResourceQueueElement lastElement, Resource resource) { + final DateAndHour queueEndTime = (lastElement != null) ? lastElement + .getEndTime() : null; DateAndHour startTime = DateAndHour.Max( - getStartTimeBecauseOfGantt(candidate), element.getEndTime()); + getStartTimeBecauseOfGantt(candidate), queueEndTime); return LimitingResourceQueueElementGap .create(resource, startTime, null); }