001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2002-2006, GeoTools Project Managment Committee (PMC)
005: * (C) 2002, Refractions Reserach Inc.
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation;
010: * version 2.1 of the License.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: */
017: package org.geotools.graph.io.standard;
018:
019: import java.io.BufferedReader;
020: import java.io.BufferedWriter;
021: import java.io.FileReader;
022: import java.io.FileWriter;
023: import java.io.Writer;
024: import java.util.Iterator;
025: import java.util.StringTokenizer;
026:
027: import org.geotools.graph.build.GraphGenerator;
028: import org.geotools.graph.structure.Edge;
029: import org.geotools.graph.structure.Graph;
030: import org.geotools.graph.structure.Node;
031:
032: /**
033: * An implementation of GraphReaderWriter that reads/writes graphs from/to text
034: * files. Each line of the text file represents an object to be modelled by
035: * the graph.
036: * <BR>
037: * When performing a read, the text file is read line by line. As each line
038: * is read it is tokenized based on the delimiter property, and passed to the
039: * template method readInternal(StringTokenizer), which must be implemented
040: * by a subclass. The method returns the object that is to be represented in
041: * the graph. The returned object is then passed to an underlying GraphGenerator
042: * which creates the necessary graph components to modell the object.<BR>
043: * <BR>
044: * When performing a write, the graph is read component by component based
045: * on set properties. If the NODES property is set, nodes will be written. If
046: * the EDGES property is set, edges will be written as well. As each component
047: * is processed, it is passed to the repspective template methods
048: * writeNode(Writer,Node) and writeEdge(Writer,Edge). The methods then write
049: * out the text representation of the component.
050: *
051: * @author Justin Deoliveira, Refractions Research Inc, jdeolive@refractions.net
052: *
053: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/extension/graph/src/main/java/org/geotools/graph/io/standard/TextfileReaderWriter.java $
054: */
055: public abstract class TextfileReaderWriter extends AbstractReaderWriter
056: implements FileReaderWriter {
057:
058: /** line delimiter key **/
059: public static final String DELIMITER = "DELIMITER";
060:
061: /**
062: * Performs a read of the text file line by line. As each line is read the
063: * corresponding graph components represented by the line of text are
064: * created by an underlying GraphGenerator.
065: *
066: * @see GraphGenerator#read()
067: */
068: public Graph read() throws Exception {
069: //get the underlying generator
070: GraphGenerator generator = (GraphGenerator) getProperty(GENERATOR);
071:
072: //create in the file reader
073: BufferedReader in = new BufferedReader(new FileReader(
074: (String) getProperty(FILENAME)));
075:
076: //read the delimiter property
077: String delim = (String) getProperty(DELIMITER);
078: delim = delim != null ? delim : ",";
079:
080: //read file line by line passing each line to template method
081: String line;
082: while ((line = in.readLine()) != null) {
083: StringTokenizer st = new StringTokenizer(line, delim);
084: generator.add(readInternal(st));
085: }
086:
087: return (generator.getGraph());
088: }
089:
090: /**
091: * Performs a write on the graph out to a text file. If the NODES property
092: * is set, the nodes of the graph will be written, and if the EDGES property
093: * is set, the edges of the graph will be written.
094: *
095: * * @see GraphGenerator#write()
096: */
097: public void write(Graph g) throws Exception {
098: //create the file writer
099: BufferedWriter out = new BufferedWriter(new FileWriter(
100: (String) getProperty(FILENAME)));
101:
102: //check NODES property
103: if (getProperty(NODES) != null) {
104: for (Iterator itr = g.getNodes().iterator(); itr.hasNext();) {
105: writeNode(out, (Node) itr.next());
106: }
107: }
108:
109: //check EDGES property
110: if (getProperty(EDGES) != null) {
111: for (Iterator itr = g.getEdges().iterator(); itr.hasNext();) {
112: writeEdge(out, (Edge) itr.next());
113: }
114: }
115: }
116:
117: /**
118: * Template method for writing the text representation of a node to
119: * an text file.
120: *
121: * @param out The text file writer.
122: * @param n The node to write.
123: */
124: protected void writeNode(Writer out, Node n) {
125: }
126:
127: /**
128: * Template method for writing the text representation of an edge to
129: * an text file.
130: *
131: * @param out The text file writer.
132: * @param e The edge to write.
133: */
134: protected void writeEdge(Writer out, Edge e) {
135: }
136:
137: /**
138: * Template method for returning the object represented by a line in the
139: * text file being read.
140: *
141: * @param st The tokenized line read from text file.
142: *
143: * @return The object represented by the line of text.
144: */
145: protected abstract Object readInternal(StringTokenizer st);
146: }
|