ItEr41S11CUConfiguracionMaquinasItEr40S15: Reattaching resources so the derived assignments can be moved

This commit is contained in:
Óscar González Fernández 2009-12-27 21:18:44 +01:00
parent a6be5c5164
commit f4645d73fd
2 changed files with 62 additions and 4 deletions

View file

@ -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<IOnMoveListener> listeners = new ArrayList<IOnMoveListener>();
@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<Resource> resources = resourcesForTask();
for (Resource each : resources) {
resourceDAO.reattach(each);
}
for (Machine machine : Resource.machines(resources)) {
Set<MachineWorkersConfigurationUnit> configurationUnits = machine
.getConfigurationUnits();
for (MachineWorkersConfigurationUnit eachUnit : configurationUnits) {
Hibernate.initialize(eachUnit);
}
}
}
private Set<Resource> resourcesForTask() {
Set<ResourceAllocation<?>> resourceAllocations = taskElement.getResourceAllocations();
Set<Resource> resources = new HashSet<Resource>();
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();

View file

@ -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<Resource> 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<? extends TaskElement> initial) {
for (TaskElement each : initial) {
forceLoadOfResourceAllocationsResources(each);
if (each instanceof TaskGroup) {
findChildrenWithQueryToAvoidProxies((TaskGroup) each);
List<TaskElement> 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<ResourceAllocation<?>> 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);