hutch-xamplr 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION.yml +2 -2
  3. data/examples/random-people-shared-addresses/Makefile +2 -2
  4. data/examples/random-people-shared-addresses/batch-load-users.rb +2 -5
  5. data/examples/random-people-shared-addresses/find-mentions.rb +1 -4
  6. data/examples/random-people-shared-addresses/find-people-by-address.rb +1 -4
  7. data/examples/random-people-shared-addresses/optimise.rb +1 -4
  8. data/examples/random-people-shared-addresses/people.rb +0 -15
  9. data/examples/random-people-shared-addresses/query.rb +1 -4
  10. data/examples/random-people-shared-addresses/query2.rb +1 -4
  11. data/examples/random-people-shared-addresses/results.write.BASELINE +298 -0
  12. data/examples/random-people-shared-addresses/results.write.NEW_ATTR_ENCODING +294 -0
  13. data/examples/random-people-shared-addresses/settings.rb +3 -0
  14. data/examples/random-people/batch-load-users.rb +1 -4
  15. data/examples/random-people/optimise.rb +1 -4
  16. data/examples/random-people/people.rb +0 -3
  17. data/examples/random-people/query.rb +1 -5
  18. data/examples/random-people/query2.rb +1 -4
  19. data/examples/random-people/settings.rb +3 -0
  20. data/examples/random-people/what-to-query-on.rb +1 -3
  21. data/examples/read-testing/Makefile +10 -0
  22. data/examples/read-testing/load.rb +65 -0
  23. data/examples/read-testing/read.rb +51 -0
  24. data/examples/read-testing/results.read.BASELINE +6 -0
  25. data/examples/read-testing/results.read.FAST +5 -0
  26. data/examples/read-testing/rrr.rb +87 -0
  27. data/examples/read-testing/settings.rb +2 -0
  28. data/examples/read-testing/xampl-gen.rb +36 -0
  29. data/examples/read-testing/xml/text.xml +8 -0
  30. data/lib/xamplr.rb +10 -1
  31. data/lib/xamplr/exceptions.rb +97 -0
  32. data/lib/xamplr/from-xml-orig.rb +350 -0
  33. data/lib/xamplr/from-xml.rb +272 -183
  34. data/lib/xamplr/handwritten/example.rb +0 -58
  35. data/lib/xamplr/handwritten/hand-example.rb +0 -27
  36. data/lib/xamplr/handwritten/test-handwritten.rb +0 -37
  37. data/lib/xamplr/mixins.rb +10 -48
  38. data/lib/xamplr/persist-to-xml.rb +249 -0
  39. data/lib/xamplr/persistence.rb +44 -412
  40. data/lib/xamplr/persistence.rb.more_thread_safe +0 -13
  41. data/lib/xamplr/persistence.rb.partially_thread_safe +0 -13
  42. data/lib/xamplr/persister.rb +298 -0
  43. data/lib/xamplr/{persister → persisters}/caches.rb +0 -0
  44. data/lib/xamplr/{persister → persisters}/caching.rb +1 -1
  45. data/lib/xamplr/{persister → persisters}/filesystem.rb +4 -5
  46. data/lib/xamplr/{persister → persisters}/in-memory.rb +1 -1
  47. data/lib/xamplr/{persister → persisters}/simple.rb +0 -0
  48. data/lib/xamplr/{persister → persisters}/tokyo-cabinet.rb +53 -15
  49. data/lib/xamplr/simpleTemplate/{input-c.r4 → obsolete/input-c.r4} +0 -0
  50. data/lib/xamplr/simpleTemplate/{play.r6.txt → obsolete/play.r6.txt} +0 -0
  51. data/lib/xamplr/simpleTemplate/{play_more.r6.txt → obsolete/play_more.r6.txt} +0 -0
  52. data/lib/xamplr/simpleTemplate/{test001.r5 → obsolete/test001.r5} +0 -0
  53. data/lib/xamplr/simpleTemplate/{test002.r5 → obsolete/test002.r5} +0 -0
  54. data/lib/xamplr/simpleTemplate/{test003.r5 → obsolete/test003.r5} +0 -0
  55. data/lib/xamplr/templates/child_indexed.template +1 -1
  56. data/lib/xamplr/templates/element_classes.template +1 -1
  57. data/lib/xamplr/templates/element_data.template +0 -39
  58. data/lib/xamplr/templates/element_empty.template +0 -40
  59. data/lib/xamplr/templates/element_mixed.template +0 -41
  60. data/lib/xamplr/templates/element_simple.template +0 -40
  61. data/lib/xamplr/test-support/bench.rb +6 -26
  62. data/lib/xamplr/test-support/test.rb +1 -89
  63. data/lib/xamplr/visitor.rb +0 -778
  64. data/lib/xamplr/visitors.rb +573 -0
  65. data/lib/xamplr/xampl-generator.rb +1 -1
  66. data/lib/xamplr/xampl-hand-generated.rb +0 -85
  67. data/lib/xamplr/xampl-module.rb +36 -0
  68. data/lib/xamplr/xampl-object-internals.rb +6 -0
  69. data/lib/xamplr/xampl-object.rb +10 -341
  70. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  71. data/lib/xamplr/xml-text.rb +117 -0
  72. metadata +53 -18
  73. data/lib/xamplr/persister/subversion.rb +0 -61
  74. data/lib/xamplr/rac.sh +0 -6
  75. data/lib/xamplr/rac_gen.sh +0 -1
  76. data/lib/xamplr/templates/child_indexed.template.000 +0 -87
@@ -0,0 +1,350 @@
1
+ require "xamplr-pp"
2
+
3
+ module Xampl
4
+
5
+ class FromXML_original < Xampl_PP
6
+
7
+ attr :checkWellFormed, false
8
+ attr :is_realising, false
9
+ attr :tokenise_content, false
10
+
11
+ @@by_tag = {}
12
+ @@by_ns_tag = {}
13
+
14
+ def initialize(recovering=false)
15
+ super()
16
+ @recovering = recovering
17
+ end
18
+
19
+ def FromXML_original.reset_registry
20
+ @@by_tag = {}
21
+ @@by_ns_tag = {}
22
+ end
23
+
24
+ def FromXML_original.register(tag, ns_tag, klass)
25
+ @@by_ns_tag[ns_tag] = [ klass ]
26
+ a = @@by_tag[tag]
27
+ if (nil == a) then
28
+ @@by_tag[tag] = [ klass ]
29
+ else
30
+ found = false
31
+ a.each { | thing | found = found | (thing == klass) }
32
+ a << klass unless found
33
+ end
34
+ end
35
+
36
+ def FromXML_original.registered(name)
37
+ klass = @@by_ns_tag[name]
38
+ klass = @@by_tag[name] unless klass
39
+ klass = [] unless klass
40
+ return klass
41
+ end
42
+
43
+ def resolve(name)
44
+ return name
45
+ end
46
+
47
+ def setup_parse(filename, tokenise_content=true, is_realising=false)
48
+ @processNamespace = true
49
+ @reportNamespaceAttributes = false
50
+ @checkWellFormed = false
51
+ @resolver = self
52
+
53
+ @is_realising = is_realising
54
+ @tokenise_content = tokenise_content
55
+
56
+ setInput(File.new(filename))
57
+ end
58
+
59
+ def setup_parse_string(string, tokenise_content=true, is_realising=false)
60
+ @processNamespace = true
61
+ @reportNamespaceAttributes = false
62
+ @checkWellFormed = false
63
+ @resolver = self
64
+
65
+ @is_realising = is_realising
66
+ @tokenise_content = tokenise_content
67
+
68
+ setInput(string)
69
+ end
70
+
71
+ def parse(filename, tokenise_content=true, is_realising=false)
72
+ begin
73
+ setup_parse(filename, tokenise_content, is_realising)
74
+ element, ignore = parse_element
75
+ return element
76
+ rescue Exception => e
77
+ puts "trouble parsing file: '#{filename}'"
78
+ puts "Exception: #{e}"
79
+ raise
80
+ end
81
+ end
82
+
83
+ def realise_string(string, tokenise_content=true, target=nil)
84
+ return parse_string(string, tokenise_content, true, target)
85
+ end
86
+
87
+ def parse_string(string, tokenise_content=true, is_realising=false, target=nil)
88
+ begin
89
+ setup_parse_string(string, tokenise_content, is_realising)
90
+ element, ignore = parse_element(nil, target)
91
+ return element
92
+ rescue Exception => e
93
+ puts "trouble parsing string: '#{string}'"
94
+ puts "Exception: #{e}"
95
+ raise
96
+ end
97
+ end
98
+
99
+ def FromXML_original.tokenise_string(str, strip=true)
100
+ return nil unless str
101
+ str.strip! if strip
102
+ str.gsub!(/[ \n\r\t][ \n\r\t]*/, " ")
103
+ return str
104
+ end
105
+
106
+ def parse_element(parent=nil, target=nil)
107
+ next_interesting_event unless parent
108
+
109
+ existing_element = nil
110
+ element = nil
111
+
112
+ requires_caching = false
113
+
114
+ if startElement? then
115
+ if ((nil != @namespace) and (0 < @namespace.size)) then
116
+ klass_name = "{#{@namespace}}#{@name}"
117
+ klasses = FromXML_original.registered(klass_name)
118
+ if (0 == klasses.size) then
119
+ xml_text = XMLText.new
120
+ xml_text.build(self)
121
+ xml_text = parent.note_adding_text_content(xml_text, @is_realising)
122
+ parent.add_content(xml_text, @tokenise_content) if xml_text
123
+ # puts "#{__LINE__ }:: add_content [#{xml_text}] --> [#{parent.content}]"
124
+ return xml_text, false
125
+ end
126
+ if (1 < klasses.size) then
127
+ raise XamplException.new("there is more than one '#{@name}' tag in namespace '#{@namespace}'\nplease report this error")
128
+ end
129
+ else
130
+ klasses = FromXML_original.registered(@name)
131
+ if (0 == klasses.size) then
132
+ raise XamplException.new("do not recognise tag '#{@name}' (no namespace specified)")
133
+ end
134
+ if (1 < klasses.size) then
135
+ raise XamplException.new("there is more than one '#{@name}' tag (no namespace specified)")
136
+ end
137
+ end
138
+
139
+ unless @is_realising then
140
+ @attributeValue.size.times do |i|
141
+ FromXML_original.tokenise_string @attributeValue[i]
142
+ end
143
+ end
144
+
145
+ if target then
146
+ element = target
147
+ target.load_needed = false
148
+ target = nil
149
+ element.init_attributes(@attributeName, @attributeNamespace, @attributeValue)
150
+ element.note_attributes_initialised(@is_realising)
151
+ else
152
+ if klasses[0].persisted? then
153
+ @attributeName.each_index do |i|
154
+ if @attributeName[i] == klasses[0].persisted?.to_s then
155
+ existing_element = Xampl.find_known(klasses[0], @attributeValue[i])
156
+ if existing_element then
157
+ # so we've found the element. Now what??? We can do several
158
+ # reasonable things:
159
+ #
160
+ # 1) continue parsing into the found element
161
+ # 2) simply return the found element
162
+ # 3) replace the found element with the new element
163
+ #
164
+ # The first one is dubious, so we won't.
165
+ # The second and third option both make complete sense
166
+ #
167
+ # We are going to do the second
168
+ #
169
+ # BTW, 'existing element' means a representation of this element already in memory
170
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
171
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
172
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
173
+ # puts "FOUND AN EXISTING THING... #{ klasses[0] } #{ @attributeValue[i] }"
174
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
175
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
176
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
177
+ # caller(0).each { | trace | puts " #{trace}"}
178
+ # existing_element.reset_contents
179
+ # element = existing_element
180
+ # existing_element = nil
181
+ # puts "#{File.basename(__FILE__)} #{__LINE__} EXISTING ELEMENT: #{ existing_element }"
182
+ # puts "#{File.basename(__FILE__)} #{__LINE__} WOW, must handle the existing element correctly"
183
+ element = existing_element #TODO -- IS THIS RIGHT????????????????????????
184
+ end
185
+ unless element then
186
+ element = klasses[0].new
187
+ requires_caching = @recovering
188
+ # puts "#{File.basename(__FILE__)} #{__LINE__} WOW, what about recovering????"
189
+ #TODO -- IS THIS RIGHT????????????????????????
190
+ requires_caching = true #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
191
+ unless @recovering then
192
+ element.force_load if parent
193
+ end
194
+ element.note_created(@is_realising)
195
+ end
196
+
197
+ break
198
+ end
199
+ end
200
+ end
201
+
202
+ unless element then
203
+ element = klasses[0].new
204
+ element.note_created(@is_realising)
205
+ end
206
+
207
+ element.note_initialise_attributes_with(@attributeName, @attributeNamespace, @attributeValue, @is_realising)
208
+ element.init_attributes(@attributeName, @attributeNamespace, @attributeValue)
209
+ element.note_attributes_initialised(@is_realising)
210
+
211
+ if requires_caching and element and element.persist_required then
212
+ # puts "ELEMENT: #{element}, #{element.class.name}"
213
+ Xampl.cache(element)
214
+ # found = Xampl.find_known(element.class, element.get_the_index)
215
+ # puts "OK? #{found == element} found: #{found}, element: #{element}"
216
+ # puts "=============================================================================="
217
+ end
218
+
219
+ #element = element.note_add_to_parent(parent, @is_realising)
220
+ #element.append_to(parent) if parent
221
+ end
222
+
223
+ while not endDocument?
224
+ case nextEvent
225
+ when START_DOCUMENT
226
+ return element if @recovering
227
+ return existing_element || element
228
+ when END_DOCUMENT
229
+ return element if @recovering
230
+ return existing_element || element
231
+ when START_ELEMENT
232
+ child, ignore_child = parse_element(element)
233
+ unless ignore_child then
234
+ case child
235
+ when XamplObject then
236
+ child = child.note_add_to_parent(element, @is_realising) if child
237
+ child = element.note_add_child(child, @is_realising) if element
238
+ child.append_to(element) if element and child
239
+ when XMLText then
240
+ puts "UNRECOGNISED Well-formed XML: #{child.to_s[0..25]}..."
241
+ else
242
+ puts "WHAT IS THIS??? #{child.class.name}"
243
+ end
244
+ # if child.kind_of? XamplObject then
245
+ # child = child.note_add_to_parent(element, @is_realising) if child
246
+ # child = element.note_add_child(child, @is_realising) if element
247
+ # child.append_to(element) if element and child
248
+ # else
249
+ # puts "WHAT IS THIS??? #{child.class.name}"
250
+ # end
251
+ end
252
+ when END_ELEMENT
253
+ element = element.note_closed(@is_realising)
254
+ return element if @recovering
255
+ return existing_element || element
256
+ when TEXT, CDATA_SECTION, ENTITY_REF
257
+ if element.has_mixed_content then
258
+ the_text = element.note_adding_text_content(@text, @is_realising)
259
+ # element.add_content(the_text, @tokenise_content)
260
+ element << the_text
261
+ # puts "#{__LINE__ }:: add_content [#{the_text}]"
262
+ else
263
+ unless whitespace? then
264
+ the_text = element.note_adding_text_content(@text, @is_realising)
265
+ # 16 Mar 2007 -- this was making preformatted text content impossible
266
+ # element.add_content(the_text, @tokenise_content)
267
+ element.add_content(the_text, false)
268
+ # puts "#{__LINE__ }:: add_content [#{the_text}] --> [#{element.content}]"
269
+ end
270
+ end
271
+ end
272
+ end
273
+ end
274
+ return element if @recovering
275
+ return existing_element || element
276
+ end
277
+
278
+ def next_interesting_event
279
+ if (endDocument?) then
280
+ return Xampl_PP::END_DOCUMENT
281
+ end
282
+
283
+ boring = true
284
+ while boring do
285
+ event = nextEvent
286
+ case event
287
+ when Xampl_PP::START_DOCUMENT
288
+ boring = true
289
+ when Xampl_PP::END_DOCUMENT
290
+ boring = false
291
+ when Xampl_PP::START_ELEMENT
292
+ boring = false
293
+ when Xampl_PP::END_ELEMENT
294
+ boring = false
295
+ when Xampl_PP::TEXT
296
+ boring = false
297
+ when Xampl_PP::CDATA_SECTION
298
+ boring = false
299
+ when Xampl_PP::ENTITY_REF
300
+ boring = false
301
+ when Xampl_PP::IGNORABLE_WHITESPACE
302
+ boring = true
303
+ when Xampl_PP::PROCESSING_INSTRUCTION
304
+ boring = true
305
+ when Xampl_PP::COMMENT
306
+ boring = true
307
+ when Xampl_PP::DOCTYPE
308
+ boring = true
309
+ end
310
+ end
311
+ return event
312
+ end
313
+
314
+ def attributeCount
315
+ return @attributeName.length
316
+ end
317
+
318
+ def attributeName(i)
319
+ return @attributeName[i]
320
+ end
321
+
322
+ def attributeNamespace(i)
323
+ return @attributeNamespace[i]
324
+ end
325
+
326
+ def attributeQName(i)
327
+ return @attributeQName[i]
328
+ end
329
+
330
+ def attributePrefix(i)
331
+ return @attributePrefix[i]
332
+ end
333
+
334
+ def attributeValue(i)
335
+ return @attributeValue[i]
336
+ end
337
+
338
+ def depth
339
+ return depth
340
+ end
341
+
342
+ def line
343
+ return line
344
+ end
345
+
346
+ def column
347
+ return column
348
+ end
349
+ end
350
+ end
@@ -1,19 +1,28 @@
1
- require "xamplr-pp"
1
+ require 'libxml'
2
2
 
3
3
  module Xampl
4
4
 
5
- class FromXML < Xampl_PP
5
+ class FromXML
6
6
 
7
7
  attr :checkWellFormed, false
8
8
  attr :is_realising, false
9
9
  attr :tokenise_content, false
10
10
 
11
+ @reader = nil
12
+
11
13
  @@by_tag = {}
12
14
  @@by_ns_tag = {}
13
15
 
14
16
  def initialize(recovering=false)
15
- super()
16
17
  @recovering = recovering
18
+
19
+ @attribute_name = Array.new(32)
20
+ @attribute_namespace = Array.new(32)
21
+ @attribute_value = Array.new(32)
22
+
23
+ @insert_end_element = false
24
+ @faking_an_end_element = false
25
+ @just_opened_an_element = false
17
26
  end
18
27
 
19
28
  def FromXML.reset_registry
@@ -41,31 +50,39 @@ module Xampl
41
50
  end
42
51
 
43
52
  def resolve(name)
53
+ #TODO -- ???
44
54
  return name
45
55
  end
46
56
 
47
57
  def setup_parse(filename, tokenise_content=true, is_realising=false)
48
- @processNamespace = true
49
- @reportNamespaceAttributes = false
50
- @checkWellFormed = false
51
58
  @resolver = self
52
59
 
53
60
  @is_realising = is_realising
54
61
  @tokenise_content = tokenise_content
55
62
 
56
- setInput(File.new(filename))
63
+ @reader = LibXML::XML::Reader.file(filename,
64
+ :options => LibXML::XML::Parser::Options::NOENT |
65
+ LibXML::XML::Parser::Options::NONET |
66
+ LibXML::XML::Parser::Options::NOCDATA |
67
+ LibXML::XML::Parser::Options::DTDATTR |
68
+ LibXML::XML::Parser::Options::COMPACT)
69
+ #TODO CLOSE THIS THING!!
57
70
  end
58
71
 
59
72
  def setup_parse_string(string, tokenise_content=true, is_realising=false)
60
- @processNamespace = true
61
- @reportNamespaceAttributes = false
62
- @checkWellFormed = false
63
73
  @resolver = self
64
74
 
65
75
  @is_realising = is_realising
66
76
  @tokenise_content = tokenise_content
67
77
 
68
- setInput(string)
78
+ # setInput(string)
79
+ @reader = LibXML::XML::Reader.string(string,
80
+ :options => LibXML::XML::Parser::Options::NOENT |
81
+ LibXML::XML::Parser::Options::NONET |
82
+ LibXML::XML::Parser::Options::NOCDATA |
83
+ LibXML::XML::Parser::Options::DTDATTR |
84
+ LibXML::XML::Parser::Options::COMPACT)
85
+ #TODO CLOSE THIS THING!!
69
86
  end
70
87
 
71
88
  def parse(filename, tokenise_content=true, is_realising=false)
@@ -104,247 +121,319 @@ module Xampl
104
121
  end
105
122
 
106
123
  def parse_element(parent=nil, target=nil)
107
- next_interesting_event unless parent
124
+ find_the_first_element
125
+ return unless start_element?
126
+
127
+ namespace = @reader.namespace_uri
128
+ name = @reader.local_name
108
129
 
109
130
  existing_element = nil
110
131
  element = nil
111
132
 
112
133
  requires_caching = false
113
134
 
114
- if startElement? then
115
- if ((nil != @namespace) and (0 < @namespace.size)) then
116
- klass_name = "{#{@namespace}}#{@name}"
117
- klasses = FromXML.registered(klass_name)
118
- if (0 == klasses.size) then
119
- xml_text = XMLText.new
120
- xml_text.build(self)
121
- xml_text = parent.note_adding_text_content(xml_text, @is_realising)
122
- parent.add_content(xml_text, @tokenise_content) if xml_text
123
- # puts "#{__LINE__ }:: add_content [#{xml_text}] --> [#{parent.content}]"
124
- return xml_text, false
125
- end
126
- if (1 < klasses.size) then
127
- raise XamplException.new("there is more than one '#{@name}' tag in namespace '#{@namespace}'\nplease report this error")
128
- end
129
- else
130
- klasses = FromXML.registered(@name)
131
- if (0 == klasses.size) then
132
- raise XamplException.new("do not recognise tag '#{@name}' (no namespace specified)")
133
- end
134
- if (1 < klasses.size) then
135
- raise XamplException.new("there is more than one '#{@name}' tag (no namespace specified)")
136
- end
135
+ build_attribute_arrays
136
+
137
+ if ((nil != namespace) and (0 < namespace.size)) then
138
+ klass_name = "{#{namespace}}#{name}"
139
+ klasses = FromXML.registered(klass_name)
140
+ if (0 == klasses.size) then
141
+ xml_text = XMLText.new
142
+ xml_text.build(self)
143
+ xml_text = parent.note_adding_text_content(xml_text, @is_realising)
144
+ parent.add_content(xml_text, @tokenise_content) if xml_text
145
+ return xml_text, false
137
146
  end
147
+ if (1 < klasses.size) then
148
+ raise XamplException.new("there is more than one '#{name}' tag in namespace '#{namespace}'\nplease report this error")
149
+ end
150
+ else
151
+ klasses = FromXML.registered(name)
152
+ if (0 == klasses.size) then
153
+ raise XamplException.new("do not recognise tag '#{name}' (no namespace specified)")
154
+ end
155
+ if (1 < klasses.size) then
156
+ raise XamplException.new("there is more than one '#{name}' tag (no namespace specified)")
157
+ end
158
+ end
138
159
 
139
- unless @is_realising then
140
- @attributeValue.size.times do |i|
141
- FromXML.tokenise_string @attributeValue[i]
142
- end
160
+ unless @is_realising then
161
+ @attribute_value.size.times do |i|
162
+ FromXML.tokenise_string @attribute_value[i]
143
163
  end
164
+ end
144
165
 
145
- if target then
146
- element = target
147
- target.load_needed = false
148
- target = nil
149
- element.init_attributes(@attributeName, @attributeNamespace, @attributeValue)
150
- element.note_attributes_initialised(@is_realising)
151
- else
152
- if klasses[0].persisted? then
153
- @attributeName.each_index do |i|
154
- if @attributeName[i] == klasses[0].persisted?.to_s then
155
- existing_element = Xampl.find_known(klasses[0], @attributeValue[i])
156
- if existing_element then
157
- # so we've found the element. Now what??? We can do several
158
- # reasonable things:
159
- #
160
- # 1) continue parsing into the found element
161
- # 2) simply return the found element
162
- # 3) replace the found element with the new element
163
- #
164
- # The first one is dubious, so we won't.
165
- # The second and third option both make complete sense
166
- #
167
- # We are going to do the second
168
- #
169
- # BTW, 'existing element' means a representation of this element already in memory
170
- # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
171
- # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
172
- # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
173
- # puts "FOUND AN EXISTING THING... #{ klasses[0] } #{ @attributeValue[i] }"
174
- # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
175
- # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
176
- # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
177
- # caller(0).each { | trace | puts " #{trace}"}
178
- # existing_element.reset_contents
179
- # element = existing_element
180
- # existing_element = nil
181
- # puts "#{File.basename(__FILE__)} #{__LINE__} EXISTING ELEMENT: #{ existing_element }"
182
- # puts "#{File.basename(__FILE__)} #{__LINE__} WOW, must handle the existing element correctly"
183
- element = existing_element #TODO -- IS THIS RIGHT????????????????????????
184
- end
185
- unless element then
186
- element = klasses[0].new
187
- requires_caching = @recovering
166
+ if target then
167
+ element = target
168
+ target.load_needed = false
169
+ target = nil
170
+ element.init_attributes(@attribute_name, @attribute_namespace, @attribute_value)
171
+ element.note_attributes_initialised(@is_realising)
172
+ else
173
+ if klasses[0].persisted? then
174
+ @attribute_name.each_index do |i|
175
+ if @attribute_name[i] == klasses[0].persisted?.to_s then
176
+ existing_element = Xampl.find_known(klasses[0], @attribute_value[i])
177
+ if existing_element then
178
+ # so we've found the element. Now what??? We can do several
179
+ # reasonable things:
180
+ #
181
+ # 1) continue parsing into the found element
182
+ # 2) simply return the found element
183
+ # 3) replace the found element with the new element
184
+ #
185
+ # The first one is dubious, so we won't.
186
+ # The second and third option both make complete sense
187
+ #
188
+ # We are going to do the second
189
+ #
190
+ # BTW, 'existing element' means a representation of this element already in memory
191
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
192
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
193
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
194
+ # puts "FOUND AN EXISTING THING... #{ klasses[0] } #{ @attribute_value[i] }"
195
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
196
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
197
+ # puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
198
+ # caller(0).each { | trace | puts " #{trace}"}
199
+ # existing_element.reset_contents
200
+ # element = existing_element
201
+ # existing_element = nil
202
+ # puts "#{File.basename(__FILE__)} #{__LINE__} EXISTING ELEMENT: #{ existing_element }"
203
+ # puts "#{File.basename(__FILE__)} #{__LINE__} WOW, must handle the existing element correctly"
204
+ element = existing_element #TODO -- IS THIS RIGHT????????????????????????
205
+ end
206
+ unless element then
207
+ element = klasses[0].new
208
+ requires_caching = @recovering
188
209
  # puts "#{File.basename(__FILE__)} #{__LINE__} WOW, what about recovering????"
189
- #TODO -- IS THIS RIGHT????????????????????????
190
- requires_caching = true #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
191
- unless @recovering then
192
- element.force_load if parent
193
- end
194
- element.note_created(@is_realising)
210
+ #TODO -- IS THIS RIGHT????????????????????????
211
+ requires_caching = true #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
212
+ unless @recovering then
213
+ element.force_load if parent
195
214
  end
196
-
197
- break
215
+ element.note_created(@is_realising)
198
216
  end
199
- end
200
- end
201
217
 
202
- unless element then
203
- element = klasses[0].new
204
- element.note_created(@is_realising)
218
+ break
219
+ end
205
220
  end
221
+ end
206
222
 
207
- element.note_initialise_attributes_with(@attributeName, @attributeNamespace, @attributeValue, @is_realising)
208
- element.init_attributes(@attributeName, @attributeNamespace, @attributeValue)
209
- element.note_attributes_initialised(@is_realising)
223
+ unless element then
224
+ element = klasses[0].new
225
+ element.note_created(@is_realising)
226
+ end
210
227
 
211
- if requires_caching and element and element.persist_required then
212
- # puts "ELEMENT: #{element}, #{element.class.name}"
213
- Xampl.cache(element)
214
- # found = Xampl.find_known(element.class, element.get_the_index)
215
- # puts "OK? #{found == element} found: #{found}, element: #{element}"
216
- # puts "=============================================================================="
217
- end
228
+ element.note_initialise_attributes_with(@attribute_name, @attribute_namespace, @attribute_value, @is_realising)
229
+ element.init_attributes(@attribute_name, @attribute_namespace, @attribute_value)
230
+ element.note_attributes_initialised(@is_realising)
218
231
 
219
- #element = element.note_add_to_parent(parent, @is_realising)
220
- #element.append_to(parent) if parent
232
+ if requires_caching and element and element.persist_required then
233
+ Xampl.cache(element)
221
234
  end
222
235
 
223
- while not endDocument?
224
- case nextEvent
236
+ #element = element.note_add_to_parent(parent, @is_realising)
237
+ #element.append_to(parent) if parent
238
+ end
239
+
240
+ while next_reader_event
241
+ case current_node_type
242
+
243
+ =begin
244
+ TODO -- can these ever happen?
225
245
  when START_DOCUMENT
226
246
  return element if @recovering
227
247
  return existing_element || element
228
248
  when END_DOCUMENT
229
249
  return element if @recovering
230
250
  return existing_element || element
231
- when START_ELEMENT
251
+
252
+ =end
253
+
254
+ when LibXML::XML::Reader::TYPE_ELEMENT
232
255
  child, ignore_child = parse_element(element)
256
+
233
257
  unless ignore_child then
234
258
  case child
235
- when XamplObject then
236
- child = child.note_add_to_parent(element, @is_realising) if child
237
- child = element.note_add_child(child, @is_realising) if element
238
- child.append_to(element) if element and child
239
- when XMLText then
240
- puts "UNRECOGNISED Well-formed XML: #{child.to_s[0..25]}..."
241
- else
242
- puts "WHAT IS THIS??? #{child.class.name}"
259
+ when XamplObject then
260
+ child = child.note_add_to_parent(element, @is_realising) if child
261
+ child = element.note_add_child(child, @is_realising) if element
262
+ child.append_to(element) if element and child
263
+ when XMLText then
264
+ puts "UNRECOGNISED Well-formed XML: #{child.to_s[0..25]}..."
265
+ else
266
+ puts "WHAT IS THIS??? #{child.class.name}"
243
267
  end
244
- # if child.kind_of? XamplObject then
245
- # child = child.note_add_to_parent(element, @is_realising) if child
246
- # child = element.note_add_child(child, @is_realising) if element
247
- # child.append_to(element) if element and child
248
- # else
249
- # puts "WHAT IS THIS??? #{child.class.name}"
250
- # end
251
268
  end
252
- when END_ELEMENT
269
+ when LibXML::XML::Reader::TYPE_END_ELEMENT
253
270
  element = element.note_closed(@is_realising)
254
271
  return element if @recovering
255
272
  return existing_element || element
256
- when TEXT, CDATA_SECTION, ENTITY_REF
273
+ when LibXML::XML::Reader::TYPE_TEXT, LibXML::XML::Reader::TYPE_CDATA, LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE, LibXML::XML::Reader::TYPE_ENTITY_REFERENCE
257
274
  if element.has_mixed_content then
258
- the_text = element.note_adding_text_content(@text, @is_realising)
259
- # element.add_content(the_text, @tokenise_content)
275
+ text = @reader.read_string
276
+ the_text = element.note_adding_text_content(text, @is_realising)
260
277
  element << the_text
261
- # puts "#{__LINE__ }:: add_content [#{the_text}]"
262
278
  else
263
- unless whitespace? then
264
- the_text = element.note_adding_text_content(@text, @is_realising)
265
- # 16 Mar 2007 -- this was making preformatted text content impossible
266
- # element.add_content(the_text, @tokenise_content)
267
- element.add_content(the_text, false)
268
- # puts "#{__LINE__ }:: add_content [#{the_text}] --> [#{element.content}]"
269
- end
279
+ text = @reader.read_string
280
+ the_text = element.note_adding_text_content(text, @is_realising)
281
+ element.add_content(the_text, false)
270
282
  end
271
- end
283
+ else
272
284
  end
273
285
  end
286
+
274
287
  return element if @recovering
275
288
  return existing_element || element
276
289
  end
277
290
 
278
- def next_interesting_event
279
- if (endDocument?) then
280
- return Xampl_PP::END_DOCUMENT
291
+ def current_node_type
292
+ if @faking_an_end_element then
293
+ LibXML::XML::Reader::TYPE_END_ELEMENT
294
+ else
295
+ @reader.node_type
281
296
  end
297
+ end
282
298
 
283
- boring = true
284
- while boring do
285
- event = nextEvent
286
- case event
287
- when Xampl_PP::START_DOCUMENT
288
- boring = true
289
- when Xampl_PP::END_DOCUMENT
290
- boring = false
291
- when Xampl_PP::START_ELEMENT
292
- boring = false
293
- when Xampl_PP::END_ELEMENT
294
- boring = false
295
- when Xampl_PP::TEXT
296
- boring = false
297
- when Xampl_PP::CDATA_SECTION
298
- boring = false
299
- when Xampl_PP::ENTITY_REF
300
- boring = false
301
- when Xampl_PP::IGNORABLE_WHITESPACE
302
- boring = true
303
- when Xampl_PP::PROCESSING_INSTRUCTION
304
- boring = true
305
- when Xampl_PP::COMMENT
306
- boring = true
307
- when Xampl_PP::DOCTYPE
308
- boring = true
309
- end
299
+ =begin
300
+ def describe_current_element_type()
301
+ case @reader.node_type
302
+ when LibXML::XML::Reader::TYPE_ATTRIBUTE
303
+ puts "ATTRIBUTE"
304
+ when LibXML::XML::Reader::TYPE_DOCUMENT
305
+ puts "DOCUMENT"
306
+ when LibXML::XML::Reader::TYPE_ELEMENT
307
+ attribute_count = @reader.attribute_count
308
+ puts "ELEMENT #{ @reader.local_name }, ns: #{ @reader.namespace_uri }, #attributes: #{ attribute_count }, depth: #{ @reader.depth }"
309
+ puts " FAKING END ELEMENT" if @faking_an_end_element
310
+ when LibXML::XML::Reader::TYPE_END_ELEMENT
311
+ puts "END ELEMENT"
312
+ when LibXML::XML::Reader::TYPE_TEXT
313
+ puts "TEXT [[#{ @reader.read_string }]]"
314
+ when LibXML::XML::Reader::TYPE_CDATA
315
+ puts "CDATA [[#{ @reader.read_string }]]"
316
+ when LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE
317
+ puts "SIGNIFICANT white space [[#{ @reader.read_string }]]"
318
+ when LibXML::XML::Reader::TYPE_ENTITY_REFERENCE
319
+ puts "entity ref"
320
+ when LibXML::XML::Reader::TYPE_WHITESPACE
321
+ puts "whitespace"
322
+ when LibXML::XML::Reader::TYPE_PROCESSING_INSTRUCTION
323
+ puts "processing instruction"
324
+ when LibXML::XML::Reader::TYPE_COMMENT
325
+ puts "comment"
326
+ when LibXML::XML::Reader::TYPE_DOCUMENT_TYPE
327
+ puts "doc type"
328
+
329
+ when LibXML::XML::Reader::TYPE_XML_DECLARATION
330
+ puts "xml decl"
331
+ when LibXML::XML::Reader::TYPE_NONE
332
+ puts "NONE!!"
333
+ when LibXML::XML::Reader::TYPE_NOTATION
334
+ puts "notifiation"
335
+ when LibXML::XML::Reader::TYPE_DOCUMENT_FRAGMENT
336
+ puts "doc fragment"
337
+ when LibXML::XML::Reader::TYPE_ENTITY
338
+ puts "entity"
339
+ when LibXML::XML::Reader::TYPE_END_ENTITY
340
+ puts "end entity"
341
+ else
342
+ puts "UNKNOWN: #{@reader.node_type}"
310
343
  end
311
- return event
312
344
  end
345
+ =end
313
346
 
314
- def attributeCount
315
- return @attributeName.length
347
+ def next_reader_event
348
+ if @insert_end_element then
349
+ @faking_an_end_element = true
350
+ @insert_end_element = false
351
+ return
352
+ end
353
+
354
+ @faking_an_end_element = false
355
+
356
+ #describe_current_element_type
357
+
358
+ okay = @reader.read
359
+
360
+ @just_opened_an_element = start_element?
361
+ @insert_end_element = (@just_opened_an_element and @reader.empty_element?)
362
+
363
+ #describe_current_element_type
364
+
365
+ okay
316
366
  end
317
367
 
318
- def attributeName(i)
319
- return @attributeName[i]
368
+ def start_element?
369
+ current_node_type == LibXML::XML::Reader::TYPE_ELEMENT
320
370
  end
321
371
 
322
- def attributeNamespace(i)
323
- return @attributeNamespace[i]
372
+ def whitespace?
373
+ current_note_type == LibXML::XML::Reader::TYPE_WHITESPACE
374
+ end
375
+
376
+ def find_the_first_element
377
+ while true do
378
+ break if start_element?
379
+ break unless next_reader_event
380
+ end
381
+ @just_opened_an_element = start_element?
324
382
  end
325
383
 
326
- def attributeQName(i)
327
- return @attributeQName[i]
384
+ def build_attribute_arrays
385
+
386
+ @attribute_name.clear
387
+ @attribute_namespace.clear
388
+ @attribute_value.clear
389
+
390
+ return unless LibXML::XML::Reader::TYPE_ELEMENT == current_node_type
391
+
392
+ if @reader.has_attributes? then
393
+ attribute_count = @reader.attribute_count
394
+ @reader.move_to_first_attribute
395
+ attribute_count.times do | i |
396
+ if @reader.namespace_declaration? then
397
+ @reader.move_to_next_attribute
398
+ next
399
+ end
400
+
401
+ @attribute_name << @reader.local_name
402
+ @attribute_namespace << @reader.namespace_uri
403
+ @attribute_value << @reader.value
404
+
405
+ @reader.move_to_next_attribute
406
+ end
407
+ end
328
408
  end
329
409
 
330
- def attributePrefix(i)
331
- return @attributePrefix[i]
410
+ def attributeCount
411
+ return @attribute_name.length
412
+ end
413
+
414
+ def attributeName(i)
415
+ return @attribute_name[i]
416
+ end
417
+
418
+ def attributeNamespace(i)
419
+ return @attribute_namespace[i]
332
420
  end
333
421
 
334
422
  def attributeValue(i)
335
- return @attributeValue[i]
423
+ return @attribute_value[i]
336
424
  end
337
425
 
338
426
  def depth
339
- return depth
427
+ return @reader.depth
340
428
  end
341
429
 
342
430
  def line
343
- return line
431
+ return @reader.line_number
344
432
  end
345
433
 
346
434
  def column
347
- return column
435
+ return @reader.column_number
348
436
  end
349
437
  end
438
+
350
439
  end