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 913f8d215..d75d4c503 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 @@ -284,12 +284,6 @@ public class GenericResourceAllocation extends return allocation; } - @Override - public ResourcesPerDayModification asResourcesPerDayModification() { - return ResourcesPerDayModification.create(this, - getIntendedResourcesPerDay(), getAssociatedResources()); - } - @Override public HoursModification asHoursModification() { return HoursModification.create(this, getIntendedHours(), 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 f1252f61d..364794a63 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 @@ -594,7 +594,21 @@ public abstract class ResourceAllocation extends public abstract ResourcesPerDayModification withDesiredResourcesPerDay( ResourcesPerDay resourcesPerDay); - public abstract ResourcesPerDayModification asResourcesPerDayModification(); + public final ResourcesPerDayModification asResourcesPerDayModification() { + if (getIntendedResourcesPerDay().isZero()) { + return null; + } + if (this instanceof GenericResourceAllocation) { + GenericResourceAllocation generic = (GenericResourceAllocation) this; + return ResourcesPerDayModification.create(generic, + getIntendedResourcesPerDay(), getAssociatedResources()); + } else if (this instanceof SpecificResourceAllocation) { + SpecificResourceAllocation specific = (SpecificResourceAllocation) this; + return ResourcesPerDayModification.create(specific, + getIntendedResourcesPerDay()); + } + throw new RuntimeException("can't handle: " + this.getClass()); + } public abstract HoursModification asHoursModification(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java index f0afc3a2e..6c49de9ea 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java @@ -243,12 +243,6 @@ public class SpecificResourceAllocation extends return result; } - @Override - public ResourcesPerDayModification asResourcesPerDayModification() { - return ResourcesPerDayModification.create(this, - getIntendedResourcesPerDay()); - } - @Override public HoursModification asHoursModification() { return HoursModification.create(this, getIntendedHours()); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java index eb6937afb..e369e35ca 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -723,6 +723,11 @@ public class Task extends TaskElement implements ITaskPositionConstrained { Direction direction, List> toBeModified) { List allocations = strategy .getResourcesPerDayModified(toBeModified); + if (allocations.isEmpty()) { + LOG.warn("all allocations for task " + this + + " have no valid data that could be used"); + return; + } switch (calculatedValue) { case NUMBER_OF_HOURS: ResourceAllocation.allocating(allocations).allocateOnTaskLength(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java index 65b6f8f1e..799d17642 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java @@ -29,6 +29,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; import org.navalplanner.business.calendars.entities.CombinedWorkHours; @@ -198,8 +199,9 @@ public abstract class ResourcesPerDayModification extends public static ResourcesPerDayModification create( GenericResourceAllocation resourceAllocation, ResourcesPerDay resourcesPerDay, List resources) { - return new OnGenericAllocation(resourceAllocation, - resourcesPerDay, resources); + Validate.isTrue(!resourcesPerDay.isZero()); + return new OnGenericAllocation(resourceAllocation, resourcesPerDay, + resources); } public static List withNewResources( @@ -215,6 +217,7 @@ public abstract class ResourcesPerDayModification extends public static ResourcesPerDayModification create( SpecificResourceAllocation resourceAllocation, ResourcesPerDay resourcesPerDay) { + Validate.isTrue(!resourcesPerDay.isZero()); return new OnSpecificAllocation(resourceAllocation, resourcesPerDay, Collections.singletonList(resourceAllocation .getResource())); @@ -225,7 +228,11 @@ public abstract class ResourcesPerDayModification extends IResourceDAO resourcesDAO) { List result = new ArrayList(); for (ResourceAllocation resourceAllocation : allocations) { - result.add(resourceAllocation.asResourcesPerDayModification()); + ResourcesPerDayModification modification = resourceAllocation + .asResourcesPerDayModification(); + if (modification != null) { + result.add(modification); + } } return ensureNoOneWithoutAssociatedResources(result, resourcesDAO); }