Fix bug refresh queues correctly after replacing a resource allocation

of a task for another which may be in a different queue

FEA: ItEr66OTS08CorreccionsRecursosLimitantesItEr65OTS04
This commit is contained in:
Diego Pino Garcia 2010-12-25 19:45:11 +01:00
parent 3be35bc1a9
commit da187a59ec
4 changed files with 72 additions and 30 deletions

View file

@ -140,7 +140,7 @@ public interface ILimitingResourceQueueModel {
boolean userCanRead(Order order, String loginName);
void replaceLimitingResourceQueueElement(
List<LimitingResourceQueueElement> replaceLimitingResourceQueueElement(
LimitingResourceQueueElement oldElement,
LimitingResourceQueueElement newElement);

View file

@ -1045,10 +1045,12 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel {
@Override
@Transactional(readOnly=true)
public void replaceLimitingResourceQueueElement(
public List<LimitingResourceQueueElement> replaceLimitingResourceQueueElement(
LimitingResourceQueueElement oldElement,
LimitingResourceQueueElement newElement) {
List<LimitingResourceQueueElement> result = new ArrayList<LimitingResourceQueueElement>();
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<LimitingResourceQueueDependency> dependencies = new HashSet<LimitingResourceQueueDependency>();
dependencies.addAll(newElement.getDependenciesAsOrigin());
@ -1065,6 +1067,8 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel {
toBeSavedDependencies.put(newElement, dependencies);
markAsModified(newElement);
return result;
}
}

View file

@ -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<LimitingResourceQueueElement> modified = limitingResourceQueueModel
.replaceLimitingResourceQueueElement(oldElement,
newElement);
Set<LimitingResourceQueueDependency> outgoingDependencies = oldElement.getDependenciesAsOrigin();
Set<LimitingResourceQueueDependency> incomingDependencies = oldElement.getDependenciesAsDestiny();
// Update dependencies
for (LimitingResourceQueueDependency each: outgoingDependencies) {
each.setOrigin(newElement);
newElement.add(each);
// Refresh modified queues
Set<LimitingResourceQueue> toRefreshQueues = new HashSet<LimitingResourceQueue>();
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<LimitingResourceQueue> getQueuesOf(
List<LimitingResourceQueueElement> modified) {
Set<LimitingResourceQueue> result = new HashSet<LimitingResourceQueue>();
for (LimitingResourceQueueElement each: modified) {
result.add(each.getLimitingResourceQueue());
}
return result;
}
private EditTaskController getEditController(Window window) {
return (EditTaskController) editTaskWindow.getVariable("editController", true);
}

View file

@ -408,6 +408,12 @@ public class LimitingResourcesPanel extends HtmlMacroComponent {
dependencyList.addDependenciesFor(element);
}
public void refreshQueues(Set<LimitingResourceQueue> queues) {
for (LimitingResourceQueue each: queues) {
refreshQueue(each);
}
}
public void refreshQueue(LimitingResourceQueue queue) {
dependencyList.removeDependenciesFor(queue);
queueListComponent.refreshQueue(queue);