From da187a59ecc1db2c49550b9ad758e21da3d576c8 Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Sat, 25 Dec 2010 19:45:11 +0100 Subject: [PATCH] Fix bug refresh queues correctly after replacing a resource allocation of a task for another which may be in a different queue FEA: ItEr66OTS08CorreccionsRecursosLimitantesItEr65OTS04 --- .../ILimitingResourceQueueModel.java | 2 +- .../LimitingResourceQueueModel.java | 8 +- .../LimitingResourcesController.java | 86 +++++++++++++------ .../LimitingResourcesPanel.java | 6 ++ 4 files changed, 72 insertions(+), 30 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java index 6774111bb..46f5892fe 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java @@ -140,7 +140,7 @@ public interface ILimitingResourceQueueModel { boolean userCanRead(Order order, String loginName); - void replaceLimitingResourceQueueElement( + List replaceLimitingResourceQueueElement( LimitingResourceQueueElement oldElement, LimitingResourceQueueElement newElement); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java index 64975d3f1..25e56b7d2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java @@ -1045,10 +1045,12 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { @Override @Transactional(readOnly=true) - public void replaceLimitingResourceQueueElement( + public List replaceLimitingResourceQueueElement( LimitingResourceQueueElement oldElement, LimitingResourceQueueElement newElement) { + List result = new ArrayList(); + boolean needToReassign = oldElement.hasDayAssignments(); limitingResourceQueueElementDAO.save(oldElement); @@ -1057,7 +1059,7 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { queuesState.replaceLimitingResourceQueueElement(oldElement, newElement); if (needToReassign) { - assignLimitingResourceQueueElement(newElement); + result.addAll(assignLimitingResourceQueueElement(newElement)); } HashSet dependencies = new HashSet(); dependencies.addAll(newElement.getDependenciesAsOrigin()); @@ -1065,6 +1067,8 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { toBeSavedDependencies.put(newElement, dependencies); markAsModified(newElement); + + return result; } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java index aa2e42306..013a020f6 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java @@ -25,7 +25,10 @@ import static org.navalplanner.web.I18nHelper._; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -41,7 +44,6 @@ import org.navalplanner.business.planner.limiting.entities.LimitingResourceQueue import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.LimitingResourceQueue; import org.navalplanner.business.resources.entities.Resource; -import org.navalplanner.web.common.Util; import org.navalplanner.web.limitingresources.LimitingResourcesPanel.IToolbarCommand; import org.navalplanner.web.planner.order.BankHolidaysMarker; import org.navalplanner.web.planner.taskedition.EditTaskController; @@ -325,41 +327,71 @@ public class LimitingResourcesController extends GenericForwardComposer { if (editTaskController.getStatus() == Messagebox.OK) { // Update resource allocation for element - LimitingResourceQueueElement newElement = task.getResourceAllocation().getLimitingResourceQueueElement(); + LimitingResourceQueueElement newElement = copyFrom(oldElement, + getQueueElementFrom(task)); - newElement.setEarlierStartDateBecauseOfGantt(oldElement.getEarlierStartDateBecauseOfGantt()); - newElement.setResourceAllocation(task.getResourceAllocation()); + // Replace old limiting resource with new one + LimitingResourceQueue oldQueue = oldElement.getLimitingResourceQueue(); + List modified = limitingResourceQueueModel + .replaceLimitingResourceQueueElement(oldElement, + newElement); - - Set outgoingDependencies = oldElement.getDependenciesAsOrigin(); - Set incomingDependencies = oldElement.getDependenciesAsDestiny(); - - // Update dependencies - for (LimitingResourceQueueDependency each: outgoingDependencies) { - each.setOrigin(newElement); - newElement.add(each); + // Refresh modified queues + Set toRefreshQueues = new HashSet(); + toRefreshQueues.addAll(getQueuesOf(modified)); + if (oldQueue != null) { + toRefreshQueues.add(oldQueue); } - for (LimitingResourceQueueDependency each: incomingDependencies) { - each.setDestiny(newElement); - newElement.add(each); - } - - LimitingResourceQueue queue = oldElement.getLimitingResourceQueue(); - limitingResourceQueueModel.replaceLimitingResourceQueueElement(oldElement, newElement); - if (newElement.getLimitingResourceQueue() != null) { - limitingResourcesPanel.removeQueueElementFrom(queue, oldElement); - limitingResourcesPanel.appendQueueElementToQueue(newElement); - - limitingResourcesPanel.refreshQueue(queue); - limitingResourcesPanel.refreshQueue(newElement.getLimitingResourceQueue()); - } - Util.reloadBindings(gridUnassignedLimitingResourceQueueElements); + limitingResourcesPanel.refreshQueues(toRefreshQueues); } } catch (SuspendNotAllowedException e) { e.printStackTrace(); } } + private LimitingResourceQueueElement getQueueElementFrom(Task task) { + return task.getResourceAllocation().getLimitingResourceQueueElement(); + } + + /** + * Copies earliestStartDateBecauseOfGantt and dependencies from source to dest + * + * @param source + * @param dest + * @return + */ + private LimitingResourceQueueElement copyFrom( + LimitingResourceQueueElement source, + LimitingResourceQueueElement dest) { + + dest.setEarlierStartDateBecauseOfGantt(source + .getEarlierStartDateBecauseOfGantt()); + + for (LimitingResourceQueueDependency each : source + .getDependenciesAsOrigin()) { + each.setOrigin(dest); + dest.add(each); + } + for (LimitingResourceQueueDependency each : source + .getDependenciesAsDestiny()) { + each.setDestiny(dest); + dest.add(each); + } + + return dest; + } + + private Set getQueuesOf( + List modified) { + + Set result = new HashSet(); + + for (LimitingResourceQueueElement each: modified) { + result.add(each.getLimitingResourceQueue()); + } + return result; + } + private EditTaskController getEditController(Window window) { return (EditTaskController) editTaskWindow.getVariable("editController", true); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java index 96e101afb..8dbf5835f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java @@ -408,6 +408,12 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { dependencyList.addDependenciesFor(element); } + public void refreshQueues(Set queues) { + for (LimitingResourceQueue each: queues) { + refreshQueue(each); + } + } + public void refreshQueue(LimitingResourceQueue queue) { dependencyList.removeDependenciesFor(queue); queueListComponent.refreshQueue(queue);