4543b424dcabb845bb8f9eb3a7b805e5a42b1d6b
[controller.git] / third-party / net.sf.jung2 / src / main / java / edu / uci / ics / jung / algorithms / filters / VertexPredicateFilter.java
1 /*
2  * Created on May 19, 2008
3  *
4  * Copyright (c) 2008, the JUNG Project and the Regents of the University 
5  * of California
6  * All rights reserved.
7  *
8  * This software is open-source under the BSD license; see either
9  * "license.txt" or
10  * http://jung.sourceforge.net/license.txt for a description.
11  */
12 package edu.uci.ics.jung.algorithms.filters;
13
14 import java.util.Collection;
15
16 import org.apache.commons.collections15.Predicate;
17
18 import edu.uci.ics.jung.graph.Graph;
19
20 /**
21  * Transforms the input graph into one which contains only those vertices 
22  * that pass the specified <code>Predicate</code>.  The filtered graph
23  * is a copy of the original graph (same type, uses the same vertex and
24  * edge objects).  Only those edges whose entire incident vertex collection
25  * passes the predicate are copied into the new graph.
26  * 
27  * @author Joshua O'Madadhain
28  */
29 public class VertexPredicateFilter<V,E> implements Filter<V,E>
30 {
31     protected Predicate<V> vertex_pred;
32
33     /**
34      * Creates an instance based on the specified vertex <code>Predicate</code>.
35      * @param vertex_pred   the predicate that specifies which vertices to add to the filtered graph
36      */
37     public VertexPredicateFilter(Predicate<V> vertex_pred)
38     {
39         this.vertex_pred = vertex_pred;
40     }
41     
42     @SuppressWarnings("unchecked")
43         public Graph<V,E> transform(Graph<V,E> g)
44     {
45         Graph<V, E> filtered;
46         try
47         {
48             filtered = g.getClass().newInstance();
49         }
50         catch (InstantiationException e)
51         {
52             throw new RuntimeException("Unable to create copy of existing graph: ", e);
53         }
54         catch (IllegalAccessException e)
55         {
56             throw new RuntimeException("Unable to create copy of existing graph: ", e);
57         }
58
59         for (V v : g.getVertices())
60             if (vertex_pred.evaluate(v))
61                 filtered.addVertex(v);
62         
63         Collection<V> filtered_vertices = filtered.getVertices();
64         
65         for (E e : g.getEdges())
66         {
67             Collection<V> incident = g.getIncidentVertices(e);
68             if (filtered_vertices.containsAll(incident))
69                 filtered.addEdge(e, incident);
70         }
71         
72         return filtered;
73     }
74
75 }