1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 """Basic objects used to build the relax data store."""
24
25
26 from re import search
27 from numpy import ndarray
28
29
30 from lib.xml import fill_object_contents, xml_to_object
31
32
34 """Empty data container."""
35
36 - def __init__(self, name='element', desc='container object'):
37 """Initialise some class variables.
38
39 @keyword name: The name of the object.
40 @type name: str
41 @keyword desc: The description of the object.
42 @type desc: str
43 """
44
45
46 super(Element, self).__init__()
47
48
49 self.name = name
50 self.desc = desc
51
52
53 self.blacklist = []
54
55
57
58 text = "%-25s%-100s\n\n" % ("Data structure", "Value")
59
60
61 for name in dir(self):
62
63 if name in list(Element.__dict__.keys()) or name in list(self.__class__.__dict__.keys()):
64 continue
65
66
67 if search("^_", name):
68 continue
69
70
71 obj = getattr(self, name)
72
73
74 if isinstance(obj, ndarray) and isinstance(obj[0], ndarray):
75 spacer = '\n'
76 else:
77 spacer = ''
78
79
80 text = text + "%-25s%s%-100s\n" % (name, spacer, repr(obj))
81
82
83 return text
84
85
86 - def from_xml(self, super_node, file_version=1):
87 """Recreate the element data structure from the XML element node.
88
89 @param super_node: The element XML node.
90 @type super_node: xml.dom.minicompat.Element instance
91 @keyword file_version: The relax XML version of the XML file.
92 @type file_version: int
93 """
94
95
96 xml_to_object(super_node, self, file_version=file_version)
97
98
100 """Method for testing if the Element container is empty.
101
102 @return: True if the Element container is empty, False otherwise.
103 @rtype: bool
104 """
105
106
107 for name in dir(self):
108
109 if name in list(Element.__dict__.keys()) or name in list(self.__class__.__dict__.keys()):
110 continue
111
112
113 if search("^__", name):
114 continue
115
116
117 return False
118
119
120 return True
121
122
123 - def to_xml(self, doc, element):
124 """Create an XML element for the container.
125
126 @param doc: The XML document object.
127 @type doc: xml.dom.minidom.Document instance
128 @param element: The element to add the data container XML element to.
129 @type element: XML element object
130 """
131
132
133 cont_element = doc.createElement(self.name)
134 element.appendChild(cont_element)
135
136
137 cont_element.setAttribute('desc', self.desc)
138
139
140 blacklist = ['name', 'desc', 'blacklist'] + list(list(Element.__dict__.keys()) + list(self.__class__.__dict__.keys()) + list(object.__dict__.keys()))
141
142
143 to_xml_list = []
144 for name in dir(self):
145
146 if name in blacklist:
147 continue
148
149
150 if search('^_', name):
151 continue
152
153
154 obj = getattr(self, name)
155 if hasattr(obj, 'to_xml'):
156 to_xml_list.append(obj)
157 blacklist = blacklist + [name]
158
159
160 fill_object_contents(doc, cont_element, object=self, blacklist=blacklist)
161
162
163 for obj in to_xml_list:
164 obj.to_xml(doc, cont_element)
165
166
167
169 """An empty list type container."""
170
172 """Initialise some class variables."""
173
174
175 super(RelaxListType, self).__init__()
176
177
178 self.list_name = 'relax_list'
179 self.list_desc = 'relax list container'
180 self.element_name = 'relax_list_element'
181 self.element_desc = 'relax container'
182
183
184 self.blacklist = []
185
186
187 - def from_xml(self, super_node, file_version=1):
188 """Recreate the data structure from the XML node.
189
190 @param super_node: The XML nodes.
191 @type super_node: xml.dom.minicompat.Element instance
192 @keyword file_version: The relax XML version of the XML file.
193 @type file_version: int
194 """
195
196
197 xml_to_object(super_node, self, file_version=file_version, blacklist=self.blacklist)
198
199
200 nodes = super_node.getElementsByTagName(self.element_name)
201
202
203 for node in nodes:
204
205 self.add_item(node.getAttribute('name'))
206
207
208 xml_to_object(node, self[-1], file_version=file_version)
209
210
211 - def to_xml(self, doc, element):
212 """Create an XML element for the list data structure.
213
214 @param doc: The XML document object.
215 @type doc: xml.dom.minidom.Document instance
216 @param element: The element to add the list data structure XML element to.
217 @type element: XML element object
218 """
219
220
221 list_element = doc.createElement(self.list_name)
222 element.appendChild(list_element)
223
224
225 list_element.setAttribute('desc', self.list_desc)
226
227
228 blacklist = ['list_name', 'list_desc', 'element_name', 'element_desc', 'blacklist'] + list(list(self.__dict__.keys()) + list(RelaxListType.__dict__.keys()) + list(self.__class__.__dict__.keys()) + list(list.__dict__.keys()) + list(list.__dict__.keys()))
229
230
231 fill_object_contents(doc, list_element, object=self, blacklist=blacklist)
232
233
234 for i in range(len(self)):
235
236 if hasattr(self[i], 'to_xml'):
237 self[i].to_xml(doc, list_element)
238
239
240 else:
241
242 list_item_element = doc.createElement(self.element_name)
243 list_element.appendChild(list_item_element)
244 list_item_element.setAttribute('index', repr(i))
245 list_item_element.setAttribute('desc', self.element_desc)
246
247
248 blacklist = list(self[i].__class__.__dict__.keys())
249
250
251 for name in dir(self[i]):
252
253 if name in blacklist:
254 continue
255
256
257 if search('^_', name):
258 continue
259
260
261 obj = getattr(self[i], name)
262 if hasattr(obj, 'to_xml'):
263 obj.to_xml(doc, list_item_element)
264 blacklist = blacklist + [name]
265
266
267 fill_object_contents(doc, list_item_element, object=self[i], blacklist=blacklist)
268