#!/usr/bin/python

import string, sys
import xml.dom.minidom

def InsertComment(nextChildren, namesEntry, comment_text, classes, tree, topNamespace):
	classNames = namesEntry.split('%')

	# Find target class element
	classIndices = []
	i = 0
	while i < len(classes):
		if classes[i].getAttribute("name") in classNames:
			classIndices.append(i)
		i = i + 1

	if len(classNames) != len(classIndices):
		print "Error: some class elements not found."
		sys.exit(1)
		
	# Create Notepad box
	notepad = tree.createElement("children")
	notepad.setAttribute("xsi:type", "editmodel:NotepadEditModel")
	notepad.setAttribute("note", comment_text)

	# Loop: can have more than one sourceConnection if points to a group of classes
	sc = 0
	for target_index in classIndices:
		sourceConnections = tree.createElement("sourceConnections")
		sourceConnections.setAttribute("xsi:type", "editmodel:IndicationEditModel")
		sourceConnections.setAttribute("autoLocated", "true")
		sourceConnections.setAttribute("source", "//@children." + str(nextChildren))
		sourceConnections.setAttribute("target", "//@children." + str(target_index))
		sourceConnections.setAttribute("targetEnd", "//@children." + str(nextChildren) + "/@sourceConnections." + str(sc) + "/@children.1")
		sourceConnections.setAttribute("sourceEnd", "//@children." + str(nextChildren) + "/@sourceConnections." + str(sc) + "/@children.0")
		sourceConnections.setAttribute("connectionRouterKind", "Manual")
		children0 = tree.createElement("children")
		children0.setAttribute("xsi:type", "editmodel:AssociationEndEditModel")
		children1 = tree.createElement("children")
		children1.setAttribute("xsi:type", "editmodel:AssociationEndEditModel")
		children1.setAttribute("attachSource", "true")
		sourceConnections.appendChild(children0)
		sourceConnections.appendChild(children1)
		notepad.appendChild(sourceConnections)
		classes[target_index].setAttribute("targetConnections", classes[target_index].getAttribute("targetConnections") + " //@children." + str(nextChildren) + "/@sourceConnections." + str(sc))
		sc = sc + 1

	topNamespace.appendChild(notepad)


if len(sys.argv) != 4:
	print "Usage: grigio <PINOT input file> <Omondo ucd file name> <Output ucd file name>"
	sys.exit(1)

input_pinot = sys.argv[1]
input_ucd   = sys.argv[2]
output_ucd  = sys.argv[3]

# Omondo

# Prepare for the DOM parser
tree = xml.dom.minidom.parse(input_ucd)
topNamespace = tree.getElementsByTagName("editmodel:ClassDiagramEditModel")[0]

children = tree.getElementsByTagName("children")
classes = []
methods = []
fields  = []

# Get list of classes
i = 0
while i < len(children):
	if (children[i].getAttribute("xsi:type") == 'editmodel:ClassEditModel') or (children[i].getAttribute("xsi:type") == 'editmodel:InterfaceEditModel'):
		classes.append(children[i])
		print children[i].getAttribute("name")
	i = i + 1

nextChildren = len(classes)
patterns = open(input_pinot)
line = patterns.readline()
while line != '':
	tokens = line.split('#')
	if tokens[0] == 'c':
		InsertComment(nextChildren, tokens[1], tokens[2], classes, tree, topNamespace)
		nextChildren = nextChildren + 1
	line = patterns.readline()
patterns.close()

newfile = open(output_ucd, "w")
tree.writexml(newfile)
newfile.close()