📄 xmlmodel.java
字号:
/** * Copyright 2004 Carlos Silva A. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */package jgantt.model;import java.awt.Color;import java.awt.Font;import java.io.IOException;import java.io.InputStream;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Iterator;import java.util.Stack;import java.util.StringTokenizer;import java.util.Vector;import org.xml.sax.SAXException;import com.csa.lib.xml.dom.DocumentParser;import com.csa.lib.xml.dom.Node;/** * XMLModel provee funciones para transformar un project en un modelo DOM y para * la transformacion inversa. * <p> * $Date: 2005/06/12 09:52:48 $ * </p> * * @version $Revision: 1.22 $ * @author Carlos Silva */public class XMLModel { static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); static final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.S"); static final String dayNames[] = { "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday" }; public static final String XML_PROJECT = "project"; public static final String XML_NAME = "name"; public static final String XML_START_DATE = "start-date"; public static final String XML_EFFORT = "effort"; public static final String XML_TOTAL = "total"; public static final String XML_WORKED = "worked"; public static final String XML_TASK = "task"; public static final String XML_ID = "id"; public static final String XML_ASIGNMENT = "asignment"; public static final String XML_RESOURCE = "resource"; public static final String XML_CONSTRAINT = "constraint"; public static final String XML_MASTER = "master"; /** * Generar una representacion de un Project en un arbol DOM de XML Retorna * el nodo pero no lo agrega al arbol. * * @return Element */ static public Node toXML(Project project) { Node e = null; Node root = new Node(XML_PROJECT); root.appendChild(new Node(XML_NAME, project.getName())); root.appendChild(new Node(XML_START_DATE, sdf.format(project .getStartDate()))); // Date organizer root.appendChild(toXML(project.getDateOrganizer())); // Recursos for (Iterator i = project.getResources().iterator(); i.hasNext();) { Resource r = (Resource) i.next(); Node rnode = toXML(r); root.appendChild(rnode); Node enode = new Node(XML_EFFORT); int total = project.getMainTask().getTotalResourceUnits(r); enode.appendChild(new Node(XML_TOTAL, String.valueOf(total))); int worked = project.getMainTask().getWorkedResourceUnits(r); enode.appendChild(new Node(XML_WORKED, String.valueOf(worked))); rnode.appendChild(enode); } // Tareas root.appendChild(toXML(project.getMainTask())); // Snapshots Node snapshots = new Node("snapshots"); for (Iterator i = project.getSnapshots().iterator(); i.hasNext();) { Project.SnapShot ss = (Project.SnapShot) i.next(); String name = ss.name; Node snapshot = new Node("snapshot", name); snapshot.setAttribute("id", df.format(ss.date)); snapshots.appendChild(snapshot); } if (project.getSnapshots().size() > 0) root.appendChild(snapshots); return root; } /** * Generar una representacion de un Task en un arbol DOM de XML Retorna el * nodo pero no lo agrega al arbol. * * @return Element */ static public Node toXML(Task task) { Node e = null; Node root = new Node(XML_TASK); root.appendChild(XML_ID, String.valueOf(task.id)); root.appendChild(new Node(XML_NAME, task.name)); root.appendChild(new Node("length", String.valueOf(task.length))); if (task.notBeforeDate != null) { root.appendChild(new Node("not-before", sdf .format(task.notBeforeDate))); } root.appendChild(new Node("completed", String.valueOf(task.completed))); root.appendChild(new Node("comments", task.comments)); root.appendChild(new Node("notes", task.notes)); for (Iterator i = task.constraints.iterator(); i.hasNext();) { Constraint c = (Constraint) i.next(); root.appendChild(toXML(c)); } for (Iterator i = task.resources.iterator(); i.hasNext();) { Asignation a = (Asignation) i.next(); Node anode = toXML(a); root.appendChild(anode); Node enode = new Node(XML_EFFORT); int total = task.getLocalTotalResourceUnits(a.getResource()); enode.appendChild(new Node(XML_TOTAL, String.valueOf(total))); int worked = task.getLocalWorkedResourceUnits(a.getResource()); enode.appendChild(new Node(XML_WORKED, String.valueOf(worked))); anode.appendChild(enode); } for (Iterator i = task.childTasks.iterator(); i.hasNext();) { Task t = (Task) i.next(); root.appendChild(toXML(t)); } // Snapshots if (task.snapshots.size() > 0) { Node snapshots = new Node("snapshots"); for (Iterator i = task.snapshots.iterator(); i.hasNext();) { Task.SnapShot ss = (Task.SnapShot) i.next(); Node snapshot = new Node("snapshot"); snapshot.appendChild("id", df.format(ss.date)); snapshot.appendChild("start", df.format(ss.start)); snapshot.appendChild("end", df.format(ss.end)); snapshot.appendChild("completed", String.valueOf(ss.completed)); snapshots.appendChild(snapshot); } root.appendChild(snapshots); } return root; } /** * Generar una representacion de un Resource en un arbol DOM de XML Retorna * el nodo pero no lo agrega al arbol. * * @return Element */ static public Node toXML(Resource resource) { Node e = null; Node root = new Node(XML_RESOURCE); root.appendChild(XML_ID, String.valueOf(resource.id)); root.appendChild(new Node(XML_NAME, resource.name)); root.appendChild(new Node("alias", resource.alias)); root.appendChild(new Node("initials", resource.initials)); return root; } /** * Generar una representacion de un Constraint en un arbol DOM de XML * Retorna el nodo pero no lo agrega al arbol. * * @return Element */ static public Node toXML(Constraint constraint) { Node root = new Node(XML_CONSTRAINT); root.appendChild(XML_MASTER, String.valueOf(constraint.masterTask .getId())); switch (constraint.mode) { case 0: root.appendChild("mode", "EB"); break; case 1: root.appendChild("mode", "EE"); break; case 2: root.appendChild("mode", "BE"); break; case 3: root.appendChild("mode", "BB"); break; } root.appendChild("delay", String.valueOf(constraint.delay)); return root; } /** * Generar una representacion de un Asignation en un arbol DOM de XML * Retorna el nodo pero no lo agrega al arbol. * * @return Element */ static public Node toXML(Asignation asignation) { Node root = new Node(XML_ASIGNMENT); root.appendChild("resource", String.valueOf(asignation.resource .getId())); root.appendChild("percent", String.valueOf(asignation.units)); return root; } /** * Generar una representacion de un Constraint en un arbol DOM de XML * Retorna el nodo pero no lo agrega al arbol. * * @return Element */ static public Node toXML(DateOrganizer dOrg) { Node e = null; Node root = new Node("date-organizer"); root.appendChild("day-start", dOrg.startHH + ":" + dOrg.startMM); root.appendChild("work-hours", dOrg.workHours + ":" + dOrg.workMinutes); root.appendChild("work-hours", dOrg.workHours + ":" + dOrg.workMinutes); e = new Node("labor-days"); for (int i = 0; i < dOrg.laborDays.length; i++) { if (dOrg.laborDays[i]) e.appendChild(new Node(dayNames[i])); } root.appendChild(e); e = new Node("holidays"); for (Iterator i = dOrg.holidays.iterator(); i.hasNext();) { Date d = (Date) i.next(); e.appendChild("holiday", sdf.format(d)); } root.appendChild(e); e = new Node("extra-days"); for (Iterator i = dOrg.extraWorkDays.iterator(); i.hasNext();) { Date d = (Date) i.next(); e.appendChild("extra-day", sdf.format(d)); } root.appendChild(e); return root; } /** * Lee un proyecto */ static public Project readProject(Node doc) throws ParseException, GanttException { // System.out.println("XMLModel.readProject()"); doc = getChildByName(doc, XML_PROJECT); // date organizer DateOrganizer dOrg = readDateOrganizer(getChildByName(doc, "date-organizer")); // proyecto Project project = new Project(dOrg); // resources Node r = getChildByName(doc, XML_RESOURCE); while (r != null) { if (r.getNodeName().equals(XML_RESOURCE)) { readResource(project, r); } r = r.getNextSibling(); } // datos varios project.setName(getChildText(doc, XML_NAME)); project.setStartDate(getElementDate(doc, XML_START_DATE)); // tasks project.mainTask = readTask(project, getChildByName(doc, XML_TASK)); project.taskList.clear(); project.rebuildIds(project.getMainTask(), 0); searchConstraints(project, getChildByName(doc, XML_TASK)); // Snapshots Node snapshots = getChildByName(doc, "snapshots"); if (snapshots != null) { Node item = getChildByName(snapshots, "snapshot"); while (item != null) { if (!item.getNodeName().equals("snapshot")) break; Date d = df.parse(item.getAttribute("id")); String n = item.getValue(); project.getSnapshots().add(new Project.SnapShot(d, n)); item = item.getNextSibling(); } } project.clearUndoRedo(); return project; } static public void searchConstraints(Project project, Node rootTask) throws GanttException { Stack s = new Stack(); Vector constraints = new Vector(); s.push(rootTask); while (!s.empty()) { Node n = (Node) s.pop(); Node c = getChildByName(n, XML_CONSTRAINT); while (c != null) { if (c.getNodeName().equals(XML_CONSTRAINT)) { constraints.add(c); } c = c.getNextSibling(); } Node t = getChildByName(n, XML_TASK); while (t != null) { if (t.getNodeName().equals(XML_TASK)) { s.push(t); } t = t.getNextSibling(); } } for (Iterator i = constraints.iterator(); i.hasNext();) { Node n = (Node) i.next(); Node task = n.getParentNode(); int delay = Integer.parseInt(getChildText(n, "delay")); String mode = getChildText(n, "mode"); int slaveid = Integer.parseInt(getChildText(task, "id")); int masterid = Integer.parseInt(getChildText(n, XML_MASTER)); Task slave = project.getTask(slaveid - 1); Task master = project.getTask(masterid - 1); // System.out.println("new Constraint "+master.getName()+" a // "+slave.getName()); Constraint c = new Constraint(master, slave); c.setDelay(delay); } } static public DateOrganizer readDateOrganizer(Node doc) throws ParseException, GanttException { DateOrganizer dOrg = new DateOrganizer(); String dayStart = getChildText(doc, "day-start"); dOrg.startHH = Byte.parseByte(dayStart.substring(0, dayStart .indexOf(":"))); dOrg.startMM = Byte.parseByte(dayStart .substring(dayStart.indexOf(":") + 1)); String workHours = getChildText(doc, "work-hours"); dOrg.workHours = Integer.parseInt(workHours.substring(0, workHours .indexOf(":"))); dOrg.workMinutes = Integer.parseInt(workHours.substring(workHours .indexOf(":") + 1)); Node ld = getChildByName(doc, "labor-days"); boolean laborDays[] = new boolean[7]; for (int i = 0; i < 6; i++) { laborDays[i] = (getChildByName(ld, dayNames[i])) != null; } dOrg.setLaborDays(laborDays); Node h = getElementByPath(doc, "holidays").getFirstChild(); while (h != null) { if (h.getNodeName().equals("holiday")) { dOrg.addHoliday(sdf.parse(h.getValue())); } h = h.getNextSibling(); } Node x = getElementByPath(doc, "extra-days"); if (x != null) { x = x.getFirstChild(); while (x != null) { if (x.getNodeName().equals("extra-day")) { dOrg.addExtraWorkDays(sdf.parse(x.getValue())); } x = x.getNextSibling(); } } return dOrg; } /** * @id, name, length, not-before, completed, asignation*, task* */ static public Task readTask(Project project, Node doc) throws ParseException, GanttException { // System.out.println("XMLModel.readTask()"); Task task = new Task(project); task.setName(getChildText(doc, XML_NAME)); task.setId(Integer.parseInt(getChildText(doc, "id"))); task.setLength(Integer.parseInt(getChildText(doc, "length"))); Node n = getChildByName(doc, "not-before"); if (n != null) { task.setNotBeforeDate(sdf.parse(n.getValue()));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -