001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer.gems.monitors.prefuse;
011    
012    import java.util.Collection;
013    import java.util.HashMap;
014    import java.util.Map;
015    
016    import org.picocontainer.gems.monitors.ComponentDependencyMonitor.Dependency;
017    
018    import prefuse.data.Graph;
019    import prefuse.data.Node;
020    import prefuse.data.Schema;
021    import prefuse.data.tuple.TupleSet;
022    
023    public final class PrefuseDependencyGraph implements ComponentDependencyListener {
024        private Graph graph;
025    
026        private final Map nodes;
027    
028        public PrefuseDependencyGraph() {
029            this.graph = initializeGraph();
030            this.nodes = new HashMap();
031        }
032    
033        public void addDependency(final Dependency dependency) {
034            Node componentNode = addNode(dependency.getComponentType());
035            Node dependencyNode = addNode(dependency.getDependencyType());
036            if (dependencyNode != null) {
037                graph.addEdge(componentNode, dependencyNode);
038            }
039        }
040    
041        Collection getTypes() {
042            return nodes.keySet();
043        }
044    
045        Node[] getNodes() {
046            return (Node[]) nodes.values().toArray(new Node[nodes.size()]);
047        }
048    
049        private Node addNode(final Class type) {
050            if (type != null && !nodes.containsKey(type)) {
051                Node node = graph.addNode();
052                node.set("type", type);
053                nodes.put(type, node);
054            }
055            return (Node) nodes.get(type);
056        }
057    
058        private Graph initializeGraph() {
059            return getGraph(getSchema());
060        }
061    
062        private Graph getGraph(final Schema schema) {
063            graph = new Graph(true);
064            graph.addColumns(schema);
065            return graph;
066        }
067    
068        private Schema getSchema() {
069            Schema schema = new Schema();
070            schema.addColumn("type", Class.class, null);
071            return schema;
072        }
073    
074        public TupleSet getEdges() {
075            return graph.getEdges();
076        }
077    
078        public Graph getGraph() {
079            return graph;
080        }
081    }