changeset 22332:fdc687bad5d4

GraphPrintVisitor: factor out implementation
author Andreas Woess <andreas.woess@oracle.com>
date Wed, 28 Oct 2015 14:04:33 +0100
parents 920c3ec54499
children 1801b7f11c64
files truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java
diffstat 1 files changed, 134 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java	Wed Oct 28 14:00:16 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java	Wed Oct 28 14:04:33 2015 +0100
@@ -59,13 +59,12 @@
 
     public static final String GraphVisualizerAddress = "127.0.0.1";
     public static final int GraphVisualizerPort = 4444;
-    private static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance();
 
     private Map<Object, NodeElement> nodeMap;
     private List<EdgeElement> edgeList;
     private Map<Object, NodeElement> prevNodeMap;
     private int id;
-    private XMLStreamWriter xmlstream;
+    private Impl xmlstream;
     private OutputStream outputStream;
     private int openGroupCount;
     private int openGraphCount;
@@ -120,66 +119,140 @@
         }
     }
 
+    private static class Impl {
+        private static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance();
+        private final XMLStreamWriter xmlstream;
+
+        protected Impl(OutputStream outputStream) {
+            try {
+                this.xmlstream = XML_OUTPUT_FACTORY.createXMLStreamWriter(outputStream);
+            } catch (XMLStreamException | FactoryConfigurationError e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void writeStartDocument() {
+            try {
+                xmlstream.writeStartDocument();
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void writeEndDocument() {
+            try {
+                xmlstream.writeEndDocument();
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void writeStartElement(String name) {
+            try {
+                xmlstream.writeStartElement(name);
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void writeEndElement() {
+            try {
+                xmlstream.writeEndElement();
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void writeAttribute(String name, String value) {
+            try {
+                xmlstream.writeAttribute(name, value);
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void writeCharacters(String text) {
+            try {
+                xmlstream.writeCharacters(text);
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void flush() {
+            try {
+                xmlstream.flush();
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void close() {
+            try {
+                xmlstream.close();
+            } catch (XMLStreamException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
     public GraphPrintVisitor() {
         this(new ByteArrayOutputStream());
     }
 
     public GraphPrintVisitor(OutputStream outputStream) {
         this.outputStream = outputStream;
-        try {
-            this.xmlstream = XML_OUTPUT_FACTORY.createXMLStreamWriter(outputStream);
-            this.xmlstream.writeStartDocument();
-            this.xmlstream.writeStartElement("graphDocument");
-        } catch (XMLStreamException | FactoryConfigurationError e) {
-            throw new RuntimeException(e);
+        this.xmlstream = new Impl(outputStream);
+        this.xmlstream.writeStartDocument();
+        this.xmlstream.writeStartElement("graphDocument");
+    }
+
+    private void ensureOpen() {
+        if (xmlstream == null) {
+            throw new IllegalStateException("printer is closed");
         }
     }
 
     public GraphPrintVisitor beginGroup(String groupName) {
+        ensureOpen();
         maybeEndGraph();
         openGroupCount++;
-        try {
-            xmlstream.writeStartElement("group");
-            xmlstream.writeStartElement("properties");
-
-            if (!groupName.isEmpty()) {
-                // set group name
-                xmlstream.writeStartElement("p");
-                xmlstream.writeAttribute("name", "name");
-                xmlstream.writeCharacters(groupName);
-                xmlstream.writeEndElement();
-            }
+        xmlstream.writeStartElement("group");
+        xmlstream.writeStartElement("properties");
 
-            xmlstream.writeEndElement(); // properties
+        if (!groupName.isEmpty()) {
+            // set group name
+            xmlstream.writeStartElement("p");
+            xmlstream.writeAttribute("name", "name");
+            xmlstream.writeCharacters(groupName);
+            xmlstream.writeEndElement();
+        }
 
-            // forget old nodes
-            prevNodeMap = null;
-            nodeMap = new IdentityHashMap<>();
-            edgeList = new ArrayList<>();
+        xmlstream.writeEndElement(); // properties
 
-            return this;
-        } catch (XMLStreamException e) {
-            throw new RuntimeException(e);
-        }
+        // forget old nodes
+        prevNodeMap = null;
+        nodeMap = new IdentityHashMap<>();
+        edgeList = new ArrayList<>();
+
+        return this;
     }
 
     public GraphPrintVisitor endGroup() {
+        ensureOpen();
         if (openGroupCount <= 0) {
             throw new IllegalArgumentException("no open group");
         }
         maybeEndGraph();
         openGroupCount--;
 
-        try {
-            xmlstream.writeEndElement(); // group
-        } catch (XMLStreamException e) {
-            throw new RuntimeException(e);
-        }
+        xmlstream.writeEndElement(); // group
 
         return this;
     }
 
     public GraphPrintVisitor beginGraph(String graphName) {
+        ensureOpen();
         if (openGroupCount == 0) {
             beginGroup(graphName);
         }
@@ -204,43 +277,40 @@
     }
 
     public GraphPrintVisitor endGraph() {
+        ensureOpen();
         if (openGraphCount <= 0) {
             throw new IllegalArgumentException("no open graph");
         }
         openGraphCount--;
 
-        try {
-            xmlstream.writeStartElement("graph");
+        xmlstream.writeStartElement("graph");
 
-            xmlstream.writeStartElement("properties");
+        xmlstream.writeStartElement("properties");
 
-            // set graph name
-            xmlstream.writeStartElement("p");
-            xmlstream.writeAttribute("name", "name");
-            xmlstream.writeCharacters(currentGraphName);
-            xmlstream.writeEndElement();
+        // set graph name
+        xmlstream.writeStartElement("p");
+        xmlstream.writeAttribute("name", "name");
+        xmlstream.writeCharacters(currentGraphName);
+        xmlstream.writeEndElement();
 
-            xmlstream.writeEndElement(); // properties
+        xmlstream.writeEndElement(); // properties
 
-            xmlstream.writeStartElement("nodes");
-            writeNodes();
-            xmlstream.writeEndElement(); // nodes
+        xmlstream.writeStartElement("nodes");
+        writeNodes();
+        xmlstream.writeEndElement(); // nodes
 
-            xmlstream.writeStartElement("edges");
-            writeEdges();
-            xmlstream.writeEndElement(); // edges
+        xmlstream.writeStartElement("edges");
+        writeEdges();
+        xmlstream.writeEndElement(); // edges
 
-            xmlstream.writeEndElement(); // graph
+        xmlstream.writeEndElement(); // graph
 
-            xmlstream.flush();
-        } catch (XMLStreamException e) {
-            throw new RuntimeException(e);
-        }
+        xmlstream.flush();
 
         return this;
     }
 
-    private void writeNodes() throws XMLStreamException {
+    private void writeNodes() {
         for (NodeElement node : nodeMap.values()) {
             xmlstream.writeStartElement("node");
             xmlstream.writeAttribute("id", String.valueOf(node.getId()));
@@ -258,7 +328,7 @@
         }
     }
 
-    private void writeEdges() throws XMLStreamException {
+    private void writeEdges() {
         for (EdgeElement edge : edgeList) {
             xmlstream.writeStartElement("edge");
 
@@ -315,18 +385,16 @@
         if (xmlstream == null) {
             return;
         }
-        try {
-            while (openGroupCount > 0) {
-                endGroup();
-            }
+        while (openGroupCount > 0) {
+            endGroup();
+        }
+        assert openGraphCount == 0 && openGroupCount == 0;
 
-            xmlstream.writeEndElement(); // graphDocument
-            xmlstream.writeEndDocument();
-            xmlstream.flush();
-            xmlstream = null;
-        } catch (XMLStreamException e) {
-            throw new RuntimeException(e);
-        }
+        xmlstream.writeEndElement(); // graphDocument
+        xmlstream.writeEndDocument();
+        xmlstream.flush();
+        xmlstream.close();
+        xmlstream = null;
     }
 
     private int nextId() {