/* 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 net.sourceforge.ganttproject.io; import biz.ganttproject.core.time.CalendarFactory; import net.sourceforge.ganttproject.GPLogger; import net.sourceforge.ganttproject.GPVersion; import net.sourceforge.ganttproject.GanttGraphicArea; import net.sourceforge.ganttproject.GanttPreviousState; import net.sourceforge.ganttproject.GanttProject; import net.sourceforge.ganttproject.GanttResourcePanel; import net.sourceforge.ganttproject.IGanttProject; import net.sourceforge.ganttproject.gui.TaskTreeUIFacade; import net.sourceforge.ganttproject.gui.UIFacade; import net.sourceforge.ganttproject.language.GanttLanguage; import net.sourceforge.ganttproject.roles.Role; import net.sourceforge.ganttproject.roles.RoleManager; import net.sourceforge.ganttproject.roles.RoleSet; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import java.io.IOException; import java.io.OutputStream; import java.util.List; public class GanttXMLSaver extends SaverBase implements GPSaver { private static final String VERSION = GPVersion.getCurrentVersionNumber(); private final IGanttProject myProject; private final UIFacade myUIFacade; private GanttGraphicArea area; private final TaskTreeUIFacade myTaskTree; /** The constructor */ public GanttXMLSaver(IGanttProject project, TaskTreeUIFacade taskTree, GanttResourcePanel peop, GanttGraphicArea area, UIFacade uiFacade) { myTaskTree = taskTree; this.area = area; myProject = project; myUIFacade = uiFacade; } @Override public void save(OutputStream stream) throws IOException { try { AttributesImpl attrs = new AttributesImpl(); StreamResult result = new StreamResult(stream); TransformerHandler handler = createHandler(result); handler.startDocument(); addAttribute("name", getProject().getProjectName(), attrs); addAttribute("company", getProject().getOrganization(), attrs); addAttribute("webLink", getProject().getWebLink(), attrs); addAttribute("view-date", CalendarFactory.createGanttCalendar(area.getStartDate()).toXMLString(), attrs); addAttribute("view-index", "" + myUIFacade.getViewIndex(), attrs); // TODO for GP 2.0: move view configurations into <view> tag (see // ViewSaver) addAttribute("gantt-divider-location", "" + myUIFacade.getGanttDividerLocation(), attrs); addAttribute("resource-divider-location", "" + myUIFacade.getResourceDividerLocation(), attrs); addAttribute("version", VERSION, attrs); addAttribute("locale", GanttLanguage.getInstance().getLocale().toString(), attrs); startElement("project", attrs, handler); // cdataElement("description", getProject().getDescription(), attrs, handler); saveViews(handler); emptyComment(handler); saveCalendar(handler); saveTasks(handler); saveResources(handler); saveAssignments(handler); saveVacations(handler); //saveGanttChartView(handler); saveHistory(handler); saveRoles(handler); endElement("project", handler); handler.endDocument(); stream.close(); } catch (Throwable e) { if (!GPLogger.log(e)) { e.printStackTrace(System.err); } IOException propagatedException = new IOException("Failed to save the project file"); propagatedException.initCause(e); throw propagatedException; } } private void saveHistory(TransformerHandler handler) throws SAXException, ParserConfigurationException, IOException { List<GanttPreviousState> history = ((GanttProject) myProject).getBaselines(); new HistorySaver().save(history, handler); } private void saveGanttChartView(TransformerHandler handler) throws SAXException { new GanttChartViewSaver().save(myTaskTree.getVisibleFields(), handler); } private void saveVacations(TransformerHandler handler) throws SAXException { new VacationSaver().save(getProject(), handler); } private void saveResources(TransformerHandler handler) throws SAXException { new ResourceSaver().save(getProject(), handler); } private void saveViews(TransformerHandler handler) throws SAXException { new ViewSaver().save(getUIFacade(), handler); } private void saveCalendar(TransformerHandler handler) throws SAXException { new CalendarSaver().save(getProject(), handler); } private void saveTasks(TransformerHandler handler) throws SAXException, IOException { new TaskSaver().save(getProject(), handler); } private void saveAssignments(TransformerHandler handler) throws SAXException { new AssignmentSaver().save(getProject(), handler); } private void saveRoles(TransformerHandler handler) throws SAXException { AttributesImpl attrs = new AttributesImpl(); RoleManager roleManager = getProject().getRoleManager(); RoleSet[] roleSets = roleManager.getRoleSets(); for (int i = 0; i < roleSets.length; i++) { RoleSet next = roleSets[i]; if (next.isEnabled()) { addAttribute("roleset-name", next.getName(), attrs); emptyElement("roles", attrs, handler); } } // RoleSet projectRoleSet = roleManager.getProjectRoleSet(); if (!projectRoleSet.isEmpty()) { startElement("roles", attrs, handler); Role[] projectRoles = projectRoleSet.getRoles(); for (int i = 0; i < projectRoles.length; i++) { Role next = projectRoles[i]; addAttribute("id", next.getPersistentID(), attrs); addAttribute("name", next.getName(), attrs); emptyElement("role", attrs, handler); } endElement("roles", handler); } } IGanttProject getProject() { return myProject; } UIFacade getUIFacade() { return myUIFacade; } }