From b7765d3e24f6d879cdd97adf6648b43d5d6fe02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 15 Sep 2009 23:43:53 +0200 Subject: [PATCH] ItEr25S07CUAsignacionGrupoRecursosAPlanificacionItEr24S08: Extracting superclass for doing allocation --- .../entities/GenericResourceAllocation.java | 57 ++++--------------- .../planner/entities/ResourceAllocation.java | 57 +++++++++++++++++++ 2 files changed, 68 insertions(+), 46 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java index 58341acae..8756d7159 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.joda.time.Days; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.CombinedWorkHours; @@ -85,13 +84,14 @@ public class GenericResourceAllocation extends ResourceAllocation { return Collections.unmodifiableSet(criterions); } - private class Allocation implements IAllocatable { + private class GenericAllocation extends + AssignmentsAllocation { private final List resources; private final List workHours; - public Allocation(List resources) { + public GenericAllocation(List resources) { this.resources = resources; this.workHours = new ArrayList(); for (Resource resource : resources) { @@ -99,7 +99,7 @@ public class GenericResourceAllocation extends ResourceAllocation { } } - private IWorkHours generateWorkHoursFor(Resource resource) { + private final IWorkHours generateWorkHoursFor(Resource resource) { List calendars = new ArrayList(); if (resource.getCalendar() != null) { calendars.add(resource.getCalendar()); @@ -116,47 +116,7 @@ public class GenericResourceAllocation extends ResourceAllocation { } @Override - public void allocate(ResourcesPerDay resourcesPerDay) { - Task task = getTask(); - LocalDate startInclusive = new LocalDate(task.getStartDate()); - List assigmentsCreated = new ArrayList(); - for (int i = 0; i < getDaysElapsedAt(task); i++) { - LocalDate day = startInclusive.plusDays(i); - int totalForDay = calculateTotalToDistribute(day, - resourcesPerDay); - assigmentsCreated.addAll(distributeForDay(day, totalForDay)); - } - setResourcesPerDay(resourcesPerDay); - setAssigments(assigmentsCreated); - } - - private int calculateTotalToDistribute(LocalDate day, - ResourcesPerDay resourcesPerDay) { - Integer workableHours = getWorkableHoursAt(day); - return resourcesPerDay.asHoursGivenResourceWorkingDayOf(workableHours); - } - - private Integer getWorkableHoursAt(LocalDate day) { - if (getTaskCalendar() == null) { - return SameWorkHoursEveryDay.getDefaultWorkingDay() - .getWorkableHours(day); - } else { - return getTaskCalendar().getWorkableHours(day); - } - } - - private BaseCalendar getTaskCalendar() { - return getTask().getCalendar(); - } - - private int getDaysElapsedAt(Task task) { - LocalDate endExclusive = new LocalDate(task.getEndDate()); - Days daysBetween = Days.daysBetween(new LocalDate(task - .getStartDate()), endExclusive); - return daysBetween.getDays(); - } - - private List distributeForDay(LocalDate day, + protected List distributeForDay(LocalDate day, int totalHours) { List result = new ArrayList(); List shares = currentSharesFor(day); @@ -188,10 +148,15 @@ public class GenericResourceAllocation extends ResourceAllocation { return shares; } + @Override + protected void resetAssignmentsTo(List assignments) { + setAssigments(assignments); + } + } public IAllocatable forResources(Collection resources) { - return new Allocation(new ArrayList(resources)); + return new GenericAllocation(new ArrayList(resources)); } private void setAssigments(List assignmentsCreated) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java index f42dee20e..b555ced23 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java @@ -1,10 +1,15 @@ package org.navalplanner.business.planner.entities; +import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.Validate; import org.hibernate.validator.NotNull; +import org.joda.time.Days; +import org.joda.time.LocalDate; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; import org.navalplanner.business.common.BaseEntity; /** @@ -54,6 +59,58 @@ public abstract class ResourceAllocation extends BaseEntity { return task; } + protected abstract class AssignmentsAllocation + implements IAllocatable { + + @Override + public final void allocate(ResourcesPerDay resourcesPerDay) { + Task task = getTask(); + LocalDate startInclusive = new LocalDate(task.getStartDate()); + List assigmentsCreated = new ArrayList(); + for (int i = 0; i < getDaysElapsedAt(task); i++) { + LocalDate day = startInclusive.plusDays(i); + int totalForDay = calculateTotalToDistribute(day, + resourcesPerDay); + assigmentsCreated.addAll(distributeForDay(day, totalForDay)); + } + setResourcesPerDay(resourcesPerDay); + resetAssignmentsTo(assigmentsCreated); + } + + protected abstract void resetAssignmentsTo(List assignments); + + private int calculateTotalToDistribute(LocalDate day, + ResourcesPerDay resourcesPerDay) { + Integer workableHours = getWorkableHoursAt(day); + return resourcesPerDay + .asHoursGivenResourceWorkingDayOf(workableHours); + } + + private Integer getWorkableHoursAt(LocalDate day) { + if (getTaskCalendar() == null) { + return SameWorkHoursEveryDay.getDefaultWorkingDay() + .getWorkableHours(day); + } else { + return getTaskCalendar().getWorkableHours(day); + } + } + + protected final BaseCalendar getTaskCalendar() { + return getTask().getCalendar(); + } + + private int getDaysElapsedAt(Task task) { + LocalDate endExclusive = new LocalDate(task.getEndDate()); + Days daysBetween = Days.daysBetween(new LocalDate(task + .getStartDate()), endExclusive); + return daysBetween.getDays(); + } + + protected abstract List distributeForDay(LocalDate day, + int totalHours); + + } + public AssigmentFunction getAssigmentFunction() { return assigmentFunction; }