diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java index 9c3d76143..49844ee06 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java @@ -1,7 +1,10 @@ package org.navalplanner.web.planner; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.Order; @@ -66,12 +69,50 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { Order orderReloaded) { ITaskElementAdapter taskElementAdapter = getTaskElementAdapter(); taskElementAdapter.setOrder(orderReloaded); - planningState = new PlanningState(orderReloaded.getAssociatedTasks()); + planningState = new PlanningState(retainOnlyTopLevel(orderReloaded + .getAssociatedTasks())); forceLoadOfDependenciesCollections(planningState.getInitial()); + forceLoadOfWorkingHours(planningState.getInitial()); return new PlannerConfiguration(taskElementAdapter, new TaskElementNavigator(), planningState.getInitial()); } + private Collection retainOnlyTopLevel( + List associatedTasks) { + Set descendantsFromOther = new HashSet(); + for (TaskElement taskElement : associatedTasks) { + descandants(descendantsFromOther, taskElement); + } + ArrayList result = new ArrayList(); + for (TaskElement taskElement : associatedTasks) { + if (!descendantsFromOther.contains(taskElement)) { + result.add(taskElement); + } + } + return result; + } + + private void descandants( + Set accumulated, + TaskElement taskElement) { + if (taskElement.isLeaf()) { + return; + } + for (TaskElement t : taskElement.getChildren()) { + accumulated.add(t); + descandants(accumulated, t); + } + } + + private void forceLoadOfWorkingHours(List initial) { + for (TaskElement taskElement : initial) { + taskElement.getOrderElement().getWorkHours(); + if (!taskElement.isLeaf()) { + forceLoadOfWorkingHours(taskElement.getChildren()); + } + } + } + private void forceLoadOfDependenciesCollections( Collection elements) { for (TaskElement task : elements) {