From fcaeafa1f9d448f48ccef7f63d52ca6398aac831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 7 Jun 2010 20:59:49 +0200 Subject: [PATCH] ItEr59S04ValidacionEProbasFuncionaisItEr58S04: Fix bug. Gaps now can have null start time so it's needed to calculate the subgaps using AvailabilityTimeLine. --- .../entities/AvailabilityCalculator.java | 2 +- .../planner/limiting/entities/Gap.java | 81 +++++++++---------- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java index 1c901a079..11dedac7c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java @@ -63,7 +63,7 @@ public class AvailabilityCalculator { return result.and(getCriterionsAvailabilityFor(criterions, each)); } - private static AvailabilityTimeLine getCriterionsAvailabilityFor( + public static AvailabilityTimeLine getCriterionsAvailabilityFor( Collection criterions, Resource resource) { AvailabilityTimeLine result = AvailabilityTimeLine.allValid(); for (Criterion each : criterions) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/Gap.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/Gap.java index 6946d6012..d21f850bc 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/Gap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/Gap.java @@ -22,18 +22,22 @@ package org.navalplanner.business.planner.limiting.entities; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.ResourceCalendar; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine.DatePoint; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine.EndOfTime; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine.FixedPoint; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine.Interval; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine.StartOfTime; +import org.navalplanner.business.planner.entities.AvailabilityCalculator; import org.navalplanner.business.resources.entities.Criterion; -import org.navalplanner.business.resources.entities.CriterionCompounder; -import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.LimitingResourceQueue; import org.navalplanner.business.resources.entities.Resource; @@ -266,51 +270,40 @@ public class Gap implements Comparable { private static List splitIntoGapsSatisfyingCriteria(Resource resource, Set criteria, DateAndHour gapStartTime, DateAndHour gapEndTime) { - - final ICriterion compositedCriterion = CriterionCompounder.buildAnd( - criteria).getResult(); - final ResourceCalendar calendar = resource.getCalendar(); - - // FIXME: If endTime is null (lastGap), set endTime as 100 years ahead - // startTime - final LocalDate gapEndDate = gapEndTime != null ? gapEndTime.getDate() - .plusDays(1) : gapStartTime.getDate().plusYears(10); - final LocalDate gapStartDate = gapStartTime.getDate(); - - List result = new ArrayList(); - - LocalDate date = gapStartDate; - boolean open = compositedCriterion - .isSatisfiedBy(resource, toDate(date)); - DateAndHour startTime = gapStartTime, endTime; - while (date.isBefore(gapEndDate)) { - if (calendar.getCapacityAt(date) == 0) { - date = date.plusDays(1); - continue; - } - - if (open == false - && compositedCriterion - .isSatisfiedBy(resource, toDate(date))) { - startTime = new DateAndHour(date, 0); - open = true; - } - if (open == true - && !compositedCriterion.isSatisfiedBy(resource, - toDate(date))) { - endTime = new DateAndHour(date, 0); - result.add(Gap.create(resource, startTime, endTime)); - open = false; - } - date = date.plusDays(1); + AvailabilityTimeLine criterionsAvailability = AvailabilityCalculator + .getCriterionsAvailabilityFor(criteria, resource); + if (gapStartTime != null) { + criterionsAvailability.invalidUntil(gapStartTime.getDate()); + } + if (gapEndTime != null) { + criterionsAvailability.invalidFrom(gapEndTime.getDate()); + } + List validPeriods = criterionsAvailability.getValidPeriods(); + List result = new ArrayList(); + for (Interval each : validPeriods) { + result.add(createGap(resource, each, gapStartTime, gapEndTime)); } - result.add(Gap.create(resource, startTime, gapEndTime)); - return result; } - private static Date toDate(LocalDate date) { - return date != null ? date.toDateTimeAtStartOfDay().toDate() : null; + private static Gap createGap(Resource resource, Interval interval, + DateAndHour originalGapStartTime, DateAndHour originalGapEndTime) { + DateAndHour start = convert(originalGapStartTime, interval.getStart()); + DateAndHour end = convert(originalGapEndTime, interval.getEnd()); + return Gap.create(resource, start, end); + } + + private static DateAndHour convert(DateAndHour possibleMatch, + DatePoint datePoint) { + if (datePoint instanceof StartOfTime || datePoint instanceof EndOfTime) { + return null; + } + FixedPoint p = (FixedPoint) datePoint; + if (possibleMatch != null + && possibleMatch.getDate().equals(p.getDate())) { + return possibleMatch; + } + return DateAndHour.from(p.getDate()); } }