#!/usr/bin/python
#
#  File: helena-merge-reports
#
#  Merge a set of XML report files into a single report file.
#

from xml.dom.minidom import parse, parseString
import os
import sys

def mergeNode(nodeName, doSum, refDoc, docs):
    n = refDoc.getElementsByTagName(nodeName)
    if len(n) == 0:
        return
    n = n[0]
    l = refDoc.createElement("list")
    s = 0
    for doc in docs:
        val = doc.getElementsByTagName(nodeName)[0].childNodes[0].nodeValue
        item = refDoc.createElement("item")
        item.appendChild(doc.createTextNode(val))
        l.appendChild(item)
        if doSum:
            s += int(val)
    c = n.childNodes[0]
    if doSum:
        item = refDoc.createElement("sum")
        item.appendChild(doc.createTextNode(str(s)))
        l.appendChild(item)
    n.replaceChild(l, c)

def mergeReports(refDoc, docs):
    for (node, doSum) in [ ("arcs", True),
                           ("barrierTime", False),
                           ("sleepTime", False),
                           ("bfsLevels", False),
                           ("duplicateDetectionTime", False),
                           ("eventExecPerSecond", False),
                           ("eventsExecuted", False),
                           ("eventsExecutedDDD", False),
                           ("eventsExecutedExpansion", False),
                           ("host", False),
                           ("maxMemoryUsed", False),
                           ("searchResult", False),
                           ("searchTime", False),
                           ("statesAccepting", False),
                           ("stateComparisons", False),
                           ("statesProcessed", True),
                           ("statesProcessedDev", False),
                           ("statesProcessedMax", False),
                           ("statesProcessedMin", False),
                           ("statesReduced", True),
                           ("statesMaxStored", True),
                           ("statesStored", True),
                           ("statesTerminal", False),
                           ("bytesSent", True),
                           ("avgCPUUsage", False) ]:
        mergeNode(node, doSum, refDoc, docs)

def exitWithError(errMsg):
    sys.stderr.write(errMsg + "\n")
    exit(1)

if __name__ == "__main__":
    if len(sys.argv) == 1:
        print "usage: helena-merge-reports report-0.xml .. report-N.xml"
        exit(1)
    else:
        docs = list()
        for xml in sys.argv[1:]:
            try:
                docs.append(parse(xml))
            except:
                exitWithError("error: could not parse file " + xml)
        docRef = docs[0]
        mergeReports(docRef, docs)
        out = open("report.xml", "w")
        out.write(docRef.toprettyxml(indent = '  '))
        out.close()
    exit(0)
