/*
* 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 org.apache.commons.collections15.Predicate;
import edu.uci.ics.jung.graph.Graph;
/**
* Transforms the input graph into one which contains only those edges 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). All
* vertices from the original graph are copied into the new graph (even if they
* are not incident to any edges in the new graph).
*
* @author Joshua O'Madadhain
*/
public class EdgePredicateFilter<V, E> implements Filter<V, E> {
protected Predicate<E> edge_pred;
/**
* Creates an instance based on the specified edge <code>Predicate</code>.
*
* @param edge_pred
* the predicate that specifies which edges to add to the
* filtered graph
*/
public EdgePredicateFilter(Predicate<E> edge_pred) {
this.edge_pred = edge_pred;
}
@Override
public Graph<V, E> transform(Graph<V, E> g) {
Graph<V, E> filtered;
try {
filtered = g.newInstance();
} catch (Exception e) {
throw new RuntimeException(
"Unable to create copy of existing graph: ", e);
}
for (V v : g.getVertices()) {
filtered.addVertex(v);
}
for (E e : g.getEdges()) {
if (edge_pred.evaluate(e)) {
filtered.addEdge(e, g.getIncidentVertices(e));
}
}
return filtered;
}
}