diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java index c5230cc15..a06deff10 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java @@ -28,12 +28,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.apache.commons.lang.Validate; +import org.hibernate.Hibernate; import org.joda.time.LocalDate; import org.navalplanner.business.common.IAdHocTransactionService; import org.navalplanner.business.common.IOnTransaction; @@ -43,12 +45,18 @@ 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.Dependency; +import org.navalplanner.business.planner.entities.DerivedAllocation; +import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.StartConstraintType; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskMilestone; import org.navalplanner.business.planner.entities.TaskStartConstraint; import org.navalplanner.business.planner.entities.Dependency.Type; +import org.navalplanner.business.resources.daos.IResourceDAO; +import org.navalplanner.business.resources.entities.Machine; +import org.navalplanner.business.resources.entities.MachineWorkersConfigurationUnit; +import org.navalplanner.business.resources.entities.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -101,6 +109,9 @@ public class TaskElementAdapter implements ITaskElementAdapter { @Autowired private ITaskElementDAO taskDAO; + @Autowired + private IResourceDAO resourceDAO; + private List listeners = new ArrayList(); @Override @@ -157,6 +168,7 @@ public class TaskElementAdapter implements ITaskElementAdapter { @Override public Long execute() { taskDAO.reattach(taskElement); + reattachAllResourcesForTask(); Long result = setBeginDateInsideTransaction(beginDate); fireTaskElementMoved(taskElement); return result; @@ -165,6 +177,35 @@ public class TaskElementAdapter implements ITaskElementAdapter { return runOnReadOnlyTransaction; } + private void reattachAllResourcesForTask() { + Set resources = resourcesForTask(); + for (Resource each : resources) { + resourceDAO.reattach(each); + } + for (Machine machine : Resource.machines(resources)) { + Set configurationUnits = machine + .getConfigurationUnits(); + for (MachineWorkersConfigurationUnit eachUnit : configurationUnits) { + Hibernate.initialize(eachUnit); + } + } + } + + private Set resourcesForTask() { + Set> resourceAllocations = taskElement.getResourceAllocations(); + Set resources = new HashSet(); + for (ResourceAllocation each : resourceAllocations) { + resources.addAll(each + .getAssociatedResources()); + for (DerivedAllocation derivedAllocation : each + .getDerivedAllocations()) { + resources + .addAll(derivedAllocation.getResources()); + } + } + return resources; + } + private Long setBeginDateInsideTransaction(final Date beginDate) { taskElement.moveTo(beginDate); return getLengthMilliseconds(); 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 ab9db282d..27bded0c2 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 @@ -47,7 +47,9 @@ 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.DerivedAllocation; import org.navalplanner.business.planner.entities.ICostCalculator; +import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; @@ -579,11 +581,10 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { taskElementAdapter.setOrder(orderReloaded); TaskGroup taskElement = orderReloaded .getAssociatedTaskElement(); + final List allResources = resourceDAO.list(Resource.class); forceLoadOfChildren(Arrays.asList(taskElement)); - planningState = new PlanningState(taskElement, - orderReloaded.getAssociatedTasks(), - resourceDAO.list(Resource.class)); - forceLoadOfChildren(planningState.getInitial()); + planningState = new PlanningState(taskElement, orderReloaded + .getAssociatedTasks(), allResources); forceLoadOfDependenciesCollections(planningState.getInitial()); forceLoadOfWorkingHours(planningState.getInitial()); forceLoadOfLabels(planningState.getInitial()); @@ -598,6 +599,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { private void forceLoadOfChildren(Collection initial) { for (TaskElement each : initial) { + forceLoadOfResourceAllocationsResources(each); if (each instanceof TaskGroup) { findChildrenWithQueryToAvoidProxies((TaskGroup) each); List children = each.getChildren(); @@ -606,6 +608,21 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { } } + /** + * Forcing the load of all resources so the resources at planning state and + * at allocations are the same + */ + private void forceLoadOfResourceAllocationsResources(TaskElement taskElement) { + Set> resourceAllocations = taskElement + .getResourceAllocations(); + for (ResourceAllocation each : resourceAllocations) { + each.getAssociatedResources(); + for (DerivedAllocation eachDerived : each.getDerivedAllocations()) { + eachDerived.getResources(); + } + } + } + private void findChildrenWithQueryToAvoidProxies(TaskGroup group) { for (TaskElement eachTask : taskDAO.findChildrenOf(group)) { Hibernate.initialize(eachTask);