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
88 - def from_xml(self, super_node, file_version=1):
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 @keyword file_version: The relax XML version of the XML file.
94 @type file_version: int
95 """
96
97
98 xml_to_object(super_node, self, file_version=file_version)
99
100
102 """Method for testing if the Element container is empty.
103
104 @return: True if the Element container is empty, False otherwise.
105 @rtype: bool
106 """
107
108
109 for name in dir(self):
110
111 if name in list(Element.__dict__.keys()) or name in list(self.__class__.__dict__.keys()):
112 continue
113
114
115 if search("^__", name):
116 continue
117
118
119 return False
120
121
122 return True
123
124
125 - def to_xml(self, doc, element):
126 """Create an XML element for the container.
127
128 @param doc: The XML document object.
129 @type doc: xml.dom.minidom.Document instance
130 @param element: The element to add the data container XML element to.
131 @type element: XML element object
132 """
133
134
135 cont_element = doc.createElement(self.name)
136 element.appendChild(cont_element)
137
138
139 cont_element.setAttribute('desc', self.desc)
140
141
142 blacklist = ['name', 'desc', 'blacklist'] + list(Element.__dict__.keys() + self.__class__.__dict__.keys() + object.__dict__.keys())
143
144
145 to_xml_list = []
146 for name in dir(self):
147
148 if name in blacklist:
149 continue
150
151
152 if search('^_', name):
153 continue
154
155
156 obj = getattr(self, name)
157 if hasattr(obj, 'to_xml'):
158 to_xml_list.append(obj)
159 blacklist = blacklist + [name]
160
161
162 fill_object_contents(doc, cont_element, object=self, blacklist=blacklist)
163
164
165 for obj in to_xml_list:
166 obj.to_xml(doc, cont_element)
167
168
169
171 """An empty list type container."""
172
174 """Initialise some class variables."""
175
176
177 super(RelaxListType, self).__init__()
178
179
180 self.list_name = 'relax_list'
181 self.list_desc = 'relax list container'
182 self.element_name = 'relax_list_element'
183 self.element_desc = 'relax container'
184
185
186 self.blacklist = []
187
188
189 - def from_xml(self, super_node, file_version=1):
190 """Recreate the data structure from the XML node.
191
192 @param super_node: The XML nodes.
193 @type super_node: xml.dom.minicompat.Element instance
194 @keyword file_version: The relax XML version of the XML file.
195 @type file_version: int
196 """
197
198
199 xml_to_object(super_node, self, file_version=file_version, blacklist=self.blacklist)
200
201
202 nodes = super_node.getElementsByTagName(self.element_name)
203
204
205 for node in nodes:
206
207 self.add_item(node.getAttribute('name'))
208
209
210 xml_to_object(node, self[-1], file_version=file_version)
211
212
213 - def to_xml(self, doc, element):
214 """Create an XML element for the list data structure.
215
216 @param doc: The XML document object.
217 @type doc: xml.dom.minidom.Document instance
218 @param element: The element to add the list data structure XML element to.
219 @type element: XML element object
220 """
221
222
223 list_element = doc.createElement(self.list_name)
224 element.appendChild(list_element)
225
226
227 list_element.setAttribute('desc', self.list_desc)
228
229
230 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())
231
232
233 fill_object_contents(doc, list_element, object=self, blacklist=blacklist)
234
235
236 for i in xrange(len(self)):
237
238 if hasattr(self[i], 'to_xml'):
239 self[i].to_xml(doc, list_element)
240
241
242 else:
243
244 list_item_element = doc.createElement(self.element_name)
245 list_element.appendChild(list_item_element)
246 list_item_element.setAttribute('index', repr(i))
247 list_item_element.setAttribute('desc', self.element_desc)
248
249
250 blacklist = list(self[i].__class__.__dict__.keys())
251
252
253 for name in dir(self[i]):
254
255 if name in blacklist:
256 continue
257
258
259 if search('^_', name):
260 continue
261
262
263 obj = getattr(self[i], name)
264 if hasattr(obj, 'to_xml'):
265 obj.to_xml(doc, list_item_element)
266 blacklist = blacklist + [name]
267
268
269 fill_object_contents(doc, list_item_element, object=self[i], blacklist=blacklist)
270