/*
* 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.build.basic;
import java.util.HashMap;
import org.geotools.graph.build.GraphBuilder;
import org.geotools.graph.build.GraphGenerator;
import org.geotools.graph.structure.Edge;
import org.geotools.graph.structure.Graph;
import org.geotools.graph.structure.Graphable;
import org.geotools.graph.structure.Node;
/**
* An implementation of GraphGenerator. Graphs are generated as follows:<BR>
* <UL>
* <LI>Objects added to the generator are 2 element object arrays.</LI>
* <LI>The elements of the array represent the objects modelled by the nodes.
* <LI>The object array itself is the object modelled by the edges.
* <LI>As each object array is added to the generator:
* <UL>
* <LI>A node lookup table is queried using the elements of the object array.
* <LI>If a node lookup returns null, a new node is created for its respective
* object.
* <LI>A new edge is created incident to the two looked up nodes.
* <LI>The underlying object of the edge is set to the be object array.
* </UL>
* </UL>
*
* @author Justin Deoliveira, Refractions Research Inc, jdeolive@refractions.net
*
* @source $URL$
*/
public class BasicGraphGenerator implements GraphGenerator {
/** The underlying builder **/
private GraphBuilder m_builder;
/** object to node lookup table **/
private HashMap m_obj2graphable;
/**
* Constructs a new generator.
*/
public BasicGraphGenerator() {
m_obj2graphable = new HashMap();
setGraphBuilder(new BasicGraphBuilder());
}
/**
* @see GraphGenerator#add(Object)
*/
public Graphable add(Object obj) {
Object[] objs = (Object[])obj;
Node n1, n2;
//look up first node and create if necessary
if ((n1 = (Node)m_obj2graphable.get(objs[0])) == null) {
n1 = getGraphBuilder().buildNode();
n1.setObject(objs[0]);
getGraphBuilder().addNode(n1);
m_obj2graphable.put(objs[0], n1);
}
//look up second node and create if necessary
if ((n2 = (Node)m_obj2graphable.get(objs[1])) == null) {
n2 = getGraphBuilder().buildNode();
n2.setObject(objs[1]);
getGraphBuilder().addNode(n2);
m_obj2graphable.put(objs[1], n2);
}
//create edge and set underlying object
Edge e = getGraphBuilder().buildEdge(n1,n2);
e.setObject(obj);
getGraphBuilder().addEdge(e);
return(e);
}
/**
* @see GraphGenerator#get(Object)
*/
public Graphable get(Object obj) {
Object[] objs = (Object[])obj;
Node n1 = (Node)m_obj2graphable.get(objs[0]);
Node n2 = (Node)m_obj2graphable.get(objs[1]);
return(n1.getEdge(n2));
}
/**
* @see GraphGenerator#remove(Object)
*/
public Graphable remove(Object obj) {
Object[] objs = (Object[])obj;
Node n1 = (Node)m_obj2graphable.get(objs[0]);
Node n2 = (Node)m_obj2graphable.get(objs[1]);
Edge e = n1.getEdge(n2);
getGraphBuilder().removeEdge(e);
return(e);
}
/**
* @see GraphGenerator#setGraphBuilder(GraphBuilder)
*/
public void setGraphBuilder(GraphBuilder builder) {
m_builder = builder;
}
/**
* @see GraphGenerator#getGraphBuilder()
*/
public GraphBuilder getGraphBuilder() {
return(m_builder);
}
/**
* @see GraphGenerator#getGraph()
*/
public Graph getGraph() {
return(m_builder.getGraph());
}
}