1
2
3
4
5 from ..backend.XMLStorage import XMLStorage
6
7 from Ft.Xml import Parse
8 from Ft.Xml.XPath.Context import Context
9 from Ft.Xml.XPath import Evaluate
10
11 import marshal
12 import sys
13
14
16
17
18 ___STORAGE = 'data/db.model'
19
20
21
22
23 - def parse(self, aFilename):
24 """Parse the given XMI to the storage"""
25
26 ucr = UMLClassReader()
27 classDefs = ucr.parse(aFilename)
28
29
30
31
32 ouf = open(self.___STORAGE, 'wb')
33 marshal.dump(classDefs, ouf)
34 ouf.close()
35
37 """Extract class definitions from a XMI file"""
38
39
40
41
42 ___NAMESPACE = u'org.omg.xmi.namespace.UML'
43
46
48 """Extract the list of classes"""
49 doc = Parse(name)
50
51 NSS = {u'Uml': self.___NAMESPACE}
52 ctx = Context(doc, processorNss=NSS)
53 defList = []
54 classNameDict = {}
55 umlDefs = Evaluate(u'//Uml:Class', ctx)
56
57
58 for e in umlDefs:
59
60 if (None, u'name') in e.attributes:
61 n = e.attributes[(None, u'name')].value
62 i = e.attributes[(None, u'xmi.id')].value
63 classNameDict[i] = n
64 ctx2 = Context(None, processorNss=NSS)
65 xp = u"//Uml:Class[@xmi.id='" + i + "']/*/Uml:Attribute"
66 attrDefs = Evaluate(xp, e, ctx2)
67 attrList = []
68 for a in attrDefs:
69 attrList.append(a.attributes[(None, u'name')].value)
70 defList.append({'name': n, 'xmi_id': i, 'attrs': attrList})
71 deps = Evaluate(u'//Uml:Dependency', ctx)
72 depList = []
73 for dep in deps:
74
75
76
77
78 if not dep.childNodes == []:
79 ctx2 = Context(dep, processorNss=NSS)
80 i = dep.attributes[(None, 'xmi.id')].value
81 con_name = dep.attributes[(None, 'name')].value
82 xp = u"//Uml:Dependency[@xmi.id='" + i + "']/Uml:Dependency.client"
83 client_node = Evaluate(xp, ctx2)
84
85
86 client = client_node[0].childNodes[1].attributes[(None, u'xmi.idref')].value
87 client = classNameDict[client]
88
89 xp = u"//Uml:Dependency[@xmi.id='" + i + "']/Uml:Dependency.supplier"
90 supplier_node = Evaluate(xp, ctx2)[0].childNodes[1]
91 supplier = supplier_node.attributes[(None, u'xmi.idref')].value
92
93 supplier = classNameDict[supplier]
94
95
96
97 depList.append([client, supplier, con_name])
98
99
100 return {'classDefs': defList, 'dependencyDefs': depList}
101