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,19 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ class NS
4
+ class << self
5
+ def from_java(java_obj)
6
+
7
+ end
8
+ end
9
+
10
+ def initialize(node, href, prefix)
11
+ @node, @href, @prefix = node, href, prefix
12
+ end
13
+
14
+ attr_reader :href, :prefix
15
+ def href?; !!href; end
16
+ def prefix?; !!prefix; end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,121 @@
1
+ class LibXMLJRuby::XML::Parser
2
+ class ParseError < RuntimeError; end
3
+
4
+ VERNUM = 0
5
+ VERSION = '0'
6
+
7
+ @default_tree_indent_string = ' '
8
+ @check_lib_versions = ''
9
+ @features = []
10
+
11
+ class << self
12
+ attr_accessor :debug_entities, :default_compression,
13
+ :default_keep_blanks, :default_line_numbers,
14
+ :default_substitute_entities,
15
+ :default_tree_indent_string,
16
+ :default_validity_checking, :default_warnings,
17
+ :features, :indent_tree_output,
18
+ :check_lib_versions
19
+
20
+ def register_error_handler(handler = nil, &block)
21
+
22
+ end
23
+
24
+ def file(filename)
25
+ p = new
26
+ p.filename = filename
27
+ p
28
+ end
29
+
30
+ def string(string)
31
+ p = new
32
+ p.string = string
33
+ p
34
+ end
35
+
36
+ def io(io)
37
+ p = new
38
+ p.io = io
39
+ p
40
+ end
41
+ end
42
+
43
+ def initialize
44
+ @source_type = nil
45
+ @parsed = false
46
+ end
47
+
48
+ attr_reader :string, :filename, :io
49
+
50
+ def string=(string = nil)
51
+ raise TypeError if string.nil?
52
+ @parsed = false
53
+ @source_type = String
54
+ @string = string
55
+ end
56
+
57
+ def filename=(filename)
58
+ @source_type = File
59
+ @filename = filename
60
+ end
61
+
62
+ def io=(io)
63
+ raise TypeError if StringIO === io
64
+ @io = io
65
+ self.string = @io.read
66
+ end
67
+
68
+ def parse
69
+ raise ParseError, "You cannot parse twice" if @parsed
70
+ raise ParseError, "No input specified, please specify an input" unless @source_type
71
+ doc = send("parse_#{@source_type.to_s.downcase}")
72
+ @parsed = true
73
+ doc
74
+ end
75
+
76
+ def document_builder_factory
77
+ @dbf ||= DocumentBuilderFactory.new_instance
78
+ end
79
+
80
+ def document_builder
81
+ document_builder_factory.namespace_aware = true
82
+ document_builder_factory.new_document_builder
83
+ end
84
+
85
+ def string_reader
86
+ StringReader.new(@string)
87
+ end
88
+
89
+ def input_source
90
+ InputSource.new(string_reader)
91
+ end
92
+
93
+ def parse_string
94
+ raise ParseError if @string.empty?
95
+ builder = document_builder
96
+
97
+ begin
98
+ jdoc = builder.parse(input_source)
99
+ rescue NativeException
100
+ raise ParseError
101
+ end
102
+
103
+ XML::Document.from_java(jdoc)
104
+ end
105
+
106
+ def parse_file
107
+ builder = document_builder
108
+
109
+ begin
110
+ jdoc = builder.parse(@filename)
111
+ rescue
112
+ raise ParseError
113
+ end
114
+
115
+ XML::Document.from_java(jdoc)
116
+ end
117
+
118
+ def parse_io
119
+ parse_string
120
+ end
121
+ end
@@ -0,0 +1,98 @@
1
+ module LibXMLJRuby
2
+ module XML
3
+ module XPath
4
+ NODESET = nil
5
+
6
+ class Object
7
+ include Enumerable
8
+
9
+ def initialize(expr, document, nslist = nil)
10
+ @expr, @document = expr, document
11
+ @nslist = nslist
12
+ end
13
+
14
+ def each(&block)
15
+ set.each(&block)
16
+ end
17
+
18
+ def length
19
+ set.length
20
+ end
21
+
22
+ def first
23
+ set.first
24
+ end
25
+
26
+ def xpath_type
27
+ XML::XPath::NODESET
28
+ end
29
+
30
+ def set
31
+ @set ||= XML::Node::Set.from_java(evaluate_expression)
32
+ end
33
+
34
+ def [](index)
35
+ set[index]
36
+ end
37
+
38
+ private
39
+ def xpath_factory
40
+ @xpath_factory ||= XPathFactory.new_instance
41
+ end
42
+
43
+ def xpath
44
+ @xpath ||= xpath_factory.newXPath
45
+ end
46
+
47
+ def resolver
48
+ PrefixResolverDefault.new(doc_element)
49
+ end
50
+
51
+ def doc_element
52
+ if document.respond_to?(:getDocumentElement)
53
+ document.getDocumentElement
54
+ elsif document.respond_to?(:getOwnerDocument)
55
+ document.getOwnerDocument
56
+ else
57
+ nil
58
+ end
59
+ end
60
+
61
+ def namespace_context
62
+ CustomNamespaceContext.new(resolver)
63
+ end
64
+
65
+ def evaluate_expression
66
+ xpath.setNamespaceContext(namespace_context)
67
+ xpath.evaluate(@expr, document, XPathConstants::NODESET)
68
+ end
69
+
70
+ def document
71
+ @document.respond_to?(:java_obj) ? @document.java_obj : @document
72
+ end
73
+
74
+ class CustomNamespaceContext
75
+ include javax.xml.namespace.NamespaceContext
76
+
77
+ attr_reader :resolver
78
+
79
+ def initialize(resolver)
80
+ @resolver = resolver
81
+ end
82
+
83
+ def getNamespaceURI(prefix)
84
+ resolver.getNamespaceForPrefix(prefix)
85
+ end
86
+
87
+ def getPrefixes(val)
88
+ nil
89
+ end
90
+
91
+ def getPrefix(uri)
92
+ nil
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1 @@
1
+ require 'libxml-jruby'
@@ -0,0 +1,13 @@
1
+ # This file loads libxml and adds the LibXML namespace
2
+ # to the toplevel for conveneience. The end result
3
+ # is to have XML:: universally exposed.
4
+ #
5
+ # It is recommend that you only load this file for libs
6
+ # that do not have their own namespace, eg. administrative
7
+ # scripts, personal programs, etc. For other applications
8
+ # require 'libxml' instead and include LibXML into your
9
+ # app/libs namespace.
10
+
11
+ require 'libxml'
12
+
13
+ include LibXML
@@ -0,0 +1,8 @@
1
+ # This is here for backward compatibility.
2
+ #
3
+ # TODO: DEPRECATE!
4
+
5
+ require 'libxml.rb'
6
+
7
+ include LibXML
8
+
@@ -0,0 +1,19 @@
1
+ require 'xml'
2
+
3
+ 1.times do |count|
4
+
5
+ xml_doc = XML::Document.new()
6
+ xml_doc.encoding = "UTF-8"
7
+ xml_doc.root = XML::Node.new("Request")
8
+
9
+ 1000.times do |index|
10
+ xml_doc.root << node = XML::Node.new("row")
11
+ node["user_id"] = index.to_s
12
+ node << "600445"
13
+ end
14
+
15
+ xml_str = xml_doc.to_s
16
+ print "\r#{count}"
17
+ $stdout.flush
18
+ end
19
+ puts "\n"
@@ -0,0 +1,21 @@
1
+ require 'xml'
2
+
3
+ def test( doc2 )
4
+ doc = XML::Document.new('1.0')
5
+ doc.root = XML::Node.new("ccc")
6
+ doc.root['aaa'] = 'aaa'
7
+ doc.root.child_add(doc2.root.copy(true)) # BUG!
8
+ doc.root << doc2.root.copy(true)
9
+ return doc
10
+ end
11
+
12
+ def test2
13
+ doc2 = XML::Document.new('1.0')
14
+ doc2.root = XML::Node.new("aaa")
15
+ test( doc2 )
16
+ end
17
+
18
+ 1000.times { |i|
19
+ print "\r#{i}"; $stdout.flush
20
+ test2
21
+ }
@@ -0,0 +1,38 @@
1
+ require 'xml'
2
+
3
+ str = <<-STR
4
+ <html>
5
+ <body>
6
+ <div class="textarea" id="t1"
7
+ style="STATIC">werwerwerwerwer </div>
8
+ <div class="textarea" id="t2" style="STATIC">
9
+ Quisque et diam dapibus nisi bibendum blandit.
10
+ </div>
11
+ <div class="textarea" id="t3" style="STATIC">
12
+ <p>aaaaaaaaa</p>
13
+ </div>
14
+ </body>
15
+ </html>
16
+ STR
17
+
18
+ XML::Parser.default_keep_blanks = false
19
+ xp = XML::Parser.new
20
+ xp.string = str
21
+ doc = xp.parse
22
+
23
+ xpath = "//div[@id='t1']"
24
+ div1 = doc.find(xpath).to_a[0]
25
+ printf "xxx div1: #{div1}\n"
26
+
27
+ xpath = "//div[@id='t2']"
28
+ div2 = doc.find(xpath).to_a[0]
29
+ printf "xxx div2: #{div2}\n"
30
+
31
+
32
+ div2.each do |child|
33
+ #c = child.clone
34
+ c = child.copy(false)
35
+ div1.child_add(c)
36
+ end
37
+
38
+ printf "xxx root: #{doc.root}\n"
@@ -0,0 +1,15 @@
1
+ require 'xml'
2
+
3
+ # This is related to bug 8337, complaint is on amd64/fbsd
4
+ # unknown if it happens on other amd64/os combos
5
+
6
+ Process.setrlimit(Process::RLIMIT_NOFILE,10005)
7
+
8
+ (1..10000).each{|time|
9
+ XML::Document.file(File.join(File.dirname(__FILE__),'ets_test.xml'))
10
+ if time % 100 == 0
11
+ print "\r#{time}"
12
+ $stdout.flush
13
+ end
14
+ }
15
+ puts "\n"
@@ -0,0 +1,21 @@
1
+ require 'xml'
2
+
3
+ 100.times do |count|
4
+
5
+ xml_doc = XML::Document.new()
6
+ xml_doc.encoding = "UTF-8"
7
+ xml_doc.root = XML::Node.new("Request")
8
+
9
+ 1000.times do |index|
10
+
11
+ xml_doc.root << node = XML::Node.new("row")
12
+ node["user_id"] = index.to_s
13
+ node << "600445"
14
+
15
+ end
16
+
17
+ xml_str = xml_doc.to_s
18
+ print "\r#{count}"
19
+ $stdout.flush
20
+ end
21
+ puts "\n"
@@ -0,0 +1,26 @@
1
+ require 'libxml'
2
+
3
+ 100.times do
4
+ doc = XML::Document.new
5
+ doc.encoding = 'UTF-8'
6
+
7
+ root = XML::Node.new 'gpx'
8
+ root['version'] = '1.0'
9
+ root['creator'] = 'OpenStreetMap.org'
10
+ root['xmlns'] = "http://www.topografix.com/GPX/1/0/"
11
+
12
+ doc.root = root
13
+
14
+ track = XML::Node.new 'trk'
15
+ doc.root << track
16
+
17
+ trkseg = XML::Node.new 'trkseg'
18
+ track << trkseg
19
+
20
+ 1.upto(1000) do |n|
21
+ trkpt = XML::Node.new 'trkpt'
22
+ trkpt['lat'] = n.to_s
23
+ trkpt['lon'] = n.to_s
24
+ trkseg << trkpt
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ require 'xml'
2
+
3
+ # test of bug 13310, clears MEM2
4
+
5
+ include GC
6
+
7
+ inner = XML::Node.new('inner')
8
+ save = nil
9
+ 1.times do
10
+ outer = XML::Node.new('outer')
11
+ outer.child = inner
12
+ 1.times do
13
+ doc = XML::Document.new
14
+ doc.root = outer
15
+ # Uncomment the following line and it won't crash
16
+ save = doc
17
+ end
18
+ garbage_collect
19
+ end
20
+ garbage_collect
21
+ puts inner
@@ -0,0 +1,9 @@
1
+ require 'xml'
2
+
3
+ 10_000.times {|n|
4
+ j=XML::Node.new2(nil,"happy#{n}")
5
+ 10.times {|r|
6
+ j1=XML::Node.new("happy#{r}","farts")
7
+ j.child=j1
8
+ }
9
+ }