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 c0ee557f5..4c1f34628 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 @@ -64,11 +64,9 @@ import org.navalplanner.business.planner.entities.ICostCalculator; import org.navalplanner.business.planner.entities.Task; 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.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.scenarios.IScenarioManager; -import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.business.users.daos.IOrderAuthorizationDAO; import org.navalplanner.business.users.daos.IUserDAO; import org.navalplanner.business.users.entities.OrderAuthorization; @@ -78,7 +76,6 @@ import org.navalplanner.business.users.entities.UserRole; import org.navalplanner.business.workingday.EffortDuration; import org.navalplanner.web.calendars.BaseCalendarModel; import org.navalplanner.web.common.ViewSwitcher; -import org.navalplanner.web.planner.TaskElementAdapter; import org.navalplanner.web.planner.advances.AdvanceAssignmentPlanningController; import org.navalplanner.web.planner.advances.IAdvanceAssignmentPlanningCommand; import org.navalplanner.web.planner.allocation.IResourceAllocationCommand; @@ -110,7 +107,6 @@ import org.zkforge.timeplot.Plotinfo; import org.zkforge.timeplot.Timeplot; import org.zkoss.ganttz.IChartVisibilityChangedListener; import org.zkoss.ganttz.Planner; -import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.adapters.PlannerConfiguration.IPrintAction; import org.zkoss.ganttz.adapters.PlannerConfiguration.IReloadChartListener; @@ -222,9 +218,6 @@ public class OrderPlanningModel implements IOrderPlanningModel { @Autowired private IScenarioManager scenarioManager; - @Autowired - private SaveCommandBuilder saveCommandBuilder; - @Autowired private IReassignCommand reassignCommand; @@ -254,9 +247,6 @@ public class OrderPlanningModel implements IOrderPlanningModel { private List keepAliveZoomListeners = new ArrayList(); - @Autowired - private TaskElementAdapter taskElementAdapterCreator; - @Autowired private ICostCalculator hoursCostCalculator; @@ -264,34 +254,10 @@ public class OrderPlanningModel implements IOrderPlanningModel { private List keepAliveChartVisibilityListeners = new ArrayList(); - private Scenario currentScenario; - private Planner planner; private OverAllProgressContent overallProgressContent; - private static final class TaskElementNavigator implements - IStructureNavigator { - - @Override - public List getChildren(TaskElement object) { - return object.getChildren(); - } - - @Override - public boolean isLeaf(TaskElement object) { - return object.isLeaf(); - } - - @Override - public boolean isMilestone(TaskElement object) { - if (object != null) { - return object instanceof TaskMilestone; - } - return false; - } - } - private static class NullSeparatorCommandOnTask implements ICommandOnTask { @@ -329,8 +295,8 @@ public class OrderPlanningModel implements IOrderPlanningModel { long time = System.currentTimeMillis(); this.planner = planner; planningState = createPlanningStateFor(order); - currentScenario = scenarioManager.getCurrent(); - PlannerConfiguration configuration = createConfiguration(order); + PlannerConfiguration configuration = planningState + .getConfiguration(); PROFILING_LOG.info("load data and create configuration took: " + (System.currentTimeMillis() - time) + " ms"); User user; @@ -962,12 +928,12 @@ public class OrderPlanningModel implements IOrderPlanningModel { private ISaveCommand setupSaveCommand( PlannerConfiguration configuration, boolean writingAllowed) { - if (writingAllowed) { - ISaveCommand result = buildSaveCommand(configuration); - configuration.addGlobalCommand(result); - return result; + if (!writingAllowed) { + return null; } - return null; + ISaveCommand result = planningState.getSaveCommand(); + configuration.addGlobalCommand(result); + return result; } private void setupEditingCapabilities( @@ -1017,11 +983,6 @@ public class OrderPlanningModel implements IOrderPlanningModel { return resourceAllocationCommand; } - private ISaveCommand buildSaveCommand( - PlannerConfiguration configuration) { - return saveCommandBuilder.build(planningState, configuration); - } - private ICommand buildReassigningCommand() { reassignCommand.setState(planningState); return reassignCommand; @@ -1088,19 +1049,6 @@ public class OrderPlanningModel implements IOrderPlanningModel { return zoomListener; } - private PlannerConfiguration createConfiguration(Order order) { - PlannerConfiguration result = new PlannerConfiguration( - taskElementAdapterCreator - .createForOrder(currentScenario, order), - new TaskElementNavigator(), planningState.getInitial()); - result.setNotBeforeThan(order.getInitDate()); - result.setNotAfterThan(order.getDeadline()); - result.setDependenciesConstraintsHavePriority(order - .getDependenciesConstraintsHavePriority()); - result.setScheduleBackwards(order.isScheduleBackwards()); - return result; - } - @Autowired private PlanningStateCreator planningStateCreator; 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 eca4e3f4c..8d5087861 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 @@ -62,10 +62,14 @@ 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.TaskElementAdapter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties; +import org.zkoss.ganttz.adapters.IStructureNavigator; +import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.zk.ui.Desktop; /** @@ -132,6 +136,12 @@ public class PlanningStateCreator { @Autowired private ITaskSourceDAO taskSourceDAO; + @Autowired + private TaskElementAdapter taskElementAdapterCreator; + + @Autowired + private SaveCommandBuilder saveCommandBuilder; + public interface IActionsOnRetrieval { public void onRetrieval(PlanningState planningState); @@ -146,6 +156,7 @@ public class PlanningStateCreator { Object existent = desktop.getAttribute(ATTRIBUTE_NAME); if (existent instanceof PlanningState) { PlanningState result = (PlanningState) existent; + result.onRetrieval(); if (onRetrieval != null) { onRetrieval.onRetrieval(result); } @@ -327,6 +338,28 @@ public class PlanningStateCreator { } } + private static final class TaskElementNavigator implements + IStructureNavigator { + + @Override + public List getChildren(TaskElement object) { + return object.getChildren(); + } + + @Override + public boolean isLeaf(TaskElement object) { + return object.isLeaf(); + } + + @Override + public boolean isMilestone(TaskElement object) { + if (object != null) { + return object instanceof TaskMilestone; + } + return false; + } + } + public interface IScenarioInfo { public IAssignmentsOnResourceCalculator getAssignmentsCalculator(); @@ -513,6 +546,42 @@ public class PlanningStateCreator { return getScenarioInfo().getAssignmentsCalculator(); } + void onRetrieval() { + cachedConfiguration = null; + cachedCommand = null; + } + + private PlannerConfiguration cachedConfiguration; + + public PlannerConfiguration getConfiguration() { + if (cachedConfiguration != null) { + return cachedConfiguration; + } + IAdapterToTaskFundamentalProperties adapter; + adapter = taskElementAdapterCreator.createForOrder( + getScenarioInfo().getCurrentScenario(), order); + + PlannerConfiguration result = new PlannerConfiguration( + adapter, new TaskElementNavigator(), getInitial()); + + result.setNotBeforeThan(order.getInitDate()); + result.setNotAfterThan(order.getDeadline()); + result.setDependenciesConstraintsHavePriority(order + .getDependenciesConstraintsHavePriority()); + result.setScheduleBackwards(order.isScheduleBackwards()); + return cachedConfiguration = result; + } + + private ISaveCommand cachedCommand; + + public ISaveCommand getSaveCommand() { + if (cachedCommand != null) { + return cachedCommand; + } + return cachedCommand = saveCommandBuilder.build(this, + getConfiguration()); + } + public abstract Collection getTasksToSave(); public abstract List getInitial(); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java index e3716eff4..935730877 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java @@ -103,7 +103,7 @@ public class SaveCommandBuilder { public ISaveCommand build(PlanningState planningState, PlannerConfiguration plannerConfiguration) { - SaveCommandImpl result = new SaveCommandImpl(planningState, + SaveCommand result = new SaveCommand(planningState, plannerConfiguration); return ConcurrentModificationHandling.addHandling( @@ -175,7 +175,7 @@ public class SaveCommandBuilder { @Autowired private IAdHocTransactionService transactionService; - private class SaveCommandImpl implements ISaveCommand { + private class SaveCommand implements ISaveCommand { private PlanningState state; @@ -187,7 +187,7 @@ public class SaveCommandBuilder { private List listeners = new ArrayList(); - public SaveCommandImpl(PlanningState planningState, + public SaveCommand(PlanningState planningState, PlannerConfiguration configuration) { this.state = planningState; this.configuration = configuration;