diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDAO.java index 0fa8ac722..8a17fbdae 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDAO.java @@ -20,9 +20,12 @@ package org.navalplanner.business.planner.daos; +import java.util.List; + import org.navalplanner.business.common.daos.IGenericDAO; import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.TaskGroup; /** * @author Óscar González Fernández @@ -34,4 +37,6 @@ public interface ITaskElementDAO extends IGenericDAO { */ void removeOrphanedDayAssignments(); + List findChildrenOf(TaskGroup each); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java index 7740d9f09..f53615ddf 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java @@ -29,6 +29,7 @@ import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.planner.entities.GenericDayAssignment; import org.navalplanner.business.planner.entities.SpecificDayAssignment; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.TaskGroup; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -72,4 +73,11 @@ public class TaskElementDAO extends GenericDAOHibernate return getSession().createCriteria(SpecificDayAssignment.class).add( Restrictions.isNull("specificResourceAllocation")).list(); } + + @SuppressWarnings("unchecked") + @Override + public List findChildrenOf(TaskGroup each) { + return getSession().createCriteria(TaskElement.class).add( + Restrictions.eq("parent", each)).list(); + } } 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 b17f29f64..2eac985e9 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 @@ -24,6 +24,7 @@ import static org.navalplanner.web.I18nHelper._; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashSet; @@ -33,6 +34,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import org.hibernate.Hibernate; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.BaseCalendar; @@ -43,10 +45,12 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; 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.planner.daos.ITaskElementDAO; import org.navalplanner.business.planner.entities.DayAssignment; 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.daos.IResourceDAO; import org.navalplanner.business.resources.entities.Resource; @@ -130,6 +134,9 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { @Autowired private IWorkReportLineDAO workReportLineDAO; + @Autowired + private ITaskElementDAO taskDAO; + @Autowired private IAdHocTransactionService transactionService; @@ -562,11 +569,13 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { Order orderReloaded) { taskElementAdapter = getTaskElementAdapter(); taskElementAdapter.setOrder(orderReloaded); - planningState = new PlanningState(orderReloaded - .getAssociatedTaskElement(), + TaskGroup taskElement = orderReloaded + .getAssociatedTaskElement(); + forceLoadOfChildren(Arrays.asList(taskElement)); + planningState = new PlanningState(taskElement, orderReloaded.getAssociatedTasks(), resourceDAO.list(Resource.class)); - + forceLoadOfChildren(planningState.getInitial()); forceLoadOfDependenciesCollections(planningState.getInitial()); forceLoadOfWorkingHours(planningState.getInitial()); forceLoadOfLabels(planningState.getInitial()); @@ -579,6 +588,22 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { return result; } + private void forceLoadOfChildren(Collection initial) { + for (TaskElement each : initial) { + if (each instanceof TaskGroup) { + findChildrenWithQueryToAvoidProxies((TaskGroup) each); + List children = each.getChildren(); + forceLoadOfChildren(children); + } + } + } + + private void findChildrenWithQueryToAvoidProxies(TaskGroup group) { + for (TaskElement eachTask : taskDAO.findChildrenOf(group)) { + Hibernate.initialize(eachTask); + } + } + private void forceLoadOfWorkingHours(List initial) { for (TaskElement taskElement : initial) { OrderElement orderElement = taskElement.getOrderElement();