001    package org.expasy.jpl.commons.collection.graph;
002    
003    
004    import edu.uci.ics.jung.graph.Graph;
005    import edu.uci.ics.jung.graph.util.Pair;
006    
007    
008    /**
009     * This object clones graphs.
010     * 
011     * @author nikitin
012     * 
013     * @version 1.0
014     * 
015     */
016    public final class GraphCloner<V, E> {
017            
018            private GraphCloner() {}
019            
020            public static <V, E> GraphCloner<V, E> newInstance() {
021                    return new GraphCloner<V, E>();
022            }
023            
024            /**
025             * @return a copy of the given undirected sparse graph.
026             */
027            @SuppressWarnings("unchecked")
028            public Graph<V, E> clone(Graph<V, E> graph) {
029                    
030                    Graph<V, E> clone;
031                    try {
032                            clone = graph.getClass().newInstance();
033                    } catch (InstantiationException e) {
034                            throw new RuntimeException(
035                                "Unable to create copy of existing graph: ", e);
036                    } catch (IllegalAccessException e) {
037                            throw new RuntimeException(
038                                "Unable to create copy of existing graph: ", e);
039                    }
040                    
041                    for (V vertex : graph.getVertices()) {
042                            clone.addVertex(vertex);
043                    }
044                    
045                    for (E edge : graph.getEdges()) {
046                            Pair<V> pair = graph.getEndpoints(edge);
047                            clone.addEdge(edge, pair.getFirst(), pair.getSecond());
048                    }
049                    
050                    return clone;
051            }
052    }