1 package net.sf.quarrel.dot;
2
3 import net.sf.quarrel.uml.Element;
4 import net.sf.quarrel.uml.Model;
5 import net.sf.quarrel.uml.Relationship;
6 import net.sf.quarrel.uml.UmlClass;
7 import net.sf.quarrel.uml.UmlInterface;
8
9 import java.io.ByteArrayOutputStream;
10 import java.io.PrintWriter;
11 import java.util.Iterator;
12
13 /***
14 * An implementation of DotRenderer
15 */
16 public class ModelRenderer implements DotRenderer {
17
18 /***
19 * Creates an instance of DotRenderer for handling UML model objects.
20 */
21 public ModelRenderer() {
22 }
23
24 /***
25 * {@inheritDoc}
26 */
27 public String getDotString(Object subject) {
28
29 Model model = (Model) subject;
30
31 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
32 final PrintWriter writer = new PrintWriter(baos);
33 writer.println("digraph {");
34 writer.println("rankdir=BT;");
35 writer.println("node [shape=record];");
36
37 final Iterator elements = model.elements();
38
39
40 final DotRenderer classRenderer = new ClassRenderer();
41 final DotRenderer interfaceRenderer = new InterfaceRenderer();
42 final DotRenderer stubRenderer = new StubElementRenderer();
43
44 final RelationshipRenderer relationshipRenderer = new RelationshipRenderer();
45
46 while (elements.hasNext()) {
47 final Object obj = elements.next();
48
49
50
51 if (obj instanceof UmlInterface) {
52 UmlInterface umlinterface = (UmlInterface) obj;
53 writer.println(interfaceRenderer.getDotString(umlinterface));
54 } else if (obj instanceof UmlClass) {
55 UmlClass umlClass = (UmlClass) obj;
56 writer.println(classRenderer.getDotString(umlClass));
57 } else if (obj instanceof Element) {
58 writer.println(stubRenderer.getDotString(obj));
59 } else {
60 throw new IllegalStateException("Unsupported element [" + obj.getClass() + "]");
61 }
62
63 }
64
65 writer.println();
66
67 final Iterator relationships = model.relationships();
68 while (relationships.hasNext()) {
69 Relationship relationship = (Relationship) relationships.next();
70 writer.println(relationshipRenderer.getDotString(relationship));
71 }
72
73 writer.println("}");
74 writer.flush();
75
76 final byte[] bytes = baos.toByteArray();
77
78 return new String(bytes).trim();
79
80 }
81
82 }