libxml-jruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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