From b1e42069b0b70c295216a6d6ba2c517e5ccad95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 26 Oct 2009 21:43:08 +0100 Subject: [PATCH] ItEr32S09ValidacionEProbasFuncionaisItEr31S12: [Bug #66] Simplifying OrderPlanningModel using HoursByDayCalculator --- .../web/planner/CompanyPlanningModel.java | 21 +-- .../web/planner/LoadChartFiller.java | 25 ++++ .../web/planner/OrderPlanningModel.java | 126 ++++++------------ 3 files changed, 67 insertions(+), 105 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CompanyPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CompanyPlanningModel.java index 45566a778..3d8fcc94c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CompanyPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CompanyPlanningModel.java @@ -33,8 +33,6 @@ import java.util.SortedMap; import java.util.Map.Entry; import org.joda.time.LocalDate; -import org.navalplanner.business.calendars.entities.ResourceCalendar; -import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; import org.navalplanner.business.common.IAdHocTransactionService; import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.orders.daos.IOrderDAO; @@ -341,24 +339,11 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel { @Override protected int getHoursFor( Entry> element) { - int sum = 0; - for (Resource resource : element.getValue()) { - sum += hoursFor(resource, element.getKey()); - } - return sum; + LocalDate day = element.getKey(); + List resources = element.getValue(); + return sumHoursForDay(resources, day); } - private int hoursFor(Resource resource, LocalDate day) { - int result = 0; - ResourceCalendar calendar = resource.getCalendar(); - if (calendar != null) { - result += calendar.getWorkableHours(day); - } else { - result += SameWorkHoursEveryDay.getDefaultWorkingDay() - .getWorkableHours(day); - } - return result; - } }.calculate(getResourcesByDateBetween( resources, start, finish)); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/LoadChartFiller.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/LoadChartFiller.java index ea2b318bf..6c169b802 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/LoadChartFiller.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/LoadChartFiller.java @@ -33,7 +33,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.joda.time.LocalDate; +import org.navalplanner.business.calendars.entities.ResourceCalendar; +import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; import org.navalplanner.business.planner.entities.DayAssignment; +import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.web.servlets.CallbackServlet; import org.navalplanner.web.servlets.CallbackServlet.IServletRequestHandler; import org.zkforge.timeplot.Timeplot; @@ -88,6 +91,28 @@ public abstract class LoadChartFiller implements ILoadChartFiller { } } + protected final int sumHoursForDay( + Collection resources, + LocalDate day) { + int sum = 0; + for (Resource resource : resources) { + sum += hoursFor(resource, day); + } + return sum; + } + + private int hoursFor(Resource resource, LocalDate day) { + int result = 0; + ResourceCalendar calendar = resource.getCalendar(); + if (calendar != null) { + result += calendar.getWorkableHours(day); + } else { + result += SameWorkHoursEveryDay.getDefaultWorkingDay() + .getWorkableHours(day); + } + return result; + } + private final class GraphicSpecificationCreator implements IServletRequestHandler { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java index f31950779..18109ef51 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java @@ -25,16 +25,16 @@ import static org.navalplanner.web.I18nHelper._; import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; -import java.util.TreeMap; +import java.util.Map.Entry; import org.joda.time.LocalDate; -import org.navalplanner.business.calendars.entities.ResourceCalendar; -import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.entities.Order; @@ -428,8 +428,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { private Plotinfo getCalendarMaximumAvailabilityPlotInfo(Order order, Date start, Date finish) { - SortedMap mapDayAssignments = calculateHoursAdditionByDay( - order.getDayAssignments(), true); + SortedMap mapDayAssignments = calculateCapacity(order.getDayAssignments()); String uri = getServletUri(mapDayAssignments, start, finish); @@ -443,101 +442,54 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { return plotInfo; } - /** - * Calculate the hours by day for all the {@link DayAssignment} in the list. - * - * @param dayAssignments - * The list of {@link DayAssignment} - * @param calendarHours - * If true the resource's calendar will be used to - * calculate the available hours. Otherwise, the - * {@link DayAssignment} hours will be used. - * @param minDate - * If it's not null, just {@link DayAssignment} from - * this date will be used. - * @param maxDate - * If it's not null, just {@link DayAssignment} to - * this date will be used. - * - * @return A map { day => hours } sorted by date - */ - private SortedMap calculateHoursAdditionByDay( - List dayAssignments, boolean calendarHours, - LocalDate minDate, LocalDate maxDate) { - SortedMap map = new TreeMap(); + private SortedMap calculateCapacity( + List dayAssignments) { + return new HoursByDayCalculator>>() { - if (dayAssignments.isEmpty()) { - return map; - } + @Override + protected LocalDate getDayFor( + Entry> element) { + return element.getKey(); + } - Set resroucesAlreadyUsed = new HashSet(); + @Override + protected int getHoursFor( + Entry> element) { + Collection resources = element.getValue(); + LocalDate day = element.getKey(); + return sumHoursForDay(resources, day); + } - for (DayAssignment dayAssignment : DayAssignment - .orderedByDay(dayAssignments)) { + }.calculate(resourcesByDate(dayAssignments)); + } + + private Collection>> resourcesByDate( + List dayAssignments) { + Map> result = new HashMap>(); + for (DayAssignment dayAssignment : dayAssignments) { LocalDate day = dayAssignment.getDay(); - Integer hours = 0; - - if (minDate != null) { - if (day.compareTo(minDate) < 0) { - continue; - } - } - - if (maxDate != null) { - if (day.compareTo(maxDate) > 0) { - continue; - } - } - - if (calendarHours) { - Resource resource = dayAssignment.getResource(); - - if (map.get(day) == null) { - resroucesAlreadyUsed.clear(); - } - - if (!resroucesAlreadyUsed.contains(resource)) { - resroucesAlreadyUsed.add(resource); - ResourceCalendar calendar = resource.getCalendar(); - if (calendar != null) { - hours = calendar.getWorkableHours(dayAssignment - .getDay()); - } else { - hours = SameWorkHoursEveryDay.getDefaultWorkingDay() - .getWorkableHours(dayAssignment.getDay()); - } - } - } else { - hours = dayAssignment.getHours(); - } - - if (map.get(day) == null) { - map.put(day, hours); - } else { - map.put(day, map.get(day) + hours); + if (!result.containsKey(day)) { + result.put(day, new HashSet()); } + result.get(day).add(dayAssignment.getResource()); } - - return convertAsNeededByZoom(map); + return result.entrySet(); } private SortedMap calculateHoursAdditionByDay( List dayAssignments) { - return calculateHoursAdditionByDay(dayAssignments, false, null, - null); + return new DefaultDayAssignmentCalculator() + .calculate(dayAssignments); } private SortedMap calculateHoursAdditionByDay( - List dayAssignments, LocalDate minDate, - LocalDate maxDate) { - return calculateHoursAdditionByDay(dayAssignments, false, minDate, - maxDate); - } - - private SortedMap calculateHoursAdditionByDay( - List dayAssignments, boolean calendarHours) { - return calculateHoursAdditionByDay(dayAssignments, calendarHours, - null, null); + List dayAssignments, final LocalDate minDate, + final LocalDate maxDate) { + return new DefaultDayAssignmentCalculator() { + protected boolean included(DayAssignment each) { + return each.includedIn(minDate, maxDate); + }; + }.calculate(dayAssignments); } }