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 9128c3eb8..c38e589a7 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 @@ -746,7 +746,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { criterionDAO.list(Criterion.class); forceLoadOfChildren(Arrays.asList(taskElement)); planningState = new PlanningState(taskElement, orderReloaded - .getAssociatedTasks(), allResources); + .getAssociatedTasks(), allResources, criterionDAO); forceLoadOfDependenciesCollections(planningState.getInitial()); forceLoadOfWorkingHours(planningState.getInitial()); forceLoadOfLabels(planningState.getInitial()); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java index 915844d72..e41f2782d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/PlanningState.java @@ -30,7 +30,10 @@ import java.util.Set; 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.ICriterionDAO; import org.navalplanner.business.resources.daos.IResourceDAO; +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.web.calendars.BaseCalendarModel; @@ -45,10 +48,14 @@ public class PlanningState { private final TaskGroup rootTask; + private final ICriterionDAO criterionDAO; + public PlanningState(TaskGroup rootTask, Collection initialState, - Collection initialResources) { + Collection initialResources, + ICriterionDAO criterionDAO) { this.rootTask = rootTask; + this.criterionDAO = criterionDAO; this.initial = new ArrayList(initialState); this.toSave = new HashSet(initialState); this.toRemove = new HashSet(); @@ -67,9 +74,28 @@ public class PlanningState { 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); doReattachments(newResources); @@ -79,6 +105,8 @@ public class PlanningState { private > T doReattachments(T result) { for (Resource each : result) { reattachCalendarFor(each); + // loading criterions so there are no repeated instances + forceLoadOfCriterions(each); } return result; } @@ -89,6 +117,15 @@ public class PlanningState { } } + private void forceLoadOfCriterions(Resource resource) { + Set criterionSatisfactions = resource + .getCriterionSatisfactions(); + for (CriterionSatisfaction each : criterionSatisfactions) { + each.getCriterion().getName(); + each.getCriterion().getType(); + } + } + private Set getNewResources(IResourceDAO resourceDAO) { Set result = new HashSet(resourceDAO .list(Resource.class));