1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 """Basic objects used to build the relax data store."""
25
26
27 from re import search
28 from numpy import ndarray
29 from types import ListType
30
31
32 from relax_xml import fill_object_contents, xml_to_object
33
34
36 """Empty data container."""
37
38 - def __init__(self, name='element', desc='container object'):
39 """Initialise some class variables.
40
41 @keyword name: The name of the object.
42 @type name: str
43 @keyword desc: The description of the object.
44 @type desc: str
45 """
46
47
48 super(Element, self).__init__()
49
50
51 self.name = name
52 self.desc = desc
53
54
55 self.blacklist = []
56
57
59
60 text = "%-25s%-100s\n\n" % ("Data structure", "Value")
61
62
63 for name in dir(self):
64
65 if name in list(Element.__dict__.keys()) or name in list(self.__class__.__dict__.keys()):
66 continue
67
68
69 if search("^_", name):
70 continue
71
72
73 obj = getattr(self, name)
74
75
76 if isinstance(obj, ndarray) and isinstance(obj[0], ndarray):
77 spacer = '\n'
78 else:
79 spacer = ''
80
81
82 text = text + "%-25s%s%-100s\n" % (name, spacer, repr(obj))
83
84
85 return text
86
87
89 """Recreate the element data structure from the XML element node.
90
91 @param super_node: The element XML node.
92 @type super_node: xml.dom.minicompat.Element instance
93 """
94
95
96 xml_to_object(super_node, self)
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(Element.__dict__.keys() + self.__class__.__dict__.keys() + 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
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 """
193
194
195 xml_to_object(super_node, self, blacklist=self.blacklist)
196
197
198 nodes = super_node.getElementsByTagName(self.element_name)
199
200
201 for node in nodes:
202
203 self.add_item(node.getAttribute('name'))
204
205
206 xml_to_object(node, self[-1])
207
208
209 - def to_xml(self, doc, element):
210 """Create an XML element for the list data structure.
211
212 @param doc: The XML document object.
213 @type doc: xml.dom.minidom.Document instance
214 @param element: The element to add the list data structure XML element to.
215 @type element: XML element object
216 """
217
218
219 list_element = doc.createElement(self.list_name)
220 element.appendChild(list_element)
221
222
223 list_element.setAttribute('desc', self.list_desc)
224
225
226 blacklist = ['list_name', 'list_desc', 'element_name', 'element_desc', 'blacklist'] + list(self.__dict__.keys() + RelaxListType.__dict__.keys() + self.__class__.__dict__.keys() + list.__dict__.keys() + ListType.__dict__.keys())
227
228
229 fill_object_contents(doc, list_element, object=self, blacklist=blacklist)
230
231
232 for i in xrange(len(self)):
233
234 if hasattr(self[i], 'to_xml'):
235 self[i].to_xml(doc, list_element)
236
237
238 else:
239
240 list_item_element = doc.createElement(self.element_name)
241 list_element.appendChild(list_item_element)
242 list_item_element.setAttribute('index', repr(i))
243 list_item_element.setAttribute('desc', self.element_desc)
244
245
246 blacklist = list(self[i].__class__.__dict__.keys())
247
248
249 for name in dir(self[i]):
250
251 if name in blacklist:
252 continue
253
254
255 if search('^_', name):
256 continue
257
258
259 obj = getattr(self[i], name)
260 if hasattr(obj, 'to_xml'):
261 obj.to_xml(doc, list_item_element)
262 blacklist = blacklist + [name]
263
264
265 fill_object_contents(doc, list_item_element, object=self[i], blacklist=blacklist)
266