From e3d680e0b191bac31c5790fa6e33f3f073159079 Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Sun, 19 Dec 2010 14:37:34 +0100 Subject: [PATCH] Schedule several unassigned queue elements at once FEA: ItEr65OTS05AlgoritmosLimitantes --- .../ILimitingResourceQueueModel.java | 4 + .../LimitingResourceQueueModel.java | 11 +++ .../LimitingResourcesController.java | 79 +++++++++++++------ .../LimitingResourcesPanel.java | 2 +- .../web/limitingresources/QueuesState.java | 30 +++++++ 5 files changed, 101 insertions(+), 25 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 46f5892fe..d50f37351 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 @@ -20,6 +20,7 @@ package org.navalplanner.web.limitingresources; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -144,4 +145,7 @@ public interface ILimitingResourceQueueModel { LimitingResourceQueueElement oldElement, LimitingResourceQueueElement newElement); + Set assignLimitingResourceQueueElements( + List elements); + } 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 d23959697..adc13e23a 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 @@ -1097,4 +1097,15 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { return result; } + + @Override + public Set assignLimitingResourceQueueElements( + List queueElements) { + Set result = new HashSet(); + for (LimitingResourceQueueElement each: queuesState.inTopologicalOrder(queueElements)) { + result.addAll(assignLimitingResourceQueueElement(each)); + } + 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 a645fda82..b46598f24 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 @@ -419,6 +419,8 @@ public class LimitingResourcesController extends GenericForwardComposer { public void render(Row row, Object data) throws Exception { LimitingResourceQueueElementDTO element = (LimitingResourceQueueElementDTO) data; + row.setValue(data); + row.appendChild(automaticQueueing(element)); row.appendChild(label(element.getOrderName())); row.appendChild(label(element.getTaskName())); @@ -513,32 +515,16 @@ public class LimitingResourcesController extends GenericForwardComposer { private void assignLimitingResourceQueueElement( LimitingResourceQueueElementDTO dto) { - LimitingResourceQueueElement element = dto.getOriginal(); List inserted = limitingResourceQueueModel - .assignLimitingResourceQueueElement(element); - if (!inserted.isEmpty()) { - reloadUnassignedLimitingResourceQueueElements(); - for (LimitingResourceQueueElement each : inserted) { - // FIXME visually wrong if an element jumps from a queue to - // another - LimitingResourceQueue queue = each.getLimitingResourceQueue(); - // Remove all dependency components associated to element - limitingResourcesPanel.removeDependenciesFor(each); - // Dependencies will be created again on refreshing queue - limitingResourcesPanel.refreshQueue(queue); - } - } else { - showErrorMessage(_("Cannot allocate selected element. There is not any queue " + - "that matches resource allocation criteria at any interval of time")); - } - } - - private void showErrorMessage(String error) { - try { - Messagebox.show(error, _("Error"), Messagebox.OK, Messagebox.ERROR); - } catch (InterruptedException e) { + .assignLimitingResourceQueueElement(dto.getOriginal()); + if (inserted.isEmpty()) { + showErrorMessage(_("Cannot allocate selected element. There is not any queue " + + "that matches resource allocation criteria at any interval of time")); + return; } + limitingResourcesPanel.refreshQueues((LimitingResourceQueue.queuesOf(inserted))); + reloadUnassignedLimitingResourceQueueElements(); } private Checkbox automaticQueueing( @@ -559,7 +545,11 @@ public class LimitingResourcesController extends GenericForwardComposer { } public void unschedule(QueueTask task) { - limitingResourceQueueModel.unschedule(task.getLimitingResourceQueueElement()); + LimitingResourceQueueElement queueElement = task.getLimitingResourceQueueElement(); + LimitingResourceQueue queue = queueElement.getLimitingResourceQueue(); + + limitingResourceQueueModel.unschedule(queueElement); + limitingResourcesPanel.refreshQueue(queue); reloadUnassignedLimitingResourceQueueElements(); } @@ -600,7 +590,48 @@ public class LimitingResourcesController extends GenericForwardComposer { } public void assignAllSelectedElements() { + List elements = getAllSelectedQueueElements(); + if (!elements.isEmpty()) { + Set inserted = limitingResourceQueueModel + .assignLimitingResourceQueueElements(elements); + clearSelectAllCheckbox(); + if (inserted.isEmpty()) { + showErrorMessage(_("Cannot allocate selected element. There is not any queue " + + "that matches resource allocation criteria at any interval of time")); + return; + } + limitingResourcesPanel.refreshQueues(LimitingResourceQueue.queuesOf(inserted)); + reloadUnassignedLimitingResourceQueueElements(); + } + } + + private void clearSelectAllCheckbox() { + cbSelectAll.setChecked(false); + } + + private List getAllSelectedQueueElements() { + List result = new ArrayList(); + + final Rows rows = gridUnassignedLimitingResourceQueueElements.getRows(); + for (Object each : rows.getChildren()) { + final Row row = (Row) each; + Checkbox cbAutoQueueing = getAutoQueueing(row); + if (cbAutoQueueing.isChecked()) { + LimitingResourceQueueElementDTO dto = (LimitingResourceQueueElementDTO) row + .getValue(); + result.add((LimitingResourceQueueElement) dto.getOriginal()); + } + } + return result; + } + + private void showErrorMessage(String error) { + try { + Messagebox.show(error, _("Error"), Messagebox.OK, Messagebox.ERROR); + } catch (InterruptedException e) { + + } } } 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 390ce0b6f..363c82966 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 @@ -384,7 +384,7 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { dependencyList.addDependenciesFor(element); } - public void refreshQueues(Set queues) { + public void refreshQueues(Collection queues) { for (LimitingResourceQueue each: queues) { refreshQueue(each); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java index 48802a76c..4d025c1ad 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueuesState.java @@ -561,4 +561,34 @@ public class QueuesState { elementsById.put(element.getId(), element); } + public List inTopologicalOrder(List queueElements) { + return toList(topologicalIterator(buildSubgraphFor(queueElements))); + } + + /** + * Constructs a graph composed only by queueElements + * + * @param queueElements + * @return + */ + private DirectedGraph buildSubgraphFor( + List queueElements) { + SimpleDirectedGraph result = instantiateDirectedGraph(); + + // Iterate through elements and construct graph + for (LimitingResourceQueueElement each : queueElements) { + result.addVertex(each); + for (LimitingResourceQueueDependency dependency : each + .getDependenciesAsOrigin()) { + LimitingResourceQueueElement destiny = dependency + .getHasAsDestiny(); + if (queueElements.contains(destiny)) { + // Add source, destiny and edge between them + addDependency(result, dependency); + } + } + } + return result; + } + }