/* Copyright 2003-2012 Dmitry Barashev, GanttProject Team This file is part of GanttProject, an opensource project management tool. GanttProject is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GanttProject 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 General Public License for more details. You should have received a copy of the GNU General Public License along with GanttProject. If not, see <http://www.gnu.org/licenses/>. */ package org.ganttproject.chart.pert; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.List; import biz.ganttproject.core.time.TimeDuration; import net.sourceforge.ganttproject.task.Task; import net.sourceforge.ganttproject.task.TaskManager; import net.sourceforge.ganttproject.task.dependency.TaskDependency; import net.sourceforge.ganttproject.task.dependency.TaskDependencySlice; public class PertChartAbstraction { private final TaskManager myTaskManager; private final List<TaskGraphNode> myTaskGraph; public PertChartAbstraction(TaskManager taskManager) { myTaskManager = taskManager; myTaskGraph = new ArrayList<TaskGraphNode>(); load(); } /** * Loads data from task manager into pert chart abstraction. It creates all * TaskGraphNodes. */ private void load() { Task[] tasks = myTaskManager.getTasks(); for (int i = 0; i < tasks.length; i++) { Task task = tasks[i]; TaskGraphNode tgn = getTaskGraphNode(task); TaskDependencySlice dependencies = task.getDependenciesAsDependee(); TaskDependency[] relationship = dependencies.toArray(); for (int j = 0; j < relationship.length; j++) { Task successor = relationship[j].getDependant(); tgn.addSuccessor(getTaskGraphNode(successor)); } } } /** * @param task * The task from which we want the <code>TaskGraphNode</code> * @return The <code>TaskGraphNode</code> corresponding of the given * <code>task</code>. */ private TaskGraphNode getTaskGraphNode(Task task) { TaskGraphNode res = getTaskGraphNodeByID(task.getTaskID()); if (res == null) { res = new TaskGraphNode(task); if (task.isMilestone()) { res.setType(Type.MILESTONE); } else if (myTaskManager.getTaskHierarchy().getNestedTasks(task).length == 0) { res.setType(Type.NORMAL); } else { res.setType(Type.SUPER); } myTaskGraph.add(res); } return res; } /** @return The list of <code>TaskGraphNodes</code>. */ public List<TaskGraphNode> getTaskGraphNodes() { return myTaskGraph; } /** * @param id * The task ID from which we want the <code>TaskGraphNode</code> * @return The <code>TaskGraphNode</code> corresponding to the given task ID. */ public TaskGraphNode getTaskGraphNodeByID(int id) { for (TaskGraphNode tgn : myTaskGraph) { if (tgn.getID() == id) { return tgn; } } return null; } /** * PERT graph node abstraction * * @author bbaranne */ static class TaskGraphNode { private List<TaskGraphNode> successors; private int type; private Task myTask; TaskGraphNode(Task task) { successors = new ArrayList<TaskGraphNode>(); myTask = task; } void setType(int type) { this.type = type; } int getType() { return this.type; } void addSuccessor(TaskGraphNode successor) { this.successors.add(successor); } List<TaskGraphNode> getSuccessors() { return this.successors; } String getName() { return myTask.getName(); } TimeDuration getDuration() { return myTask.getDuration(); } int getID() { return myTask.getTaskID(); } boolean isCritical() { return myTask.isCritical(); } @Override public String toString() { return "{" + getName() + ", " + getDuration() + /* ", " + successors + */"}"; } GregorianCalendar getEndDate() { return myTask.getDisplayEnd(); } GregorianCalendar getStartDate() { return myTask.getStart(); } } /** * Type of the node: NORMAL, SUPER (for super tasks) and MILESTONE. * * @author bbaranne * */ static class Type { public static final int NORMAL = 0; public static final int SUPER = 1; public static final int MILESTONE = 2; } }