1 19 20 package taskblocks.io; 21 22 import java.io.File ; 23 import java.io.IOException ; 24 import java.util.ArrayList ; 25 import java.util.HashMap ; 26 import java.util.HashSet ; 27 import java.util.List ; 28 import java.util.Map ; 29 import java.util.Set ; 30 31 import javax.xml.parsers.DocumentBuilderFactory ; 32 import javax.xml.parsers.ParserConfigurationException ; 33 import javax.xml.transform.Transformer ; 34 import javax.xml.transform.TransformerException ; 35 import javax.xml.transform.TransformerFactory ; 36 import javax.xml.transform.dom.DOMSource ; 37 import javax.xml.transform.stream.StreamResult ; 38 39 import org.w3c.dom.Document ; 40 import org.w3c.dom.Element ; 41 import org.w3c.dom.Node ; 42 import org.w3c.dom.NodeList ; 43 import org.xml.sax.SAXException ; 44 45 import taskblocks.Pair; 46 import taskblocks.Utils; 47 import taskblocks.modelimpl.ColorLabel; 48 import taskblocks.modelimpl.ManImpl; 49 import taskblocks.modelimpl.TaskImpl; 50 import taskblocks.modelimpl.TaskModelImpl; 51 52 58 public class ProjectSaveLoad { 59 60 public static final String TASKMAN_E = "taskman"; 61 public static final String TASKS_E = "tasks"; 62 public static final String MANS_E = "mans"; 63 public static final String TASK_E = "task"; 64 public static final String MAN_E = "man"; 65 public static final String PREDECESSORS_E = "predecessors"; 66 public static final String PREDECESSOR_E = "predecessor"; 67 68 public static final String NAME_A = "name"; 69 public static final String ID_A = "id"; 70 public static final String START_A = "start"; 71 public static final String DURATION_A = "duration"; 72 public static final String MAN_A = "man"; 73 public static final String PRED_A = "pred"; 74 public static final String COLOR_A = "color"; 75 76 TaskModelImpl _model; 77 Map <String , TaskImpl> _taskIds; 78 Map <String , ManImpl> _manIds; 79 80 88 public TaskModelImpl loadProject(File f) throws WrongDataException { 89 try { 90 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 91 Document doc; 92 doc = dbf.newDocumentBuilder().parse(f); 93 Element rootE = doc.getDocumentElement(); 94 if(!TASKMAN_E.equals(rootE.getNodeName())) { 95 throw new WrongDataException("Document is not TaskManager project"); 96 } 97 98 Map <String , ManImpl> mans = new HashMap <String , ManImpl>(); 100 Map <String , TaskImpl>tasks = new HashMap <String , TaskImpl>(); 102 List <Pair<TaskImpl, String []>> taskPredecessorsIds = new ArrayList <Pair<TaskImpl,String []>>(); 104 105 Element mansE = getFirstChild(rootE, MANS_E); 107 if(mansE != null) { 108 Element [] manEs = Utils.getChilds(mansE, MAN_E); 109 for(Element manE: manEs) { 110 String manName = manE.getAttribute(NAME_A); 111 String manId = manE.getAttribute(ID_A); 112 ManImpl man = new ManImpl(); 113 man.setName(manName); 114 mans.put(manId, man); 115 } 116 } 117 Element tasksE = getFirstChild(rootE, TASKS_E); 118 if(tasksE != null) { 119 for(Element taskE: Utils.getChilds(tasksE, TASK_E)) { 120 String taskId = taskE.getAttribute(ID_A); 121 String taskName = taskE.getAttribute(NAME_A); 122 long taskStart = Long.valueOf(taskE.getAttribute(START_A)); 123 long taskDuration = Long.valueOf(taskE.getAttribute(DURATION_A)); 124 String colorTxt = taskE.getAttribute(COLOR_A); 125 String taskManId = taskE.getAttribute(MAN_A); 126 ManImpl man = mans.get(taskManId); 128 if(man == null) { 129 throw new WrongDataException("Task with id " + taskId + " is not assigned to any man"); 130 } 131 132 TaskImpl task = new TaskImpl(); 133 task.setName(taskName); 134 task.setStartTime(taskStart); 135 task.setDuration(taskDuration); 136 task.setMan(man); 137 if(colorTxt != null && colorTxt.length() > 0) { 138 int colorIndex = Integer.parseInt(colorTxt); 139 if(colorIndex >= 0 && colorIndex < ColorLabel.COLOR_LABELS.length) { 140 task.setColorLabel(ColorLabel.COLOR_LABELS[colorIndex]); 141 } 142 } 143 144 Element predsE = getFirstChild(taskE, PREDECESSORS_E); 146 if(predsE != null) { 147 List <String > preds = new ArrayList <String >(); 148 for(Element predE: Utils.getChilds(predsE, PREDECESSOR_E)) { 149 preds.add(predE.getAttribute(PRED_A)); 150 } 151 taskPredecessorsIds.add(new Pair<TaskImpl, String []>(task, preds.toArray(new String [preds.size()]))); 152 } 153 154 tasks.put(taskId, task); 155 } 156 } 157 158 for(Pair<TaskImpl, String []> taskAndPredIds: taskPredecessorsIds) { 160 List <TaskImpl> preds = new ArrayList <TaskImpl>(); 161 for(String predId: taskAndPredIds.snd) { 162 TaskImpl pred = tasks.get(predId); 163 if(pred == null) { 164 System.out.println("Warning: Task predecessor with id " + predId + " doesn't exist"); 165 } else if(pred == taskAndPredIds.fst) { 166 System.out.println("Warning: Task with id " + predId + " is it's own predecessor"); 167 } else { 168 preds.add(pred); 169 } 170 } 171 taskAndPredIds.fst.setPredecessors(preds.toArray(new TaskImpl[preds.size()])); 172 } 173 174 TaskModelImpl taskModel = new TaskModelImpl(tasks.values().toArray(new TaskImpl[tasks.size()]), mans.values().toArray(new ManImpl[mans.size()])); 175 176 return taskModel; 177 178 } catch (SAXException e) { 179 throw new WrongDataException("Document is not valid data file", e); 180 } catch (IOException e) { 181 throw new WrongDataException("Can't read file: " + e.getMessage(), e); 182 } catch (ParserConfigurationException e) { 183 throw new WrongDataException("Document is not TaskManager project", e); 184 } 185 } 186 187 195 public void saveProject(File f, TaskModelImpl model) throws TransformerException , ParserConfigurationException { 196 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 197 Document doc; 198 doc = dbf.newDocumentBuilder().newDocument(); 199 200 _model = model; 201 _taskIds = new HashMap <String , TaskImpl>(); 202 _manIds = new HashMap <String , ManImpl>(); 203 204 saveProject(doc); 206 prettyLayout((Element )doc.getFirstChild()); 207 208 TransformerFactory tf = TransformerFactory.newInstance(); 209 Transformer t = tf.newTransformer(); 210 t.transform(new DOMSource (doc), new StreamResult (f)); 211 } 212 213 private void saveProject(Document doc) { 214 Element rootE = doc.createElement(TASKMAN_E); 215 doc.appendChild(rootE); 216 Set <ManImpl> mans = new HashSet <ManImpl>(); 217 218 for(TaskImpl t: _model._tasks) { 220 mans.add(t.getMan()); 221 } 222 223 int lastTaskId = 1; 225 int lastManId = 1; 226 for(TaskImpl t: _model._tasks) { 227 t._id = String.valueOf(lastTaskId++); 228 } 229 for(ManImpl man: mans) { 230 man._id = String.valueOf(lastManId++); 231 } 232 233 Element mansE = doc.createElement(MANS_E); 235 for(ManImpl man : mans) { 236 saveMan(mansE, man); 237 } 238 rootE.appendChild(mansE); 239 240 Element tasksE = doc.createElement(TASKS_E); 242 for(TaskImpl t: _model._tasks) { 243 saveTask(tasksE, t); 244 } 245 rootE.appendChild(tasksE); 246 } 247 248 private void saveMan(Element mansE, ManImpl man) { 249 Element manE = mansE.getOwnerDocument().createElement(MAN_E); 250 manE.setAttribute(ID_A, man._id); 251 manE.setAttribute(NAME_A, man.getName()); 252 mansE.appendChild(manE); 253 } 254 255 private void saveTask(Element tasksE, TaskImpl t) { 256 Element taskE = tasksE.getOwnerDocument().createElement(TASK_E); 257 taskE.setAttribute(NAME_A, t.getName()); 258 taskE.setAttribute(ID_A, t._id); 259 taskE.setAttribute(START_A, String.valueOf(t.getStartTime())); 260 taskE.setAttribute(DURATION_A, String.valueOf(t.getDuration())); 261 taskE.setAttribute(MAN_A, t.getMan()._id); 262 if(t.getColorLabel() != null) { 263 taskE.setAttribute(COLOR_A, String.valueOf(t.getColorLabel()._index)); 264 } 265 266 if(t.getPredecessors().length > 0) { 268 Element predsE = taskE.getOwnerDocument().createElement(PREDECESSORS_E); 269 for(TaskImpl pred: t.getPredecessors()) { 270 Element predE = predsE.getOwnerDocument().createElement(PREDECESSOR_E); 271 predE.setAttribute(PRED_A, pred._id); 272 predsE.appendChild(predE); 273 } 274 taskE.appendChild(predsE); 275 } 276 tasksE.appendChild(taskE); 277 } 278 279 private Element getFirstChild(Element e, String name) { 280 NodeList nl = e.getChildNodes(); 281 for(int i = 0; i < nl.getLength(); i++) { 282 Node n = nl.item(i); 283 if(n.getNodeType() == Node.ELEMENT_NODE && name.equals(n.getNodeName())) { 284 return (Element )n; 285 } 286 } 287 return null; 288 } 289 290 private void prettyLayout(Element e) { 291 prettyLayoutRec(e, ""); 292 } 293 294 private void prettyLayoutRec(Element e, String currentIndent) { 295 296 if(currentIndent.length() > 0) { 300 e.getParentNode().insertBefore(e.getOwnerDocument().createTextNode(currentIndent), e); 301 } 302 303 NodeList nl = e.getChildNodes(); 306 boolean hasChildrenElems = false; 307 for(int i = 0; i < nl.getLength(); i++) { 308 Node n = nl.item(i); 309 if(n.getNodeType() == Node.ELEMENT_NODE) { 310 hasChildrenElems = true; 311 break; 312 } 313 } 314 315 if(hasChildrenElems) { 316 e.insertBefore(e.getOwnerDocument().createTextNode("\n"), e.getFirstChild()); 318 319 e.appendChild(e.getOwnerDocument().createTextNode(currentIndent)); 321 322 currentIndent += " "; 324 Node n = e.getFirstChild(); 327 while(n != null) { 328 if(n.getNodeType() == Node.ELEMENT_NODE) { 329 prettyLayoutRec((Element )n, currentIndent); 330 } 331 n = n.getNextSibling(); 332 } 333 } 334 335 Node text = e.getOwnerDocument().createTextNode("\n"); 337 if(e.getNextSibling() == null) { 338 if(e.getParentNode().getNodeType() != Node.DOCUMENT_NODE) { 339 e.getParentNode().appendChild(text); 340 } 341 } else { 342 e.getParentNode().insertBefore(text, e.getNextSibling()); 343 } 344 } 345 } 346 | Popular Tags |