Change getHours method to getDuration.

Instead of returning a number of hours return a EffortDuration.

FEA: ItEr60S19TimeUnitDataType
This commit is contained in:
Óscar González Fernández 2010-08-19 16:10:05 +02:00
parent 399a2edcd3
commit 6df2e3b75b
7 changed files with 73 additions and 49 deletions

View file

@ -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

View file

@ -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);

View file

@ -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;

View file

@ -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")

View file

@ -129,4 +129,8 @@ public class EffortDuration implements Comparable<EffortDuration> {
return seconds - other.seconds;
}
public EffortDuration multiplyBy(int integer) {
return EffortDuration.seconds(this.seconds * integer);
}
}

View file

@ -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

View file

@ -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) {