1
2
3
4
5
6
7
13
14
20
21
22
23
24 import xml.sax.saxutils
25
26
28 return xml.sax.saxutils.escape(s)
29
32
33
34 from Ganga.GPIDev.Lib.GangaList.GangaList import makeGangaListByRef as makeGangaListByRef
35
36
37 from Ganga.Utility.Config import config_scope
38
39
40
41
42
43
44
46
47
48
49
50 - def __init__(self,out=None,selection=''):
51 self.level = 0
52 self.nocomma = 1
53 self.selection = selection
54 if out:
55 self.out = out
56 else:
57 import sys
58 self.out = sys.stdout
59
61 print >> self.out,'<root>'
62
64 print >> self.out,'</root>'
65
67 return ' '*(self.level-1)*3
68
75
77 print >> self.out,self.indent(),'</class>'
78 self.level -= 1
79 return
80
83
85 if self.showAttribute( node, name ):
86 self.level+=1
87 print >> self.out, self.indent(),
88 print >> self.out, '<attribute name="%s">'%name,
89
90 def print_value(v):
91
92 print >> self.out,'<value>%s</value>'%self.quote(v),
93
94 if sequence:
95 self.level+=1
96 print >> self.out
97 print >> self.out, self.indent(),'<sequence>'
98 for v in value:
99 self.level+=1
100 print >> self.out, self.indent(),
101 print_value(v)
102 print >> self.out
103 self.level-=1
104 print >> self.out, self.indent(), '</sequence>'
105 self.level-=1
106 print >> self.out, self.indent(), '</attribute>'
107 else:
108 self.level+=1
109 print_value(value)
110 self.level-=1
111 print >> self.out,'</attribute>'
112 self.level-=1
113
115 self.level+=1
116 if s is None:
117 print >> self.out,self.indent(), '<value>None</value>'
118 else:
119 s.accept(self)
120 self.level-=1
121
123 if self.showAttribute( node, name ):
124 self.empty_body = 0
125 self.level+=1
126 print >> self.out, self.indent(), '<attribute name="%s">'%name
127 if sequence:
128 self.level+=1
129 print >> self.out, self.indent(), '<sequence>'
130 for s in subnode:
131 self.acceptOptional(s)
132 print >> self.out,self.indent(), '</sequence>'
133 self.level-=1
134 else:
135 self.acceptOptional(subnode)
136 print >> self.out,self.indent(), '</attribute>'
137 self.level-=1
138
141
142
143
144
145
146 from Ganga.GPIDev.Base.Objects import GangaObject
147 from Ganga.Utility.Plugin import PluginManagerError, allPlugins
148 from Ganga.GPIDev.Schema import Schema, Version
149
150 from Ganga.Utility.logging import getLogger
151 logger = getLogger()
152
153
160
161
164
166 """ Job object tree loader.
167 """
168
170 self.stack = None
171 self.ignore_count = 0
172 self.errors = []
173 self.value_construct = None
174 self.sequence_start = []
175
177 """ Parse and load object from string s using internal XML parser (expat).
178 """
179 import xml.parsers.expat
180
181
182 def start_element(name, attrs):
183
184
185 if self.ignore_count:
186 self.ignore_count += 1
187 return
188
189
190 if name == 'root':
191 assert self.stack is None,"duplicated <root> element"
192 self.stack = []
193 return
194
195 assert not self.stack is None,"missing <root> element"
196
197
198 if name == 'class':
199 try:
200 cls = allPlugins.find(attrs['category'],attrs['name'])
201 except PluginManagerError,e:
202 self.errors.append(e)
203
204 obj = EmptyGangaObject()
205 self.ignore_count = 1
206 else:
207 version = Version(*[int(v) for v in attrs['version'].split('.')])
208 if not cls._schema.version.isCompatible(version):
209 attrs['currversion'] = '%s.%s'%(cls._schema.version.major,cls._schema.version.minor)
210 self.errors.append(SchemaVersionError('Incompatible schema of %(name)s, repository is %(version)s currently in use is %(currversion)s'%attrs))
211 obj = EmptyGangaObject()
212 self.ignore_count = 1
213 else:
214
215 obj = super(cls, cls).__new__(cls)
216 obj._data = {}
217 self.stack.append(obj)
218
219
220 if name == 'attribute':
221 self.stack.append(attrs['name'])
222
223
224 if name == 'value':
225 self.value_construct = ''
226
227
228 if name == 'sequence':
229 self.sequence_start.append(len(self.stack))
230
231 def end_element(name):
232
233
234
235 if self.ignore_count:
236 self.ignore_count -= 1
237 return
238
239
240 if name == 'attribute':
241 value = self.stack.pop()
242 aname = self.stack.pop()
243 obj = self.stack[-1]
244
245 obj._data[aname] = value
246
247
248 if name == 'value':
249
250 s = unescape(self.value_construct)
251
252 val = eval(s,config_scope)
253
254 self.stack.append(val)
255 self.value_construct = None
256
257
258
259 if name == 'sequence':
260 pos = self.sequence_start.pop()
261 alist = makeGangaListByRef(self.stack[pos:])
262 del self.stack[pos:]
263 self.stack.append(alist)
264
265
266
267
268 if name == 'class':
269 obj = self.stack[-1]
270 for attr, item in obj._schema.allItems():
271 if not attr in obj._data:
272 obj._data[attr] = obj._schema.getDefaultValue(attr)
273 obj.__setstate__(obj.__dict__)
274
275 def char_data(data):
276
277
278 if self.value_construct is not None:
279
280
281 self.value_construct += data
282
283
284 p = xml.parsers.expat.ParserCreate()
285
286 p.StartElementHandler = start_element
287 p.EndElementHandler = end_element
288 p.CharacterDataHandler = char_data
289
290 p.Parse(s)
291
292 assert len(self.stack)==1, 'multiple objects inside <root> element'
293
294 obj = self.stack[-1]
295 if obj._name == 'Unknown':
296 raise Exception('Unable to create root object',self.errors)
297
298 return obj,self.errors
299
300
301
302
303
304
305
306
312
314 import StringIO
315 s = StringIO.StringIO()
316 p(j,s)
317 return Parser().parse(s.getvalue())
318
319
320