View Javadoc

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          // todo need to clean this up to use some kind of factory pattern
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              // todo this will be impacted in the refactored described above
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  }