#!/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:])
