1 package org.matsim.guice;
3 import com.google.common.base.Joiner;
4 import com.google.common.collect.ImmutableList;
5 import com.google.common.collect.Lists;
6 import com.google.common.collect.Maps;
7 import com.google.inject.Key;
8 import com.google.inject.grapher.BindingEdge;
9 import com.google.inject.grapher.DependencyEdge;
10 import com.google.inject.grapher.Edge;
11 import com.google.inject.grapher.ImplementationNode;
12 import com.google.inject.grapher.InstanceNode;
13 import com.google.inject.grapher.InterfaceNode;
14 import com.google.inject.grapher.NameFactory;
15 import com.google.inject.grapher.Node;
16 import com.google.inject.grapher.NodeId;
17 import com.google.inject.grapher.ShortNameFactory;
18 import com.google.inject.grapher.graphviz.ArrowType;
19 import com.google.inject.grapher.graphviz.CompassPoint;
20 import com.google.inject.grapher.graphviz.EdgeStyle;
21 import com.google.inject.grapher.graphviz.GraphvizEdge;
22 import com.google.inject.grapher.graphviz.GraphvizNode;
23 import com.google.inject.grapher.graphviz.NodeStyle;
24 import com.google.inject.grapher.graphviz.PortIdFactory;
25 import com.google.inject.grapher.graphviz.PortIdFactoryImpl;
26 import com.google.inject.spi.InjectionPoint;
27 import org.jgrapht.Graph;
29 import java.io.PrintWriter;
30 import java.lang.reflect.Member;
31 import java.util.List;
38 private final Map<NodeId, GraphvizNode>
nodes = Maps.newHashMap();
39 private final List<GraphvizEdge>
edges = Lists.newArrayList();
40 private final NameFactory
nameFactory =
new ShortNameFactory();
43 private PrintWriter
out;
46 public void render(Graph<Node, Edge> graph) {
47 for (Node node : graph.vertexSet()) {
48 if (node instanceof InstanceNode) {
50 }
else if (node instanceof ImplementationNode) {
52 }
else if (node instanceof InterfaceNode) {
56 for (Edge edge : graph.edgeSet()) {
57 if (edge instanceof BindingEdge) {
59 }
else if (edge instanceof DependencyEdge) {
63 out.println(
"digraph injector {");
65 Map<String, String> attrs = Maps.newHashMap();
66 attrs.put(
"rankdir", rankdir);
69 for (GraphvizNode node : nodes.values()) {
73 for (GraphvizEdge edge : edges) {
108 void setRankdir(String rankdir) {
118 out.println(node.getIdentifier() +
" " +
getAttrString(attrs));
122 Map<String, String> attrs = Maps.newHashMap();
126 attrs.put(
"margin",
"\"0.02,0\"");
127 attrs.put(
"shape", node.getShape().toString());
128 attrs.put(
"style", node.getStyle().toString());
139 String cellborder = node.getStyle() == NodeStyle.INVISIBLE ?
"1" :
"0";
141 StringBuilder html =
new StringBuilder();
143 html.append(
"<table cellspacing=\"0\" cellpadding=\"5\" cellborder=\"");
144 html.append(cellborder).append(
"\" border=\"0\">");
146 html.append(
"<tr>").append(
"<td align=\"left\" port=\"header\" ");
147 html.append(
"bgcolor=\"" + node.getHeaderBackgroundColor() +
"\">");
149 String subtitle = Joiner.on(
"<br align=\"left\"/>").join(node.getSubtitles());
150 if (subtitle.length() != 0) {
151 html.append(
"<font color=\"").append(node.getHeaderTextColor());
152 html.append(
"\" point-size=\"10\">");
153 html.append(subtitle).append(
"<br align=\"left\"/>").append(
"</font>");
156 html.append(
"<font color=\"" + node.getHeaderTextColor() +
"\">");
157 html.append(
htmlEscape(node.getTitle())).append(
"<br align=\"left\"/>");
158 html.append(
"</font>").append(
"</td>").append(
"</tr>");
160 for (Map.Entry<String, String> field : node.getFields().entrySet()) {
162 html.append(
"<td align=\"left\" port=\"").append(
htmlEscape(field.getKey())).append(
"\">");
164 html.append(
"</td>").append(
"</tr>");
167 html.append(
"</table>");
169 return html.toString();
175 String tailId =
getEdgeEndPoint(nodes.get(edge.getTailNodeId()).getIdentifier(),
176 edge.getTailPortId(), edge.getTailCompassPoint());
178 String headId =
getEdgeEndPoint(nodes.get(edge.getHeadNodeId()).getIdentifier(),
179 edge.getHeadPortId(), edge.getHeadCompassPoint());
181 out.println(tailId +
" -> " + headId +
" " +
getAttrString(attrs));
185 Map<String, String> attrs = Maps.newHashMap();
189 attrs.put(
"style", edge.getStyle().toString());
195 List<String> attrList = Lists.newArrayList();
197 for (Map.Entry<String, String> attr : attrs.entrySet()) {
198 String value = attr.getValue();
201 attrList.add(attr.getKey() +
"=" + value);
205 return "[" + Joiner.on(
", ").join(attrList) +
"]";
214 return Joiner.on(
"").join(arrows);
217 private String
getEdgeEndPoint(String nodeId, String portId, CompassPoint compassPoint) {
218 List<String> portStrings = Lists.newArrayList(nodeId);
220 if (portId != null) {
221 portStrings.add(portId);
224 if (compassPoint != null) {
225 portStrings.add(compassPoint.toString());
228 return Joiner.on(
":").join(portStrings);
232 return str.replace(
"&",
"&").replace(
"<",
"<").replace(
">",
">");
236 NodeId nodeId = node.getId();
237 GraphvizNode gnode =
new GraphvizNode(nodeId);
238 gnode.setStyle(NodeStyle.DASHED);
239 Key<?> key = nodeId.getKey();
240 gnode.setTitle(nameFactory.getClassName(key));
241 gnode.addSubtitle(0, nameFactory.getAnnotationName(key));
246 NodeId nodeId = node.getId();
247 GraphvizNode gnode =
new GraphvizNode(nodeId);
248 gnode.setStyle(NodeStyle.SOLID);
250 gnode.setHeaderBackgroundColor(
"#000000");
251 gnode.setHeaderTextColor(
"#ffffff");
252 gnode.setTitle(nameFactory.getClassName(nodeId.getKey()));
255 for (Member member : node.getMembers()) {
256 gnode.addField(portIdFactory.getPortId(member), nameFactory.getMemberName(member));
264 NodeId nodeId = node.getId();
265 GraphvizNode gnode =
new GraphvizNode(nodeId);
266 gnode.setStyle(NodeStyle.SOLID);
268 gnode.setHeaderBackgroundColor(
"#000000");
269 gnode.setHeaderTextColor(
"#ffffff");
270 gnode.setTitle(nameFactory.getClassName(nodeId.getKey()));
272 gnode.addSubtitle(0, nameFactory.getSourceName(node.getSource()));
274 gnode.setHeaderBackgroundColor(
"#aaaaaa");
275 gnode.setHeaderTextColor(
"#ffffff");
276 gnode.setTitle(nameFactory.getInstanceName(node.getInstance()));
279 for (Member member : node.getMembers()) {
280 gnode.addField(portIdFactory.getPortId(member), nameFactory.getMemberName(member));
287 GraphvizEdge gedge =
new GraphvizEdge(edge.getFromId(), edge.getToId());
288 InjectionPoint fromPoint = edge.getInjectionPoint();
289 if (fromPoint == null) {
290 gedge.setTailPortId(
"header");
292 gedge.setTailPortId(portIdFactory.getPortId(fromPoint.getMember()));
294 gedge.setArrowHead(ImmutableList.of(ArrowType.NORMAL));
295 gedge.setTailCompassPoint(CompassPoint.EAST);
301 GraphvizEdge gedge =
new GraphvizEdge(edge.getFromId(), edge.getToId());
302 gedge.setStyle(EdgeStyle.DASHED);
303 switch (edge.getType()) {
305 gedge.setArrowHead(ImmutableList.of(ArrowType.NORMAL_OPEN));
309 gedge.setArrowHead(ImmutableList.of(ArrowType.NORMAL_OPEN, ArrowType.NORMAL_OPEN));
312 case CONVERTED_CONSTANT:
313 gedge.setArrowHead(ImmutableList.of(ArrowType.NORMAL_OPEN, ArrowType.DOT_OPEN));
320 node.setIdentifier(
"x" + nodes.size());
321 nodes.put(node.getNodeId(), node);
void addNode(GraphvizNode node)
final Map< NodeId, GraphvizNode > nodes
String getAttrString(Map< String, String > attrs)
String htmlEscape(String str)
Map< String, String > getNodeAttributes(GraphvizNode node)
Map< String, String > getEdgeAttributes(GraphvizEdge edge)
String getEdgeEndPoint(String nodeId, String portId, CompassPoint compassPoint)
final PortIdFactory portIdFactory
void render(Graph< Node, Edge > graph)
void newBindingEdge(BindingEdge edge)
void newDependencyEdge(DependencyEdge edge)
void setOut(PrintWriter out)
void renderEdge(GraphvizEdge edge)
final List< GraphvizEdge > edges
void newImplementationNode(ImplementationNode node)
void renderNode(GraphvizNode node)
String getArrowString(List< ArrowType > arrows)
final NameFactory nameFactory
String getNodeLabel(GraphvizNode node)
void newInstanceNode(InstanceNode node)
void newInterfaceNode(InterfaceNode node)