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 data.relax_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