/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.filters.plugin.operator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JPanel;
import org.gephi.filters.spi.Category;
import org.gephi.filters.spi.EdgeFilter;
import org.gephi.filters.spi.Filter;
import org.gephi.filters.spi.FilterBuilder;
import org.gephi.filters.spi.FilterProperty;
import org.gephi.filters.spi.NodeFilter;
import org.gephi.filters.spi.Operator;
import org.gephi.graph.api.Edge;
import org.gephi.graph.api.Graph;
import org.gephi.graph.api.HierarchicalGraph;
import org.gephi.graph.api.Node;
import org.openide.util.NbBundle;
import org.openide.util.lookup.ServiceProvider;
/**
*
* @author Mathieu Bastian
*/
@ServiceProvider(service = FilterBuilder.class)
public class INTERSECTIONBuilder implements FilterBuilder {
public Category getCategory() {
return new Category("Operator");
}
public String getName() {
return NbBundle.getMessage(INTERSECTIONBuilder.class, "INTERSECTIONBuilder.name");
}
public Icon getIcon() {
return null;
}
public String getDescription() {
return NbBundle.getMessage(INTERSECTIONBuilder.class, "INTERSECTIONBuilder.description");
}
public Filter getFilter() {
return new IntersectionOperator();
}
public JPanel getPanel(Filter filter) {
return null;
}
public void destroy(Filter filter) {
}
public static class IntersectionOperator implements Operator {
public int getInputCount() {
return Integer.MAX_VALUE;
}
public String getName() {
return NbBundle.getMessage(INTERSECTIONBuilder.class, "INTERSECTIONBuilder.name");
}
public FilterProperty[] getProperties() {
return null;
}
public Graph filter(Graph[] graphs) {
HierarchicalGraph minHGraph = (HierarchicalGraph) graphs[0];
int minElements = Integer.MAX_VALUE;
for (int i = 0; i < graphs.length; i++) {
int count = ((HierarchicalGraph)graphs[i]).getNodeCount();
if (count < minElements) {
minHGraph = (HierarchicalGraph) graphs[i];
minElements = count;
}
}
for (Node n : minHGraph.getNodes().toArray()) {
for (int i = 0; i < graphs.length; i++) {
if ((HierarchicalGraph)graphs[i] != minHGraph) {
if (!((HierarchicalGraph)graphs[i]).contains(n)) {
minHGraph.removeNode(n);
break;
}
}
}
}
for (Edge e : minHGraph.getEdges().toArray()) {
for (int i = 0; i < graphs.length; i++) {
if ((HierarchicalGraph)graphs[i] != minHGraph) {
if (!((HierarchicalGraph)graphs[i]).contains(e)) {
minHGraph.removeEdge(e);
break;
}
}
}
}
return minHGraph;
}
public Graph filter(Graph graph, Filter[] filters) {
HierarchicalGraph hgraph = (HierarchicalGraph) graph;
List<NodeFilter> nodeFilters = new ArrayList<NodeFilter>();
List<EdgeFilter> edgeFilters = new ArrayList<EdgeFilter>();
for (Filter f : filters) {
if (f instanceof NodeFilter) {
nodeFilters.add((NodeFilter) f);
} else if (f instanceof EdgeFilter) {
edgeFilters.add((EdgeFilter) f);
}
}
if (nodeFilters.size() > 0) {
for (Iterator<NodeFilter> itr = nodeFilters.iterator(); itr.hasNext();) {
NodeFilter nf = itr.next();
if (!nf.init(hgraph)) {
itr.remove();
}
}
List<Node> nodesToRemove = new ArrayList<Node>();
for (Node n : hgraph.getNodes()) {
for (NodeFilter nf : nodeFilters) {
if (!nf.evaluate(hgraph, n)) {
nodesToRemove.add(n);
break;
}
}
}
for (Node n : nodesToRemove) {
hgraph.removeNode(n);
}
for (NodeFilter nf : nodeFilters) {
nf.finish();
}
}
if (edgeFilters.size() > 0) {
for (Iterator<EdgeFilter> itr = edgeFilters.iterator(); itr.hasNext();) {
EdgeFilter ef = itr.next();
if (!ef.init(hgraph)) {
itr.remove();
}
}
List<Edge> edgesToRemove = new ArrayList<Edge>();
for (Edge e : hgraph.getEdges()) {
for (EdgeFilter ef : edgeFilters) {
if (!ef.evaluate(hgraph, e)) {
edgesToRemove.add(e);
break;
}
}
}
for (Edge e : edgesToRemove) {
hgraph.removeEdge(e);
}
for (EdgeFilter ef : edgeFilters) {
ef.finish();
}
}
return hgraph;
}
}
}