/* GanttProject is an opensource project management tool. Copyright (C) 2011 GanttProject Team This program 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. This program 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.parser; import java.util.ArrayList; import java.util.List; import net.sourceforge.ganttproject.GPLogger; import net.sourceforge.ganttproject.gui.UIFacade; 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.TaskDependencyConstraint; import net.sourceforge.ganttproject.task.dependency.TaskDependencyException; import net.sourceforge.ganttproject.task.dependency.TaskDependency.Hardness; import net.sourceforge.ganttproject.task.dependency.constraint.FinishStartConstraintImpl; import org.xml.sax.Attributes; public class DependencyTagHandler extends AbstractTagHandler implements ParsingListener { private final TaskManager myTaskManager; private final UIFacade myUIFacade; public DependencyTagHandler(ParsingContext context, TaskManager taskManager, UIFacade uiFacade) { super("depend"); myContext = context; myTaskManager = taskManager; myUIFacade = uiFacade; } @Override protected boolean onStartElement(Attributes attrs) { loadDependency(attrs); return true; } @Override public void parsingStarted() { } @Override public void parsingFinished() { for (int i = 0; i < getDependencies().size(); i++) { GanttDependStructure ds = getDependencies().get(i); Task dependee = myTaskManager.getTask(ds.taskID); Task dependant = myTaskManager.getTask(ds.successorTaskID); if (dependee == null || dependant == null) { continue; } try { TaskDependency dep = myTaskManager.getDependencyCollection().createDependency(dependant, dependee, new FinishStartConstraintImpl()); dep.setConstraint(myTaskManager.createConstraint(ds.dependType)); dep.setDifference(ds.difference); if (myContext.getTasksWithLegacyFixedStart().contains(dependant)) { dep.setHardness(TaskDependency.Hardness.RUBBER); } else { dep.setHardness(ds.myHardness); } } catch (TaskDependencyException e) { GPLogger.log(e); } } } protected void loadDependency(Attributes attrs) { if (attrs != null) { GanttDependStructure gds = new GanttDependStructure(); gds.setTaskID(getDependencyAddressee()); gds.setDependTaskID(getDependencyAddresser(attrs)); String dependencyTypeAsString = attrs.getValue("type"); String differenceAsString = attrs.getValue("difference"); String hardnessAsString = attrs.getValue("hardness"); if (dependencyTypeAsString != null) { try { gds.setDependType(TaskDependencyConstraint.Type.fromPersistentValue(dependencyTypeAsString)); } catch (NumberFormatException e) { } } if (differenceAsString != null) { try { int difference = Integer.parseInt(differenceAsString); gds.setDifference(difference); } catch (NumberFormatException e) { } } if (hardnessAsString != null) { TaskDependency.Hardness hardness = TaskDependency.Hardness.parse(hardnessAsString); gds.setHardness(hardness); } getDependencies().add(gds); } } private int getDependencyAddressee() { return getContext().peekTask().getTaskID(); } private int getDependencyAddresser(Attributes attrs) { try { return Integer.parseInt(attrs.getValue("id")); } catch (NumberFormatException e) { throw new RuntimeException("Failed to parse 'depend' tag. Attribute 'id' seems to be invalid: " + attrs.getValue("id"), e); } } private List<GanttDependStructure> getDependencies() { return myDependencies; } private ParsingContext getContext() { return myContext; } private List<GanttDependStructure> myDependencies = new ArrayList<GanttDependStructure>(); private ParsingContext myContext; private class GanttDependStructure { public int taskID, successorTaskID; public int difference = 0; public TaskDependencyConstraint.Type dependType = TaskDependencyConstraint.Type.finishstart; private Hardness myHardness = TaskDependency.Hardness.STRONG; public void setHardness(Hardness hardness) { myHardness = hardness; } public GanttDependStructure() { } public void setTaskID(int taskID) { this.taskID = taskID; } public void setDifference(int difference) { this.difference = difference; } public void setDependTaskID(int successorTaskID) { this.successorTaskID = successorTaskID; } public void setDependType(TaskDependencyConstraint.Type dependType) { this.dependType = dependType; } } }