diff --git a/ccm-core/src/com/arsdigita/portation/conversion/NgCoreCollection.java b/ccm-core/src/com/arsdigita/portation/conversion/NgCoreCollection.java index 50e81e7d0..c0da29a28 100644 --- a/ccm-core/src/com/arsdigita/portation/conversion/NgCoreCollection.java +++ b/ccm-core/src/com/arsdigita/portation/conversion/NgCoreCollection.java @@ -32,6 +32,7 @@ import com.arsdigita.portation.modules.core.workflow.AssignableTask; import com.arsdigita.portation.modules.core.workflow.Task; import com.arsdigita.portation.modules.core.workflow.TaskAssignment; import com.arsdigita.portation.modules.core.workflow.TaskComment; +import com.arsdigita.portation.modules.core.workflow.TaskDependency; import com.arsdigita.portation.modules.core.workflow.Workflow; import java.util.ArrayList; @@ -62,6 +63,7 @@ public class NgCoreCollection { public static Map taskComments = new HashMap<>(); public static Map tasks = new HashMap<>(); public static Map assignableTasks = new HashMap<>(); + public static Map taskDependencies = new HashMap<>(); public static Map taskAssignments = new HashMap<>(); public static Map permissions = new HashMap<>(); diff --git a/ccm-core/src/com/arsdigita/portation/conversion/core/security/GroupConversion.java b/ccm-core/src/com/arsdigita/portation/conversion/core/security/GroupConversion.java index fb6c6a17b..86bd9744c 100644 --- a/ccm-core/src/com/arsdigita/portation/conversion/core/security/GroupConversion.java +++ b/ccm-core/src/com/arsdigita/portation/conversion/core/security/GroupConversion.java @@ -100,7 +100,8 @@ public class GroupConversion { if (group != null && member != null) { // create groupMemeberships - GroupMembership groupMembership = new GroupMembership(group, member); + GroupMembership groupMembership = new GroupMembership(group, + member); // set opposed associations group.addMembership(groupMembership); diff --git a/ccm-core/src/com/arsdigita/portation/conversion/core/workflow/AssignableTaskConversion.java b/ccm-core/src/com/arsdigita/portation/conversion/core/workflow/AssignableTaskConversion.java index 23272d1a2..128bbdac8 100644 --- a/ccm-core/src/com/arsdigita/portation/conversion/core/workflow/AssignableTaskConversion.java +++ b/ccm-core/src/com/arsdigita/portation/conversion/core/workflow/AssignableTaskConversion.java @@ -28,9 +28,9 @@ import com.arsdigita.portation.modules.core.workflow.AssignableTask; import com.arsdigita.portation.modules.core.workflow.Task; import com.arsdigita.portation.modules.core.workflow.TaskAssignment; import com.arsdigita.portation.modules.core.workflow.TaskComment; +import com.arsdigita.portation.modules.core.workflow.TaskDependency; import com.arsdigita.portation.modules.core.workflow.Workflow; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -59,9 +59,9 @@ public class AssignableTaskConversion { .arsdigita.workflow.simple.UserTask.getAllObjectUserTasks(); System.err.println("done."); - System.err.printf("\tConverting assignable tasks and task assignments...\n"); + System.err.printf("\tConverting assignable tasks, task dependencies " + + "and task assignments...\n"); createAssignableTasksAndSetAssociations(trunkUserTasks); - setTaskRingDependencies(trunkUserTasks); System.err.printf("\tSorting task assignments...\n"); sortAssignableTaskMap(); @@ -79,11 +79,13 @@ public class AssignableTaskConversion { */ private static void createAssignableTasksAndSetAssociations(List trunkUserTasks) { - int pTasks = 0, pAssignments = 0; + int pTasks = 0, pAssignments = 0, pDependencies = 0; for (com.arsdigita.workflow.simple.UserTask trunkUserTask : trunkUserTasks) { + // TASK STUFF + // create assignableTask AssignableTask assignableTask = new AssignableTask(trunkUserTask); @@ -101,6 +103,10 @@ public class AssignableTaskConversion { } } catch (Exception ignored) {} + // taskDependencies + pDependencies += createTaskDependencies(assignableTask, + trunkUserTask.getDependencies()); + // set taskComments Iterator commentsIt = trunkUserTask.getComments(); while (commentsIt.hasNext()) { @@ -116,6 +122,8 @@ public class AssignableTaskConversion { } + // ASSIGNABLETASK STUFF + // set lockingUser and notificationSender if (trunkUserTask.getLockedUser() != null) { User lockingUser = NgCoreCollection.users.get(trunkUserTask @@ -138,11 +146,57 @@ public class AssignableTaskConversion { groupCollection); pTasks++; + + + /*System.err.printf("\t\tTasks: %d, " + + "Dependencies: %d, " + + "Assignments: %d\n", + pTasks, pDependencies, pAssignments);*/ } System.err.printf("\t\tCreated %d assignable tasks and\n" + + "\t\tCreated %d task dependencies and\n" + "\t\tcreated %d task assignments.\n", - pTasks, pAssignments); + pTasks, pDependencies, pAssignments); + } + + /** + * Method for recreating the + * ng-{@link com.arsdigita.portation.modules.core.workflow.Task}s ring-like + * dependencies between dependentTask and dependsOn. Because all + * ng-{@link com.arsdigita.portation.modules.core.workflow.Task}s have + * already been created, it is possible e.g. to find the dependsOn-{@code + * Tasks} and bind them for association. + * + * @param assignableTask The {@link AssignableTask} + * @param dependencyIt An iterator representing all dependencies of the + * given assignableTask + */ + private static long createTaskDependencies(AssignableTask assignableTask, + Iterator dependencyIt) { + + int processed = 0; + + while (dependencyIt.hasNext()) { + AssignableTask dependency = NgCoreCollection + .assignableTasks + .get(((com.arsdigita.workflow.simple + .Task) dependencyIt.next()) + .getID() + .longValue()); + + if (assignableTask != null && dependency != null) { + TaskDependency taskDependency = + new TaskDependency(assignableTask, dependency); + + // set opposed associations + assignableTask.addBlockingTask(taskDependency); + dependency.addBlockedTask(taskDependency); + + processed++; + } + } + return processed; } /** @@ -184,43 +238,6 @@ public class AssignableTaskConversion { return processed; } - /** - * Method for recreating the - * ng-{@link com.arsdigita.portation.modules.core.workflow.Task}s ring-like - * dependencies between dependentTask and dependsOn. Because all - * ng-{@link com.arsdigita.portation.modules.core.workflow.Task}s have - * already been created, it is possible e.g. to find the dependsOn-{@code - * Tasks} and bind them for association. - * - * @param trunkUserTasks List of all - * {@link com.arsdigita.workflow.simple.UserTask}s - * from this old trunk-system. - */ - private static void setTaskRingDependencies(List trunkUserTasks) { - - for (com.arsdigita.workflow.simple.UserTask trunkUserTask : - trunkUserTasks) { - AssignableTask assignableTask = NgCoreCollection - .assignableTasks - .get(trunkUserTask.getID().longValue()); - - Iterator it = trunkUserTask.getDependencies(); - while (it.hasNext()) { - AssignableTask dependency = NgCoreCollection - .assignableTasks - .get(((com.arsdigita.workflow.simple - .Task) it.next()).getID().longValue()); - - if (assignableTask != null && dependency != null) { - // set dependencies and opposed - assignableTask.addDependsOn(dependency); - dependency.addDependentTask(assignableTask); - } - } - } - } - /** * Sorts values of assignable-task-map to ensure that the dependencies will * be listed before their dependant tasks in the export file. @@ -258,16 +275,17 @@ public class AssignableTaskConversion { */ private static void addDependencies(ArrayList sortedList, AssignableTask assignableTask) { - List dependencies = assignableTask.getDependsOn(); + List dependencies = assignableTask.getBlockingTasks(); if (!dependencies.isEmpty()) { - for (Task dependsOnTask : dependencies) { - AssignableTask dependency = (AssignableTask) dependsOnTask; - if (dependency != null) { - addDependencies(sortedList, dependency); + for (TaskDependency dependency : dependencies) { + AssignableTask blockingTask = (AssignableTask) dependency + .getBlockingTask(); + if (blockingTask != null) { + addDependencies(sortedList, blockingTask); - if (!sortedList.contains(dependency)) - sortedList.add(dependency); + if (!sortedList.contains(blockingTask)) + sortedList.add(blockingTask); } } } diff --git a/ccm-core/src/com/arsdigita/portation/modules/CoreExporter.java b/ccm-core/src/com/arsdigita/portation/modules/CoreExporter.java index 0f2f284df..0a3e0173d 100644 --- a/ccm-core/src/com/arsdigita/portation/modules/CoreExporter.java +++ b/ccm-core/src/com/arsdigita/portation/modules/CoreExporter.java @@ -51,6 +51,7 @@ public class CoreExporter extends AbstractExporter { exportWorkflows(); exportTaskComments(); exportAssignableTasks(); + exportTaskDependencies(); exportTaskAssignments(); } @@ -171,6 +172,17 @@ public class CoreExporter extends AbstractExporter { System.out.printf("\tdone.\n"); } + private static void exportTaskDependencies() { + System.out.printf("\tExporting task dependencies..."); + TaskDependencyMarshaller taskDependencyMarshaller = new + TaskDependencyMarshaller(); + taskDependencyMarshaller.prepare( + Format.XML, pathName, "taskDependencies", indentation); + taskDependencyMarshaller.exportList( + new ArrayList<>(NgCoreCollection.taskDependencies.values())); + System.out.printf("\tdone.\n"); + } + private static void exportTaskAssignments() { System.out.printf("\tExporting task assignments..."); TaskAssignmentMarshaller taskAssignmentMarshaller = new diff --git a/ccm-core/src/com/arsdigita/portation/modules/core/workflow/Task.java b/ccm-core/src/com/arsdigita/portation/modules/core/workflow/Task.java index e0c5a0bf9..9a13752a6 100644 --- a/ccm-core/src/com/arsdigita/portation/modules/core/workflow/Task.java +++ b/ccm-core/src/com/arsdigita/portation/modules/core/workflow/Task.java @@ -49,9 +49,9 @@ public class Task { @JsonIdentityReference(alwaysAsId = true) private Workflow workflow; @JsonIgnore - private List dependentTasks; - @JsonIdentityReference(alwaysAsId = true) - private List dependsOn; + private List blockedTasks; + @JsonIgnore + private List blockingTasks; @JsonIdentityReference(alwaysAsId = true) private List comments; @@ -70,8 +70,8 @@ public class Task { //this.workflow - this.dependentTasks = new ArrayList<>(); - this.dependsOn = new ArrayList<>(); + this.blockedTasks = new ArrayList<>(); + this.blockingTasks = new ArrayList<>(); this.comments = new ArrayList<>(); NgCoreCollection.tasks.put(this.getTaskId(), this); @@ -133,37 +133,36 @@ public class Task { this.workflow = workflow; } - public List getDependentTasks() { - return dependentTasks; + public List getBlockedTasks() { + return blockedTasks; } - public void setDependentTasks(final List dependentTasks) { - this.dependentTasks = dependentTasks; + public void setBlockedTasks(final List blockedTasks) { + this.blockedTasks = blockedTasks; } - public void addDependentTask(final Task task) { - dependentTasks.add(task); + public void addBlockedTask(final TaskDependency blockedTask) { + this.blockedTasks.add(blockedTask); } - public void removeDependentTask(final Task task) { - dependentTasks.remove(task); + public void removeBlockedTask(final TaskDependency blockedTask) { + this.blockedTasks.remove(blockedTask); } - public List getDependsOn() { - return dependsOn; + public List getBlockingTasks() { + return blockingTasks; } - public void setDependsOn(final List dependsOn) { - this.dependsOn = dependsOn; + public void setBlockingTasks(final List blockingTasks) { + this.blockingTasks = blockingTasks; } - public void addDependsOn(final Task task) { - dependsOn.add(task); + public void addBlockingTask(final TaskDependency blockingTask) { + this.blockingTasks.add(blockingTask); } - - public void removeDependsOn(final Task task) { - dependsOn.remove(task); + public void removeBlockingTask(final TaskDependency blockingTask) { + this.blockingTasks.remove(blockingTask); } public List getComments() { diff --git a/ccm-core/src/com/arsdigita/portation/modules/core/workflow/TaskDependency.java b/ccm-core/src/com/arsdigita/portation/modules/core/workflow/TaskDependency.java new file mode 100644 index 000000000..d37671057 --- /dev/null +++ b/ccm-core/src/com/arsdigita/portation/modules/core/workflow/TaskDependency.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.portation.modules.core.workflow; + +import com.arsdigita.kernel.ACSObject; +import com.arsdigita.portation.Portable; +import com.arsdigita.portation.conversion.NgCoreCollection; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; + +/** + * @author