📄 recalculatetaskschedulealgorithm.java
字号:
package net.sourceforge.ganttproject.task.algorithm;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.util.SortedMap;import java.util.TreeMap;import net.sourceforge.ganttproject.GanttCalendar;import net.sourceforge.ganttproject.task.Task;import net.sourceforge.ganttproject.task.TaskContainmentHierarchyFacade;import net.sourceforge.ganttproject.task.TaskLength;import net.sourceforge.ganttproject.task.TaskMutator;import net.sourceforge.ganttproject.task.dependency.TaskDependency;import net.sourceforge.ganttproject.task.dependency.TaskDependencyConstraint;import net.sourceforge.ganttproject.task.dependency.TaskDependencyException;/** * Created by IntelliJ IDEA. User: bard */public abstract class RecalculateTaskScheduleAlgorithm extends AlgorithmBase { private Set myMarkedTasks = new HashSet(); private SortedMap myDistance2dependencyList = new TreeMap(); private Set myModifiedTasks = new HashSet(); private final AdjustTaskBoundsAlgorithm myAdjuster; private int myEntranceCounter; private boolean isRunning; public RecalculateTaskScheduleAlgorithm(AdjustTaskBoundsAlgorithm adjuster) { myAdjuster = adjuster; } public void run(Task changedTask) throws TaskDependencyException { if (!isEnabled()) { return; } isRunning = true; myEntranceCounter++; myMarkedTasks.clear(); buildDistanceGraph(changedTask); fulfilDependencies(); myDistance2dependencyList.clear(); myModifiedTasks.add(changedTask); myAdjuster.run((Task[]) myModifiedTasks.toArray(new Task[0])); myDistance2dependencyList.clear(); myModifiedTasks.clear(); myEntranceCounter--; isRunning = false; } public void run(Set taskSet) throws TaskDependencyException { if (!isEnabled()) { return; } isRunning = true; myEntranceCounter++; myMarkedTasks.clear(); for (Iterator tasks = taskSet.iterator(); tasks.hasNext();) { Task nextTask = (Task) tasks.next(); buildDistanceGraph(nextTask); fulfilDependencies(); myDistance2dependencyList.clear(); myModifiedTasks.add(nextTask); } myAdjuster.run((Task[]) myModifiedTasks.toArray(new Task[0])); myDistance2dependencyList.clear(); myModifiedTasks.clear(); myEntranceCounter--; isRunning = false; } public void run() throws TaskDependencyException { if (!isEnabled()) { return; } isRunning = true; TaskContainmentHierarchyFacade facade = createContainmentFacade(); Set independentTasks = new HashSet(); traverse(facade, facade.getRootTask(), independentTasks); for (Iterator it = independentTasks.iterator(); it.hasNext();) { Task next = (Task) it.next(); buildDistanceGraph(next); } fulfilDependencies(); isRunning = false; } public boolean isRunning() { return isRunning; } private void traverse(TaskContainmentHierarchyFacade facade, Task root, Set independentTasks) { TaskDependency[] asDependant = root.getDependenciesAsDependant() .toArray(); if (asDependant.length == 0) { independentTasks.add(root); } Task[] nestedTasks = facade.getNestedTasks(root); for (int i = 0; i < nestedTasks.length; i++) { traverse(facade, nestedTasks[i], independentTasks); } } private void fulfilDependencies() throws TaskDependencyException { // System.err.println("[RecalculateTaskSchedule] // >>>fulfilDependencies()"); for (Iterator distances = myDistance2dependencyList.entrySet() .iterator(); distances.hasNext();) { Map.Entry nextEntry = (Map.Entry) distances.next(); List nextDependenciesList = (List) nextEntry.getValue(); for (int i = 0; i < nextDependenciesList.size(); i++) { TaskDependency nextDependency = (TaskDependency) nextDependenciesList .get(i); TaskDependencyConstraint nextConstraint = nextDependency .getConstraint(); TaskDependencyConstraint.Collision collision = nextConstraint .getCollision(); if (collision.isActive()) { fulfilConstraints(nextDependency); nextDependency.getDependant().applyThirdDateConstraint(); } } } // System.err.println("[RecalculateTaskSchedule] // <<<fulfilDependencies()"); } private void fulfilConstraints(TaskDependency dependency) throws TaskDependencyException { Task dependant = dependency.getDependant(); TaskDependency[] depsAsDependant = dependant .getDependenciesAsDependant().toArray(); if (depsAsDependant.length > 0) { ArrayList startLaterVariations = new ArrayList(); ArrayList startEarlierVariations = new ArrayList(); ArrayList noVariations = new ArrayList(); // for (int i = 0; i < depsAsDependant.length; i++) { TaskDependency next = depsAsDependant[i]; TaskDependencyConstraint.Collision nextCollision = next .getConstraint().getCollision(); GanttCalendar acceptableStart = nextCollision .getAcceptableStart(); switch (nextCollision.getVariation()) { case TaskDependencyConstraint.Collision.START_EARLIER_VARIATION: { startEarlierVariations.add(acceptableStart); break; } case TaskDependencyConstraint.Collision.START_LATER_VARIATION: { startLaterVariations.add(acceptableStart); break; } case TaskDependencyConstraint.Collision.NO_VARIATION: { noVariations.add(acceptableStart); break; } } } if (noVariations.size() > 1) { throw new TaskDependencyException( "Failed to fulfill constraints of task=" + dependant + ". There are " + noVariations.size() + " constraints which don't allow for task start variation"); } // Collections.sort(startEarlierVariations); Collections.sort(startLaterVariations); // GanttCalendar solution;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -