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 }