123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- package graph.io;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.ArrayList;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
- import graph.LayeredGraphEdge;
- import graph.LayeredGraphNode;
- import graph.LayeredNode;
- /**
- * reads a {@link LayeredGraphNode} from a JSON file
- * @author kolja
- *
- */
- public class Reader {
- private String fileName;
-
- public Reader( String inputFileName )
- {
- fileName = inputFileName;
- }
-
- /**
- * read the JSON file and return its contents as a {@link LayeredGraphNode}
- * @return the read {@link LayeredGraphNode}
- */
- public LayeredGraphNode readInputGraph()
- {
- String file = "";
- try {
- BufferedReader r = new BufferedReader( new FileReader( fileName ) );
- String tmp = null;
- while( (tmp = r.readLine()) != null )
- file += tmp;
- r.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- try {
- JSONObject json = new JSONObject( file );
- return parseNode( json, null );
- } catch (JSONException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- private LayeredGraphNode parseNode( JSONObject node, LayeredGraphNode parent ) throws JSONException
- {
- LayeredGraphNode newNode = new LayeredNode( null, null );
- if( parent != null )
- newNode = parent.createNode( null );
- if( node.has( "dummy" ) && node.getBoolean( "dummy" ) )
- {
- newNode.setDummyNode( true );
- }
- if( node.has( "name" ) )
- {
- if( parent != null && parent.findNodeByName( node.getString( "name" ) ) != null )
- throw new JSONException( "Node " + node.getString( "name" ) + " is already known" );
- newNode.setName( node.getString( "name" ) );
- }
- if( node.has( "width" ) )
- newNode.setWidth( node.getInt( "width" ), null );
- else
- newNode.setWidth( 40, null );
- if( node.has( "height" ) )
- newNode.setHeight( node.getInt( "height" ), null );
- else
- newNode.setHeight( 40, null );
- if( node.has( "layers" ) )
- {
- JSONArray layers = node.getJSONArray( "layers" );
- for( int i = 0; i < layers.length(); i++ )
- {
- for( LayeredGraphNode n : parseLayer( layers.getJSONArray( i ), newNode ) )
- n.setLayer( i );
- }
- }
- if( node.has( "edges" ) )
- {
- JSONArray edges = node.getJSONArray( "edges" );
- for( int i = 0; i < edges.length(); i++ )
- {
- JSONObject edge = edges.getJSONObject( i );
- newNode.addEdge( parseEdge( edge, newNode ) );
- }
- }
- return newNode;
- }
-
- private LayeredGraphEdge parseEdge( JSONObject edge, LayeredGraphNode parent ) throws JSONException
- {
- if( !edge.has( "source" ) || !edge.has( "target" ) )
- throw new JSONException( edge + " is no valid Layered Graph Edge." );
- if( parent.findNodeByName( edge.getString( "source" ) ) == null )
- throw new JSONException( edge + " is no valid Layered Graph Edge." );
- if( parent.findNodeByName( edge.getString( "target" ) ) == null )
- throw new JSONException( edge + " is no valid Layered Graph Edge." );
- LayeredGraphEdge newEdge = parent.createSimpleEdge( null, parent.findNodeByName( edge.getString( "source" ) ), parent.findNodeByName( edge.getString( "target" ) ) );
- if( parent.findNodeByName( edge.getString( "source" ) ).isDummyNode() && parent.findNodeByName( edge.getString( "target" ) ).isDummyNode() )
- newEdge.setDummyEdge();
- return newEdge;
- }
-
- private ArrayList<LayeredGraphNode> parseLayer( JSONArray layer, LayeredGraphNode parent ) throws JSONException
- {
- ArrayList<LayeredGraphNode> nodes = new ArrayList<>();
- for( int i = 0; i < layer.length(); i++ )
- {
- JSONObject node = layer.getJSONObject( i );
- nodes.add( parseNode( node, parent ) );
- }
- return nodes;
- }
- }
|