diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java index e2d249900..e1984e96f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -136,5 +136,4 @@ public class Task extends TaskElement { } return result; } - } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java index 073902072..1d9b32a62 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -148,7 +148,75 @@ public abstract class TaskElement { public abstract List getChildren(); + protected void setParent(TaskGroup taskGroup) { this.parent = taskGroup; } + + public void detach() { + detachDependencies(); + detachFromParent(); + } + + private void detachFromParent() { + if (parent != null) { + parent.remove(this); + } + } + + private void removeDependenciesWithOrigin(TaskElement t) { + List dependenciesToRemove = getDependenciesWithOrigin(t); + dependenciesWithThisDestination.removeAll(dependenciesToRemove); + } + + private void removeDependenciesWithDestination(TaskElement t) { + List dependenciesToRemove = getDependenciesWithDestination(t); + dependenciesWithThisOrigin.removeAll(dependenciesToRemove); + } + + private List getDependenciesWithDestination(TaskElement t) { + ArrayList result = new ArrayList(); + for (Dependency dependency : dependenciesWithThisOrigin) { + if (dependency.getDestination().equals(t)) { + result.add(dependency); + } + } + return result; + } + + private List getDependenciesWithOrigin(TaskElement t) { + ArrayList result = new ArrayList(); + for (Dependency dependency : dependenciesWithThisDestination) { + if (dependency.getOrigin().equals(t)) { + result.add(dependency); + } + } + return result; + } + + private void detachDependencies() { + detachOutcomingDependencies(); + detachIncomingDependencies(); + } + + private void detachIncomingDependencies() { + Set tasksToNotify = new HashSet(); + for (Dependency dependency : dependenciesWithThisDestination) { + tasksToNotify.add(dependency.getOrigin()); + } + for (TaskElement taskElement : tasksToNotify) { + taskElement.removeDependenciesWithDestination(this); + } + } + + private void detachOutcomingDependencies() { + Set tasksToNotify = new HashSet(); + for (Dependency dependency : dependenciesWithThisOrigin) { + tasksToNotify.add(dependency.getDestination()); + } + for (TaskElement taskElement : tasksToNotify) { + taskElement.removeDependenciesWithOrigin(this); + } + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java index a58554d53..f171862dc 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java @@ -34,4 +34,8 @@ public class TaskGroup extends TaskElement { return getOrderElement().getWorkHours(); } + public void remove(TaskElement taskElement) { + taskElements.remove(taskElement); + } + } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java index 49b81531b..5b1c905b5 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java @@ -197,4 +197,36 @@ public class TaskElementTest { } } } + + @Test + public void detachRemovesDependenciesFromRelatedTasks() { + HoursGroup hoursGroup = new HoursGroup(); + Task taskToDetach = Task.createTask(hoursGroup); + Task sourceDependencyTask = Task.createTask(new HoursGroup()); + Task destinationDependencyTask = Task.createTask(new HoursGroup()); + taskToDetach.setName("prueba"); + taskToDetach.setNotes("blabla"); + taskToDetach.setStartDate(new Date()); + Dependency.createDependency(sourceDependencyTask, taskToDetach, + Type.END_START); + Dependency.createDependency(taskToDetach, + destinationDependencyTask, Type.END_START); + taskToDetach.detach(); + assertThat(sourceDependencyTask.getDependenciesWithThisOrigin().size(), + equalTo(0)); + assertThat(destinationDependencyTask + .getDependenciesWithThisDestination().size(), equalTo(0)); + } + + @Test + public void detachRemovesTaskFromParent() { + TaskGroup parent = new TaskGroup(); + HoursGroup hoursGroup = new HoursGroup(); + Task child = Task.createTask(hoursGroup); + Task anotherChild = Task.createTask(hoursGroup); + parent.addTaskElement(child); + parent.addTaskElement(anotherChild); + child.detach(); + assertThat(parent.getChildren().size(), equalTo(1)); + } }