[graphl-cvs] graphl/src/org/mediavirus/graphl/graph/filter TestFilter.java GraphFilter.java Filtered
Status: Pre-Alpha
Brought to you by:
flo1
From: Flo L. <fl...@us...> - 2005-08-17 15:53:00
|
Update of /cvsroot/graphl/graphl/src/org/mediavirus/graphl/graph/filter In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16461/src/org/mediavirus/graphl/graph/filter Added Files: TestFilter.java GraphFilter.java FilteredGraph.java Log Message: - FEATURE: added navigator thread for update-exhibition, disabled in normal operation - FEATURE: started implementation of filtering architecture - FEATURE: creating new node opens type context menu - CODE: added NS calss for easier namespace referencing in code --- NEW FILE: GraphFilter.java --- /* * Created on 11.08.2005 */ package org.mediavirus.graphl.graph.filter; import org.mediavirus.graphl.graph.Edge; import org.mediavirus.graphl.graph.Graph; import org.mediavirus.graphl.graph.Node; /** * @author flo */ public interface GraphFilter { public boolean acceptNode(Node node, Graph graph); public boolean acceptEdge(Edge edge, Graph graph); } --- NEW FILE: FilteredGraph.java --- /* * Created on 11.08.2005 */ package org.mediavirus.graphl.graph.filter; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.mediavirus.graphl.graph.AbstractGraph; import org.mediavirus.graphl.graph.Edge; import org.mediavirus.graphl.graph.Graph; import org.mediavirus.graphl.graph.GraphListener; import org.mediavirus.graphl.graph.Node; /** * @author flo */ public class FilteredGraph extends AbstractGraph implements GraphListener{ List cachedNodes = new ArrayList(); List cachedEdges = new ArrayList(); List filters = new LinkedList(); Graph sourceGraph; public FilteredGraph() { } public FilteredGraph(Graph graph) { setSource(graph); } public void addFilter(GraphFilter filter) { filters.add(filter); } public void removeFilter(GraphFilter filter) { filters.remove(filter); } public void setSource(Graph graph){ sourceGraph = graph; graph.addGraphListener(this); graphContentsChanged(graph); } public Graph getSource(){ return sourceGraph; } /** * @see org.mediavirus.graphl.graph.GraphListener#graphLayoutUpdated(org.mediavirus.graphl.graph.Graph) */ public void graphLayoutUpdated(Graph graph) { notifyLayoutUpdated(); } /** * @see org.mediavirus.graphl.graph.GraphListener#graphUpdated(org.mediavirus.graphl.graph.Graph) */ public void graphUpdated(Graph graph) { notifyUpdated(); } /** * @see org.mediavirus.graphl.graph.GraphListener#graphContentsChanged(org.mediavirus.graphl.graph.Graph) */ public void graphContentsChanged(Graph graph) { cachedEdges.clear(); cachedNodes.clear(); Collection filteredEdges = filterEdges(graph.getEdges()); if (filteredEdges != null) cachedEdges.addAll(filteredEdges); Collection filteredNodes = filterNodes(graph.getNodes()); if (filteredNodes != null) cachedNodes.addAll(filteredNodes); fireGraphContentsChanged(); } /** * @see org.mediavirus.graphl.graph.GraphListener#elementsAdded(org.mediavirus.graphl.graph.Graph, java.util.Collection, java.util.Collection) */ public void elementsAdded(Graph graph, Collection nodes, Collection edges) { Collection filteredEdges = filterEdges(edges); if (filteredEdges != null) cachedEdges.addAll(filteredEdges); Collection filteredNodes = filterNodes(nodes); if (filteredNodes != null) cachedNodes.addAll(filteredNodes); fireElementsAdded(filteredNodes, filteredEdges); } /** * @param edges */ private Collection filterEdges(Collection edges) { if (edges != null) { List filteredEdges = new ArrayList(); for (Iterator edgesI = edges.iterator(); edgesI.hasNext();) { Edge edge = (Edge) edgesI.next(); if (filterEdge(edge, sourceGraph)) filteredEdges.add(edge); } if (!filteredEdges.isEmpty()) { return filteredEdges; } } return null; } /** * @param nodes */ private Collection filterNodes(Collection nodes) { if (nodes != null) { List filteredNodes = new ArrayList(); for (Iterator nodesI = nodes.iterator(); nodesI.hasNext();) { Node node = (Node) nodesI.next(); if (filterNode(node, sourceGraph)) filteredNodes.add(node); } if (!filteredNodes.isEmpty()) { return filteredNodes; } } return null; } public boolean filterNode(Node node, Graph graph) { for (Iterator edgesI = cachedEdges.iterator(); edgesI.hasNext();) { Edge edge = (Edge) edgesI.next(); if ((edge.getFrom() == node) || (edge.getTo() == node)) { return true; } } for (Iterator filtersI = filters.iterator(); filtersI.hasNext();) { GraphFilter filter = (GraphFilter) filtersI.next(); if (!filter.acceptNode(node, graph)) { return false; } } return true; } public boolean filterEdge(Edge edge, Graph graph) { for (Iterator filtersI = filters.iterator(); filtersI.hasNext();) { GraphFilter filter = (GraphFilter) filtersI.next(); if (!filter.acceptEdge(edge, graph)) return false; } return true; } /** * @see org.mediavirus.graphl.graph.GraphListener#elementsRemoved(org.mediavirus.graphl.graph.Graph, java.util.Collection, java.util.Collection) */ public void elementsRemoved(Graph graph, Collection nodes, Collection edges) { List removedNodes = new ArrayList(); List removedEdges = new ArrayList(); for (Iterator nodesI = nodes.iterator(); nodesI.hasNext();) { Node node = (Node) nodesI.next(); if (cachedNodes.contains(node)) { cachedNodes.remove(node); removedNodes.add(node); } } for (Iterator edgesI = edges.iterator(); edgesI.hasNext();) { Edge edge = (Edge) edgesI.next(); if (cachedEdges.contains(edge)) { cachedEdges.remove(edge); removedEdges.add(edge); } } fireElementsRemoved(removedNodes, removedEdges); } /** * @see org.mediavirus.graphl.graph.Graph#getNodes() */ public List getNodes() { return cachedNodes; } /** * @see org.mediavirus.graphl.graph.Graph#getEdges() */ public List getEdges() { return cachedEdges; } /** * @see org.mediavirus.graphl.graph.Graph#createNode() */ public Node createNode() { return sourceGraph.createNode(); } /** * @see org.mediavirus.graphl.graph.Graph#getNodeOrNew(java.lang.String) */ public Node getNodeOrNew(String id) { return sourceGraph.getNodeOrNew(id); } /** * @see org.mediavirus.graphl.graph.Graph#createEdge(org.mediavirus.graphl.graph.Node, org.mediavirus.graphl.graph.Node) */ public Edge createEdge(Node from, Node to) { return sourceGraph.createEdge(from, to); } } --- NEW FILE: TestFilter.java --- /* * Created on 16.08.2005 */ package org.mediavirus.graphl.graph.filter; import org.mediavirus.graphl.graph.Edge; import org.mediavirus.graphl.graph.Graph; import org.mediavirus.graphl.graph.Node; import org.mediavirus.graphl.vocabulary.NS; /** * @author flo */ public class TestFilter implements GraphFilter { /** * @see org.mediavirus.graphl.graph.filter.GraphFilter#acceptNode(org.mediavirus.graphl.graph.Node, org.mediavirus.graphl.graph.Graph) */ public boolean acceptNode(Node node, Graph graph) { return (node.getNeighbours(NS.graphl + "definedIn", true).isEmpty()); } /** * @see org.mediavirus.graphl.graph.filter.GraphFilter#acceptEdge(org.mediavirus.graphl.graph.Edge, org.mediavirus.graphl.graph.Graph) */ public boolean acceptEdge(Edge edge, Graph graph) { return (edge.getSource() == null); } } |