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    }