View Javadoc

1   package edu.uci.ics.jung.graph;
2   
3   import java.util.ArrayList;
4   import java.util.Collection;
5   import java.util.Collections;
6   import java.util.LinkedList;
7   import java.util.List;
8   
9   import edu.uci.ics.jung.graph.event.GraphEvent;
10  import edu.uci.ics.jung.graph.event.GraphEventListener;
11  import edu.uci.ics.jung.graph.util.EdgeType;
12  
13  /**
14   * A decorator class for graphs which generates events 
15   * 
16   * @author Joshua O'Madadhain
17   */
18  @SuppressWarnings("serial")
19  public class ObservableGraph<V,E> extends GraphDecorator<V,E> {
20  
21  	List<GraphEventListener<V,E>> listenerList = 
22  		Collections.synchronizedList(new LinkedList<GraphEventListener<V,E>>());
23  
24      /**
25       * Creates a new instance based on the provided {@code delegate}.
26       */
27  	public ObservableGraph(Graph<V, E> delegate) {
28  		super(delegate);
29  	}
30  	
31  	/**
32  	 * Adds {@code l} as a listener to this graph.
33  	 */
34  	public void addGraphEventListener(GraphEventListener<V,E> l) {
35  		listenerList.add(l);
36  	}
37  
38      /**
39       * Removes {@code l} as a listener to this graph.
40       */
41  	public void removeGraphEventListener(GraphEventListener<V,E> l) {
42  		listenerList.remove(l);
43  	}
44  
45  	protected void fireGraphEvent(GraphEvent<V,E> evt) {
46  		for(GraphEventListener<V,E> listener : listenerList) {
47  			listener.handleGraphEvent(evt);
48  		 }
49  	 }
50  
51  	/**
52  	 * @see edu.uci.ics.jung.graph.Hypergraph#addEdge(java.lang.Object, java.util.Collection)
53  	 */
54  	@Override
55  	public boolean addEdge(E edge, Collection<? extends V> vertices) {
56  		boolean state = super.addEdge(edge, vertices);
57  		if(state) {
58  			GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_ADDED, edge);
59  			fireGraphEvent(evt);
60  		}
61  		return state;
62  	}
63  
64  	/**
65  	 * @see edu.uci.ics.jung.graph.Graph#addEdge(java.lang.Object, java.lang.Object, java.lang.Object, edu.uci.ics.jung.graph.util.EdgeType)
66  	 */
67  	@Override
68    public boolean addEdge(E e, V v1, V v2, EdgeType edgeType) {
69  		boolean state = super.addEdge(e, v1, v2, edgeType);
70  		if(state) {
71  			GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_ADDED, e);
72  			fireGraphEvent(evt);
73  		}
74  		return state;
75  	}
76  
77  	/**
78  	 * @see edu.uci.ics.jung.graph.Graph#addEdge(java.lang.Object, java.lang.Object, java.lang.Object)
79  	 */
80  	@Override
81    public boolean addEdge(E e, V v1, V v2) {
82  		boolean state = super.addEdge(e, v1, v2);
83  		if(state) {
84  			GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_ADDED, e);
85  			fireGraphEvent(evt);
86  		}
87  		return state;
88  	}
89  
90  	/**
91  	 * @see edu.uci.ics.jung.graph.Hypergraph#addVertex(java.lang.Object)
92  	 */
93  	@Override
94    public boolean addVertex(V vertex) {
95  		boolean state = super.addVertex(vertex);
96  		if(state) {
97  			GraphEvent<V,E> evt = new GraphEvent.Vertex<V,E>(delegate, GraphEvent.Type.VERTEX_ADDED, vertex);
98  			fireGraphEvent(evt);
99  		}
100 		return state;
101 	}
102 
103 	/**
104 	 * @see edu.uci.ics.jung.graph.Hypergraph#removeEdge(java.lang.Object)
105 	 */
106 	@Override
107   public boolean removeEdge(E edge) {
108 		boolean state = delegate.removeEdge(edge);
109 		if(state) {
110 			GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_REMOVED, edge);
111 			fireGraphEvent(evt);
112 		}
113 		return state;
114 	}
115 
116 	/**
117 	 * @see edu.uci.ics.jung.graph.Hypergraph#removeVertex(java.lang.Object)
118 	 */
119 	@Override
120 	public boolean removeVertex(V vertex) {
121 		// remove all incident edges first, so that the appropriate events will
122 		// be fired (otherwise they'll be removed inside {@code delegate.removeVertex}
123 		// and the events will not be fired)
124 		Collection<E> incident_edges = new ArrayList<E>(delegate.getIncidentEdges(vertex));
125 		for (E e : incident_edges) 
126 			this.removeEdge(e);
127 		
128 		boolean state = delegate.removeVertex(vertex);
129 		if(state) {
130 			GraphEvent<V,E> evt = new GraphEvent.Vertex<V,E>(delegate, GraphEvent.Type.VERTEX_REMOVED, vertex);
131 			fireGraphEvent(evt);
132 		}
133 		return state;
134 	}
135 
136 }