#!/usr/bin/env python
#
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
#
# This script reads visualization data emitted by the static analyzer for
# display in Ubigraph.
#
##===----------------------------------------------------------------------===##

import xmlrpclib
import sys

def Error(message):
    print >> sys.stderr, 'ubiviz: ' + message
    sys.exit(1)

def StreamData(filename):
  file = open(filename)
  for ln in file:
    yield eval(ln)
  file.close()

def Display(G, data):
  action = data[0]
  if action == 'vertex':
    vertex = data[1]
    G.new_vertex_w_id(vertex)
    for attribute in data[2:]:
      G.set_vertex_attribute(vertex, attribute[0], attribute[1])
  elif action == 'edge':
    src = data[1]
    dst = data[2]
    edge = G.new_edge(src,dst)
    for attribute in data[3:]:
      G.set_edge_attribute(edge, attribute[0], attribute[1])
  elif action == "vertex_style":
    style_id = data[1]
    parent_id = data[2]
    G.new_vertex_style_w_id(style_id, parent_id)
    for attribute in data[3:]:
      G.set_vertex_style_attribute(style_id, attribute[0], attribute[1])
  elif action == "vertex_style_attribute":
    style_id = data[1]
    for attribute in data[2:]:
      G.set_vertex_style_attribute(style_id, attribute[0], attribute[1])
  elif action == "change_vertex_style":
     vertex_id = data[1]
     style_id = data[2]
     G.change_vertex_style(vertex_id,style_id)

def main(args):
  if len(args) == 0:
    Error('no input files')

  server = xmlrpclib.Server('http://127.0.0.1:20738/RPC2')
  G = server.ubigraph

  for arg in args:
    G.clear()
    for x in StreamData(arg):
      Display(G,x)

  sys.exit(0)


if __name__ == '__main__':
    main(sys.argv[1:])

