001 package org.picocontainer.gems.monitors.prefuse;
002
003 import java.util.Collection;
004 import java.util.HashMap;
005 import java.util.Map;
006
007 import org.picocontainer.gems.monitors.ComponentDependencyMonitor.Dependency;
008
009 import prefuse.data.Graph;
010 import prefuse.data.Node;
011 import prefuse.data.Schema;
012 import prefuse.data.tuple.TupleSet;
013
014 public class PrefuseDependencyGraph implements ComponentDependencyListener {
015 private Graph graph;
016
017 private Map nodes;
018
019 public PrefuseDependencyGraph() {
020 this.graph = initializeGraph();
021 this.nodes = new HashMap();
022 }
023
024 public void addDependency(Dependency dependency) {
025 Node componentNode = addNode(dependency.getComponentType());
026 Node dependencyNode = addNode(dependency.getDependencyType());
027 if (dependencyNode != null) {
028 graph.addEdge(componentNode, dependencyNode);
029 }
030 }
031
032 Collection getTypes() {
033 return nodes.keySet();
034 }
035
036 Node[] getNodes() {
037 return (Node[]) nodes.values().toArray(new Node[nodes.size()]);
038 }
039
040 private Node addNode(Class type) {
041 if (type != null && !nodes.containsKey(type)) {
042 Node node = graph.addNode();
043 node.set("type", type);
044 nodes.put(type, node);
045 }
046 return (Node) nodes.get(type);
047 }
048
049 private Graph initializeGraph() {
050 return getGraph(getSchema());
051 }
052
053 private Graph getGraph(Schema schema) {
054 graph = new Graph(true);
055 graph.addColumns(schema);
056 return graph;
057 }
058
059 private Schema getSchema() {
060 Schema schema = new Schema();
061 schema.addColumn("type", Class.class, null);
062 return schema;
063 }
064
065 public TupleSet getEdges() {
066 return graph.getEdges();
067 }
068
069 public Graph getGraph() {
070 return graph;
071 }
072 }