From 6df2e3b75b3553fb93baff34b7693c418f2c8265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 19 Aug 2010 16:10:05 +0200 Subject: [PATCH] Change getHours method to getDuration. Instead of returning a number of hours return a EffortDuration. FEA: ItEr60S19TimeUnitDataType --- .../calendars/entities/BaseCalendar.java | 72 +++++++++---------- .../calendars/entities/CalendarData.java | 4 ++ .../calendars/entities/CalendarException.java | 4 ++ .../calendars/entities/ResourceCalendar.java | 19 +++-- .../business/workingday/EffortDuration.java | 4 ++ .../web/calendars/BaseCalendarModel.java | 8 +-- .../web/calendars/BaseCalendarModelTest.java | 11 +-- 7 files changed, 73 insertions(+), 49 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java index 5870f6c05..d6353e5cc 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java @@ -21,6 +21,7 @@ package org.navalplanner.business.calendars.entities; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.EnumMap; @@ -51,7 +52,7 @@ import org.navalplanner.business.workingday.ResourcesPerDay; */ public class BaseCalendar extends IntegrationEntity implements IWorkHours { - private static final Integer DEFAULT_VALUE = 0; + private static final EffortDuration DEFAULT_VALUE = EffortDuration.zero(); public static BaseCalendar create() { return create(new BaseCalendar(CalendarData.create())); @@ -299,39 +300,39 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { * calendar restrictions. */ public Integer getCapacityAt(LocalDate date) { - return getWorkableHours(date); + return roundToHours(getWorkableHours(date)); } - private Integer getWorkableHours(LocalDate date) { + private EffortDuration getWorkableHours(LocalDate date) { if (!isActive(date)) { - return 0; + return EffortDuration.zero(); } CalendarException exceptionDay = getExceptionDay(date); if (exceptionDay != null) { - return exceptionDay.getHours(); + return exceptionDay.getDuration(); } switch (date.getDayOfWeek()) { case DateTimeConstants.MONDAY: - return getHours(date, Days.MONDAY); + return getDurationAt(date, Days.MONDAY); case DateTimeConstants.TUESDAY: - return getHours(date, Days.TUESDAY); + return getDurationAt(date, Days.TUESDAY); case DateTimeConstants.WEDNESDAY: - return getHours(date, Days.WEDNESDAY); + return getDurationAt(date, Days.WEDNESDAY); case DateTimeConstants.THURSDAY: - return getHours(date, Days.THURSDAY); + return getDurationAt(date, Days.THURSDAY); case DateTimeConstants.FRIDAY: - return getHours(date, Days.FRIDAY); + return getDurationAt(date, Days.FRIDAY); case DateTimeConstants.SATURDAY: - return getHours(date, Days.SATURDAY); + return getDurationAt(date, Days.SATURDAY); case DateTimeConstants.SUNDAY: - return getHours(date, Days.SUNDAY); + return getDurationAt(date, Days.SUNDAY); default: throw new RuntimeException("Day of week out of range!"); @@ -346,27 +347,27 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { return true; } - public Integer getHours(Date date, Days day) { - return getHours(new LocalDate(date), day); + public EffortDuration getDurationAt(Date date, Days day) { + return getDurationAt(new LocalDate(date), day); } - public Integer getHours(LocalDate date, Days day) { + public EffortDuration getDurationAt(LocalDate date, Days day) { CalendarData calendarData = getCalendarData(date); - Integer hours = calendarData.getHours(day); + EffortDuration duration = calendarData.getDurationAt(day); BaseCalendar parent = getParent(date); - if ((hours == null) && (parent != null)) { - return parent.getHours(date, day); + if (duration == null && parent != null) { + return parent.getDurationAt(date, day); } - - return valueIfNotNullElseDefaultValue(hours); + return valueIfNotNullElseDefaultValue(duration); } - private Integer valueIfNotNullElseDefaultValue(Integer hours) { - if (hours == null) { + private EffortDuration valueIfNotNullElseDefaultValue( + EffortDuration duration) { + if (duration == null) { return DEFAULT_VALUE; } - return hours; + return duration; } /** @@ -907,30 +908,29 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { @Override public Integer toHours(LocalDate day, ResourcesPerDay resourcesPerDay) { - final Integer workableHours = getWorkableHours(day); - return limitOverAssignability(day, - roundToHours(resourcesPerDay - .asDurationGivenWorkingDayOf(EffortDuration - .hours(workableHours))), - workableHours); + final EffortDuration workableHours = getWorkableHours(day); + return roundToHours(limitOverAssignability(day, + resourcesPerDay.asDurationGivenWorkingDayOf(workableHours), + workableHours)); } - private Integer limitOverAssignability(LocalDate day, - int hoursInitiallyCalculated, int workableHoursAtDay) { + private EffortDuration limitOverAssignability(LocalDate day, + EffortDuration effortInitiallyCalculated, + EffortDuration workableHoursAtDay) { boolean overAssignable = isOverAssignable(day); if (overAssignable) { - return hoursInitiallyCalculated; + return effortInitiallyCalculated; } else { - return Math.min(hoursInitiallyCalculated, - multiplyByCapacity(workableHoursAtDay)); + return Collections.min(Arrays.asList(effortInitiallyCalculated, + multiplyByCapacity(workableHoursAtDay))); } } /** * This method is intended to be overriden */ - protected int multiplyByCapacity(Integer workableHours) { - return workableHours; + protected EffortDuration multiplyByCapacity(EffortDuration duration) { + return duration; } @Override diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java index 09de0f092..dc947caad 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarData.java @@ -109,6 +109,10 @@ public class CalendarData extends IntegrationEntity { return getHoursForDay(day); } + public EffortDuration getDurationAt(Days day) { + return effortPerDay.get(day.ordinal()); + } + public void setHours(Days day, Integer hours) throws IllegalArgumentException { setHoursForDay(day, hours); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java index 5e1d2984f..32177b63e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarException.java @@ -103,6 +103,10 @@ public class CalendarException extends IntegrationEntity { return duration != null ? duration.getHours() : 0; } + public EffortDuration getDuration() { + return duration; + } + @NotNull public CalendarExceptionType getType() { return type; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java index dc6614ba1..835196634 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java @@ -24,6 +24,7 @@ import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotNull; import org.joda.time.LocalDate; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.workingday.EffortDuration; /** * Calendar for a {@link Resource}. @@ -81,14 +82,24 @@ public class ResourceCalendar extends BaseCalendar { return multiplyByCapacity(super.getCapacityAt(date)); } - protected int multiplyByCapacity(Integer workableHours) { - if (workableHours == null) { + protected Integer multiplyByCapacity(Integer duration) { + if (duration == null) { return 0; } if (capacity == null) { - return workableHours; + return duration; } - return capacity * workableHours; + return duration * capacity; + } + + protected EffortDuration multiplyByCapacity(EffortDuration duration) { + if (duration == null) { + return EffortDuration.zero(); + } + if (capacity == null) { + return duration; + } + return duration.multiplyBy(capacity); } @AssertTrue(message = "Capacity must be a positive integer number") diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java b/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java index 8d8edaca8..ffe9b2711 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workingday/EffortDuration.java @@ -129,4 +129,8 @@ public class EffortDuration implements Comparable { return seconds - other.seconds; } + public EffortDuration multiplyBy(int integer) { + return EffortDuration.seconds(this.seconds * integer); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java index 31175dd40..a88720a18 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java @@ -33,13 +33,13 @@ import org.joda.time.LocalDate; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.calendars.daos.ICalendarExceptionTypeDAO; import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.BaseCalendar.DayType; import org.navalplanner.business.calendars.entities.CalendarAvailability; import org.navalplanner.business.calendars.entities.CalendarData; +import org.navalplanner.business.calendars.entities.CalendarData.Days; import org.navalplanner.business.calendars.entities.CalendarException; import org.navalplanner.business.calendars.entities.CalendarExceptionType; import org.navalplanner.business.calendars.entities.ResourceCalendar; -import org.navalplanner.business.calendars.entities.BaseCalendar.DayType; -import org.navalplanner.business.calendars.entities.CalendarData.Days; import org.navalplanner.business.common.daos.IConfigurationDAO; import org.navalplanner.business.common.entities.Configuration; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -275,8 +275,8 @@ public class BaseCalendarModel implements IBaseCalendarModel { if (getBaseCalendar() == null) { return null; } - - return getBaseCalendar().getHours(selectedDate, day); + return BaseCalendar.roundToHours(getBaseCalendar().getDurationAt( + selectedDate, day)); } @Override diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/calendars/BaseCalendarModelTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/calendars/BaseCalendarModelTest.java index e8024e479..f4a534a2d 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/calendars/BaseCalendarModelTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/calendars/BaseCalendarModelTest.java @@ -24,6 +24,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.business.workingday.EffortDuration.hours; import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE; import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_FILE; import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE; @@ -76,7 +77,8 @@ public class BaseCalendarModelTest { assertThat(baseCalendarModel.getBaseCalendars().get(previous) .getId(), equalTo(baseCalendar.getId())); assertThat(baseCalendarModel.getBaseCalendars().get(previous) - .getHours(new Date(), Days.MONDAY), equalTo(8)); + .getDurationAt(new Date(), Days.MONDAY), + equalTo(hours(8))); } catch (ValidationException e) { fail("It should not throw an exception"); } @@ -108,8 +110,8 @@ public class BaseCalendarModelTest { equalTo(previous + 1)); assertThat(baseCalendarModel.getBaseCalendars().get(previous).getId(), equalTo(baseCalendar.getId())); - assertThat(baseCalendarModel.getBaseCalendars().get(previous).getHours( - new Date(), Days.MONDAY), equalTo(4)); + assertThat(baseCalendarModel.getBaseCalendars().get(previous) + .getDurationAt(new Date(), Days.MONDAY), equalTo(hours(4))); } @Test @@ -130,8 +132,7 @@ public class BaseCalendarModelTest { assertThat(baseCalendarModel.getBaseCalendars().size(), equalTo(previous + 1)); assertThat(baseCalendarModel.getBaseCalendars().get(previous) - .getHours( - date, Days.MONDAY), equalTo(4)); + .getDurationAt(date, Days.MONDAY), equalTo(hours(4))); assertThat(baseCalendarModel.getBaseCalendars().get(previous) .getCalendarDataVersions().size(), equalTo(2)); } catch (ValidationException e) {