/**
* $Id: mxGdDocument.java,v 1.2 2011-01-31 12:13:34 david Exp $
* Copyright (c) 2010, Gaudenz Alder, David Benson
*/
package com.mxgraph.io.gd;
import com.mxgraph.util.mxPoint;
import java.io.BufferedReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
/**
* This class is a representation of a GD file.<br/>
* Allows access to the nodes and edges of the graph.
*/
public class mxGdDocument
{
/**
* Represents the different states in the parse of a file.
*/
public enum mxGDParseState
{
START, PARSING_NODES, PARSING_EDGES
}
private List<mxGdNode> nodes = new ArrayList<mxGdNode>();
private List<mxGdEdge> edges = new ArrayList<mxGdEdge>();
/**
* @return Returns the list of edges.
*/
public List<mxGdEdge> getEdges()
{
return edges;
}
/**
* @return Returns the list of nodes.
*/
public List<mxGdNode> getNodes()
{
return nodes;
}
public void setEdges(List<mxGdEdge> edges)
{
this.edges = edges;
}
public void setNodes(List<mxGdNode> nodes)
{
this.nodes = nodes;
}
/**
* Parses the String with the file content and loads into the document,
* the data of nodes and edges.
* @param gd String with the file content.
*/
public void parse(String gd)
{
gd = gd.trim();
BufferedReader br = new BufferedReader(new StringReader(gd));
mxGDParseState state = mxGDParseState.START;
try
{
String line = br.readLine();
while (line != null)
{
switch (state)
{
case START:
{
if (line.startsWith("# Nodes"))
{
state = mxGDParseState.PARSING_NODES;
}
else
{
throw new Exception("Error in parsing");
}
break;
}
case PARSING_NODES:
{
if (line.startsWith("# Edges"))
{
state = mxGDParseState.PARSING_EDGES;
}
else if (!line.equals(""))
{
String[] items = line.split(",");
if (items.length != 5)
{
throw new Exception("Error in parsing");
}
else
{
double x = Double.valueOf(items[1]);
double y = Double.valueOf(items[2]);
double width = Double.valueOf(items[3]);
double height = Double.valueOf(items[4]);
mxGdNode node = new mxGdNode(items[0],
new mxPoint(x, y), new mxPoint(width,
height));
nodes.add(node);
}
}
break;
}
case PARSING_EDGES:
{
if (!line.equals(""))
{
String[] items = line.split(",");
if (items.length != 2)
{
throw new Exception("Error in parsing");
}
else
{
String source = items[0];
String target = items[1];
mxGdEdge edge = new mxGdEdge(source, target);
edges.add(edge);
}
}
break;
}
}
line = br.readLine();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* @return Returns the String representation of the document.
*/
public String getDocumentString()
{
StringBuilder buf = new StringBuilder("# Nodes\n");
for (mxGdNode node : nodes)
{
buf.append(node.getNodeString());
buf.append("\n");
}
buf.append("# Edges\n");
for (mxGdEdge edge : edges)
{
buf.append(edge.getEdgeString());
buf.append("\n");
}
return buf.toString();
}
}