From b84455ab418397f34e24433cd31bcf37881f324a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 7 Sep 2011 19:49:27 +0200 Subject: [PATCH] The tasks to save and so on are recreated each time a screen is entered. FEA: ItEr75S11PreventLooseChanges --- .../planner/order/PlanningStateCreator.java | 415 +++++++----------- 1 file changed, 166 insertions(+), 249 deletions(-) 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 8d5087861..88404a356 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 @@ -175,19 +175,16 @@ public class PlanningStateCreator { private PlanningState createInitialPlanning(Order orderReloaded) { Scenario currentScenario = scenarioManager.getCurrent(); - if (!orderReloaded.isSomeTaskElementScheduled()) { - return new EmptyPlannigState(currentScenario, orderReloaded); - } final List allResources = resourceDAO.list(Resource.class); criterionDAO.list(Criterion.class); - TaskGroup taskElement = orderReloaded.getAssociatedTaskElement(); - forceLoadOfChildren(Arrays.asList(taskElement)); - forceLoadDayAssignments(orderReloaded.getResources()); - switchAllocationsToScenario(currentScenario, taskElement); + TaskGroup rootTask = orderReloaded.getAssociatedTaskElement(); + if (rootTask != null) { + forceLoadOfChildren(Arrays.asList(rootTask)); + forceLoadDayAssignments(orderReloaded.getResources()); + } - PlanningState result = new WithDataPlanningState(taskElement, - orderReloaded.getAssociatedTasks(), allResources, - buildScenarioInfo(orderReloaded)); + PlanningState result = new PlanningState(orderReloaded, allResources, + currentScenario); forceLoadOfDependenciesCollections(result.getInitial()); forceLoadOfWorkingHours(result.getInitial()); @@ -512,20 +509,71 @@ public class PlanningStateCreator { } } - public abstract class PlanningState { + public class PlanningState { private final Order order; - public PlanningState(Order order) { + private ArrayList initial; + + private Set toSave; + + private Set toRemove = new HashSet(); + + private Set resources = new HashSet(); + + private TaskGroup rootTask; + + private final IScenarioInfo scenarioInfo; + + public PlanningState(Order order, + Collection initialResources, + Scenario currentScenario) { Validate.notNull(order); this.order = order; + rebuildTasksState(order); + this.scenarioInfo = isEmpty() ? new EmptySchedulingScenarioInfo( + currentScenario) : buildScenarioInfo(order); + this.resources = OrderPlanningModel + .loadRequiredDataFor(new HashSet(initialResources)); + associateWithScenario(this.resources); + } + + void onRetrieval() { + cachedConfiguration = null; + cachedCommand = null; + rebuildTasksState(order); + } + + private void rebuildTasksState(Order order) { + this.rootTask = order.getAssociatedTaskElement(); + if (this.rootTask == null) { + this.initial = new ArrayList(); + this.toSave = new HashSet(); + } else { + this.initial = new ArrayList( + rootTask.getChildren()); + this.toSave = rootTask == null ? new HashSet() + : new HashSet(rootTask.getChildren()); + this.toSave.removeAll(this.toRemove); + } + } + + private void associateWithScenario( + Collection resources) { + Scenario currentScenario = getCurrentScenario(); + for (Resource each : resources) { + each.useScenario(currentScenario); + + } } public Order getOrder() { return order; } - public abstract boolean isEmpty(); + public boolean isEmpty() { + return rootTask == null; + } /** *

@@ -546,10 +594,6 @@ public class PlanningStateCreator { return getScenarioInfo().getAssignmentsCalculator(); } - void onRetrieval() { - cachedConfiguration = null; - cachedCommand = null; - } private PlannerConfiguration cachedConfiguration; @@ -582,23 +626,119 @@ public class PlanningStateCreator { getConfiguration()); } - public abstract Collection getTasksToSave(); + public Collection getTasksToSave() { + return Collections.unmodifiableCollection(toSave); + } - public abstract List getInitial(); + public List getInitial() { + return new ArrayList(initial); + } - public abstract List getAllTasks(); + public List getAllTasks() { + List result = new ArrayList(); + if (rootTask != null) { + findTasks(rootTask, result); + } + return result; + } - public abstract void reassociateResourcesWithSession(); + private void findTasks(TaskElement taskElement, List result) { + if (taskElement instanceof Task) { + Task t = (Task) taskElement; + result.add(t); + } + for (TaskElement each : taskElement.getChildren()) { + findTasks(each, result); + } + } - public abstract Collection getToRemove(); + public void reassociateResourcesWithSession() { + for (Resource resource : resources) { + resourceDAO.reattach(resource); + } + // ensuring no repeated instances of criterions + reattachCriterions(getExistentCriterions(resources)); + addingNewlyCreated(resourceDAO); + } - public abstract void removed(TaskElement taskElement); + private Set getExistentCriterions(Set resources) { + Set result = new HashSet(); + for (Resource resource : resources) { + for (CriterionSatisfaction each : resource + .getCriterionSatisfactions()) { + result.add(each.getCriterion()); + } + } + return result; + } - public abstract void added(TaskElement taskElement); + private void reattachCriterions(Set criterions) { + for (Criterion each : criterions) { + criterionDAO.reattachUnmodifiedEntity(each); + } + } - public abstract TaskGroup getRootTask(); + private void addingNewlyCreated(IResourceDAO resourceDAO) { + Set newResources = getNewResources(resourceDAO); + OrderPlanningModel.loadRequiredDataFor(newResources); + associateWithScenario(newResources); + resources.addAll(newResources); + } - public abstract IScenarioInfo getScenarioInfo(); + private Set getNewResources(IResourceDAO resourceDAO) { + Set result = new HashSet( + resourceDAO.list(Resource.class)); + result.removeAll(resources); + return result; + } + + 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; + } + + 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() == rootTask; + } + + public void added(TaskElement taskElement) { + if (!isTopLevel(taskElement)) { + return; + } + toRemove.remove(taskElement); + toSave.add(taskElement); + } + + public TaskGroup getRootTask() { + return rootTask; + } + + public IScenarioInfo getScenarioInfo() { + return scenarioInfo; + } public Scenario getCurrentScenario() { return getScenarioInfo().getCurrentScenario(); @@ -713,229 +853,6 @@ public class PlanningStateCreator { } - 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; - } - - @Override - public List getAllTasks() { - return Collections.emptyList(); - } - - } - - 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 getAllTasks() { - List result = new ArrayList(); - findTasks(rootTask, result); - return result; - } - - private void findTasks(TaskElement taskElement, List result) { - if (taskElement instanceof Task) { - Task t = (Task) taskElement; - result.add(t); - } - for (TaskElement each : taskElement.getChildren()) { - findTasks(each, result); - } - } - - @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; - } - - } - public interface IAllocationCriteria { boolean isSatisfiedBy(ResourceAllocation resourceAllocation);