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 d75d4c503..3ece56186 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 @@ -37,7 +37,6 @@ import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; import org.navalplanner.business.calendars.entities.ICalendar; import org.navalplanner.business.planner.entities.EffortDistributor.IResourceSelector; import org.navalplanner.business.planner.entities.EffortDistributor.ResourceWithAssignedDuration; -import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification; import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification; import org.navalplanner.business.resources.daos.IResourceDAO; import org.navalplanner.business.resources.entities.Criterion; @@ -284,12 +283,6 @@ public class GenericResourceAllocation extends return allocation; } - @Override - public HoursModification asHoursModification() { - return HoursModification.create(this, getIntendedHours(), - getAssociatedResources()); - } - @Override public ResourcesPerDayModification withDesiredResourcesPerDay( ResourcesPerDay resourcesPerDay) { 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 9926093e9..14528ee42 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 @@ -601,6 +601,27 @@ public abstract class ResourceAllocation extends return originalTotalAssignment; } + public interface IVisitor { + + T on(SpecificResourceAllocation specificAllocation); + + T on(GenericResourceAllocation genericAllocation); + } + + public static T visit(ResourceAllocation allocation, + IVisitor visitor) { + Validate.notNull(allocation); + Validate.notNull(visitor); + if (allocation instanceof GenericResourceAllocation) { + GenericResourceAllocation generic = (GenericResourceAllocation) allocation; + return visitor.on(generic); + } else if (allocation instanceof SpecificResourceAllocation) { + SpecificResourceAllocation specific = (SpecificResourceAllocation) allocation; + return visitor.on(specific); + } + throw new RuntimeException("can't handle: " + allocation.getClass()); + } + public abstract ResourcesPerDayModification withDesiredResourcesPerDay( ResourcesPerDay resourcesPerDay); @@ -608,19 +629,40 @@ public abstract class ResourceAllocation extends 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()); + return visit(this, new IVisitor() { + + @Override + public ResourcesPerDayModification on( + SpecificResourceAllocation specificAllocation) { + return ResourcesPerDayModification.create(specificAllocation, + getIntendedResourcesPerDay()); + } + + @Override + public ResourcesPerDayModification on( + GenericResourceAllocation genericAllocation) { + return ResourcesPerDayModification.create(genericAllocation, + getIntendedResourcesPerDay(), getAssociatedResources()); + } + }); } - public abstract HoursModification asHoursModification(); + public final HoursModification asHoursModification(){ + return visit(this, new IVisitor() { + + @Override + public HoursModification on(GenericResourceAllocation genericAllocation) { + return HoursModification.create(genericAllocation, getIntendedHours(), + getAssociatedResources()); + } + + @Override + public HoursModification on(SpecificResourceAllocation specificAllocation) { + return HoursModification.create(specificAllocation, + getIntendedHours()); + } + }); + } public abstract IAllocatable withPreviousAssociatedResources(); 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 6c49de9ea..4c44796ea 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 @@ -40,7 +40,6 @@ import org.navalplanner.business.calendars.entities.AvailabilityTimeLine.Interva import org.navalplanner.business.calendars.entities.CombinedWorkHours; import org.navalplanner.business.calendars.entities.ICalendar; import org.navalplanner.business.common.ProportionalDistributor; -import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification; import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification; import org.navalplanner.business.planner.limiting.entities.LimitingResourceQueueElement; import org.navalplanner.business.resources.daos.IResourceDAO; @@ -243,11 +242,6 @@ public class SpecificResourceAllocation extends return result; } - @Override - public HoursModification asHoursModification() { - return HoursModification.create(this, getIntendedHours()); - } - @Override public ResourcesPerDayModification withDesiredResourcesPerDay( ResourcesPerDay resourcesPerDay) {