1
2
3
4
5
6
7
8 -def to_file(j,f=None,ignore_subs=''):
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
35
36
37
38
39 import xml.sax.saxutils
40
41
43 return xml.sax.saxutils.escape(s)
44
47
48 from Ganga.GPIDev.Lib.GangaList.GangaList import makeGangaListByRef
49
50
51 from Ganga.Utility.Config import config_scope
52
53
54
55 -def fastXML(obj,indent='',ignore_subs=''):
56 if hasattr(obj,"__iter__") and not hasattr(obj,"iteritems"):
57 sl = ["\n",indent,"<sequence>","\n"]
58 for so in obj:
59 sl.append(indent)
60 sl.extend(fastXML(so,indent+' ',ignore_subs))
61 sl.append(indent)
62 sl.append("</sequence>")
63 return sl
64 elif hasattr(obj,'_data'):
65 v = obj._schema.version
66 sl = ['\n',indent,'<class name="%s" version="%i.%i" category="%s">\n' % (obj._name, v.major, v.minor, obj._category)]
67 for k,o in obj._data.iteritems():
68 if k != ignore_subs:
69 try:
70 if not obj._schema[k]._meta["transient"]:
71 sl.append(indent)
72 sl.append('<attribute name="%s">' % k)
73 sl.extend(fastXML(o,indent+' ',ignore_subs))
74 sl.append('</attribute>\n')
75 except KeyError:
76 pass
77 sl.append(indent)
78 sl.append('</class>')
79 return sl
80 else:
81 return ["<value>",escape(repr(obj)),"</value>"]
82
83
84
85
87
88
89
90
91 - def __init__(self,out=None,selection=''):
92 self.level = 0
93 self.selection = selection
94 if out:
95 self.out = out
96 else:
97 import sys
98 self.out = sys.stdout
99
101 print >> self.out,'<root>'
102
104 print >> self.out,'</root>'
105
107 return ' '*(self.level-1)*3
108
113
115 print >> self.out,self.indent(),'</class>'
116 self.level -= 1
117 return
118
120
121 print >> self.out,'<value>%s</value>' % escape(repr(x))
122
125
127 if self.showAttribute( node, name ):
128 self.level+=1
129 print >> self.out, self.indent(),
130 print >> self.out, '<attribute name="%s">'%name,
131 if sequence:
132 self.level+=1
133 print >> self.out
134 print >> self.out, self.indent(),'<sequence>'
135 for v in value:
136 self.level+=1
137 print >> self.out, self.indent(),
138 self.print_value(v)
139 print >> self.out
140 self.level-=1
141 print >> self.out, self.indent(), '</sequence>'
142 self.level-=1
143 print >> self.out, self.indent(), '</attribute>'
144 else:
145 self.level+=1
146 self.print_value(value)
147 self.level-=1
148 print >> self.out,'</attribute>'
149 self.level-=1
150
152 self.level+=1
153 if s is None:
154 print >> self.out,self.indent(), '<value>None</value>'
155 else:
156 s.accept(self)
157 self.level-=1
158
160 if self.showAttribute( node, name ):
161 self.level+=1
162 print >> self.out, self.indent(), '<attribute name="%s">'%name
163 if sequence:
164 self.level+=1
165 print >> self.out, self.indent(), '<sequence>'
166 for s in subnode:
167 self.acceptOptional(s)
168 print >> self.out,self.indent(), '</sequence>'
169 self.level-=1
170 else:
171 self.acceptOptional(subnode)
172 print >> self.out,self.indent(), '</attribute>'
173 self.level-=1
174
175
176
177
178
179
180
181
182 from Ganga.GPIDev.Base.Objects import GangaObject
183 from Ganga.Utility.Plugin import PluginManagerError, allPlugins
184 from Ganga.GPIDev.Schema import Schema, Version
185
186 from Ganga.Utility.logging import getLogger
187 logger = getLogger()
188
189
190 from GangaRepository import EmptyGangaObject, SchemaVersionError
191
193 """ Job object tree loader.
194 """
195
197 self.stack = None
198 self.ignore_count = 0
199 self.errors = []
200 self.value_construct = None
201 self.sequence_start = []
202
204 """ Parse and load object from string s using internal XML parser (expat).
205 """
206 import xml.parsers.expat
207
208
209 def start_element(name, attrs):
210
211
212 if self.ignore_count:
213 self.ignore_count += 1
214 return
215
216
217 if name == 'root':
218 assert self.stack is None,"duplicated <root> element"
219 self.stack = []
220 return
221
222 assert not self.stack is None,"missing <root> element"
223
224
225 if name == 'class':
226 try:
227 cls = allPlugins.find(attrs['category'],attrs['name'])
228 except PluginManagerError,e:
229 self.errors.append(e)
230
231 obj = EmptyGangaObject()
232 self.ignore_count = 1
233 else:
234 version = Version(*[int(v) for v in attrs['version'].split('.')])
235 if not cls._schema.version.isCompatible(version):
236 attrs['currversion'] = '%s.%s'%(cls._schema.version.major,cls._schema.version.minor)
237 self.errors.append(SchemaVersionError('Incompatible schema of %(name)s, repository is %(version)s currently in use is %(currversion)s'%attrs))
238 obj = EmptyGangaObject()
239 self.ignore_count = 1
240 else:
241
242 obj = super(cls, cls).__new__(cls)
243 obj._data = {}
244 self.stack.append(obj)
245
246
247 if name == 'attribute':
248 self.stack.append(attrs['name'])
249
250
251 if name == 'value':
252 self.value_construct = ''
253
254
255 if name == 'sequence':
256 self.sequence_start.append(len(self.stack))
257
258 def end_element(name):
259
260
261
262 if self.ignore_count:
263 self.ignore_count -= 1
264 return
265
266
267 if name == 'attribute':
268 value = self.stack.pop()
269 aname = self.stack.pop()
270 obj = self.stack[-1]
271
272 obj._data[aname] = value
273
274
275 if name == 'value':
276
277 s = unescape(self.value_construct)
278
279 val = eval(s,config_scope)
280
281 self.stack.append(val)
282 self.value_construct = None
283
284
285
286 if name == 'sequence':
287 pos = self.sequence_start.pop()
288 alist = makeGangaListByRef(self.stack[pos:])
289 del self.stack[pos:]
290 self.stack.append(alist)
291
292
293
294
295 if name == 'class':
296 obj = self.stack[-1]
297 for attr, item in obj._schema.allItems():
298 if not attr in obj._data:
299 if item._meta["sequence"] == 1:
300 obj._data[attr] = makeGangaListByRef(obj._schema.getDefaultValue(attr))
301 else:
302 obj._data[attr] = obj._schema.getDefaultValue(attr)
303
304 obj.__setstate__(obj.__dict__)
305
306 def char_data(data):
307
308
309 if self.value_construct is not None:
310
311
312 self.value_construct += data
313
314
315 p = xml.parsers.expat.ParserCreate()
316
317 p.StartElementHandler = start_element
318 p.EndElementHandler = end_element
319 p.CharacterDataHandler = char_data
320
321 p.Parse(s)
322
323 if len(self.stack)!=1:
324 self.errors.append(AssertionError('multiple objects inside <root> element'))
325
326 obj = self.stack[-1]
327
328 for attr, item in obj._schema.allItems():
329 if not attr in obj._data:
330 raise AssertionError("incomplete XML file")
331 return obj,self.errors
332