libxml-jruby 1.0.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.
Files changed (61) hide show
  1. data/History.txt +4 -0
  2. data/README.txt +50 -0
  3. data/Rakefile +19 -0
  4. data/VERSION +1 -0
  5. data/VERSION.yml +5 -0
  6. data/lib/libxml-jruby.rb +84 -0
  7. data/lib/libxml-jruby/xml.rb +1 -0
  8. data/lib/libxml-jruby/xml/attr.rb +46 -0
  9. data/lib/libxml-jruby/xml/attributes.rb +68 -0
  10. data/lib/libxml-jruby/xml/document.rb +52 -0
  11. data/lib/libxml-jruby/xml/dtd.rb +25 -0
  12. data/lib/libxml-jruby/xml/node.rb +285 -0
  13. data/lib/libxml-jruby/xml/ns.rb +19 -0
  14. data/lib/libxml-jruby/xml/parser.rb +121 -0
  15. data/lib/libxml-jruby/xml/xpath.rb +98 -0
  16. data/lib/libxml.rb +1 -0
  17. data/lib/xml.rb +13 -0
  18. data/lib/xml/libxml.rb +8 -0
  19. data/test/etc_doc_to_s.rb +19 -0
  20. data/test/ets_copy_bug.rb +21 -0
  21. data/test/ets_copy_bug3.rb +38 -0
  22. data/test/ets_doc_file.rb +15 -0
  23. data/test/ets_doc_to_s.rb +21 -0
  24. data/test/ets_gpx.rb +26 -0
  25. data/test/ets_node_gc.rb +21 -0
  26. data/test/ets_tsr.rb +9 -0
  27. data/test/model/default_validation_bug.rb +0 -0
  28. data/test/tc_attributes.rb +110 -0
  29. data/test/tc_deprecated_require.rb +13 -0
  30. data/test/tc_document.rb +97 -0
  31. data/test/tc_document_write.rb +139 -0
  32. data/test/tc_dtd.rb +70 -0
  33. data/test/tc_html_parser.rb +63 -0
  34. data/test/tc_node.rb +108 -0
  35. data/test/tc_node_attr.rb +176 -0
  36. data/test/tc_node_cdata.rb +51 -0
  37. data/test/tc_node_comment.rb +32 -0
  38. data/test/tc_node_copy.rb +40 -0
  39. data/test/tc_node_edit.rb +98 -0
  40. data/test/tc_node_set.rb +24 -0
  41. data/test/tc_node_set2.rb +37 -0
  42. data/test/tc_node_text.rb +17 -0
  43. data/test/tc_node_xlink.rb +28 -0
  44. data/test/tc_ns.rb +18 -0
  45. data/test/tc_parser.rb +308 -0
  46. data/test/tc_parser_context.rb +126 -0
  47. data/test/tc_properties.rb +37 -0
  48. data/test/tc_reader.rb +112 -0
  49. data/test/tc_relaxng.rb +39 -0
  50. data/test/tc_sax_parser.rb +113 -0
  51. data/test/tc_schema.rb +39 -0
  52. data/test/tc_traversal.rb +220 -0
  53. data/test/tc_well_formed.rb +11 -0
  54. data/test/tc_xinclude.rb +26 -0
  55. data/test/tc_xpath.rb +130 -0
  56. data/test/tc_xpath_context.rb +72 -0
  57. data/test/tc_xpointer.rb +78 -0
  58. data/test/test_libxml-jruby.rb +0 -0
  59. data/test/test_suite.rb +31 -0
  60. data/test/ts_working.rb +31 -0
  61. metadata +121 -0
@@ -0,0 +1,4 @@
1
+ == 1.0.0 / 2008-09-20
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
@@ -0,0 +1,50 @@
1
+ libxml-jruby
2
+ by Michael Guterl
3
+ http://diminishing.org
4
+
5
+ == DESCRIPTION:
6
+
7
+ LibXMLJRuby is a LibXMLRuby compatibility layer that mimcs the LibXMLRuby
8
+ interface as closely as possible. LibXMLJRuby does not use libxml at all
9
+ it just delegates the methods to the appropriate underlying Java class.
10
+
11
+ == FEATURES/PROBLEMS:
12
+
13
+ * FIXME (list of features or problems)
14
+
15
+ == SYNOPSIS:
16
+
17
+ FIXME (code sample of usage)
18
+
19
+ == REQUIREMENTS:
20
+
21
+ * FIXME (list of requirements)
22
+
23
+ == INSTALL:
24
+
25
+ jruby -S gem install dylanvaughn-libxml-jruby --source=http://gems.github.com
26
+
27
+ == LICENSE:
28
+
29
+ (The MIT License)
30
+
31
+ Copyright (c) 2008 FIXME (different license?)
32
+
33
+ Permission is hereby granted, free of charge, to any person obtaining
34
+ a copy of this software and associated documentation files (the
35
+ 'Software'), to deal in the Software without restriction, including
36
+ without limitation the rights to use, copy, modify, merge, publish,
37
+ distribute, sublicense, and/or sell copies of the Software, and to
38
+ permit persons to whom the Software is furnished to do so, subject to
39
+ the following conditions:
40
+
41
+ The above copyright notice and this permission notice shall be
42
+ included in all copies or substantial portions of the Software.
43
+
44
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
45
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
46
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
47
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
48
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
49
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
50
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ #require 'libxml-jruby'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |s|
6
+ s.name = "libxml-jruby"
7
+ s.summary = "Libxml replacement for JRuby"
8
+ s.email = "uwelk@xhochy.org"
9
+ s.homepage = "http://github.com/xhochy/libxml-jruby"
10
+ s.description = "Lixml replacement for JRuby in 100% Java"
11
+ s.authors = ["Michael Guterl", "Uwe L. Korn"]
12
+ s.files = FileList["[A-Z]*", "{lib}/**/*"]
13
+ #s.add_dependency ''
14
+ end
15
+ rescue LoadError
16
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
+ end
18
+
19
+ # EOF
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,5 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 0
4
+ :major: 1
5
+
@@ -0,0 +1,84 @@
1
+ # $Id$
2
+
3
+ # Equivalent to a header guard in C/C++
4
+ # Used to prevent the class/module from being loaded more than once
5
+ unless defined? LibXMLJRuby
6
+
7
+ module LibXMLJRuby
8
+
9
+ # :stopdoc:
10
+ VERSION = '1.0.0'
11
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
12
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
13
+ # :startdoc:
14
+
15
+ # Returns the version string for the library.
16
+ #
17
+ def self.version
18
+ VERSION
19
+ end
20
+
21
+ # Returns the library path for the module. If any arguments are given,
22
+ # they will be joined to the end of the libray path using
23
+ # <tt>File.join</tt>.
24
+ #
25
+ def self.libpath( *args )
26
+ args.empty? ? LIBPATH : ::File.join(LIBPATH, *args)
27
+ end
28
+
29
+ # Returns the lpath for the module. If any arguments are given,
30
+ # they will be joined to the end of the path using
31
+ # <tt>File.join</tt>.
32
+ #
33
+ def self.path( *args )
34
+ args.empty? ? PATH : ::File.join(PATH, *args)
35
+ end
36
+
37
+ # Utility method used to rquire all files ending in .rb that lie in the
38
+ # directory below this file that has the same name as the filename passed
39
+ # in. Optionally, a specific _directory_ name can be passed in such that
40
+ # the _filename_ does not have to be equivalent to the directory.
41
+ #
42
+ def self.require_all_libs_relative_to( fname, dir = nil )
43
+ dir ||= ::File.basename(fname, '.*')
44
+ search_me = ::File.expand_path(
45
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
46
+
47
+ Dir.glob(search_me).sort.each {|rb| require rb}
48
+ end
49
+
50
+ end # module LibXMLJRuby
51
+
52
+ require 'java'
53
+ require 'stringio'
54
+
55
+ # these use include_class to avoid conflicts with Rake's top-level
56
+ # import method, the issue doesn't seem to occur when not using a
57
+ # string.
58
+ include_class 'com.sun.org.apache.xml.internal.utils.PrefixResolver'
59
+ include_class 'com.sun.org.apache.xml.internal.utils.PrefixResolverDefault'
60
+ include_class 'org.xml.sax.InputSource'
61
+
62
+ include_class 'java.io.ByteArrayInputStream'
63
+ include_class 'java.io.StringReader'
64
+ include_class 'java.io.StringWriter'
65
+
66
+ include_class 'javax.xml.parsers.DocumentBuilder'
67
+ include_class 'javax.xml.parsers.DocumentBuilderFactory'
68
+ include_class 'javax.xml.transform.stream.StreamSource'
69
+ include_class 'javax.xml.transform.stream.StreamResult'
70
+ include_class 'javax.xml.transform.TransformerFactory'
71
+ include_class 'javax.xml.transform.dom.DOMSource'
72
+ include_class 'javax.xml.validation.Schema'
73
+ include_class 'javax.xml.validation.SchemaFactory'
74
+ include_class 'javax.xml.xpath.XPath'
75
+ include_class 'javax.xml.xpath.XPathFactory'
76
+ include_class 'javax.xml.xpath.XPathConstants'
77
+
78
+
79
+ LibXMLJRuby.require_all_libs_relative_to __FILE__
80
+ ::LibXML = ::LibXMLJRuby
81
+
82
+ end # unless defined?
83
+
84
+ # EOF
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/xml/node'
@@ -0,0 +1,46 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ class Attr < Node
4
+ class << self
5
+ def from_java(java_obj)
6
+ return nil unless java_obj
7
+ a = allocate
8
+ a.java_obj = java_obj
9
+ a
10
+ end
11
+ end
12
+
13
+ attr_accessor :java_obj
14
+
15
+ def initialize(node, name, value, ns = nil)
16
+ self.java_obj = node.java_obj
17
+ java_obj.set_attribute(name, value)
18
+ end
19
+
20
+ def remove!
21
+ java_obj.owner_element.remove_attribute(name)
22
+ end
23
+
24
+ def parent?
25
+ !!parent
26
+ end
27
+
28
+ def parent
29
+ XML::Node.from_java(java_obj.owner_element)
30
+ end
31
+
32
+ def name
33
+ java_obj.respond_to?(:name) ? java_obj.name : java_obj.node_name
34
+ end
35
+
36
+ def value
37
+ java_obj.value
38
+ end
39
+
40
+ def value=(value)
41
+ raise TypeError if value.nil?
42
+ java_obj.value = value
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,68 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ class Attributes
4
+ include Enumerable
5
+
6
+ class << self
7
+ def from_java(java_obj)
8
+ attrs = XML::Attributes.new
9
+ attrs.java_obj = java_obj
10
+ attrs
11
+ end
12
+ end
13
+
14
+ attr_accessor :java_obj
15
+
16
+ def initialize
17
+ @attribute_cache = {}
18
+ end
19
+
20
+ def each
21
+ i = 0
22
+ while(i < length)
23
+ yield get_attribute(java_obj.attributes.item(i).name)
24
+ i += 1
25
+ end
26
+ end
27
+
28
+ def length
29
+ java_obj.attributes.length
30
+ end
31
+
32
+ def [](name)
33
+ attr = get_attribute(name)
34
+ attr ? attr.value : nil
35
+ end
36
+
37
+ def []=(name, value)
38
+ attr = get_attribute(name)
39
+ if attr
40
+ attr.value = value
41
+ else
42
+ java_obj.setAttribute(name.to_s, value.to_s)
43
+ end
44
+ end
45
+
46
+ def get_attribute_ns(name, ns)
47
+ attr = java_obj.get_attribute_node_ns(name, ns)
48
+ attr ? nil : XML::Attr.from_java(attr)
49
+ end
50
+
51
+ def get_attribute(name)
52
+ if @attribute_cache[name.to_s]
53
+ @attribute_cache[name.to_s]
54
+ elsif java_obj && java_obj.attributes
55
+ attr = java_obj.attributes.get_named_item(name.to_s)
56
+ if attr
57
+ @attribute_cache[name.to_s] = XML::Attr.from_java(attr)
58
+ @attribute_cache[name.to_s]
59
+ else
60
+ nil
61
+ end
62
+ else
63
+ nil
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,52 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ class Document
4
+ class << self
5
+ def file(filename)
6
+ XML::Parser.file(filename).parse
7
+ end
8
+
9
+ def string(str)
10
+ XML::Parser.string(str).parse
11
+ end
12
+
13
+ def from_java(java_obj)
14
+ d = new
15
+ d.java_obj = java_obj
16
+ d
17
+ end
18
+ end
19
+
20
+ attr_accessor :java_obj # org.w3c.dom.Document
21
+
22
+ def initialize(xml_version = 1.0)
23
+ @xml_version = xml_version
24
+ @xpath_cache = {}
25
+ end
26
+
27
+ def validate(dtd)
28
+ dtd.validate(self)
29
+ end
30
+
31
+ def find(expr, nslist = nil)
32
+ @xpath_cache[[expr, nslist]] ||= XML::XPath::Object.new(expr, self, nslist)
33
+ end
34
+
35
+ def find_first(expr, nslist = nil)
36
+ find(expr, nslist).first
37
+ end
38
+
39
+ def child?
40
+ java_obj.hasChildNodes
41
+ end
42
+
43
+ def parent?
44
+ !!java_obj.parent_node
45
+ end
46
+
47
+ def root
48
+ @root ||= Node.from_java(java_obj.document_element)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,25 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ class Dtd
4
+ def initialize(schema)
5
+ @schema = schema
6
+ end
7
+
8
+ def validate(doc)
9
+ validator.validate(doc)
10
+ end
11
+
12
+ def schema_factory
13
+ SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
14
+ end
15
+
16
+ def schema
17
+ schema = schema_factory.newSchema(StreamSource.new(ByteArrayInputStream.new(@schema.to_java_bytes)))
18
+ end
19
+
20
+ def validator
21
+ schema.newValidator
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,285 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ class Node
4
+ ATTRIBUTE_NODE = org.w3c.dom.Node.ATTRIBUTE_NODE
5
+ CDATA_SECTION_NODE = org.w3c.dom.Node.CDATA_SECTION_NODE
6
+ COMMENT_NODE = org.w3c.dom.Node.COMMENT_NODE
7
+ DOCUMENT_FRAG_NODE = org.w3c.dom.Node.DOCUMENT_FRAGMENT_NODE
8
+ DOCUMENT_NODE = org.w3c.dom.Node.DOCUMENT_NODE
9
+ DOCUMENT_TYPE_NODE = org.w3c.dom.Node.DOCUMENT_TYPE_NODE
10
+ ELEMENT_NODE = org.w3c.dom.Node.ELEMENT_NODE
11
+ ENTITY_NODE = org.w3c.dom.Node.ENTITY_NODE
12
+ ENTITY_REFERENCE_NODE = org.w3c.dom.Node.ENTITY_REFERENCE_NODE
13
+ NOTATION_NODE = org.w3c.dom.Node.NOTATION_NODE
14
+ PROCESSING_INSTRUCTION_NODE = org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE
15
+ TEXT_NODE = org.w3c.dom.Node.TEXT_NODE
16
+
17
+ class << self
18
+ def from_java(java_obj)
19
+ return nil if java_obj.nil?
20
+ n = allocate
21
+ n.java_obj = java_obj
22
+ n
23
+ end
24
+ end
25
+
26
+ include Enumerable
27
+
28
+ attr_accessor :java_obj # org.w3c.dom.Element(Node?)
29
+
30
+ def initialize(name, content = nil)
31
+ jdoc = DocumentBuilderFactory.new_instance.new_document_builder.new_document
32
+ self.java_obj = jdoc.createElement(name)
33
+ self.content = content
34
+ end
35
+
36
+ def name
37
+ java_obj.node_name ||= @name
38
+ end
39
+
40
+ def content
41
+ java_obj.text_content ||= @content
42
+ end
43
+
44
+ def name=(name)
45
+ @name = name
46
+ java_obj.node_name = @name if @name
47
+ end
48
+
49
+ def base
50
+ b = java_obj.getAttributeNS('xml', 'base')
51
+ b.empty? ? nil : b
52
+ end
53
+
54
+ def content=(content)
55
+ @content = content
56
+ java_obj.node_value = @value if @value
57
+ end
58
+
59
+ def child_add(node)
60
+ java_obj.getOwnerDocument.adoptNode(node.java_obj)
61
+ java_obj.appendChild(node.java_obj) # should this be importNode?
62
+ end
63
+
64
+ def copy(deep = false)
65
+ XML::Node.from_java(java_obj.cloneNode(deep))
66
+ end
67
+
68
+ def <<(node)
69
+
70
+ end
71
+
72
+ def each(&block)
73
+ children.each(&block)
74
+ end
75
+
76
+ def each_element
77
+ if block_given?
78
+ each do |node|
79
+ yield(node) if node.node_type == ELEMENT_NODE
80
+ end
81
+ else
82
+ select do |node|
83
+ node.node_type == org.w3c.dom.Node.ELEMENT_NODE
84
+ end
85
+ end
86
+ end
87
+
88
+ def find(expr)
89
+ XML::XPath::Object.new(expr, java_obj)
90
+ end
91
+
92
+ def find_first(expr)
93
+ raise TypeError if java_obj.nil?
94
+ find(expr).first
95
+ end
96
+
97
+ def node_type
98
+ java_obj.node_type
99
+ end
100
+
101
+ def node_type_name
102
+ case node_type
103
+ # Most common choices first
104
+ when ATTRIBUTE_NODE
105
+ 'attribute'
106
+ when DOCUMENT_NODE
107
+ 'document_xml'
108
+ when ELEMENT_NODE
109
+ 'element'
110
+ when TEXT_NODE
111
+ 'text'
112
+
113
+ # Now the rest
114
+ when ATTRIBUTE_DECL
115
+ 'attribute_decl'
116
+ when CDATA_SECTION_NODE
117
+ 'cdata'
118
+ when COMMENT_NODE
119
+ 'comment'
120
+ when DOCB_DOCUMENT_NODE
121
+ 'document_docbook'
122
+ when DOCUMENT_FRAG_NODE
123
+ 'fragment'
124
+ when DOCUMENT_TYPE_NODE
125
+ 'doctype'
126
+ when DTD_NODE
127
+ 'dtd'
128
+ when ELEMENT_DECL
129
+ 'elem_decl'
130
+ when ENTITY_DECL
131
+ 'entity_decl'
132
+ when ENTITY_NODE
133
+ 'entity'
134
+ when ENTITY_REF_NODE
135
+ 'entity_ref'
136
+ when HTML_DOCUMENT_NODE
137
+ 'document_html'
138
+ when NAMESPACE_DECL
139
+ 'namespace'
140
+ when NOTATION_NODE
141
+ 'notation'
142
+ when PI_NODE
143
+ 'pi'
144
+ when XINCLUDE_START
145
+ 'xinclude_start'
146
+ when XINCLUDE_END
147
+ 'xinclude_end'
148
+ else
149
+ raise(UnknownType, "Unknown node type: %n", node.node_type);
150
+ end
151
+ end
152
+
153
+ def first
154
+ child
155
+ end
156
+
157
+ def children
158
+ @children ||= XML::Node::Set.from_java(java_obj.getChildNodes).to_a
159
+ end
160
+
161
+ def child?
162
+ !!child
163
+ end
164
+
165
+ def prev?
166
+ !!prev
167
+ end
168
+
169
+ def next?
170
+ !!self.next
171
+ end
172
+
173
+ def parent?
174
+ !!parent
175
+ end
176
+
177
+ def parent
178
+ @parent ||= XML::Node.from_java(java_obj.parent_node)
179
+ end
180
+
181
+ def prev
182
+ @prev ||= XML::Node.from_java(java_obj.previous_sibling)
183
+ end
184
+
185
+ def last
186
+ @last ||= XML::Node.from_java(java_obj.last_child)
187
+ end
188
+
189
+ def child
190
+ @child ||= XML::Node.from_java(java_obj.first_child)
191
+ end
192
+
193
+ def next
194
+ @next ||= XML::Node.from_java(java_obj.next_sibling)
195
+ end
196
+
197
+ def attributes
198
+ @attributes ||= XML::Attributes.from_java(java_obj)
199
+ end
200
+
201
+ def [](name)
202
+ attributes[name]
203
+ end
204
+
205
+ def []=(name, value)
206
+ attributes[name] = value
207
+ end
208
+
209
+ def ==(other)
210
+ eql?(other)
211
+ end
212
+
213
+ def eql?(other)
214
+ return false if other.nil?
215
+ raise TypeError unless self.class === other
216
+ (java_obj.eql?(other.java_obj) || self.to_s == other.to_s)
217
+ end
218
+
219
+ def equal?(other)
220
+ self.class === other && java_obj.equal?(other.java_obj)
221
+ end
222
+
223
+ def doc
224
+ @doc ||= XML::Document.from_java(java_obj.owner_document)
225
+ end
226
+
227
+ def to_s
228
+ transformer = TransformerFactory.newInstance.newTransformer
229
+ result = StreamResult.new(StringWriter.new)
230
+ source = DOMSource.new(java_obj)
231
+ transformer.transform(source, result)
232
+ result.getWriter.toString
233
+ end
234
+
235
+ def document?
236
+ doc == self
237
+ end
238
+
239
+ alias :properties :attributes
240
+
241
+ class Set
242
+ class << self
243
+ def from_java(java_obj)
244
+ s = new
245
+ s.java_obj = java_obj
246
+ s
247
+ end
248
+ end
249
+
250
+ include Enumerable
251
+
252
+ attr_accessor :java_obj
253
+
254
+ def initialize
255
+ @java_obj = java_obj
256
+ @node_cache = {}
257
+ end
258
+
259
+ def length
260
+ java_obj.length
261
+ end
262
+
263
+ def empty?
264
+ java_obj.length < 1
265
+ end
266
+
267
+ def [](index)
268
+ @node_cache[index] ||= XML::Node.from_java(java_obj.item(index))
269
+ end
270
+
271
+ def first
272
+ self[0]
273
+ end
274
+
275
+ def each
276
+ i = 0
277
+ while(i < java_obj.length)
278
+ yield self[i]
279
+ i += 1
280
+ end
281
+ end
282
+ end
283
+ end
284
+ end
285
+ end