1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.dishevelled.graph.io.ygraphml;
25
26 import java.io.File;
27 import java.io.FileWriter;
28 import java.io.IOException;
29 import java.io.OutputStream;
30 import java.text.DecimalFormat;
31 import java.text.NumberFormat;
32 import java.util.HashMap;
33 import java.util.Map;
34
35 import javax.xml.stream.XMLOutputFactory;
36 import javax.xml.stream.XMLStreamException;
37 import javax.xml.stream.XMLStreamWriter;
38
39 import org.dishevelled.graph.Edge;
40 import org.dishevelled.graph.Graph;
41 import org.dishevelled.graph.Node;
42
43 import org.dishevelled.graph.io.GraphWriter;
44
45
46
47
48
49
50
51 public final class YGraphMLWriter
52 implements GraphWriter<ShapeNode, PolyLineEdge>
53 {
54
55 private final XMLOutputFactory outputFactory;
56
57
58
59
60
61 public YGraphMLWriter()
62 {
63 outputFactory = XMLOutputFactory.newInstance();
64 }
65
66
67
68 public void write(final Graph<ShapeNode, PolyLineEdge> graph, final File file)
69 throws IOException
70 {
71 if (graph == null)
72 {
73 throw new IllegalArgumentException("graph must not be null");
74 }
75 if (file == null)
76 {
77 throw new IllegalArgumentException("file must not be null");
78 }
79 try
80 {
81 XMLStreamWriter writer = outputFactory.createXMLStreamWriter(new FileWriter(file));
82 write(graph, writer);
83 }
84 catch (XMLStreamException e)
85 {
86
87 throw new IOException(e.getMessage());
88 }
89 }
90
91
92 public void write(final Graph<ShapeNode, PolyLineEdge> graph, final OutputStream outputStream)
93 throws IOException
94 {
95 if (graph == null)
96 {
97 throw new IllegalArgumentException("graph must not be null");
98 }
99 if (outputStream == null)
100 {
101 throw new IllegalArgumentException("outputStream must not be null");
102 }
103 try
104 {
105 XMLStreamWriter writer = outputFactory.createXMLStreamWriter(outputStream);
106 write(graph, writer);
107 }
108 catch (XMLStreamException e)
109 {
110
111 throw new IOException(e.getMessage());
112 }
113 }
114
115
116
117
118
119
120
121
122
123 private void write(final Graph<ShapeNode, PolyLineEdge> graph, final XMLStreamWriter writer)
124 throws IOException, XMLStreamException
125 {
126 writer.writeStartDocument("1.0");
127
128 writer.writeStartElement("graphml");
129 writer.writeDefaultNamespace("http://graphml.graphdrawing.org/xmlns");
130 writer.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
131 writer.writeNamespace("y", "http://www.yworks.com/xml/graphml");
132 writer.writeAttribute("xsi:schemaLocation", "http://graphml.graphdrawing.org/xmlns/graphml http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd");
133
134 writer.writeStartElement("key");
135 writer.writeAttribute("id", "k0");
136 writer.writeAttribute("for", "node");
137 writer.writeAttribute("yfiles.type", "nodegraphics");
138 writer.writeEndElement();
139
140 writer.writeStartElement("key");
141 writer.writeAttribute("id", "k1");
142 writer.writeAttribute("for", "edge");
143 writer.writeAttribute("yfiles.type", "edgegraphics");
144 writer.writeEndElement();
145
146 writer.writeStartElement("graph");
147 writer.writeAttribute("id", "G");
148 writer.writeAttribute("edgedefault", "directed");
149 NumberFormat numberFormat = NumberFormat.getInstance();
150 if (numberFormat instanceof DecimalFormat)
151 {
152 ((DecimalFormat) numberFormat).setMinimumFractionDigits(1);
153 }
154 int n = 0;
155 Map<Node<ShapeNode, PolyLineEdge>, String> nodeIds = new HashMap<Node<ShapeNode, PolyLineEdge>, String>(graph.nodeCount());
156 for (Node<ShapeNode, PolyLineEdge> node : graph.nodes())
157 {
158 String nodeId = nodeIds.get(node);
159 if (nodeId == null)
160 {
161 nodeId = "n" + n;
162 n++;
163 nodeIds.put(node, nodeId);
164 }
165 writer.writeStartElement("node");
166 writer.writeAttribute("id", nodeId);
167 writer.writeStartElement("data");
168 writer.writeAttribute("key", "k0");
169
170 ShapeNode shapeNode = node.getValue();
171 writer.writeStartElement("http://www.yworks.com/xml/graphml", "ShapeNode");
172
173 Fill fill = shapeNode.getFill();
174 writer.writeStartElement("http://www.yworks.com/xml/graphml", "Fill");
175 writer.writeAttribute("color", fill.getColor());
176 writer.writeAttribute("transparent", fill.isTransparent() ? "true" : "false");
177 writer.writeEndElement();
178
179 BorderStyle borderStyle = shapeNode.getBorderStyle();
180 writer.writeStartElement("http://www.yworks.com/xml/graphml", "BorderStyle");
181 writer.writeAttribute("type", borderStyle.getType());
182 writer.writeAttribute("width", numberFormat.format(borderStyle.getWidth()));
183 writer.writeAttribute("color", borderStyle.getColor());
184 writer.writeEndElement();
185
186 NodeLabel nodeLabel = shapeNode.getNodeLabel();
187 writer.writeStartElement("http://www.yworks.com/xml/graphml", "NodeLabel");
188 writer.writeAttribute("visible", nodeLabel.isVisible() ? "true" : "false");
189 writer.writeAttribute("alignment", nodeLabel.getAlignment());
190 writer.writeAttribute("fontFamily", nodeLabel.getFontFamily());
191 writer.writeAttribute("fontSize", String.valueOf(nodeLabel.getFontSize()));
192 writer.writeAttribute("fontStyle", nodeLabel.getFontStyle());
193 writer.writeAttribute("textColor", nodeLabel.getTextColor());
194 writer.writeAttribute("modelName", nodeLabel.getModelName());
195 writer.writeAttribute("modelPosition", nodeLabel.getModelPosition());
196 writer.writeAttribute("autoSizePolicy", nodeLabel.getAutoSizePolicy());
197 writer.writeCharacters(nodeLabel.getText());
198 writer.writeEndElement();
199
200 Shape shape = shapeNode.getShape();
201 writer.writeStartElement("http://www.yworks.com/xml/graphml", "Shape");
202 writer.writeAttribute("type", shape.getType());
203 writer.writeEndElement();
204
205 writer.writeEndElement();
206 writer.writeEndElement();
207 writer.writeEndElement();
208 }
209 int e = 0;
210 for (Edge<ShapeNode, PolyLineEdge> edge : graph.edges())
211 {
212 String edgeId = "e" + e;
213 e++;
214 writer.writeStartElement("edge");
215 writer.writeAttribute("id", edgeId);
216 writer.writeAttribute("source", nodeIds.get(edge.source()));
217 writer.writeAttribute("target", nodeIds.get(edge.target()));
218 writer.writeStartElement("data");
219 writer.writeAttribute("key", "k1");
220
221 PolyLineEdge polyLineEdge = edge.getValue();
222 writer.writeStartElement("http://www.yworks.com/xml/graphml", "PolyLineEdge");
223
224 LineStyle lineStyle = polyLineEdge.getLineStyle();
225 writer.writeStartElement("http://www.yworks.com/xml/graphml", "LineStyle");
226 writer.writeAttribute("type", lineStyle.getType());
227 writer.writeAttribute("width", numberFormat.format(lineStyle.getWidth()));
228 writer.writeAttribute("color", lineStyle.getColor());
229 writer.writeEndElement();
230
231 Arrows arrows = polyLineEdge.getArrows();
232 writer.writeStartElement("http://www.yworks.com/xml/graphml", "Arrows");
233 writer.writeAttribute("source", arrows.getSource());
234 writer.writeAttribute("target", arrows.getTarget());
235 writer.writeEndElement();
236
237 EdgeLabel edgeLabel = polyLineEdge.getEdgeLabel();
238 writer.writeStartElement("http://www.yworks.com/xml/graphml", "EdgeLabel");
239 writer.writeAttribute("visible", edgeLabel.isVisible() ? "true" : "false");
240 writer.writeAttribute("alignment", edgeLabel.getAlignment());
241 writer.writeAttribute("fontFamily", edgeLabel.getFontFamily());
242 writer.writeAttribute("fontSize", String.valueOf(edgeLabel.getFontSize()));
243 writer.writeAttribute("fontStyle", edgeLabel.getFontStyle());
244 writer.writeAttribute("textColor", edgeLabel.getTextColor());
245 writer.writeAttribute("modelName", edgeLabel.getModelName());
246 writer.writeAttribute("modelPosition", edgeLabel.getModelPosition());
247 writer.writeAttribute("preferredPlacement", edgeLabel.getPreferredPlacement());
248 writer.writeAttribute("distance", numberFormat.format(edgeLabel.getDistance()));
249 writer.writeAttribute("ratio", numberFormat.format(edgeLabel.getRatio()));
250 writer.writeCharacters(edgeLabel.getText());
251 writer.writeEndElement();
252
253 BendStyle bendStyle = polyLineEdge.getBendStyle();
254 writer.writeStartElement("http://www.yworks.com/xml/graphml", "BendStyle");
255 writer.writeAttribute("smoothed", bendStyle.isSmoothed() ? "true" : "false");
256 writer.writeEndElement();
257
258 writer.writeEndElement();
259
260 writer.writeEndElement();
261 writer.writeEndElement();
262 }
263 writer.writeEndElement();
264 writer.writeEndElement();
265 writer.close();
266 }
267 }