diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningCommand.java index ca176fc7a..a4943310f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningCommand.java @@ -27,7 +27,7 @@ import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; import org.navalplanner.web.planner.order.IEditTaskUtilities; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningController.java index 7f684d44b..b3713d6e8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningController.java @@ -30,7 +30,7 @@ import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.common.Util; import org.navalplanner.web.orders.ManageOrderElementAdvancesController; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.zkoss.ganttz.TaskComponent; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java index 641bb7420..a77093273 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java @@ -33,7 +33,7 @@ import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.planner.daos.ITaskElementDAO; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningCommand.java index 4130d0618..8e50a78a7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningCommand.java @@ -22,7 +22,7 @@ package org.navalplanner.web.planner.advances; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.ICommandOnTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningModel.java index 6b567149f..9be0a28ad 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/IAdvanceAssignmentPlanningModel.java @@ -24,7 +24,7 @@ package org.navalplanner.web.planner.advances; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.IContextWithPlannerTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationCommand.java index 997442eea..8952d1558 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationCommand.java @@ -22,7 +22,7 @@ package org.navalplanner.web.planner.allocation; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.zkoss.ganttz.extensions.ICommandOnTask; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java index 8ad6e27f5..5478498e0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IResourceAllocationModel.java @@ -30,7 +30,7 @@ import org.navalplanner.business.orders.entities.AggregatedHoursGroup; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.planner.allocation.AllocationRowsHandler.Warnings; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.IContextWithPlannerTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationCommand.java index 09a21e51b..fcb2dae00 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationCommand.java @@ -26,7 +26,7 @@ import static org.navalplanner.web.I18nHelper._; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.planner.order.IEditTaskUtilities; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -75,8 +75,7 @@ public class ResourceAllocationCommand implements IResourceAllocationCommand { } @Override - public void initialize( -EditTaskController editTaskController, + public void initialize(EditTaskController editTaskController, PlanningState planningState) { this.editTaskController = editTaskController; this.planningState = planningState; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java index 173e37d94..408ac5cc5 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationController.java @@ -47,7 +47,7 @@ import org.navalplanner.web.common.components.NewAllocationSelector; import org.navalplanner.web.common.components.NewAllocationSelectorCombo; import org.navalplanner.web.common.components.ResourceAllocationBehaviour; import org.navalplanner.web.planner.allocation.TaskInformation.ITotalHoursCalculationListener; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.navalplanner.web.planner.taskedition.TaskPropertiesController; import org.springframework.beans.factory.config.BeanDefinition; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java index 18cb1973e..d9b72c580 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java @@ -57,7 +57,7 @@ import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.ResourceEnum; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.web.planner.allocation.AllocationRowsHandler.Warnings; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationCommand.java index c3b4af945..4237f5886 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationCommand.java @@ -26,7 +26,7 @@ import static org.navalplanner.web.I18nHelper._; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.planner.order.IEditTaskUtilities; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationController.java index b2f5dcb09..113744cd2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationController.java @@ -29,7 +29,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.common.Util; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.zkoss.ganttz.TaskComponent; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java index 2da14e551..ed56e5e42 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java @@ -52,7 +52,7 @@ import org.navalplanner.business.planner.entities.consolidations.NonCalculatedCo import org.navalplanner.business.planner.entities.consolidations.NonCalculatedConsolidation; import org.navalplanner.business.workingday.EffortDuration; import org.navalplanner.business.workingday.IntraDayDate; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationCommand.java index a5fa52545..e89d0ce43 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationCommand.java @@ -22,7 +22,7 @@ package org.navalplanner.web.planner.consolidations; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.ICommandOnTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationModel.java index b30f25e11..da455705e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/IAdvanceConsolidationModel.java @@ -25,7 +25,7 @@ import java.util.List; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.IContextWithPlannerTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/ILimitingResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/ILimitingResourceAllocationModel.java index 97e7040f8..b4c75bd68 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/ILimitingResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/ILimitingResourceAllocationModel.java @@ -27,7 +27,7 @@ import org.navalplanner.business.orders.entities.AggregatedHoursGroup; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.planner.allocation.INewAllocationsAdder; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.IContextWithPlannerTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationController.java index 48295b7df..966a0fab7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationController.java @@ -35,7 +35,7 @@ import org.navalplanner.web.common.components.NewAllocationSelectorCombo; import org.navalplanner.web.common.components.ResourceAllocationBehaviour; import org.navalplanner.web.planner.allocation.TaskInformation; import org.navalplanner.web.planner.allocation.TaskInformation.ITotalHoursCalculationListener; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationModel.java index 84d539019..ddef21afa 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/limiting/allocation/LimitingResourceAllocationModel.java @@ -51,7 +51,7 @@ import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.ResourceEnum; import org.navalplanner.web.common.IMessagesForUser; import org.navalplanner.web.common.Level; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/AddMilestoneCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/AddMilestoneCommand.java index f70dcdacf..ecb93b54e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/AddMilestoneCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/AddMilestoneCommand.java @@ -27,7 +27,7 @@ import org.navalplanner.business.planner.daos.ITaskElementDAO; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; import org.navalplanner.business.planner.entities.TaskMilestone; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/DeleteMilestoneCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/DeleteMilestoneCommand.java index 3f8577d24..668ea45e2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/DeleteMilestoneCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/DeleteMilestoneCommand.java @@ -24,7 +24,7 @@ import static org.navalplanner.web.I18nHelper._; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskMilestone; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IAddMilestoneCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IAddMilestoneCommand.java index 5b6c238bd..41e5a0940 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IAddMilestoneCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IAddMilestoneCommand.java @@ -22,7 +22,7 @@ package org.navalplanner.web.planner.milestone; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.ICommandOnTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IDeleteMilestoneCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IDeleteMilestoneCommand.java index bb720c22b..24b478964 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IDeleteMilestoneCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/milestone/IDeleteMilestoneCommand.java @@ -21,7 +21,7 @@ package org.navalplanner.web.planner.milestone; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.ICommandOnTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/IOrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/IOrderPlanningModel.java index 7142cd962..8e352470a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/IOrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/IOrderPlanningModel.java @@ -29,6 +29,7 @@ import org.navalplanner.web.common.ViewSwitcher; import org.navalplanner.web.planner.advances.AdvanceAssignmentPlanningController; import org.navalplanner.web.planner.calendar.CalendarAllocationController; import org.navalplanner.web.planner.consolidations.AdvanceConsolidationController; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.zkoss.ganttz.Planner; import org.zkoss.ganttz.extensions.ICommand; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISaveCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISaveCommand.java index a9677211d..9bf06575e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISaveCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISaveCommand.java @@ -22,6 +22,7 @@ package org.navalplanner.web.planner.order; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.extensions.ICommand; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISubcontractCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISubcontractCommand.java index 233d9877d..56587b156 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISubcontractCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/ISubcontractCommand.java @@ -22,6 +22,7 @@ package org.navalplanner.web.planner.order; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.zkoss.ganttz.extensions.ICommandOnTask; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java index 3aafbfa20..7d39ac78d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java @@ -92,6 +92,7 @@ import org.navalplanner.web.planner.consolidations.IAdvanceConsolidationCommand; import org.navalplanner.web.planner.milestone.IAddMilestoneCommand; import org.navalplanner.web.planner.milestone.IDeleteMilestoneCommand; import org.navalplanner.web.planner.order.ISaveCommand.IAfterSaveListener; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.reassign.IReassignCommand; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.navalplanner.web.planner.taskedition.ITaskPropertiesCommand; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java deleted file mode 100644 index 222a97c92..000000000 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java +++ /dev/null @@ -1,514 +0,0 @@ -/* - * This file is part of NavalPlan - * - * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e - * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.navalplanner.web.planner.order; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.commons.lang.Validate; -import org.navalplanner.business.orders.daos.IOrderDAO; -import org.navalplanner.business.orders.entities.Order; -import org.navalplanner.business.orders.entities.TaskSource; -import org.navalplanner.business.planner.daos.ITaskSourceDAO; -import org.navalplanner.business.planner.entities.DayAssignment; -import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.business.planner.entities.TaskGroup; -import org.navalplanner.business.planner.entities.TaskMilestone; -import org.navalplanner.business.resources.daos.ICriterionDAO; -import org.navalplanner.business.resources.daos.IResourceDAO; -import org.navalplanner.business.resources.entities.Criterion; -import org.navalplanner.business.resources.entities.CriterionSatisfaction; -import org.navalplanner.business.resources.entities.IAssignmentsOnResourceCalculator; -import org.navalplanner.business.resources.entities.Resource; -import org.navalplanner.business.scenarios.daos.IOrderVersionDAO; -import org.navalplanner.business.scenarios.daos.IScenarioDAO; -import org.navalplanner.business.scenarios.entities.OrderVersion; -import org.navalplanner.business.scenarios.entities.Scenario; - -public abstract class PlanningState { - - public static IScenarioInfo ownerScenarioInfo( - IOrderVersionDAO orderVersionDAO, Scenario scenario, - OrderVersion currentVersionForScenario) { - return new UsingOwnerScenario(orderVersionDAO, scenario, - currentVersionForScenario); - } - - public static IScenarioInfo forNotOwnerScenario( - IAssignmentsOnResourceCalculator assigmentsOnResourceCalculator, - IOrderDAO orderDAO, - IScenarioDAO scenarioDAO, ITaskSourceDAO taskSourceDAO, - Order order, OrderVersion previousVersion, - Scenario currentScenario, OrderVersion newVersion) { - return new UsingNotOwnerScenario(assigmentsOnResourceCalculator, - orderDAO, scenarioDAO, taskSourceDAO, - order, previousVersion, - currentScenario, newVersion); - } - - public interface IScenarioInfo { - - public IAssignmentsOnResourceCalculator getAssignmentsCalculator(); - - public Scenario getCurrentScenario(); - - public boolean isUsingTheOwnerScenario(); - - /** - * @throws IllegalStateException - * if it's using the owner scenario - */ - public void saveVersioningInfo() throws IllegalStateException; - - public void afterCommit(); - } - - private static class EmptySchedulingScenarioInfo implements IScenarioInfo { - - private final Scenario currentScenario; - - public EmptySchedulingScenarioInfo(Scenario currentScenario) { - this.currentScenario = currentScenario; - } - - @Override - public void afterCommit() { - } - - @Override - public Scenario getCurrentScenario() { - return currentScenario; - } - - @Override - public boolean isUsingTheOwnerScenario() { - return true; - } - - @Override - public void saveVersioningInfo() - throws IllegalStateException { - } - - @Override - public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { - return new Resource.AllResourceAssignments(); - } - - } - - private static class UsingOwnerScenario implements IScenarioInfo { - - private final Scenario currentScenario; - private final OrderVersion currentVersionForScenario; - private final IOrderVersionDAO orderVersionDAO; - - public UsingOwnerScenario(IOrderVersionDAO orderVersionDAO, - Scenario currentScenario, OrderVersion currentVersionForScenario) { - Validate.notNull(orderVersionDAO); - Validate.notNull(currentScenario); - Validate.notNull(currentVersionForScenario); - this.orderVersionDAO = orderVersionDAO; - this.currentScenario = currentScenario; - this.currentVersionForScenario = currentVersionForScenario; - } - - @Override - public boolean isUsingTheOwnerScenario() { - return true; - } - - @Override - public void saveVersioningInfo() throws IllegalStateException { - currentVersionForScenario.savingThroughOwner(); - orderVersionDAO.save(currentVersionForScenario); - } - - @Override - public void afterCommit() { - // do nothing - } - - @Override - public Scenario getCurrentScenario() { - return currentScenario; - } - - @Override - public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { - return new Resource.AllResourceAssignments(); - } - } - - private static class UsingNotOwnerScenario implements IScenarioInfo { - - private final IOrderDAO orderDAO; - private final IScenarioDAO scenarioDAO; - private final ITaskSourceDAO taskSourceDAO; - - private final OrderVersion previousVersion; - private final Scenario currentScenario; - private final OrderVersion newVersion; - private final Order order; - private boolean versionSaved = false; - - private final IAssignmentsOnResourceCalculator assigmentsOnResourceCalculator; - - public UsingNotOwnerScenario( - IAssignmentsOnResourceCalculator assigmentsOnResourceCalculator, - IOrderDAO orderDAO, - IScenarioDAO scenarioDAO, ITaskSourceDAO taskSourceDAO, - Order order, OrderVersion previousVersion, - Scenario currentScenario, - OrderVersion newVersion) { - Validate.notNull(assigmentsOnResourceCalculator); - Validate.notNull(order); - Validate.notNull(previousVersion); - Validate.notNull(currentScenario); - Validate.notNull(newVersion); - Validate.notNull(orderDAO); - Validate.notNull(scenarioDAO); - Validate.notNull(taskSourceDAO); - this.assigmentsOnResourceCalculator = assigmentsOnResourceCalculator; - this.orderDAO = orderDAO; - this.scenarioDAO = scenarioDAO; - this.taskSourceDAO = taskSourceDAO; - this.previousVersion = previousVersion; - this.currentScenario = currentScenario; - this.newVersion = newVersion; - this.order = order; - } - - @Override - public boolean isUsingTheOwnerScenario() { - return versionSaved; - } - - @Override - public void saveVersioningInfo() throws IllegalStateException { - if (versionSaved) { - return; - } - orderDAO.save(order); - TaskSource taskSource = order.getTaskSource(); - taskSourceDAO.save(taskSource); - taskSource.dontPoseAsTransientObjectAnymore(); - taskSource.getTask().dontPoseAsTransientObjectAnymore(); - scenarioDAO.updateDerivedScenariosWithNewVersion(previousVersion, - order, currentScenario, newVersion); - } - - @Override - public void afterCommit() { - versionSaved = true; - } - - @Override - public Scenario getCurrentScenario() { - return currentScenario; - } - - @Override - public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { - return assigmentsOnResourceCalculator; - } - } - - public static PlanningState create(TaskGroup rootTask, - Collection initialState, - Collection initialResources, - ICriterionDAO criterionDAO, IResourceDAO resourceDAO, - IScenarioInfo scenarioInfo) { - return new WithDataPlanningState(rootTask, initialState, - initialResources, criterionDAO, resourceDAO, scenarioInfo); - } - - public static PlanningState createEmpty(Scenario currentScenario, - Order order) { - return new EmptyPlannigState(currentScenario, order); - } - - private final Order order; - - public PlanningState(Order order) { - Validate.notNull(order); - this.order = order; - } - - public Order getOrder() { - return order; - } - - public abstract boolean isEmpty(); - - /** - *

- * When the scenario was not owner, the previous {@link DayAssignment day - * assingments} for the scenario must be avoided. Since the previous - * scenario was not an owner, all tasks and related information are copied, - * but the resource keeps pointing to the scenario's previous assignments. - *

- *

- * If the scenario is the owner, the assignments are returned directly. - *

- * @return the {@link IAssignmentsOnResourceCalculator} to use. - * @see IAssignmentsOnResourceCalculator - * @see AvoidStaleAssignments - */ - public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { - return getScenarioInfo().getAssignmentsCalculator(); - } - - public abstract Collection getTasksToSave(); - - public abstract List getInitial(); - - public abstract void reassociateResourcesWithSession(); - - public abstract Collection getToRemove(); - - public abstract void removed(TaskElement taskElement); - - public abstract void added(TaskElement taskElement); - - public abstract TaskGroup getRootTask(); - - public abstract IScenarioInfo getScenarioInfo(); - - public Scenario getCurrentScenario() { - return getScenarioInfo().getCurrentScenario(); - } - - static class WithDataPlanningState extends PlanningState { - - private final ArrayList initial; - - private final Set toSave; - - private final Set toRemove; - - private Set resources = new HashSet(); - - private final TaskGroup rootTask; - - private final ICriterionDAO criterionDAO; - - private final IResourceDAO resourceDAO; - - private final IScenarioInfo scenarioInfo; - - private WithDataPlanningState(TaskGroup rootTask, - Collection initialState, - Collection initialResources, - ICriterionDAO criterionDAO, IResourceDAO resourceDAO, - IScenarioInfo scenarioInfo) { - super((Order) rootTask.getOrderElement()); - this.rootTask = rootTask; - this.criterionDAO = criterionDAO; - this.resourceDAO = resourceDAO; - this.scenarioInfo = scenarioInfo; - this.initial = new ArrayList(initialState); - this.toSave = new HashSet(initialState); - this.toRemove = new HashSet(); - this.resources = OrderPlanningModel - .loadRequiredDataFor(new HashSet( - initialResources)); - associateWithScenario(this.resources); - } - - private void associateWithScenario( - Collection resources) { - Scenario currentScenario = getCurrentScenario(); - for (Resource each : resources) { - each.useScenario(currentScenario); - - } - } - - @Override - public Collection getTasksToSave() { - return Collections.unmodifiableCollection(toSave); - } - - @Override - public List getInitial() { - return new ArrayList(initial); - } - - @Override - public void reassociateResourcesWithSession() { - for (Resource resource : resources) { - resourceDAO.reattach(resource); - } - // ensuring no repeated instances of criterions - reattachCriterions(getExistentCriterions(resources)); - addingNewlyCreated(resourceDAO); - } - - private void reattachCriterions(Set criterions) { - for (Criterion each : criterions) { - criterionDAO.reattachUnmodifiedEntity(each); - } - } - - private Set getExistentCriterions(Set resources) { - Set result = new HashSet(); - for (Resource resource : resources) { - for (CriterionSatisfaction each : resource - .getCriterionSatisfactions()) { - result.add(each.getCriterion()); - } - } - return result; - } - - private void addingNewlyCreated(IResourceDAO resourceDAO) { - Set newResources = getNewResources(resourceDAO); - OrderPlanningModel.loadRequiredDataFor(newResources); - associateWithScenario(newResources); - resources.addAll(newResources); - } - - private Set getNewResources(IResourceDAO resourceDAO) { - Set result = new HashSet(resourceDAO - .list(Resource.class)); - result.removeAll(resources); - return result; - } - - @Override - public Collection getToRemove() { - return Collections - .unmodifiableCollection(onlyNotTransient(toRemove)); - } - - private List onlyNotTransient( - Collection toRemove) { - ArrayList result = new ArrayList(); - for (TaskElement taskElement : toRemove) { - if (taskElement.getId() != null) { - result.add(taskElement); - } - } - return result; - } - - @Override - public void removed(TaskElement taskElement) { - taskElement.detach(); - if (!isTopLevel(taskElement)) { - return; - } - toSave.remove(taskElement); - toRemove.add(taskElement); - } - - private boolean isTopLevel(TaskElement taskElement) { - if (taskElement instanceof TaskMilestone) { - return true; - } - return taskElement.getParent() == null; - } - - @Override - public void added(TaskElement taskElement) { - if (!isTopLevel(taskElement)) { - return; - } - toRemove.remove(taskElement); - toSave.add(taskElement); - } - - @Override - public TaskGroup getRootTask() { - return rootTask; - } - - @Override - public IScenarioInfo getScenarioInfo() { - return scenarioInfo; - } - - @Override - public boolean isEmpty() { - return false; - } - - } - - private static class EmptyPlannigState extends PlanningState { - - private final Scenario currentScenario; - - private EmptyPlannigState(Scenario currentScenario, Order order) { - super(order); - this.currentScenario = currentScenario; - } - - @Override - public void added(TaskElement taskElement) { - } - - @Override - public List getInitial() { - return Collections.emptyList(); - } - - @Override - public TaskGroup getRootTask() { - return null; - } - - @Override - public Collection getTasksToSave() { - return Collections.emptyList(); - } - - @Override - public Collection getToRemove() { - return Collections.emptyList(); - } - - @Override - public void reassociateResourcesWithSession() { - } - - public void removed(TaskElement taskElement) { - } - - @Override - public IScenarioInfo getScenarioInfo() { - return new EmptySchedulingScenarioInfo(currentScenario); - } - - @Override - public boolean isEmpty() { - return true; - } - - } - -} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningStateCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningStateCreator.java index bf237edff..b9c955bb8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningStateCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningStateCreator.java @@ -21,14 +21,17 @@ package org.navalplanner.web.planner.order; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.apache.commons.lang.Validate; import org.hibernate.Hibernate; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.daos.ITaskElementDAO; import org.navalplanner.business.planner.daos.ITaskSourceDAO; import org.navalplanner.business.planner.entities.DayAssignment; @@ -37,9 +40,11 @@ import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; +import org.navalplanner.business.planner.entities.TaskMilestone; import org.navalplanner.business.resources.daos.ICriterionDAO; import org.navalplanner.business.resources.daos.IResourceDAO; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.IAssignmentsOnResourceCalculator; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.scenarios.IScenarioManager; @@ -48,7 +53,6 @@ import org.navalplanner.business.scenarios.daos.IScenarioDAO; import org.navalplanner.business.scenarios.entities.OrderVersion; import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.web.calendars.BaseCalendarModel; -import org.navalplanner.web.planner.order.PlanningState.IScenarioInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -138,7 +142,7 @@ public class PlanningStateCreator { private PlanningState createInitialPlanning(Order orderReloaded) { Scenario currentScenario = scenarioManager.getCurrent(); if (!orderReloaded.isSomeTaskElementScheduled()) { - return PlanningState.createEmpty(currentScenario, orderReloaded); + return new EmptyPlannigState(currentScenario, orderReloaded); } final List allResources = resourceDAO.list(Resource.class); criterionDAO.list(Criterion.class); @@ -147,9 +151,9 @@ public class PlanningStateCreator { forceLoadDayAssignments(orderReloaded.getResources()); switchAllocationsToScenario(currentScenario, taskElement); - PlanningState result = PlanningState.create(taskElement, - orderReloaded.getAssociatedTasks(), allResources, criterionDAO, - resourceDAO, buildScenarioInfo(orderReloaded)); + PlanningState result = new WithDataPlanningState(taskElement, + orderReloaded.getAssociatedTasks(), allResources, + buildScenarioInfo(orderReloaded)); forceLoadOfDependenciesCollections(result.getInitial()); forceLoadOfWorkingHours(result.getInitial()); @@ -223,26 +227,23 @@ public class PlanningStateCreator { private IScenarioInfo buildScenarioInfo(Order orderReloaded) { Scenario currentScenario = scenarioManager.getCurrent(); if (orderReloaded.isUsingTheOwnerScenario()) { - return createOwnerScenarioInfoFor(orderReloaded, currentScenario); + return new UsingOwnerScenario(currentScenario, currentScenario.getOrderVersion(orderReloaded)); } final List previousAssignments = orderReloaded .getDayAssignments(); + OrderVersion previousVersion = currentScenario .getOrderVersion(orderReloaded); OrderVersion newVersion = OrderVersion .createInitialVersion(currentScenario); + orderReloaded.writeSchedulingDataChangesTo(currentScenario, newVersion); switchAllocationsToScenario(currentScenario, orderReloaded.getAssociatedTaskElement()); - return createScenarioInfoForNotOwnerScenario(new AvoidStaleAssignments( - previousAssignments), orderReloaded, previousVersion, - newVersion, currentScenario); - } - private IScenarioInfo createOwnerScenarioInfoFor(Order orderReloaded, Scenario currentScenario) { - return PlanningState - .ownerScenarioInfo(orderVersionDAO, currentScenario, - currentScenario.getOrderVersion(orderReloaded)); + return new UsingNotOwnerScenario(new AvoidStaleAssignments( + previousAssignments), orderReloaded, previousVersion, + currentScenario, newVersion); } private static void switchAllocationsToScenario(Scenario scenario, @@ -252,15 +253,6 @@ public class PlanningStateCreator { } } - private IScenarioInfo createScenarioInfoForNotOwnerScenario( - IAssignmentsOnResourceCalculator returningNewAssignments, - Order orderReloaded, OrderVersion previousVersion, - OrderVersion newVersion, Scenario currentScenario) { - return PlanningState.forNotOwnerScenario(returningNewAssignments, - orderDAO, scenarioDAO, taskSourceDAO, orderReloaded, - previousVersion, currentScenario, newVersion); - } - private void forceLoadOfDependenciesCollections( Collection elements) { for (TaskElement task : elements) { @@ -304,4 +296,413 @@ public class PlanningStateCreator { } } + public interface IScenarioInfo { + + public IAssignmentsOnResourceCalculator getAssignmentsCalculator(); + + public Scenario getCurrentScenario(); + + public boolean isUsingTheOwnerScenario(); + + /** + * @throws IllegalStateException + * if it's using the owner scenario + */ + public void saveVersioningInfo() throws IllegalStateException; + + public void afterCommit(); + } + + private static class EmptySchedulingScenarioInfo implements IScenarioInfo { + + private final Scenario currentScenario; + + public EmptySchedulingScenarioInfo(Scenario currentScenario) { + this.currentScenario = currentScenario; + } + + @Override + public void afterCommit() { + } + + @Override + public Scenario getCurrentScenario() { + return currentScenario; + } + + @Override + public boolean isUsingTheOwnerScenario() { + return true; + } + + @Override + public void saveVersioningInfo() throws IllegalStateException { + } + + @Override + public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { + return new Resource.AllResourceAssignments(); + } + + } + + private class UsingOwnerScenario implements IScenarioInfo { + + private final Scenario currentScenario; + private final OrderVersion currentVersionForScenario; + + public UsingOwnerScenario(Scenario currentScenario, + OrderVersion currentVersionForScenario) { + Validate.notNull(currentScenario); + Validate.notNull(currentVersionForScenario); + this.currentScenario = currentScenario; + this.currentVersionForScenario = currentVersionForScenario; + } + + @Override + public boolean isUsingTheOwnerScenario() { + return true; + } + + @Override + public void saveVersioningInfo() throws IllegalStateException { + currentVersionForScenario.savingThroughOwner(); + orderVersionDAO.save(currentVersionForScenario); + } + + @Override + public void afterCommit() { + // do nothing + } + + @Override + public Scenario getCurrentScenario() { + return currentScenario; + } + + @Override + public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { + return new Resource.AllResourceAssignments(); + } + } + + private class UsingNotOwnerScenario implements IScenarioInfo { + + private final OrderVersion previousVersion; + private final Scenario currentScenario; + private final OrderVersion newVersion; + private final Order order; + private boolean versionSaved = false; + + private final IAssignmentsOnResourceCalculator assigmentsOnResourceCalculator; + + public UsingNotOwnerScenario( + IAssignmentsOnResourceCalculator assigmentsOnResourceCalculator, + Order order, + OrderVersion previousVersion, Scenario currentScenario, + OrderVersion newVersion) { + Validate.notNull(assigmentsOnResourceCalculator); + Validate.notNull(order); + Validate.notNull(previousVersion); + Validate.notNull(currentScenario); + Validate.notNull(newVersion); + this.assigmentsOnResourceCalculator = assigmentsOnResourceCalculator; + this.previousVersion = previousVersion; + this.currentScenario = currentScenario; + this.newVersion = newVersion; + this.order = order; + } + + @Override + public boolean isUsingTheOwnerScenario() { + return versionSaved; + } + + @Override + public void saveVersioningInfo() throws IllegalStateException { + if (versionSaved) { + return; + } + orderDAO.save(order); + TaskSource taskSource = order.getTaskSource(); + taskSourceDAO.save(taskSource); + taskSource.dontPoseAsTransientObjectAnymore(); + taskSource.getTask().dontPoseAsTransientObjectAnymore(); + scenarioDAO.updateDerivedScenariosWithNewVersion(previousVersion, + order, currentScenario, newVersion); + } + + @Override + public void afterCommit() { + versionSaved = true; + } + + @Override + public Scenario getCurrentScenario() { + return currentScenario; + } + + @Override + public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { + return assigmentsOnResourceCalculator; + } + } + + public abstract class PlanningState { + + private final Order order; + + public PlanningState(Order order) { + Validate.notNull(order); + this.order = order; + } + + public Order getOrder() { + return order; + } + + public abstract boolean isEmpty(); + + /** + *

+ * When the scenario was not owner, the previous {@link DayAssignment + * day assingments} for the scenario must be avoided. Since the previous + * scenario was not an owner, all tasks and related information are + * copied, but the resource keeps pointing to the scenario's previous + * assignments. + *

+ *

+ * If the scenario is the owner, the assignments are returned directly. + *

+ * @return the {@link IAssignmentsOnResourceCalculator} to use. + * @see IAssignmentsOnResourceCalculator + * @see AvoidStaleAssignments + */ + public IAssignmentsOnResourceCalculator getAssignmentsCalculator() { + return getScenarioInfo().getAssignmentsCalculator(); + } + + public abstract Collection getTasksToSave(); + + public abstract List getInitial(); + + public abstract void reassociateResourcesWithSession(); + + public abstract Collection getToRemove(); + + public abstract void removed(TaskElement taskElement); + + public abstract void added(TaskElement taskElement); + + public abstract TaskGroup getRootTask(); + + public abstract IScenarioInfo getScenarioInfo(); + + public Scenario getCurrentScenario() { + return getScenarioInfo().getCurrentScenario(); + } + + } + + private class EmptyPlannigState extends PlanningState { + + private final Scenario currentScenario; + + private EmptyPlannigState(Scenario currentScenario, Order order) { + super(order); + this.currentScenario = currentScenario; + } + + @Override + public void added(TaskElement taskElement) { + } + + @Override + public List getInitial() { + return Collections.emptyList(); + } + + @Override + public TaskGroup getRootTask() { + return null; + } + + @Override + public Collection getTasksToSave() { + return Collections.emptyList(); + } + + @Override + public Collection getToRemove() { + return Collections.emptyList(); + } + + @Override + public void reassociateResourcesWithSession() { + } + + public void removed(TaskElement taskElement) { + } + + @Override + public IScenarioInfo getScenarioInfo() { + return new EmptySchedulingScenarioInfo(currentScenario); + } + + @Override + public boolean isEmpty() { + return true; + } + + } + + private class WithDataPlanningState extends PlanningState { + + private final ArrayList initial; + + private final Set toSave; + + private final Set toRemove; + + private Set resources = new HashSet(); + + private final TaskGroup rootTask; + + private final IScenarioInfo scenarioInfo; + + private WithDataPlanningState(TaskGroup rootTask, + Collection initialState, + Collection initialResources, + IScenarioInfo scenarioInfo) { + super((Order) rootTask.getOrderElement()); + this.rootTask = rootTask; + this.scenarioInfo = scenarioInfo; + this.initial = new ArrayList(initialState); + this.toSave = new HashSet(initialState); + this.toRemove = new HashSet(); + this.resources = OrderPlanningModel + .loadRequiredDataFor(new HashSet(initialResources)); + associateWithScenario(this.resources); + } + + private void associateWithScenario( + Collection resources) { + Scenario currentScenario = getCurrentScenario(); + for (Resource each : resources) { + each.useScenario(currentScenario); + + } + } + + @Override + public Collection getTasksToSave() { + return Collections.unmodifiableCollection(toSave); + } + + @Override + public List getInitial() { + return new ArrayList(initial); + } + + @Override + public void reassociateResourcesWithSession() { + for (Resource resource : resources) { + resourceDAO.reattach(resource); + } + // ensuring no repeated instances of criterions + reattachCriterions(getExistentCriterions(resources)); + addingNewlyCreated(resourceDAO); + } + + private void reattachCriterions(Set criterions) { + for (Criterion each : criterions) { + criterionDAO.reattachUnmodifiedEntity(each); + } + } + + private Set getExistentCriterions(Set resources) { + Set result = new HashSet(); + for (Resource resource : resources) { + for (CriterionSatisfaction each : resource + .getCriterionSatisfactions()) { + result.add(each.getCriterion()); + } + } + return result; + } + + private void addingNewlyCreated(IResourceDAO resourceDAO) { + Set newResources = getNewResources(resourceDAO); + OrderPlanningModel.loadRequiredDataFor(newResources); + associateWithScenario(newResources); + resources.addAll(newResources); + } + + private Set getNewResources(IResourceDAO resourceDAO) { + Set result = new HashSet( + resourceDAO.list(Resource.class)); + result.removeAll(resources); + return result; + } + + @Override + public Collection getToRemove() { + return Collections + .unmodifiableCollection(onlyNotTransient(toRemove)); + } + + private List onlyNotTransient( + Collection toRemove) { + ArrayList result = new ArrayList(); + for (TaskElement taskElement : toRemove) { + if (taskElement.getId() != null) { + result.add(taskElement); + } + } + return result; + } + + @Override + public void removed(TaskElement taskElement) { + taskElement.detach(); + if (!isTopLevel(taskElement)) { + return; + } + toSave.remove(taskElement); + toRemove.add(taskElement); + } + + private boolean isTopLevel(TaskElement taskElement) { + if (taskElement instanceof TaskMilestone) { + return true; + } + return taskElement.getParent() == null; + } + + @Override + public void added(TaskElement taskElement) { + if (!isTopLevel(taskElement)) { + return; + } + toRemove.remove(taskElement); + toSave.add(taskElement); + } + + @Override + public TaskGroup getRootTask() { + return rootTask; + } + + @Override + public IScenarioInfo getScenarioInfo() { + return scenarioInfo; + } + + @Override + public boolean isEmpty() { + return false; + } + + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommand.java index 8dfab0654..59b2072c3 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommand.java @@ -69,6 +69,7 @@ import org.navalplanner.business.planner.limiting.entities.LimitingResourceQueue import org.navalplanner.business.planner.limiting.entities.LimitingResourceQueueElement; import org.navalplanner.web.common.concurrentdetection.OnConcurrentModification; import org.navalplanner.web.planner.TaskElementAdapter; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractCommand.java index fb32cc548..e8ba16049 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractCommand.java @@ -25,6 +25,7 @@ import static org.navalplanner.web.I18nHelper._; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.taskedition.EditTaskController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/IReassignCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/IReassignCommand.java index 095bc23b3..140e2bd15 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/IReassignCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/IReassignCommand.java @@ -21,7 +21,7 @@ package org.navalplanner.web.planner.reassign; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.ICommand; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java index 1d60fd2fb..d07ee1829 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java @@ -40,7 +40,7 @@ import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.daos.IResourcesSearcher; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionType; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/EditTaskController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/EditTaskController.java index a4043e600..281baf581 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/EditTaskController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/EditTaskController.java @@ -45,7 +45,7 @@ import org.navalplanner.web.planner.allocation.AllocationResult; import org.navalplanner.web.planner.allocation.FormBinder; import org.navalplanner.web.planner.allocation.ResourceAllocationController; import org.navalplanner.web.planner.limiting.allocation.LimitingResourceAllocationController; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.navalplanner.web.planner.order.SubcontractController; import org.navalplanner.web.planner.taskedition.TaskPropertiesController.ResourceAllocationTypeEnum; import org.springframework.beans.factory.annotation.Autowired; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/ITaskPropertiesCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/ITaskPropertiesCommand.java index 8dfae4bcd..0993660da 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/ITaskPropertiesCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/ITaskPropertiesCommand.java @@ -22,7 +22,7 @@ package org.navalplanner.web.planner.taskedition; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.zkoss.ganttz.extensions.ICommandOnTask; /** diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesCommand.java index d2ddd8f44..2dff47fd3 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesCommand.java @@ -25,7 +25,7 @@ import static org.navalplanner.web.I18nHelper._; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.planner.order.IEditTaskUtilities; -import org.navalplanner.web.planner.order.PlanningState; +import org.navalplanner.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope;