diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java index 106470a04..d29153d3f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java @@ -134,7 +134,7 @@ abstract class LoadPeriodGenerator { allocationsOnInterval); } - private boolean overlaps(LoadPeriodGenerator other) { + boolean overlaps(LoadPeriodGenerator other) { return (start.compareTo(other.end) < 0 && other.start .compareTo(this.end) < 0); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java index f92e03509..7c7964ac3 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java @@ -237,15 +237,14 @@ class PeriodsBuilder { ListIterator iterator = loadPeriodsGenerators .listIterator(); while (iterator.hasNext()) { - LoadPeriodGenerator current = iterator.next(); - if (iterator.hasNext()) { + final LoadPeriodGenerator current = findNextOneOverlapping(iterator); + if (current != null) { + rewind(iterator, current); iterator.remove(); LoadPeriodGenerator next = iterator.next(); iterator.remove(); List generated = current.join(next); - final LoadPeriodGenerator nextOne = generated.size() > 1 ? generated - .get(1) - : generated.get(0); + final LoadPeriodGenerator positionToComeBack = generated.get(0); List sortedByStartDate = mergeListsKeepingByStartSortOrder( generated, loadPeriodsGenerators.subList(iterator .nextIndex(), loadPeriodsGenerators.size())); @@ -253,11 +252,26 @@ class PeriodsBuilder { - generated.size(); removeNextElements(iterator, takenFromRemaining); addAtCurrentPosition(iterator, sortedByStartDate); - rewind(iterator, nextOne); + rewind(iterator, positionToComeBack); } } } + private LoadPeriodGenerator findNextOneOverlapping( + ListIterator iterator) { + while (iterator.hasNext()) { + LoadPeriodGenerator current = iterator.next(); + if (!iterator.hasNext()) { + return null; + } + LoadPeriodGenerator next = peekNext(iterator); + if (current.overlaps(next)) { + return current; + } + } + return null; + } + private void addAtCurrentPosition( ListIterator iterator, List sortedByStartDate) {