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,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
+ }