--- /dev/null
+/*
+ * Created on May 19, 2008
+ *
+ * Copyright (c) 2008, the JUNG Project and the Regents of the University
+ * of California
+ * All rights reserved.
+ *
+ * This software is open-source under the BSD license; see either
+ * "license.txt" or
+ * http://jung.sourceforge.net/license.txt for a description.
+ */
+package edu.uci.ics.jung.algorithms.filters;
+
+import java.util.Collection;
+
+import org.apache.commons.collections15.Predicate;
+
+import edu.uci.ics.jung.graph.Graph;
+
+/**
+ * Transforms the input graph into one which contains only those vertices
+ * that pass the specified <code>Predicate</code>. The filtered graph
+ * is a copy of the original graph (same type, uses the same vertex and
+ * edge objects). Only those edges whose entire incident vertex collection
+ * passes the predicate are copied into the new graph.
+ *
+ * @author Joshua O'Madadhain
+ */
+public class VertexPredicateFilter<V,E> implements Filter<V,E>
+{
+ protected Predicate<V> vertex_pred;
+
+ /**
+ * Creates an instance based on the specified vertex <code>Predicate</code>.
+ * @param vertex_pred the predicate that specifies which vertices to add to the filtered graph
+ */
+ public VertexPredicateFilter(Predicate<V> vertex_pred)
+ {
+ this.vertex_pred = vertex_pred;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Graph<V,E> transform(Graph<V,E> g)
+ {
+ Graph<V, E> filtered;
+ try
+ {
+ filtered = g.getClass().newInstance();
+ }
+ catch (InstantiationException e)
+ {
+ throw new RuntimeException("Unable to create copy of existing graph: ", e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException("Unable to create copy of existing graph: ", e);
+ }
+
+ for (V v : g.getVertices())
+ if (vertex_pred.evaluate(v))
+ filtered.addVertex(v);
+
+ Collection<V> filtered_vertices = filtered.getVertices();
+
+ for (E e : g.getEdges())
+ {
+ Collection<V> incident = g.getIncidentVertices(e);
+ if (filtered_vertices.containsAll(incident))
+ filtered.addEdge(e, incident);
+ }
+
+ return filtered;
+ }
+
+}