/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. */ package org.geotools.graph.structure.basic; import java.io.IOException; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.geotools.graph.structure.Edge; import org.geotools.graph.structure.Node; /** * Basic implementation of Node. * * @author Justin Deoliveira, Refractions Research Inc, jdeolive@refractions.net * * * @source $URL$ */ public class BasicNode extends BasicGraphable implements Node { /** List of edges incident with the node. */ transient private ArrayList m_edges; /** * Constructs a BasicNode. * */ public BasicNode() { super(); m_edges = new ArrayList(); } /** * Adds an edge to the adjacency list of the node which is an underlying List * implementation. No checking is done on the edge (duplication, looping...), * it is simply added to the list. * * @see Node#add(Edge) */ public void add(Edge e) { m_edges.add(e); } /** * @see Node#remove(Edge) */ public void remove(Edge e) { m_edges.remove(e); } /** * @see Node#getDegree() */ public int getDegree() { //since edges that loop on a node add 2 to the degree // of the node, the degree is not simply the size of the edge // list int degree = 0; for (int i = 0; i < m_edges.size(); i++) { Edge e = (Edge)m_edges.get(i); if (e.getNodeA().equals(this)) degree++; if (e.getNodeB().equals(this)) degree++; } return(degree); } /** * @see Node#getEdge(Node) */ public Edge getEdge(Node other) { //must explictley check that the edge has node other, and one node this, // just checking other is not good enough because of loops for (int i = 0; i < m_edges.size(); i++) { Edge e = (Edge)m_edges.get(i); if ( (e.getNodeA().equals(this) && e.getNodeB().equals(other)) || (e.getNodeA().equals(other) && e.getNodeB().equals(this)) ) return(e); } return(null); } /** * @see Node#getEdges(Node) */ public List getEdges(Node other) { //must explictley check that the edge has node other, and one node this, // just checking other is not good enough because of loops ArrayList edges = new ArrayList(); for (int i = 0; i < m_edges.size(); i++) { Edge e = (Edge)m_edges.get(i); if ( (e.getNodeA().equals(this) && e.getNodeB().equals(other)) || (e.getNodeA().equals(other) && e.getNodeB().equals(this)) ) edges.add(e); } return(edges); } /** * @see Node#getEdges() */ public List getEdges() { return(m_edges); } /** * Returns all nodes that are incident with adjacent edges minus itself. This * iterator is generated by calculating an underlying collection upon each * method call. * * @see org.geotools.graph.structure.Graphable#getRelated() */ public Iterator getRelated() { ArrayList related = new ArrayList(m_edges.size()); for (int i = 0; i < m_edges.size(); i++) { Edge e = (Edge)m_edges.get(i); related.add(e.getOtherNode(this)); } return(related.iterator()); } /** * Overides the default deserialization operation. The edge adjacency list * of a BasicNode is not written out when the node is serialized so it must * be recreated upon deserialization. * * @param in Object input stream containing serialized object. * * @throws IOException * @throws ClassNotFoundException */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); //recreate edge adjacency list m_edges = new ArrayList(); } }