/**
* $Id: mxGdCodec.java,v 1.1 2012/11/15 13:26:47 gaudenz Exp $
* Copyright (c) 2010-2012, JGraph Ltd
*/
package com.mxgraph.io;
import com.mxgraph.model.mxGraphModel;
import com.mxgraph.view.mxGraph;
import java.io.BufferedReader;
import java.io.StringReader;
import java.util.HashMap;
/**
* Parses a GD .txt file and imports it in the given graph.<br/>
* This class depends from the classes contained in
* com.mxgraph.io.gd.
*/
public class mxGdCodec {
/**
* Represents the different states in the parse of a file.
*/
public enum mxGDParseState {
START, NUM_NODES, PARSING_NODES, PARSING_EDGES
}
/**
* Map with the vertex cells added in the addNode method.
*/
protected static HashMap<String, Object> cellsMap = new HashMap<String, Object>();
/**
* Parses simple GD format and populate the specified graph
*
* @param input GD file to be parsed
* @param graph Graph where the parsed graph is included.
*/
public static void decode(String input, mxGraph graph) {
BufferedReader br = new BufferedReader(new StringReader(input));
mxGDParseState state = mxGDParseState.START;
Object parent = graph.getDefaultParent();
graph.getModel().beginUpdate();
try {
String line = br.readLine().trim();
while (line != null) {
switch (state) {
case START: {
if (!line.startsWith("#")) {
state = mxGDParseState.NUM_NODES;
}
else {
break;
}
}
case NUM_NODES: {
if (!line.startsWith("#")) {
int numVertices = Integer.valueOf(line);
for (int i = 0; i < numVertices; i++) {
String label = String.valueOf(i);
Object vertex = graph.insertVertex(parent, label, label, 0, 0, 10, 10);
cellsMap.put(label, vertex);
}
}
else {
state = mxGDParseState.PARSING_EDGES;
}
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]);
//Set the node name as label.
String label = items[0];
//Insert a new vertex in the graph
Object vertex = graph.insertVertex(parent, label, label, x - width / 2.0, y - height / 2.0, width, height);
cellsMap.put(label, vertex);
}
}
break;
}
case PARSING_EDGES: {
if (!line.equals("")) {
String[] items = line.split(" ");
if (items.length != 2) {
throw new Exception("Error in parsing");
}
else {
Object source = cellsMap.get(items[0]);
Object target = cellsMap.get(items[1]);
graph.insertEdge(parent, null, "", source, target);
}
}
break;
}
}
line = br.readLine();
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
graph.getModel().endUpdate();
}
}
/**
* Generates a GD text output with the cells in the graph.
* The implementation only uses the cells located in the default parent.
*
* @param graph Graph with the cells.
* @return The GD document generated.
*/
public static String encode(mxGraph graph) {
StringBuilder builder = new StringBuilder();
Object parent = graph.getDefaultParent();
Object[] vertices = mxGraphModel.getChildCells(graph.getModel(), parent, true, false);
builder.append("# Number of Nodes (0-" + String.valueOf(vertices.length - 1) + ")");
builder.append(String.valueOf(vertices.length));
// TODO
return builder.toString();
}
}