xamplr 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.txt +13 -0
- data/LICENSE +3 -0
- data/README.rdoc +26 -0
- data/README.rdoc.orig +118 -0
- data/Rakefile +85 -0
- data/VERSION.yml +4 -0
- data/examples/random-people-shared-addresses/Makefile +16 -0
- data/examples/random-people-shared-addresses/batch-load-users.rb +83 -0
- data/examples/random-people-shared-addresses/find-mentions.rb +47 -0
- data/examples/random-people-shared-addresses/find-people-by-address.rb +104 -0
- data/examples/random-people-shared-addresses/optimise.rb +16 -0
- data/examples/random-people-shared-addresses/people.rb +35 -0
- data/examples/random-people-shared-addresses/query.rb +75 -0
- data/examples/random-people-shared-addresses/query2.rb +73 -0
- data/examples/random-people-shared-addresses/random-names.csv +10000 -0
- data/examples/random-people-shared-addresses/settings.rb +3 -0
- data/examples/random-people-shared-addresses/what-to-query-on.rb +82 -0
- data/examples/random-people-shared-addresses/xampl-gen.rb +36 -0
- data/examples/random-people-shared-addresses/xml/people.xml +14 -0
- data/examples/random-people/Makefile +16 -0
- data/examples/random-people/batch-load-users.rb +61 -0
- data/examples/random-people/optimise.rb +16 -0
- data/examples/random-people/people.rb +22 -0
- data/examples/random-people/query.rb +73 -0
- data/examples/random-people/query2.rb +73 -0
- data/examples/random-people/random-names.csv +10000 -0
- data/examples/random-people/rawtc.rb +91 -0
- data/examples/random-people/settings.rb +3 -0
- data/examples/random-people/what-to-query-on.rb +80 -0
- data/examples/random-people/xampl-gen.rb +36 -0
- data/examples/random-people/xml/people.xml +11 -0
- data/examples/read-testing/Makefile +10 -0
- data/examples/read-testing/load.rb +65 -0
- data/examples/read-testing/read.rb +51 -0
- data/examples/read-testing/rrr.rb +87 -0
- data/examples/read-testing/settings.rb +2 -0
- data/examples/read-testing/xampl-gen.rb +36 -0
- data/examples/read-testing/xml/text.xml +8 -0
- data/examples/tokyo-cabinet-experimental/expt-query.rb +42 -0
- data/examples/tokyo-cabinet-experimental/expt-query2.rb +42 -0
- data/examples/tokyo-cabinet-experimental/expt-query3.rb +41 -0
- data/examples/tokyo-cabinet-experimental/expt-reader.rb +32 -0
- data/examples/tokyo-cabinet-experimental/expt.rb +61 -0
- data/examples/tokyo-cabinet-experimental/xampl-gen.rb +36 -0
- data/examples/tokyo-cabinet-experimental/xml/tcx.xml +6 -0
- data/lib/xampl-generator.rb +3 -0
- data/lib/xampl.rb +3 -0
- data/lib/xamplr-generator.rb +10 -0
- data/lib/xamplr.rb +37 -0
- data/lib/xamplr/README-POSSIBLE-PROBLEMS +5 -0
- data/lib/xamplr/TODO +1 -0
- data/lib/xamplr/exceptions.rb +97 -0
- data/lib/xamplr/from-xml-orig.rb +350 -0
- data/lib/xamplr/from-xml.rb +439 -0
- data/lib/xamplr/gen-elements.xml +6230 -0
- data/lib/xamplr/gen.elements.xml +108 -0
- data/lib/xamplr/generate-elements.rb +15 -0
- data/lib/xamplr/generator.rb +5 -0
- data/lib/xamplr/graphml-out.rb +470 -0
- data/lib/xamplr/handwritten/example.rb +698 -0
- data/lib/xamplr/handwritten/hand-example.rb +533 -0
- data/lib/xamplr/handwritten/test-handwritten.rb +873 -0
- data/lib/xamplr/indexed-array.rb +115 -0
- data/lib/xamplr/mixins.rb +397 -0
- data/lib/xamplr/my.gen.elements.xml +461 -0
- data/lib/xamplr/notifications.rb +57 -0
- data/lib/xamplr/obsolete/fsdb.rb +62 -0
- data/lib/xamplr/persist-to-xml.rb +249 -0
- data/lib/xamplr/persistence.rb +522 -0
- data/lib/xamplr/persistence.rb.more_thread_safe +771 -0
- data/lib/xamplr/persistence.rb.partially_thread_safe +763 -0
- data/lib/xamplr/persister.rb +310 -0
- data/lib/xamplr/persisters/caches.rb +186 -0
- data/lib/xamplr/persisters/caching.rb +172 -0
- data/lib/xamplr/persisters/filesystem.rb +60 -0
- data/lib/xamplr/persisters/in-memory.rb +180 -0
- data/lib/xamplr/persisters/simple.rb +59 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb +641 -0
- data/lib/xamplr/simpleTemplate/danger.rx +4 -0
- data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +35 -0
- data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +12 -0
- data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +20 -0
- data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +8 -0
- data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +13 -0
- data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +37 -0
- data/lib/xamplr/simpleTemplate/old/r6.000.rb +122 -0
- data/lib/xamplr/simpleTemplate/old/r6.001.rb +145 -0
- data/lib/xamplr/simpleTemplate/play.r6 +12 -0
- data/lib/xamplr/simpleTemplate/play_more.r6 +20 -0
- data/lib/xamplr/simpleTemplate/play_noblanks.r6 +21 -0
- data/lib/xamplr/simpleTemplate/playq.r6 +16 -0
- data/lib/xamplr/simpleTemplate/r6.rb +87 -0
- data/lib/xamplr/simpleTemplate/simple-template.rb +75 -0
- data/lib/xamplr/templates/child.template +47 -0
- data/lib/xamplr/templates/child_indexed.template +89 -0
- data/lib/xamplr/templates/child_modules.template +5 -0
- data/lib/xamplr/templates/element_classes.template +11 -0
- data/lib/xamplr/templates/element_data.template +282 -0
- data/lib/xamplr/templates/element_empty.template +285 -0
- data/lib/xamplr/templates/element_mixed.template +277 -0
- data/lib/xamplr/templates/element_simple.template +276 -0
- data/lib/xamplr/templates/package.template +26 -0
- data/lib/xamplr/test-support/Makefile +47 -0
- data/lib/xamplr/test-support/bench-cache.rb +80 -0
- data/lib/xamplr/test-support/bench-script.rb +21 -0
- data/lib/xamplr/test-support/bench.rb +116 -0
- data/lib/xamplr/test-support/bench2.rb +132 -0
- data/lib/xamplr/test-support/test-cache.rb +147 -0
- data/lib/xamplr/test-support/test-data/binding.xml +7 -0
- data/lib/xamplr/test-support/test-data/example.xml +14 -0
- data/lib/xamplr/test-support/test-data/internationalization-utf8.txt +1 -0
- data/lib/xamplr/test-support/test-data/labels.xml +37 -0
- data/lib/xamplr/test-support/test-data/labels001.xml +38 -0
- data/lib/xamplr/test-support/test-deep-change.rb +135 -0
- data/lib/xamplr/test-support/test-elements.rb +109 -0
- data/lib/xamplr/test-support/test-indexed-array.rb +169 -0
- data/lib/xamplr/test-support/test-misc.rb +73 -0
- data/lib/xamplr/test-support/test-names.rb +67 -0
- data/lib/xamplr/test-support/test-rollback.rb +106 -0
- data/lib/xamplr/test-support/test.rb +1504 -0
- data/lib/xamplr/to-ruby.rb +220 -0
- data/lib/xamplr/to-xml.rb +158 -0
- data/lib/xamplr/version.rb +67 -0
- data/lib/xamplr/visitor.rb +140 -0
- data/lib/xamplr/visitors.rb +573 -0
- data/lib/xamplr/xampl-generator.rb +533 -0
- data/lib/xamplr/xampl-hand-generated.rb +1535 -0
- data/lib/xamplr/xampl-module.rb +36 -0
- data/lib/xamplr/xampl-object-internals.rb +6 -0
- data/lib/xamplr/xampl-object.rb +202 -0
- data/lib/xamplr/xampl-persisted-object.rb +122 -0
- data/lib/xamplr/xml-text.rb +117 -0
- data/lib/xamplr/xml/document.xml +7 -0
- data/lib/xamplr/xml/elements.xml +101 -0
- data/lib/xamplr/xml/elements000.xml +73 -0
- data/lib/xamplr/xml/example.xml +23 -0
- data/lib/xamplr/xml/options.xml +12 -0
- data/lib/xamplr/xml/uche.xml +38 -0
- data/lib/xamplr/yEd-sample.graphml +300 -0
- data/test/test_helper.rb +10 -0
- data/test/xamplr_test.rb +7 -0
- metadata +245 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
|
|
2
|
+
require "xamplr/persister"
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
module Xampl
|
|
6
|
+
|
|
7
|
+
@@xampl_extends_symbols = false
|
|
8
|
+
|
|
9
|
+
def Xampl.xampl_extends_symbols
|
|
10
|
+
@@xampl_extends_symbols
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def Xampl.xampl_extends_symbols=(v)
|
|
14
|
+
@@xampl_extends_symbols = v
|
|
15
|
+
|
|
16
|
+
if @@xampl_extends_symbols then
|
|
17
|
+
Symbol.module_eval("include XamplExtensionsToRubyObjects")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class XamplLiteralRubyObject
|
|
22
|
+
def initialize(thing)
|
|
23
|
+
@thing = thing
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_xml(out="")
|
|
27
|
+
out << @thing.to_s
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module XamplExtensionsToRubyObjects
|
|
32
|
+
def to_xml(out="")
|
|
33
|
+
out << self.to_s
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
module Xampl
|
|
3
|
+
|
|
4
|
+
module XamplObject
|
|
5
|
+
attr_accessor :is_changed, :parents
|
|
6
|
+
|
|
7
|
+
@@preferred_ns_prefix = { "http://xampl.com/" => "xampl",
|
|
8
|
+
"http://xampl.com/generator" => "xampl-gen",
|
|
9
|
+
"http://www.w3.org/XML/1998/namespace" => "xml" }
|
|
10
|
+
|
|
11
|
+
def init_xampl_object
|
|
12
|
+
@parents = nil if not defined? @parents
|
|
13
|
+
@is_changed = false if not defined? @is_changed
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def init_hook
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def XamplObject.ns_preferred_prefix(ns, prefix)
|
|
20
|
+
@@preferred_ns_prefix[ns] = prefix unless @@preferred_ns_prefix.has_key?(ns)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def XamplObject.lookup_preferred_ns_prefix(ns)
|
|
24
|
+
@@preferred_ns_prefix[ns]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def persist_required
|
|
28
|
+
return false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ignore_when_no_index
|
|
32
|
+
return false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def invalidate
|
|
36
|
+
self.note_invalidate
|
|
37
|
+
self.persister.uncache(self) if self.persister
|
|
38
|
+
self.extend InvalidXampl
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def invalid
|
|
42
|
+
return kind_of?(InvalidXampl)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def changes_accepted
|
|
46
|
+
ResetIsChanged.new.start(self)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def changed
|
|
50
|
+
unless Xampl.persister then
|
|
51
|
+
raise UnmanagedChange.new(self)
|
|
52
|
+
end
|
|
53
|
+
unless @is_changed then
|
|
54
|
+
@is_changed = true
|
|
55
|
+
@parents.each{ | parent | parent.changed } if nil != @parents
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def accessed
|
|
60
|
+
raise XamplIsInvalid.new(self) if invalid
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def add_parent(xampl)
|
|
64
|
+
@parents = [] if (not defined? @parents) or (nil == @parents)
|
|
65
|
+
@parents << xampl
|
|
66
|
+
if Xampl.persister and self.persist_required and (nil == self.persister) then
|
|
67
|
+
Xampl.introduce_to_persister(self)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def init_attributes(attr_name, attr_namespace, attr_value)
|
|
72
|
+
return unless attr_name
|
|
73
|
+
|
|
74
|
+
attr_name.each_index do |i|
|
|
75
|
+
self.attributes.each do |attr_spec|
|
|
76
|
+
if (2 == attr_spec.size) then
|
|
77
|
+
if (attr_spec[1] == attr_name[i]) then
|
|
78
|
+
self.instance_variable_set(attr_spec[0], attr_value[i])
|
|
79
|
+
end
|
|
80
|
+
else
|
|
81
|
+
if ((attr_spec[1] == attr_name[i]) and (attr_spec[2] == attr_namespace[i])) then
|
|
82
|
+
self.instance_variable_set(attr_spec[0], attr_value[i])
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def compare_xampl(other)
|
|
90
|
+
accessed
|
|
91
|
+
other.accessed if other
|
|
92
|
+
return false unless self.class == other.class
|
|
93
|
+
return false unless self.children.size == other.children.size
|
|
94
|
+
self.children.zip(other.children).each do |c1, c2|
|
|
95
|
+
return false unless c1.class == c2.class
|
|
96
|
+
if c1.kind_of? String then
|
|
97
|
+
return false unless c1 == c2
|
|
98
|
+
else
|
|
99
|
+
return false unless c1.compare_xampl(c2)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
if (defined? self._content) and (defined? other._content) then
|
|
103
|
+
return false unless self._content == other._content
|
|
104
|
+
else
|
|
105
|
+
return false if (defined? self._content) or (defined? other._content)
|
|
106
|
+
end
|
|
107
|
+
return true
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def ===(other)
|
|
111
|
+
accessed
|
|
112
|
+
other.accessed if other
|
|
113
|
+
return false unless self.class == other.class
|
|
114
|
+
return false unless self.children.size == other.children.size
|
|
115
|
+
self.children.zip(other.children).each do |c1, c2|
|
|
116
|
+
return false unless c1.class == c2.class
|
|
117
|
+
if c1.kind_of? String then
|
|
118
|
+
return false unless c1 == c2
|
|
119
|
+
else
|
|
120
|
+
return false unless c1 === c2
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
if (defined? self._content) and (defined? other._content) then
|
|
124
|
+
return false unless self._content == other._content
|
|
125
|
+
else
|
|
126
|
+
return false if (defined? self._content) or (defined? other._content)
|
|
127
|
+
end
|
|
128
|
+
return true
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def to_ruby(mentions=nil)
|
|
132
|
+
accessed
|
|
133
|
+
return RubyPrinter.new(mentions).to_ruby(self)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
module XamplRubyDefinition
|
|
137
|
+
@@proc = nil
|
|
138
|
+
|
|
139
|
+
def XamplRubyDefinition.build(target = nil)
|
|
140
|
+
xampl = nil
|
|
141
|
+
if @@proc then
|
|
142
|
+
local_proc = @@proc
|
|
143
|
+
@@proc = nil
|
|
144
|
+
xampl = local_proc.call(target)
|
|
145
|
+
@@proc = nil
|
|
146
|
+
else
|
|
147
|
+
xampl = XamplRubyDefinition.build_it(target)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
return xampl
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def build_it
|
|
154
|
+
nil
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def XamplObject.from_string(string, target=nil)
|
|
159
|
+
return FromXML.new.parse_string(string, true, false, target)
|
|
160
|
+
|
|
161
|
+
# if '<' == string[0] then
|
|
162
|
+
# puts "XO.from_string XML ------------------------------------------------------"
|
|
163
|
+
# return FromXML.new.parse_string(string, true, false, target)
|
|
164
|
+
# else
|
|
165
|
+
# puts "XO.from_string RUBY ------------------------------------------------------"
|
|
166
|
+
# return XamplObject.from_ruby(string, target)
|
|
167
|
+
# end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def XamplObject.recover_from_string(string)
|
|
171
|
+
# return FromXML.new.realise_string(string)
|
|
172
|
+
return FromXML.new(true).parse_string(string, true, false, nil)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def XamplObject.from_ruby(ruby_string, target=nil)
|
|
176
|
+
eval(ruby_string, nil, "ruby_definition", 0)
|
|
177
|
+
target.load_needed = false if target
|
|
178
|
+
xampl = XamplRubyDefinition.build(target)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def persist(out="", mentions=nil, rules=nil)
|
|
182
|
+
persist_xml_new = PersistXML.new(out, mentions)
|
|
183
|
+
return persist_xml_new.start(self).done
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def XamplObject.realise_from_xml_string(xml_string, target=nil, tokenise=true)
|
|
187
|
+
xampl = FromXML.new.realise_string(xml_string, tokenise, target)
|
|
188
|
+
return xampl
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def XamplObject.from_xml_string(xml_string, tokenise=true)
|
|
192
|
+
return FromXML.new.parse_string(xml_string, tokenise)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def XamplObject.from_xml_file(file_name, tokenise=true)
|
|
196
|
+
return FromXML.new.parse(file_name, tokenise)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
module Xampl
|
|
2
|
+
|
|
3
|
+
module XamplPersistedObject
|
|
4
|
+
include XamplObject
|
|
5
|
+
|
|
6
|
+
attr_reader :persister
|
|
7
|
+
attr_accessor :load_needed
|
|
8
|
+
|
|
9
|
+
def persist_required
|
|
10
|
+
return true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def accessed
|
|
14
|
+
raise XamplIsInvalid.new(self) if invalid
|
|
15
|
+
# TODO -- why do I need to get rid of this line, alternatively, why
|
|
16
|
+
# is this next line even there? Well, because accessed is now called
|
|
17
|
+
# differently. But???
|
|
18
|
+
#raise NoActivePersister unless @persister
|
|
19
|
+
|
|
20
|
+
if @load_needed and @persister then
|
|
21
|
+
raise NoActivePersister.new unless @persister
|
|
22
|
+
|
|
23
|
+
if nil == Xampl.persister then
|
|
24
|
+
#raise UnmanagedChange.new(self)
|
|
25
|
+
if not @persister.syncing then
|
|
26
|
+
Xampl.read_only(@persister) do
|
|
27
|
+
Xampl.lazy_load(self)
|
|
28
|
+
end
|
|
29
|
+
else
|
|
30
|
+
puts "LOAD NEEDED(2): REFUSED (persister: #{@persister.name})"
|
|
31
|
+
puts " pid: #{self.get_the_index} #{self}"
|
|
32
|
+
caller(0).each { | trace | puts " #{trace}"}
|
|
33
|
+
end
|
|
34
|
+
elsif Xampl.persister != @persister then
|
|
35
|
+
raise MixedPersisters.new(@persister, self)
|
|
36
|
+
elsif Xampl.persister == @persister then
|
|
37
|
+
if not @persister.syncing then
|
|
38
|
+
Xampl.lazy_load(self)
|
|
39
|
+
else
|
|
40
|
+
puts "LOAD NEEDED(3): REFUSED (persister: #{@persister.name})"
|
|
41
|
+
puts " pid: #{self.get_the_index} #{self}"
|
|
42
|
+
caller(0).each { | trace | puts " #{trace}"}
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
puts "LOAD NEEDED(4): REFUSED (persister: #{@persister.name})"
|
|
46
|
+
puts " pid: #{self.get_the_index} #{self}"
|
|
47
|
+
caller(0).each { | trace | puts " #{trace}"}
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
puts "LOAD NEEDED(5): REFUSED (persister: #{@persister})" if @load_needed
|
|
51
|
+
puts " pid: #{self.get_the_index} #{self}" if @load_needed
|
|
52
|
+
caller(0).each { | trace | puts " #{trace}"} if @load_needed
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def changed
|
|
57
|
+
#puts "CHANGED: is_changed #{@is_changed} xampl #{self}"
|
|
58
|
+
unless Xampl.persister then
|
|
59
|
+
raise UnmanagedChange.new(self)
|
|
60
|
+
end
|
|
61
|
+
if @persister then
|
|
62
|
+
if Xampl.persister != @persister then
|
|
63
|
+
raise UnmanagedChange.new(self)
|
|
64
|
+
end
|
|
65
|
+
if @persister.block_changes then
|
|
66
|
+
raise BlockedChange.new(self)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
unless @is_changed then
|
|
70
|
+
@is_changed = true
|
|
71
|
+
if @persister then
|
|
72
|
+
@persister.has_changed self
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def force_load
|
|
78
|
+
@load_needed = true
|
|
79
|
+
@is_changed = false
|
|
80
|
+
@persister.has_not_changed(self) if @persister
|
|
81
|
+
self.clear_non_persistent_index_attributes
|
|
82
|
+
methods = self.methods.grep(/init_.*_as_child/)
|
|
83
|
+
methods.each do |method_name|
|
|
84
|
+
self.send(method_name)
|
|
85
|
+
end
|
|
86
|
+
@children = []
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def reset_contents
|
|
90
|
+
self.clear_non_persistent_index_attributes
|
|
91
|
+
self.methods.grep(/init_.*_as_child/).each do |method_name|
|
|
92
|
+
self.send(method_name)
|
|
93
|
+
end
|
|
94
|
+
@children = []
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def introduce_persister(persister)
|
|
98
|
+
#accessed
|
|
99
|
+
if @persister and (@persister != persister) then
|
|
100
|
+
raise AlreadyKnownToPersister.new(self, persister)
|
|
101
|
+
end
|
|
102
|
+
@persister = persister
|
|
103
|
+
return true
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def init_xampl_object
|
|
107
|
+
super
|
|
108
|
+
@persister = nil
|
|
109
|
+
@load_needed = false
|
|
110
|
+
if (Xampl.persister and Xampl.persister.automatic) then
|
|
111
|
+
Xampl.persister.introduce(self)
|
|
112
|
+
else
|
|
113
|
+
introduce_persister(nil)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def describe_yourself
|
|
118
|
+
nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
module Xampl
|
|
2
|
+
|
|
3
|
+
class XMLText
|
|
4
|
+
attr_accessor :namespaces, :prefix_ns_map, :ns, :first_text, :text
|
|
5
|
+
|
|
6
|
+
def initialize
|
|
7
|
+
@namespaces = []
|
|
8
|
+
@prefix_ns_map = {}
|
|
9
|
+
@first_text = nil
|
|
10
|
+
@text = nil
|
|
11
|
+
@ns = nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def start_element(pp, depth)
|
|
15
|
+
@namespaces = {}
|
|
16
|
+
@namespaces[pp.namespace] = pp.namespace
|
|
17
|
+
|
|
18
|
+
depth += 1
|
|
19
|
+
|
|
20
|
+
if @first_text then
|
|
21
|
+
@text << "<" << pp.qname
|
|
22
|
+
|
|
23
|
+
pp.attributeCount.times do |i|
|
|
24
|
+
@text << " " << pp.attributeQName(i) << "='" << pp.attributeValue(i) << "'"
|
|
25
|
+
|
|
26
|
+
prefix = pp.attributePrefix(i)
|
|
27
|
+
if prefix then
|
|
28
|
+
@prefix_ns_map[prefix] = pp.attributeNamespace(i)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
else
|
|
32
|
+
@first_text = "<" << pp.qname
|
|
33
|
+
|
|
34
|
+
pp.attributeCount.times do |i|
|
|
35
|
+
@first_text << " " << pp.attributeQName(i) << "='" << pp.attributeValue(i) << "'"
|
|
36
|
+
|
|
37
|
+
prefix = pp.attributePrefix(i)
|
|
38
|
+
if prefix then
|
|
39
|
+
@prefix_ns_map[prefix] = pp.attributeNamespace(i)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
@text = ""
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
prefix = pp.prefix
|
|
46
|
+
if prefix then
|
|
47
|
+
@prefix_ns_map[prefix] = pp.namespace
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
if @ns != pp.namespace then
|
|
51
|
+
@text << " xmlns='" << pp.namespace << "'"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
@text << ">"
|
|
55
|
+
|
|
56
|
+
return depth
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def end_element(pp, depth)
|
|
60
|
+
depth -= 1
|
|
61
|
+
|
|
62
|
+
@text << "</"
|
|
63
|
+
@text << pp.prefix << ":" if pp.prefix
|
|
64
|
+
@text << pp.name << ">"
|
|
65
|
+
|
|
66
|
+
return depth
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def to_s
|
|
70
|
+
@text
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def to_xml(xml_printer=nil)
|
|
74
|
+
@text
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def build(pp)
|
|
78
|
+
@namespaces = {}
|
|
79
|
+
@first_text = nil
|
|
80
|
+
@text = nil
|
|
81
|
+
|
|
82
|
+
depth = start_element(pp, 0)
|
|
83
|
+
|
|
84
|
+
while true
|
|
85
|
+
raise XamplException.new("unexpected end of document") if pp.endDocument?
|
|
86
|
+
|
|
87
|
+
case pp.nextEvent
|
|
88
|
+
when Xampl_PP::START_DOCUMENT
|
|
89
|
+
raise XamplException.new("unexpected start of document")
|
|
90
|
+
when Xampl_PP::END_DOCUMENT
|
|
91
|
+
raise XamplException.new("unexpected end of document")
|
|
92
|
+
when Xampl_PP::START_ELEMENT
|
|
93
|
+
depth = start_element(pp, depth)
|
|
94
|
+
when Xampl_PP::END_ELEMENT
|
|
95
|
+
depth = end_element(pp, depth)
|
|
96
|
+
break if depth <= 0
|
|
97
|
+
when Xampl_PP::TEXT, Xampl_PP::CDATA_SECTION, Xampl_PP::ENTITY_REF
|
|
98
|
+
@text << pp.text
|
|
99
|
+
#when Xampl_PP::IGNORABLE_WHITESPACE
|
|
100
|
+
#when Xampl_PP::PROCESSING_INSTRUCTION
|
|
101
|
+
#when Xampl_PP::COMMENT
|
|
102
|
+
#when Xampl_PP::DOCTYPE
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
@namespaces = @namespaces.keys
|
|
107
|
+
|
|
108
|
+
@prefix_ns_map.sort.each do |prefix, ns|
|
|
109
|
+
@first_text << " xmlns:" << prefix << "='" << ns << "'"
|
|
110
|
+
end
|
|
111
|
+
@first_text << @text
|
|
112
|
+
@text = @first_text
|
|
113
|
+
@first_text = nil
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|