Reader.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package graph.io;
  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import org.json.JSONArray;
  7. import org.json.JSONException;
  8. import org.json.JSONObject;
  9. import graph.LayeredGraphEdge;
  10. import graph.LayeredGraphNode;
  11. import graph.LayeredNode;
  12. /**
  13. * reads a {@link LayeredGraphNode} from a JSON file
  14. * @author kolja
  15. *
  16. */
  17. public class Reader {
  18. private String fileName;
  19. public Reader( String inputFileName )
  20. {
  21. fileName = inputFileName;
  22. }
  23. /**
  24. * read the JSON file and return its contents as a {@link LayeredGraphNode}
  25. * @return the read {@link LayeredGraphNode}
  26. */
  27. public LayeredGraphNode readInputGraph()
  28. {
  29. String file = "";
  30. try {
  31. BufferedReader r = new BufferedReader( new FileReader( fileName ) );
  32. String tmp = null;
  33. while( (tmp = r.readLine()) != null )
  34. file += tmp;
  35. r.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. try {
  40. JSONObject json = new JSONObject( file );
  41. return parseNode( json, null );
  42. } catch (JSONException e) {
  43. e.printStackTrace();
  44. }
  45. return null;
  46. }
  47. private LayeredGraphNode parseNode( JSONObject node, LayeredGraphNode parent ) throws JSONException
  48. {
  49. LayeredGraphNode newNode = new LayeredNode( null, null );
  50. if( parent != null )
  51. newNode = parent.createNode( null );
  52. if( node.has( "dummy" ) && node.getBoolean( "dummy" ) )
  53. {
  54. newNode.setDummyNode( true );
  55. }
  56. if( node.has( "name" ) )
  57. {
  58. if( parent != null && parent.findNodeByName( node.getString( "name" ) ) != null )
  59. throw new JSONException( "Node " + node.getString( "name" ) + " is already known" );
  60. newNode.setName( node.getString( "name" ) );
  61. }
  62. if( node.has( "width" ) )
  63. newNode.setWidth( node.getInt( "width" ), null );
  64. else
  65. newNode.setWidth( 40, null );
  66. if( node.has( "height" ) )
  67. newNode.setHeight( node.getInt( "height" ), null );
  68. else
  69. newNode.setHeight( 40, null );
  70. if( node.has( "layers" ) )
  71. {
  72. JSONArray layers = node.getJSONArray( "layers" );
  73. for( int i = 0; i < layers.length(); i++ )
  74. {
  75. for( LayeredGraphNode n : parseLayer( layers.getJSONArray( i ), newNode ) )
  76. n.setLayer( i );
  77. }
  78. }
  79. if( node.has( "edges" ) )
  80. {
  81. JSONArray edges = node.getJSONArray( "edges" );
  82. for( int i = 0; i < edges.length(); i++ )
  83. {
  84. JSONObject edge = edges.getJSONObject( i );
  85. newNode.addEdge( parseEdge( edge, newNode ) );
  86. }
  87. }
  88. return newNode;
  89. }
  90. private LayeredGraphEdge parseEdge( JSONObject edge, LayeredGraphNode parent ) throws JSONException
  91. {
  92. if( !edge.has( "source" ) || !edge.has( "target" ) )
  93. throw new JSONException( edge + " is no valid Layered Graph Edge." );
  94. if( parent.findNodeByName( edge.getString( "source" ) ) == null )
  95. throw new JSONException( edge + " is no valid Layered Graph Edge." );
  96. if( parent.findNodeByName( edge.getString( "target" ) ) == null )
  97. throw new JSONException( edge + " is no valid Layered Graph Edge." );
  98. LayeredGraphEdge newEdge = parent.createSimpleEdge( null, parent.findNodeByName( edge.getString( "source" ) ), parent.findNodeByName( edge.getString( "target" ) ) );
  99. if( parent.findNodeByName( edge.getString( "source" ) ).isDummyNode() && parent.findNodeByName( edge.getString( "target" ) ).isDummyNode() )
  100. newEdge.setDummyEdge();
  101. return newEdge;
  102. }
  103. private ArrayList<LayeredGraphNode> parseLayer( JSONArray layer, LayeredGraphNode parent ) throws JSONException
  104. {
  105. ArrayList<LayeredGraphNode> nodes = new ArrayList<>();
  106. for( int i = 0; i < layer.length(); i++ )
  107. {
  108. JSONObject node = layer.getJSONObject( i );
  109. nodes.add( parseNode( node, parent ) );
  110. }
  111. return nodes;
  112. }
  113. }