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 extends TaskElement> initialState,
- Collection extends Resource> 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 extends TaskElement> getTasksToSave();
-
- public abstract List getInitial();
-
- public abstract void reassociateResourcesWithSession();
-
- public abstract Collection extends TaskElement> 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 extends TaskElement> initialState,
- Collection extends Resource> 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 extends Resource> resources) {
- Scenario currentScenario = getCurrentScenario();
- for (Resource each : resources) {
- each.useScenario(currentScenario);
-
- }
- }
-
- @Override
- public Collection extends TaskElement> 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 extends TaskElement> getToRemove() {
- return Collections
- .unmodifiableCollection(onlyNotTransient(toRemove));
- }
-
- private List onlyNotTransient(
- Collection extends TaskElement> 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 extends TaskElement> getTasksToSave() {
- return Collections.emptyList();
- }
-
- @Override
- public Collection extends TaskElement> 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 extends TaskElement> 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 extends TaskElement> getTasksToSave();
+
+ public abstract List getInitial();
+
+ public abstract void reassociateResourcesWithSession();
+
+ public abstract Collection extends TaskElement> 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 extends TaskElement> getTasksToSave() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Collection extends TaskElement> 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 extends TaskElement> initialState,
+ Collection extends Resource> 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 extends Resource> resources) {
+ Scenario currentScenario = getCurrentScenario();
+ for (Resource each : resources) {
+ each.useScenario(currentScenario);
+
+ }
+ }
+
+ @Override
+ public Collection extends TaskElement> 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 extends TaskElement> getToRemove() {
+ return Collections
+ .unmodifiableCollection(onlyNotTransient(toRemove));
+ }
+
+ private List onlyNotTransient(
+ Collection extends TaskElement> 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;