nokogiri 1.11.0.rc4-java → 1.11.5-java

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +12 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +168 -91
  6. data/dependencies.yml +12 -12
  7. data/ext/java/nokogiri/EncodingHandler.java +76 -89
  8. data/ext/java/nokogiri/HtmlDocument.java +135 -144
  9. data/ext/java/nokogiri/HtmlElementDescription.java +102 -117
  10. data/ext/java/nokogiri/HtmlEntityLookup.java +33 -60
  11. data/ext/java/nokogiri/HtmlSaxParserContext.java +218 -222
  12. data/ext/java/nokogiri/HtmlSaxPushParser.java +162 -169
  13. data/ext/java/nokogiri/NokogiriService.java +595 -556
  14. data/ext/java/nokogiri/XmlAttr.java +118 -126
  15. data/ext/java/nokogiri/XmlAttributeDecl.java +95 -106
  16. data/ext/java/nokogiri/XmlCdata.java +35 -58
  17. data/ext/java/nokogiri/XmlComment.java +46 -67
  18. data/ext/java/nokogiri/XmlDocument.java +645 -572
  19. data/ext/java/nokogiri/XmlDocumentFragment.java +125 -137
  20. data/ext/java/nokogiri/XmlDtd.java +448 -414
  21. data/ext/java/nokogiri/XmlElement.java +23 -48
  22. data/ext/java/nokogiri/XmlElementContent.java +343 -316
  23. data/ext/java/nokogiri/XmlElementDecl.java +124 -125
  24. data/ext/java/nokogiri/XmlEntityDecl.java +119 -127
  25. data/ext/java/nokogiri/XmlEntityReference.java +49 -72
  26. data/ext/java/nokogiri/XmlNamespace.java +175 -175
  27. data/ext/java/nokogiri/XmlNode.java +1843 -1620
  28. data/ext/java/nokogiri/XmlNodeSet.java +361 -331
  29. data/ext/java/nokogiri/XmlProcessingInstruction.java +47 -69
  30. data/ext/java/nokogiri/XmlReader.java +513 -450
  31. data/ext/java/nokogiri/XmlRelaxng.java +85 -104
  32. data/ext/java/nokogiri/XmlSaxParserContext.java +328 -315
  33. data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
  34. data/ext/java/nokogiri/XmlSchema.java +328 -295
  35. data/ext/java/nokogiri/XmlSyntaxError.java +113 -115
  36. data/ext/java/nokogiri/XmlText.java +55 -76
  37. data/ext/java/nokogiri/XmlXpathContext.java +240 -238
  38. data/ext/java/nokogiri/XsltStylesheet.java +280 -269
  39. data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +201 -202
  41. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
  42. data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
  43. data/ext/java/nokogiri/internals/NokogiriDomParser.java +63 -80
  44. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
  45. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +27 -52
  46. data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -286
  47. data/ext/java/nokogiri/internals/NokogiriHelpers.java +736 -652
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +184 -173
  49. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +81 -98
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +64 -79
  51. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +84 -99
  52. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +48 -65
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +116 -131
  54. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -56
  55. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +23 -46
  56. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +55 -72
  57. data/ext/java/nokogiri/internals/ParserContext.java +206 -211
  58. data/ext/java/nokogiri/internals/ReaderNode.java +478 -403
  59. data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -739
  60. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +31 -54
  61. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
  62. data/ext/java/nokogiri/internals/XmlDeclHandler.java +3 -34
  63. data/ext/java/nokogiri/internals/XmlDomParserContext.java +206 -207
  64. data/ext/java/nokogiri/internals/XmlSaxParser.java +22 -47
  65. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
  66. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
  67. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
  68. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
  69. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
  70. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
  71. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
  72. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
  73. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
  74. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
  75. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
  76. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
  77. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
  78. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
  79. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
  80. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
  81. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
  82. data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
  83. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
  84. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
  85. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
  86. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
  87. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
  88. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
  89. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
  90. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
  91. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
  92. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
  93. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -574
  94. data/ext/nokogiri/depend +34 -474
  95. data/ext/nokogiri/extconf.rb +270 -183
  96. data/ext/nokogiri/html_document.c +10 -15
  97. data/ext/nokogiri/html_element_description.c +84 -71
  98. data/ext/nokogiri/html_entity_lookup.c +21 -16
  99. data/ext/nokogiri/html_sax_parser_context.c +67 -64
  100. data/ext/nokogiri/html_sax_push_parser.c +42 -34
  101. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  102. data/ext/nokogiri/nokogiri.c +190 -60
  103. data/ext/nokogiri/test_global_handlers.c +40 -0
  104. data/ext/nokogiri/xml_attr.c +15 -15
  105. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  106. data/ext/nokogiri/xml_cdata.c +13 -18
  107. data/ext/nokogiri/xml_comment.c +19 -26
  108. data/ext/nokogiri/xml_document.c +246 -188
  109. data/ext/nokogiri/xml_document_fragment.c +13 -15
  110. data/ext/nokogiri/xml_dtd.c +54 -48
  111. data/ext/nokogiri/xml_element_content.c +30 -27
  112. data/ext/nokogiri/xml_element_decl.c +22 -22
  113. data/ext/nokogiri/xml_encoding_handler.c +17 -11
  114. data/ext/nokogiri/xml_entity_decl.c +32 -30
  115. data/ext/nokogiri/xml_entity_reference.c +16 -18
  116. data/ext/nokogiri/xml_namespace.c +56 -49
  117. data/ext/nokogiri/xml_node.c +371 -320
  118. data/ext/nokogiri/xml_node_set.c +168 -156
  119. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  120. data/ext/nokogiri/xml_reader.c +191 -157
  121. data/ext/nokogiri/xml_relax_ng.c +29 -23
  122. data/ext/nokogiri/xml_sax_parser.c +117 -112
  123. data/ext/nokogiri/xml_sax_parser_context.c +101 -84
  124. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  125. data/ext/nokogiri/xml_schema.c +48 -42
  126. data/ext/nokogiri/xml_syntax_error.c +42 -21
  127. data/ext/nokogiri/xml_text.c +13 -17
  128. data/ext/nokogiri/xml_xpath_context.c +134 -127
  129. data/ext/nokogiri/xslt_stylesheet.c +157 -157
  130. data/lib/nokogiri.rb +2 -6
  131. data/lib/nokogiri/css/parser.rb +1 -1
  132. data/lib/nokogiri/extension.rb +26 -0
  133. data/lib/nokogiri/html/document_fragment.rb +15 -15
  134. data/lib/nokogiri/nokogiri.jar +0 -0
  135. data/lib/nokogiri/version/constant.rb +1 -1
  136. data/lib/nokogiri/version/info.rb +32 -8
  137. data/lib/nokogiri/xml/document.rb +74 -28
  138. data/lib/nokogiri/xml/node.rb +39 -42
  139. data/lib/nokogiri/xml/reader.rb +2 -9
  140. data/lib/nokogiri/xml/xpath.rb +1 -3
  141. data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
  142. metadata +62 -127
  143. data/ext/nokogiri/xml_io.c +0 -63
  144. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
@@ -1,35 +1,3 @@
1
- /**
2
- * (The MIT License)
3
- *
4
- * Copyright (c) 2008 - 2011:
5
- *
6
- * * {Aaron Patterson}[http://tenderlovemaking.com]
7
- * * {Mike Dalessio}[http://mike.daless.io]
8
- * * {Charles Nutter}[http://blog.headius.com]
9
- * * {Sergio Arbeo}[http://www.serabe.com]
10
- * * {Patrick Mahoney}[http://polycrystal.org]
11
- * * {Yoko Harada}[http://yokolet.blogspot.com]
12
- *
13
- * Permission is hereby granted, free of charge, to any person obtaining
14
- * a copy of this software and associated documentation files (the
15
- * 'Software'), to deal in the Software without restriction, including
16
- * without limitation the rights to use, copy, modify, merge, publish,
17
- * distribute, sublicense, and/or sell copies of the Software, and to
18
- * permit persons to whom the Software is furnished to do so, subject to
19
- * the following conditions:
20
- *
21
- * The above copyright notice and this permission notice shall be
22
- * included in all copies or substantial portions of the Software.
23
- *
24
- * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
25
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
- */
32
-
33
1
  package nokogiri;
34
2
 
35
3
  import static nokogiri.internals.NokogiriHelpers.adjustSystemIdIfNecessary;
@@ -79,310 +47,375 @@ import org.xml.sax.SAXParseException;
79
47
  * @author sergio
80
48
  * @author Yoko Harada <yokolet@gmail.com>
81
49
  */
82
- @JRubyClass(name="Nokogiri::XML::Schema")
83
- public class XmlSchema extends RubyObject {
84
- private Validator validator;
85
-
86
- public XmlSchema(Ruby ruby, RubyClass klazz) {
87
- super(ruby, klazz);
50
+ @JRubyClass(name = "Nokogiri::XML::Schema")
51
+ public class XmlSchema extends RubyObject
52
+ {
53
+ private Validator validator;
54
+
55
+ public
56
+ XmlSchema(Ruby ruby, RubyClass klazz)
57
+ {
58
+ super(ruby, klazz);
59
+ }
60
+
61
+ /**
62
+ * Create and return a copy of this object.
63
+ *
64
+ * @return a clone of this object
65
+ */
66
+ @Override
67
+ public Object
68
+ clone() throws CloneNotSupportedException
69
+ {
70
+ return super.clone();
71
+ }
72
+
73
+ private Schema
74
+ getSchema(Source source,
75
+ String currentDir,
76
+ String scriptFileName,
77
+ SchemaErrorHandler errorHandler,
78
+ long parseOptions) throws SAXException
79
+ {
80
+ boolean noNet = new ParserContext.Options(parseOptions).noNet;
81
+
82
+ SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
83
+ SchemaResourceResolver resourceResolver =
84
+ new SchemaResourceResolver(currentDir, scriptFileName, null, errorHandler, noNet);
85
+
86
+ schemaFactory.setResourceResolver(resourceResolver);
87
+ schemaFactory.setErrorHandler(errorHandler);
88
+
89
+ return schemaFactory.newSchema(source);
90
+ }
91
+
92
+ private void
93
+ setValidator(Validator validator)
94
+ {
95
+ this.validator = validator;
96
+ }
97
+
98
+ static XmlSchema
99
+ createSchemaInstance(ThreadContext context, RubyClass klazz, Source source, IRubyObject parseOptions)
100
+ {
101
+ Ruby runtime = context.getRuntime();
102
+ XmlSchema xmlSchema = (XmlSchema) NokogiriService.XML_SCHEMA_ALLOCATOR.allocate(runtime, klazz);
103
+
104
+ if (parseOptions == null) {
105
+ parseOptions = defaultParseOptions(context.getRuntime());
88
106
  }
89
-
90
- /**
91
- * Create and return a copy of this object.
92
- *
93
- * @return a clone of this object
94
- */
95
- @Override
96
- public Object clone() throws CloneNotSupportedException {
97
- return super.clone();
107
+ long intParseOptions = RubyFixnum.fix2long(Helpers.invoke(context, parseOptions, "to_i"));
108
+
109
+ xmlSchema.setInstanceVariable("@errors", runtime.newEmptyArray());
110
+ xmlSchema.setInstanceVariable("@parse_options", parseOptions);
111
+
112
+ try {
113
+ SchemaErrorHandler errorHandler =
114
+ new SchemaErrorHandler(context.getRuntime(), (RubyArray)xmlSchema.getInstanceVariable("@errors"));
115
+ Schema schema =
116
+ xmlSchema.getSchema(source,
117
+ context.getRuntime().getCurrentDirectory(),
118
+ context.getRuntime().getInstanceConfig().getScriptFileName(),
119
+ errorHandler,
120
+ intParseOptions);
121
+ xmlSchema.setValidator(schema.newValidator());
122
+ return xmlSchema;
123
+ } catch (SAXException ex) {
124
+ throw context.getRuntime().newRuntimeError("Could not parse document: " + ex.getMessage());
125
+ }
126
+ }
127
+
128
+ protected static IRubyObject
129
+ defaultParseOptions(Ruby runtime)
130
+ {
131
+ return ((RubyClass)runtime.getClassFromPath("Nokogiri::XML::ParseOptions")).getConstant("DEFAULT_SCHEMA");
132
+ }
133
+
134
+ /*
135
+ * call-seq:
136
+ * from_document(doc)
137
+ *
138
+ * Create a new Schema from the Nokogiri::XML::Document +doc+
139
+ */
140
+ @JRubyMethod(meta = true, required = 1, optional = 1)
141
+ public static IRubyObject
142
+ from_document(ThreadContext context, IRubyObject klazz, IRubyObject[] args)
143
+ {
144
+ IRubyObject document = args[0];
145
+ IRubyObject parseOptions = null;
146
+ if (args.length > 1) {
147
+ parseOptions = args[1];
98
148
  }
99
149
 
100
- private Schema getSchema(Source source,
101
- String currentDir,
102
- String scriptFileName,
103
- SchemaErrorHandler errorHandler,
104
- long parseOptions) throws SAXException {
105
- boolean noNet = new ParserContext.Options(parseOptions).noNet;
150
+ XmlDocument doc = ((XmlDocument)((XmlNode) document).document(context));
106
151
 
107
- SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
108
- SchemaResourceResolver resourceResolver =
109
- new SchemaResourceResolver(currentDir, scriptFileName, null, errorHandler, noNet);
152
+ RubyArray errors = (RubyArray) doc.getInstanceVariable("@errors");
153
+ if (!errors.isEmpty()) {
154
+ throw((XmlSyntaxError) errors.first()).toThrowable();
155
+ }
156
+
157
+ DOMSource source = new DOMSource(doc.getDocument());
110
158
 
111
- schemaFactory.setResourceResolver(resourceResolver);
112
- schemaFactory.setErrorHandler(errorHandler);
159
+ IRubyObject uri = doc.url(context);
113
160
 
114
- return schemaFactory.newSchema(source);
161
+ if (!uri.isNil()) {
162
+ source.setSystemId(uri.convertToString().asJavaString());
115
163
  }
116
164
 
117
- private void setValidator(Validator validator) {
118
- this.validator = validator;
165
+ return getSchema(context, (RubyClass)klazz, source, parseOptions);
166
+ }
167
+
168
+ @JRubyMethod(meta = true, required = 1, optional = 1)
169
+ public static IRubyObject
170
+ read_memory(ThreadContext context, IRubyObject klazz, IRubyObject[] args)
171
+ {
172
+ IRubyObject content = args[0];
173
+ IRubyObject parseOptions = null;
174
+ if (args.length > 1) {
175
+ parseOptions = args[1];
176
+ }
177
+ String data = content.convertToString().asJavaString();
178
+ return getSchema(context, (RubyClass) klazz, new StreamSource(new StringReader(data)), parseOptions);
179
+ }
180
+
181
+ private static IRubyObject
182
+ getSchema(ThreadContext context, RubyClass klazz, Source source, IRubyObject parseOptions)
183
+ {
184
+ String moduleName = klazz.getName();
185
+ if ("Nokogiri::XML::Schema".equals(moduleName)) {
186
+ return XmlSchema.createSchemaInstance(context, klazz, source, parseOptions);
187
+ } else if ("Nokogiri::XML::RelaxNG".equals(moduleName)) {
188
+ return XmlRelaxng.createSchemaInstance(context, klazz, source, parseOptions);
189
+ }
190
+ return context.getRuntime().getNil();
191
+ }
192
+
193
+ @JRubyMethod(visibility = Visibility.PRIVATE)
194
+ public IRubyObject
195
+ validate_document(ThreadContext context, IRubyObject document)
196
+ {
197
+ return validate_document_or_file(context, (XmlDocument)document);
198
+ }
199
+
200
+ @JRubyMethod(visibility = Visibility.PRIVATE)
201
+ public IRubyObject
202
+ validate_file(ThreadContext context, IRubyObject file)
203
+ {
204
+ Ruby runtime = context.runtime;
205
+
206
+ XmlDomParserContext ctx = new XmlDomParserContext(runtime, RubyFixnum.newFixnum(runtime, 1L));
207
+ ctx.setInputSourceFile(context, file);
208
+ XmlDocument xmlDocument = ctx.parse(context, getNokogiriClass(runtime, "Nokogiri::XML::Document"), context.nil);
209
+ return validate_document_or_file(context, xmlDocument);
210
+ }
211
+
212
+ IRubyObject
213
+ validate_document_or_file(ThreadContext context, XmlDocument xmlDocument)
214
+ {
215
+ RubyArray errors = (RubyArray) this.getInstanceVariable("@errors");
216
+ ErrorHandler errorHandler = new SchemaErrorHandler(context.runtime, errors);
217
+ setErrorHandler(errorHandler);
218
+
219
+ try {
220
+ validate(xmlDocument.getDocument());
221
+ } catch (SAXException ex) {
222
+ XmlSyntaxError xmlSyntaxError = XmlSyntaxError.createXMLSyntaxError(context.runtime);
223
+ xmlSyntaxError.setException(ex);
224
+ errors.append(xmlSyntaxError);
225
+ } catch (IOException ex) {
226
+ throw context.runtime.newIOError(ex.getMessage());
119
227
  }
120
228
 
121
- static XmlSchema createSchemaInstance(ThreadContext context, RubyClass klazz, Source source, IRubyObject parseOptions) {
122
- Ruby runtime = context.getRuntime();
123
- XmlSchema xmlSchema = (XmlSchema) NokogiriService.XML_SCHEMA_ALLOCATOR.allocate(runtime, klazz);
229
+ return errors;
230
+ }
231
+
232
+ protected void
233
+ setErrorHandler(ErrorHandler errorHandler)
234
+ {
235
+ validator.setErrorHandler(errorHandler);
236
+ }
237
+
238
+ protected void
239
+ validate(Document document) throws SAXException, IOException
240
+ {
241
+ DOMSource docSource = new DOMSource(document);
242
+ validator.validate(docSource);
243
+ }
244
+
245
+ private class SchemaResourceResolver implements LSResourceResolver
246
+ {
247
+ SchemaLSInput lsInput = new SchemaLSInput();
248
+ String currentDir;
249
+ String scriptFileName;
250
+ SchemaErrorHandler errorHandler;
251
+ boolean noNet;
252
+ //String defaultURI;
253
+
254
+ SchemaResourceResolver(String currentDir, String scriptFileName, Object input, SchemaErrorHandler errorHandler,
255
+ boolean noNet)
256
+ {
257
+ this.currentDir = currentDir;
258
+ this.scriptFileName = scriptFileName;
259
+ this.errorHandler = errorHandler;
260
+ this.noNet = noNet;
261
+ if (input == null) { return; }
262
+ if (input instanceof String) {
263
+ lsInput.setStringData((String)input);
264
+ } else if (input instanceof Reader) {
265
+ lsInput.setCharacterStream((Reader)input);
266
+ } else if (input instanceof InputStream) {
267
+ lsInput.setByteStream((InputStream)input);
268
+ }
269
+ }
124
270
 
125
- if (parseOptions == null) {
126
- parseOptions = defaultParseOptions(context.getRuntime());
271
+ @Override
272
+ public LSInput
273
+ resolveResource(String type,
274
+ String namespaceURI,
275
+ String publicId,
276
+ String systemId,
277
+ String baseURI)
278
+ {
279
+ if (noNet && (systemId.startsWith("http://") || systemId.startsWith("ftp://"))) {
280
+ if (systemId.startsWith(XMLConstants.W3C_XML_SCHEMA_NS_URI)) {
281
+ return null; // use default resolver
127
282
  }
128
- long intParseOptions = RubyFixnum.fix2long(Helpers.invoke(context, parseOptions, "to_i"));
129
-
130
- xmlSchema.setInstanceVariable("@errors", runtime.newEmptyArray());
131
- xmlSchema.setInstanceVariable("@parse_options", parseOptions);
132
-
133
283
  try {
134
- SchemaErrorHandler errorHandler =
135
- new SchemaErrorHandler(context.getRuntime(), (RubyArray)xmlSchema.getInstanceVariable("@errors"));
136
- Schema schema =
137
- xmlSchema.getSchema(source,
138
- context.getRuntime().getCurrentDirectory(),
139
- context.getRuntime().getInstanceConfig().getScriptFileName(),
140
- errorHandler,
141
- intParseOptions);
142
- xmlSchema.setValidator(schema.newValidator());
143
- return xmlSchema;
284
+ this.errorHandler.warning(new SAXParseException(String.format("Attempt to load network entity '%s'", systemId), null));
144
285
  } catch (SAXException ex) {
145
- throw context.getRuntime().newRuntimeError("Could not parse document: " + ex.getMessage());
146
286
  }
287
+ } else {
288
+ String adjusted = adjustSystemIdIfNecessary(currentDir, scriptFileName, baseURI, systemId);
289
+ lsInput.setPublicId(publicId);
290
+ lsInput.setSystemId(adjusted != null ? adjusted : systemId);
291
+ lsInput.setBaseURI(baseURI);
292
+ }
293
+ return lsInput;
147
294
  }
295
+ }
296
+
297
+ private class SchemaLSInput implements LSInput
298
+ {
299
+ protected String fPublicId;
300
+ protected String fSystemId;
301
+ protected String fBaseSystemId;
302
+ protected InputStream fByteStream;
303
+ protected Reader fCharStream;
304
+ protected String fData;
305
+ protected String fEncoding;
306
+ protected boolean fCertifiedText = false;
148
307
 
149
- protected static IRubyObject defaultParseOptions(Ruby runtime) {
150
- return ((RubyClass)runtime.getClassFromPath("Nokogiri::XML::ParseOptions")).getConstant("DEFAULT_SCHEMA");
308
+ @Override
309
+ public String
310
+ getBaseURI()
311
+ {
312
+ return fBaseSystemId;
151
313
  }
152
314
 
153
- /*
154
- * call-seq:
155
- * from_document(doc)
156
- *
157
- * Create a new Schema from the Nokogiri::XML::Document +doc+
158
- */
159
- @JRubyMethod(meta=true, required=1, optional=1)
160
- public static IRubyObject from_document(ThreadContext context, IRubyObject klazz, IRubyObject[] args) {
161
- IRubyObject document = args[0];
162
- IRubyObject parseOptions = null;
163
- if (args.length > 1) {
164
- parseOptions = args[1];
165
- }
166
-
167
- XmlDocument doc = ((XmlDocument) ((XmlNode) document).document(context));
168
-
169
- RubyArray errors = (RubyArray) doc.getInstanceVariable("@errors");
170
- if (!errors.isEmpty()) {
171
- throw ((XmlSyntaxError) errors.first()).toThrowable();
172
- }
173
-
174
- DOMSource source = new DOMSource(doc.getDocument());
175
-
176
- IRubyObject uri = doc.url(context);
177
-
178
- if (!uri.isNil()) {
179
- source.setSystemId(uri.convertToString().asJavaString());
180
- }
181
-
182
- return getSchema(context, (RubyClass)klazz, source, parseOptions);
315
+ @Override
316
+ public InputStream
317
+ getByteStream()
318
+ {
319
+ return fByteStream;
183
320
  }
184
321
 
185
- @JRubyMethod(meta=true, required=1, optional=1)
186
- public static IRubyObject read_memory(ThreadContext context, IRubyObject klazz, IRubyObject[] args) {
187
- IRubyObject content = args[0];
188
- IRubyObject parseOptions = null;
189
- if (args.length > 1) {
190
- parseOptions = args[1];
191
- }
192
- String data = content.convertToString().asJavaString();
193
- return getSchema(context, (RubyClass) klazz, new StreamSource(new StringReader(data)), parseOptions);
322
+ @Override
323
+ public boolean
324
+ getCertifiedText()
325
+ {
326
+ return fCertifiedText;
194
327
  }
195
328
 
196
- private static IRubyObject getSchema(ThreadContext context, RubyClass klazz, Source source, IRubyObject parseOptions) {
197
- String moduleName = klazz.getName();
198
- if ("Nokogiri::XML::Schema".equals(moduleName)) {
199
- return XmlSchema.createSchemaInstance(context, klazz, source, parseOptions);
200
- } else if ("Nokogiri::XML::RelaxNG".equals(moduleName)) {
201
- return XmlRelaxng.createSchemaInstance(context, klazz, source, parseOptions);
202
- }
203
- return context.getRuntime().getNil();
329
+ @Override
330
+ public Reader
331
+ getCharacterStream()
332
+ {
333
+ return fCharStream;
204
334
  }
205
335
 
206
- @JRubyMethod(visibility=Visibility.PRIVATE)
207
- public IRubyObject validate_document(ThreadContext context, IRubyObject document) {
208
- return validate_document_or_file(context, (XmlDocument)document);
336
+ @Override
337
+ public String
338
+ getEncoding()
339
+ {
340
+ return fEncoding;
209
341
  }
210
342
 
211
- @JRubyMethod(visibility=Visibility.PRIVATE)
212
- public IRubyObject validate_file(ThreadContext context, IRubyObject file) {
213
- Ruby runtime = context.runtime;
214
-
215
- XmlDomParserContext ctx = new XmlDomParserContext(runtime, RubyFixnum.newFixnum(runtime, 1L));
216
- ctx.setInputSourceFile(context, file);
217
- XmlDocument xmlDocument = ctx.parse(context, getNokogiriClass(runtime, "Nokogiri::XML::Document"), context.nil);
218
- return validate_document_or_file(context, xmlDocument);
343
+ @Override
344
+ public String
345
+ getPublicId()
346
+ {
347
+ return fPublicId;
219
348
  }
220
349
 
221
- IRubyObject validate_document_or_file(ThreadContext context, XmlDocument xmlDocument) {
222
- RubyArray errors = (RubyArray) this.getInstanceVariable("@errors");
223
- ErrorHandler errorHandler = new SchemaErrorHandler(context.runtime, errors);
224
- setErrorHandler(errorHandler);
225
-
226
- try {
227
- validate(xmlDocument.getDocument());
228
- }
229
- catch (SAXException ex) {
230
- XmlSyntaxError xmlSyntaxError = XmlSyntaxError.createXMLSyntaxError(context.runtime);
231
- xmlSyntaxError.setException(ex);
232
- errors.append(xmlSyntaxError);
233
- }
234
- catch (IOException ex) {
235
- throw context.runtime.newIOError(ex.getMessage());
236
- }
237
-
238
- return errors;
350
+ @Override
351
+ public String
352
+ getStringData()
353
+ {
354
+ return fData;
239
355
  }
240
356
 
241
- protected void setErrorHandler(ErrorHandler errorHandler) {
242
- validator.setErrorHandler(errorHandler);
357
+ @Override
358
+ public String
359
+ getSystemId()
360
+ {
361
+ return fSystemId;
243
362
  }
244
363
 
245
- protected void validate(Document document) throws SAXException, IOException {
246
- DOMSource docSource = new DOMSource(document);
247
- validator.validate(docSource);
364
+ @Override
365
+ public void
366
+ setBaseURI(String baseURI)
367
+ {
368
+ fBaseSystemId = baseURI;
248
369
  }
249
370
 
250
- private class SchemaResourceResolver implements LSResourceResolver {
251
- SchemaLSInput lsInput = new SchemaLSInput();
252
- String currentDir;
253
- String scriptFileName;
254
- SchemaErrorHandler errorHandler;
255
- boolean noNet;
256
- //String defaultURI;
257
-
258
- SchemaResourceResolver(String currentDir, String scriptFileName, Object input, SchemaErrorHandler errorHandler, boolean noNet) {
259
- this.currentDir = currentDir;
260
- this.scriptFileName = scriptFileName;
261
- this.errorHandler = errorHandler;
262
- this.noNet = noNet;
263
- if (input == null) return;
264
- if (input instanceof String) {
265
- lsInput.setStringData((String)input);
266
- } else if (input instanceof Reader) {
267
- lsInput.setCharacterStream((Reader)input);
268
- } else if (input instanceof InputStream) {
269
- lsInput.setByteStream((InputStream)input);
270
- }
271
- }
272
-
273
- @Override
274
- public LSInput resolveResource(String type,
275
- String namespaceURI,
276
- String publicId,
277
- String systemId,
278
- String baseURI) {
279
- if (noNet && (systemId.startsWith("http://") || systemId.startsWith("ftp://"))) {
280
- if (systemId.startsWith(XMLConstants.W3C_XML_SCHEMA_NS_URI)) {
281
- return null; // use default resolver
282
- }
283
- try {
284
- this.errorHandler.warning(new SAXParseException(String.format("Attempt to load network entity '%s'", systemId), null));
285
- } catch (SAXException ex) {
286
- }
287
- } else {
288
- String adjusted = adjustSystemIdIfNecessary(currentDir, scriptFileName, baseURI, systemId);
289
- lsInput.setPublicId(publicId);
290
- lsInput.setSystemId(adjusted != null? adjusted : systemId);
291
- lsInput.setBaseURI(baseURI);
292
- }
293
- return lsInput;
294
- }
371
+ @Override
372
+ public void
373
+ setByteStream(InputStream byteStream)
374
+ {
375
+ fByteStream = byteStream;
295
376
  }
296
377
 
297
- private class SchemaLSInput implements LSInput {
298
- protected String fPublicId;
299
- protected String fSystemId;
300
- protected String fBaseSystemId;
301
- protected InputStream fByteStream;
302
- protected Reader fCharStream;
303
- protected String fData;
304
- protected String fEncoding;
305
- protected boolean fCertifiedText = false;
306
-
307
- @Override
308
- public String getBaseURI() {
309
- return fBaseSystemId;
310
- }
311
-
312
- @Override
313
- public InputStream getByteStream() {
314
- return fByteStream;
315
- }
316
-
317
- @Override
318
- public boolean getCertifiedText() {
319
- return fCertifiedText;
320
- }
321
-
322
- @Override
323
- public Reader getCharacterStream() {
324
- return fCharStream;
325
- }
326
-
327
- @Override
328
- public String getEncoding() {
329
- return fEncoding;
330
- }
331
-
332
- @Override
333
- public String getPublicId() {
334
- return fPublicId;
335
- }
336
-
337
- @Override
338
- public String getStringData() {
339
- return fData;
340
- }
341
-
342
- @Override
343
- public String getSystemId() {
344
- return fSystemId;
345
- }
346
-
347
- @Override
348
- public void setBaseURI(String baseURI) {
349
- fBaseSystemId = baseURI;
350
- }
351
-
352
- @Override
353
- public void setByteStream(InputStream byteStream) {
354
- fByteStream = byteStream;
355
- }
356
-
357
- @Override
358
- public void setCertifiedText(boolean certified) {
359
- fCertifiedText = certified;
360
- }
361
-
362
- @Override
363
- public void setCharacterStream(Reader charStream) {
364
- fCharStream = charStream;
365
- }
378
+ @Override
379
+ public void
380
+ setCertifiedText(boolean certified)
381
+ {
382
+ fCertifiedText = certified;
383
+ }
366
384
 
367
- @Override
368
- public void setEncoding(String encoding) {
369
- fEncoding = encoding;
370
- }
385
+ @Override
386
+ public void
387
+ setCharacterStream(Reader charStream)
388
+ {
389
+ fCharStream = charStream;
390
+ }
371
391
 
372
- @Override
373
- public void setPublicId(String pubId) {
374
- fPublicId = pubId;
375
- }
392
+ @Override
393
+ public void
394
+ setEncoding(String encoding)
395
+ {
396
+ fEncoding = encoding;
397
+ }
376
398
 
377
- @Override
378
- public void setStringData(String stringData) {
379
- fData = stringData;
380
- }
399
+ @Override
400
+ public void
401
+ setPublicId(String pubId)
402
+ {
403
+ fPublicId = pubId;
404
+ }
381
405
 
382
- @Override
383
- public void setSystemId(String sysId) {
384
- fSystemId = sysId;
385
- }
406
+ @Override
407
+ public void
408
+ setStringData(String stringData)
409
+ {
410
+ fData = stringData;
411
+ }
386
412
 
413
+ @Override
414
+ public void
415
+ setSystemId(String sysId)
416
+ {
417
+ fSystemId = sysId;
387
418
  }
419
+
420
+ }
388
421
  }