/src/main/java/uk/ac/cam/ch/ami/amievents/log/TimelineXMLWriter.java

https://bitbucket.org/jat45/ami · Java · 200 lines · 141 code · 36 blank · 23 comment · 7 complexity · 07dc73a2da23acc29cb0447d99dd00b3 MD5 · raw file

  1. package uk.ac.cam.ch.ami.amievents.log;
  2. import org.apache.commons.io.IOUtils;
  3. import org.w3c.dom.Document;
  4. import org.w3c.dom.Element;
  5. import org.w3c.dom.Text;
  6. import uk.ac.cam.ch.ami.ColorList;
  7. import uk.ac.cam.ch.ami.amievents.AmiEventType;
  8. import uk.ac.cam.ch.ami.amievents.events.AmiEvent;
  9. import uk.ac.cam.ch.ami.amievents.events.CommentAmiEvent;
  10. import javax.xml.parsers.DocumentBuilder;
  11. import javax.xml.parsers.DocumentBuilderFactory;
  12. import javax.xml.transform.OutputKeys;
  13. import javax.xml.transform.Transformer;
  14. import javax.xml.transform.TransformerFactory;
  15. import javax.xml.transform.dom.DOMSource;
  16. import javax.xml.transform.stream.StreamResult;
  17. import java.awt.*;
  18. import java.io.*;
  19. import java.sql.Timestamp;
  20. import java.text.SimpleDateFormat;
  21. import java.util.HashMap;
  22. import java.util.Map;
  23. import java.util.TreeMap;
  24. /**
  25. * Generate an XML file which can be read by Timeline (http://thetimelineproj.sourceforge.net)
  26. *
  27. * Created by IntelliJ IDEA.
  28. * User: alt36
  29. * Date: Oct 12, 2010
  30. * Time: 1:54:10 PM
  31. */
  32. public class TimelineXMLWriter {
  33. public void WriteXML(File saveDir, AmiEventLog eventlog) {
  34. TreeMap<Timestamp, AmiEvent> allEvents = eventlog.getAllEventsLog();
  35. try{
  36. DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
  37. DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
  38. Document doc = docBuilder.newDocument();
  39. // Creating the XML tree
  40. // create the root element and add it to the document
  41. Element root = doc.createElement("timeline");
  42. doc.appendChild(root);
  43. // elements which are all children of the root element
  44. Element ver = doc.createElement("version");
  45. root.appendChild(ver);
  46. Text vertext = doc.createTextNode("0.10.2");
  47. ver.appendChild(vertext);
  48. Element categories = doc.createElement("categories");
  49. Element events = doc.createElement("events");
  50. Element view = doc.createElement("view");
  51. root.appendChild(categories);
  52. root.appendChild(events);
  53. root.appendChild(view);
  54. Map<AmiEventType, Color> colormap = new HashMap<AmiEventType, Color>();
  55. ColorList c = new ColorList();
  56. colormap.put(AmiEventType.PHYSICAL_EVENT, c.getPhysicalEventColor());
  57. colormap.put(AmiEventType.COMMENT_EVENT, c.getCommentEventColor());
  58. colormap.put(AmiEventType.USER_EVENT, c.getUserEventColor());
  59. colormap.put(AmiEventType.CHEMICAL_EVENT, c.getChemicalEventColor());
  60. colormap.put(AmiEventType.EQUIPMENT_EVENT, c.getEquipmentEventColor());
  61. colormap.put(AmiEventType.SENSOR_EVENT, c.getSensorEventColor());
  62. AmiEventType[] types=AmiEventType.values();
  63. // create list of categories
  64. for(AmiEventType t : types) {
  65. Element category = doc.createElement("category");
  66. categories.appendChild(category);
  67. Element name = doc.createElement("name");
  68. Element color = doc.createElement("color");
  69. category.appendChild(name);
  70. category.appendChild(color);
  71. Text text = doc.createTextNode(t.toString());
  72. name.appendChild(text);
  73. Color col = colormap.get(t);
  74. text = doc.createTextNode(col.getRed()+","+col.getGreen()+","+col.getBlue());
  75. color.appendChild(text);
  76. }
  77. // add all of the events
  78. for(AmiEvent e : allEvents.values()) {
  79. if(!e.isToBeDeleted()) {
  80. Element event = doc.createElement("event");
  81. events.appendChild(event);
  82. Element start=doc.createElement("start");
  83. Element end=doc.createElement("end");
  84. Element text=doc.createElement("text");
  85. Element category=doc.createElement("category");
  86. event.appendChild(start);
  87. event.appendChild(end);
  88. event.appendChild(text);
  89. event.appendChild(category);
  90. Text content = doc.createTextNode(e.getTimelineStart());
  91. start.appendChild(content);
  92. content = doc.createTextNode(e.getTimelineEnd());
  93. end.appendChild(content);
  94. content = doc.createTextNode(e.getTimelineText());
  95. text.appendChild(content);
  96. content = doc.createTextNode(e.getAmiEventType().toString());
  97. category.appendChild(content);
  98. if(e.getAmiEventType() == AmiEventType.COMMENT_EVENT) {
  99. Element description = doc.createElement("description");
  100. event.appendChild(description);
  101. CommentAmiEvent commentEvent = (CommentAmiEvent)e;
  102. content = doc.createTextNode(commentEvent.getComment());
  103. description.appendChild(content);
  104. }
  105. }
  106. }
  107. // set the "displayed period" to cover the range of all the events,
  108. // with an (arbitrary) half hour buffer either side
  109. Element displayedPeriod = doc.createElement("displayed_period");
  110. view.appendChild(displayedPeriod);
  111. Element start = doc.createElement("start");
  112. Element end = doc.createElement("end");
  113. displayedPeriod.appendChild(start);
  114. displayedPeriod.appendChild(end);
  115. long halfHour = 30*60*1000; // milliseconds in half an hour
  116. // the allEvents TreeMap is sorted with most recent events first, hence the earliest event is the last in
  117. // the log
  118. Timestamp earliest = new Timestamp(allEvents.lastKey().getTime()-halfHour);
  119. Timestamp latest = new Timestamp(allEvents.firstKey().getTime()+halfHour);
  120. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  121. Text content = doc.createTextNode(sdf.format(earliest));
  122. start.appendChild(content);
  123. content = doc.createTextNode(sdf.format(latest));
  124. end.appendChild(content);
  125. // hidden categories
  126. Element hiddenCategories = doc.createElement("hidden_categories");
  127. view.appendChild(hiddenCategories);
  128. for(AmiEventType t : types) {
  129. if(!eventlog.isEventTypeHidden(t)) {
  130. Element name = doc.createElement("name");
  131. hiddenCategories.appendChild(name);
  132. content = doc.createTextNode(t.toString());
  133. name.appendChild(content);
  134. }
  135. }
  136. /////////////////
  137. //Output the XML
  138. //set up a transformer
  139. TransformerFactory transfac = TransformerFactory.newInstance();
  140. Transformer trans = transfac.newTransformer();
  141. trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
  142. trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
  143. trans.setOutputProperty(OutputKeys.INDENT, "yes");
  144. // create string from xml tree
  145. StringWriter sw = new StringWriter();
  146. StreamResult result = new StreamResult(sw);
  147. DOMSource source = new DOMSource(doc);
  148. trans.transform(source, result);
  149. String xmlString = sw.toString();
  150. // write XML to file
  151. BufferedWriter out=null;
  152. try{
  153. out = new BufferedWriter(new FileWriter(saveDir.getPath() + IOUtils.DIR_SEPARATOR + "log.timeline"));
  154. out.write(xmlString);
  155. } catch (IOException e) {
  156. e.printStackTrace();
  157. } finally {
  158. out.close();
  159. }
  160. } catch (Exception e) {
  161. e.printStackTrace();
  162. }
  163. }
  164. }