PlanningState is now responsible of creating the SaveCommand and the PlannerConfiguration

FEA: ItEr75S11PreventLooseChanges
This commit is contained in:
Óscar González Fernández 2011-09-06 19:14:01 +02:00
parent f0721a8f23
commit d6b0882506
3 changed files with 79 additions and 62 deletions

View file

@ -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<IZoomLevelChangedListener> keepAliveZoomListeners = new ArrayList<IZoomLevelChangedListener>();
@Autowired
private TaskElementAdapter taskElementAdapterCreator;
@Autowired
private ICostCalculator hoursCostCalculator;
@ -264,34 +254,10 @@ public class OrderPlanningModel implements IOrderPlanningModel {
private List<IChartVisibilityChangedListener> keepAliveChartVisibilityListeners = new ArrayList<IChartVisibilityChangedListener>();
private Scenario currentScenario;
private Planner planner;
private OverAllProgressContent overallProgressContent;
private static final class TaskElementNavigator implements
IStructureNavigator<TaskElement> {
@Override
public List<TaskElement> 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<T> implements
ICommandOnTask<T> {
@ -329,8 +295,8 @@ public class OrderPlanningModel implements IOrderPlanningModel {
long time = System.currentTimeMillis();
this.planner = planner;
planningState = createPlanningStateFor(order);
currentScenario = scenarioManager.getCurrent();
PlannerConfiguration<TaskElement> configuration = createConfiguration(order);
PlannerConfiguration<TaskElement> 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<TaskElement> 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<TaskElement> configuration) {
return saveCommandBuilder.build(planningState, configuration);
}
private ICommand<TaskElement> buildReassigningCommand() {
reassignCommand.setState(planningState);
return reassignCommand;
@ -1088,19 +1049,6 @@ public class OrderPlanningModel implements IOrderPlanningModel {
return zoomListener;
}
private PlannerConfiguration<TaskElement> createConfiguration(Order order) {
PlannerConfiguration<TaskElement> result = new PlannerConfiguration<TaskElement>(
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;

View file

@ -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<TaskElement> {
@Override
public List<TaskElement> 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<TaskElement> cachedConfiguration;
public PlannerConfiguration<TaskElement> getConfiguration() {
if (cachedConfiguration != null) {
return cachedConfiguration;
}
IAdapterToTaskFundamentalProperties<TaskElement> adapter;
adapter = taskElementAdapterCreator.createForOrder(
getScenarioInfo().getCurrentScenario(), order);
PlannerConfiguration<TaskElement> result = new PlannerConfiguration<TaskElement>(
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<? extends TaskElement> getTasksToSave();
public abstract List<TaskElement> getInitial();

View file

@ -103,7 +103,7 @@ public class SaveCommandBuilder {
public ISaveCommand build(PlanningState planningState,
PlannerConfiguration<TaskElement> 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<IAfterSaveListener> listeners = new ArrayList<IAfterSaveListener>();
public SaveCommandImpl(PlanningState planningState,
public SaveCommand(PlanningState planningState,
PlannerConfiguration<TaskElement> configuration) {
this.state = planningState;
this.configuration = configuration;