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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/LICENSE-DEPENDENCIES.md +12 -12
- data/LICENSE.md +1 -1
- data/README.md +168 -91
- data/dependencies.yml +12 -12
- data/ext/java/nokogiri/EncodingHandler.java +76 -89
- data/ext/java/nokogiri/HtmlDocument.java +135 -144
- data/ext/java/nokogiri/HtmlElementDescription.java +102 -117
- data/ext/java/nokogiri/HtmlEntityLookup.java +33 -60
- data/ext/java/nokogiri/HtmlSaxParserContext.java +218 -222
- data/ext/java/nokogiri/HtmlSaxPushParser.java +162 -169
- data/ext/java/nokogiri/NokogiriService.java +595 -556
- data/ext/java/nokogiri/XmlAttr.java +118 -126
- data/ext/java/nokogiri/XmlAttributeDecl.java +95 -106
- data/ext/java/nokogiri/XmlCdata.java +35 -58
- data/ext/java/nokogiri/XmlComment.java +46 -67
- data/ext/java/nokogiri/XmlDocument.java +645 -572
- data/ext/java/nokogiri/XmlDocumentFragment.java +125 -137
- data/ext/java/nokogiri/XmlDtd.java +448 -414
- data/ext/java/nokogiri/XmlElement.java +23 -48
- data/ext/java/nokogiri/XmlElementContent.java +343 -316
- data/ext/java/nokogiri/XmlElementDecl.java +124 -125
- data/ext/java/nokogiri/XmlEntityDecl.java +119 -127
- data/ext/java/nokogiri/XmlEntityReference.java +49 -72
- data/ext/java/nokogiri/XmlNamespace.java +175 -175
- data/ext/java/nokogiri/XmlNode.java +1843 -1620
- data/ext/java/nokogiri/XmlNodeSet.java +361 -331
- data/ext/java/nokogiri/XmlProcessingInstruction.java +47 -69
- data/ext/java/nokogiri/XmlReader.java +513 -450
- data/ext/java/nokogiri/XmlRelaxng.java +85 -104
- data/ext/java/nokogiri/XmlSaxParserContext.java +328 -315
- data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
- data/ext/java/nokogiri/XmlSchema.java +328 -295
- data/ext/java/nokogiri/XmlSyntaxError.java +113 -115
- data/ext/java/nokogiri/XmlText.java +55 -76
- data/ext/java/nokogiri/XmlXpathContext.java +240 -238
- data/ext/java/nokogiri/XsltStylesheet.java +280 -269
- data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
- data/ext/java/nokogiri/internals/HtmlDomParserContext.java +201 -202
- data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
- data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
- data/ext/java/nokogiri/internals/NokogiriDomParser.java +63 -80
- data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
- data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +27 -52
- data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -286
- data/ext/java/nokogiri/internals/NokogiriHelpers.java +736 -652
- data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +184 -173
- data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +81 -98
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +64 -79
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +84 -99
- data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +48 -65
- data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +116 -131
- data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -56
- data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +23 -46
- data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +55 -72
- data/ext/java/nokogiri/internals/ParserContext.java +206 -211
- data/ext/java/nokogiri/internals/ReaderNode.java +478 -403
- data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -739
- data/ext/java/nokogiri/internals/SchemaErrorHandler.java +31 -54
- data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
- data/ext/java/nokogiri/internals/XmlDeclHandler.java +3 -34
- data/ext/java/nokogiri/internals/XmlDomParserContext.java +206 -207
- data/ext/java/nokogiri/internals/XmlSaxParser.java +22 -47
- data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
- data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
- data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
- data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
- data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
- data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
- data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
- data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
- data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
- data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
- data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
- data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
- data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
- data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
- data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
- data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
- data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -574
- data/ext/nokogiri/depend +34 -474
- data/ext/nokogiri/extconf.rb +270 -183
- data/ext/nokogiri/html_document.c +10 -15
- data/ext/nokogiri/html_element_description.c +84 -71
- data/ext/nokogiri/html_entity_lookup.c +21 -16
- data/ext/nokogiri/html_sax_parser_context.c +67 -64
- data/ext/nokogiri/html_sax_push_parser.c +42 -34
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +190 -60
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +15 -15
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +246 -188
- data/ext/nokogiri/xml_document_fragment.c +13 -15
- data/ext/nokogiri/xml_dtd.c +54 -48
- data/ext/nokogiri/xml_element_content.c +30 -27
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +17 -11
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +56 -49
- data/ext/nokogiri/xml_node.c +371 -320
- data/ext/nokogiri/xml_node_set.c +168 -156
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +191 -157
- data/ext/nokogiri/xml_relax_ng.c +29 -23
- data/ext/nokogiri/xml_sax_parser.c +117 -112
- data/ext/nokogiri/xml_sax_parser_context.c +101 -84
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +48 -42
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +134 -127
- data/ext/nokogiri/xslt_stylesheet.c +157 -157
- data/lib/nokogiri.rb +2 -6
- data/lib/nokogiri/css/parser.rb +1 -1
- data/lib/nokogiri/extension.rb +26 -0
- data/lib/nokogiri/html/document_fragment.rb +15 -15
- data/lib/nokogiri/nokogiri.jar +0 -0
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/version/info.rb +32 -8
- data/lib/nokogiri/xml/document.rb +74 -28
- data/lib/nokogiri/xml/node.rb +39 -42
- data/lib/nokogiri/xml/reader.rb +2 -9
- data/lib/nokogiri/xml/xpath.rb +1 -3
- data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
- metadata +62 -127
- data/ext/nokogiri/xml_io.c +0 -63
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
@@ -4,17 +4,24 @@ import org.xml.sax.ErrorHandler;
|
|
4
4
|
import org.xml.sax.SAXException;
|
5
5
|
import org.xml.sax.SAXParseException;
|
6
6
|
|
7
|
-
public class IgnoreSchemaErrorsErrorHandler implements ErrorHandler
|
7
|
+
public class IgnoreSchemaErrorsErrorHandler implements ErrorHandler
|
8
|
+
{
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
@Override
|
11
|
+
public void
|
12
|
+
warning(SAXParseException exception) throws SAXException
|
13
|
+
{
|
14
|
+
}
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
@Override
|
17
|
+
public void
|
18
|
+
error(SAXParseException exception) throws SAXException
|
19
|
+
{
|
20
|
+
}
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
@Override
|
23
|
+
public void
|
24
|
+
fatalError(SAXParseException exception) throws SAXException
|
25
|
+
{
|
26
|
+
}
|
20
27
|
}
|
@@ -23,7 +23,8 @@ import nokogiri.XmlSaxPushParser;
|
|
23
23
|
*
|
24
24
|
* @author John Shahid <jvshahid@gmail.com>
|
25
25
|
*/
|
26
|
-
public class NokogiriBlockingQueueInputStream extends InputStream
|
26
|
+
public class NokogiriBlockingQueueInputStream extends InputStream
|
27
|
+
{
|
27
28
|
private final LinkedBlockingQueue<Task> queue;
|
28
29
|
protected Task currentTask;
|
29
30
|
protected ByteArrayInputStream currentStream;
|
@@ -32,10 +33,13 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
32
33
|
|
33
34
|
public static final ByteArrayInputStream END = new ByteArrayInputStream(new byte[0]);
|
34
35
|
|
35
|
-
private static class Task extends FutureTask<Void>
|
36
|
+
private static class Task extends FutureTask<Void>
|
37
|
+
{
|
36
38
|
private final ByteArrayInputStream stream;
|
37
39
|
|
38
|
-
public
|
40
|
+
public
|
41
|
+
Task(ByteArrayInputStream stream)
|
42
|
+
{
|
39
43
|
super(new Callable<Void>() {
|
40
44
|
@Override
|
41
45
|
public Void call() throws Exception {
|
@@ -46,28 +50,38 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
46
50
|
this.stream = stream;
|
47
51
|
}
|
48
52
|
|
49
|
-
public ByteArrayInputStream
|
53
|
+
public ByteArrayInputStream
|
54
|
+
getStream()
|
55
|
+
{
|
50
56
|
return stream;
|
51
57
|
}
|
52
58
|
|
53
59
|
@Override
|
54
|
-
public void
|
60
|
+
public void
|
61
|
+
run()
|
62
|
+
{
|
55
63
|
// don't do anything
|
56
64
|
}
|
57
65
|
|
58
66
|
@Override
|
59
|
-
public boolean
|
67
|
+
public boolean
|
68
|
+
runAndReset()
|
69
|
+
{
|
60
70
|
// don't do anything
|
61
71
|
return true;
|
62
72
|
}
|
63
73
|
|
64
74
|
@Override
|
65
|
-
public void
|
75
|
+
public void
|
76
|
+
set(Void v)
|
77
|
+
{
|
66
78
|
super.set(v);
|
67
79
|
}
|
68
80
|
}
|
69
81
|
|
70
|
-
public
|
82
|
+
public
|
83
|
+
NokogiriBlockingQueueInputStream()
|
84
|
+
{
|
71
85
|
queue = new LinkedBlockingQueue<Task>();
|
72
86
|
}
|
73
87
|
|
@@ -77,7 +91,9 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
77
91
|
* that the read method will block indefinitely.
|
78
92
|
*/
|
79
93
|
@Override
|
80
|
-
public synchronized void
|
94
|
+
public synchronized void
|
95
|
+
close()
|
96
|
+
{
|
81
97
|
closed = true;
|
82
98
|
List<Task> tasks = new LinkedList<Task>();
|
83
99
|
queue.drainTo(tasks);
|
@@ -98,9 +114,12 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
98
114
|
*
|
99
115
|
* @return
|
100
116
|
*/
|
101
|
-
public synchronized Future<Void>
|
102
|
-
|
117
|
+
public synchronized Future<Void>
|
118
|
+
addChunk(ByteArrayInputStream stream) throws ClosedStreamException
|
119
|
+
{
|
120
|
+
if (closed) {
|
103
121
|
throw new ClosedStreamException("Cannot add a chunk to a closed stream");
|
122
|
+
}
|
104
123
|
Task task = new Task(stream);
|
105
124
|
queue.add(task);
|
106
125
|
return task;
|
@@ -112,10 +131,13 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
112
131
|
* @see java.io.InputStream#read()
|
113
132
|
*/
|
114
133
|
@Override
|
115
|
-
public int
|
134
|
+
public int
|
135
|
+
read() throws IOException
|
136
|
+
{
|
116
137
|
if (currentTask == null || currentStream.available() == 0)
|
117
|
-
if (getNextTask() == -1)
|
138
|
+
if (getNextTask() == -1) {
|
118
139
|
return -1;
|
140
|
+
}
|
119
141
|
return currentStream.read();
|
120
142
|
}
|
121
143
|
|
@@ -125,7 +147,9 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
125
147
|
* @see java.io.InputStream#read(byte[], int, int)
|
126
148
|
*/
|
127
149
|
@Override
|
128
|
-
public int
|
150
|
+
public int
|
151
|
+
read(byte[] bytes, int off, int len)
|
152
|
+
{
|
129
153
|
if (currentTask == null || currentStream.available() == 0) {
|
130
154
|
if (getNextTask() == -1) {
|
131
155
|
currentTask.set(null);
|
@@ -135,11 +159,14 @@ public class NokogiriBlockingQueueInputStream extends InputStream {
|
|
135
159
|
return currentStream.read(bytes, off, len);
|
136
160
|
}
|
137
161
|
|
138
|
-
protected int
|
162
|
+
protected int
|
163
|
+
getNextTask()
|
164
|
+
{
|
139
165
|
while (true) {
|
140
166
|
try {
|
141
|
-
if (currentTask != null)
|
167
|
+
if (currentTask != null) {
|
142
168
|
currentTask.set(null);
|
169
|
+
}
|
143
170
|
currentTask = queue.take();
|
144
171
|
currentStream = currentTask.getStream();
|
145
172
|
return currentStream.available() == 0 ? -1 : currentStream.available();
|
@@ -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.internals;
|
34
2
|
|
35
3
|
import java.io.IOException;
|
@@ -53,64 +21,79 @@ import org.xml.sax.SAXException;
|
|
53
21
|
*
|
54
22
|
* @author Patrick Mahoney <pat@polycrystal.org>
|
55
23
|
*/
|
56
|
-
public class NokogiriDomParser extends DOMParser
|
57
|
-
|
58
|
-
|
59
|
-
|
24
|
+
public class NokogiriDomParser extends DOMParser
|
25
|
+
{
|
26
|
+
protected DOMParser dtd;
|
27
|
+
protected boolean xInclude;
|
28
|
+
protected XMLParserConfiguration config;
|
60
29
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
30
|
+
public
|
31
|
+
NokogiriDomParser(XMLParserConfiguration config)
|
32
|
+
{
|
33
|
+
super(config);
|
34
|
+
this.config = config;
|
35
|
+
initialize();
|
36
|
+
}
|
37
|
+
|
38
|
+
public
|
39
|
+
NokogiriDomParser(ParserContext.Options options)
|
40
|
+
{
|
41
|
+
xInclude = options.xInclude;
|
42
|
+
initialize();
|
43
|
+
}
|
66
44
|
|
67
|
-
|
68
|
-
|
69
|
-
|
45
|
+
protected void
|
46
|
+
initialize()
|
47
|
+
{
|
48
|
+
if (config == null) {
|
49
|
+
if (xInclude) {
|
50
|
+
config = new XIncludeParserConfiguration();
|
51
|
+
} else {
|
52
|
+
config = getXMLParserConfiguration();
|
53
|
+
}
|
70
54
|
}
|
71
55
|
|
72
|
-
|
73
|
-
|
74
|
-
if (xInclude) {
|
75
|
-
config = new XIncludeParserConfiguration();
|
76
|
-
} else {
|
77
|
-
config = getXMLParserConfiguration();
|
78
|
-
}
|
79
|
-
}
|
56
|
+
DTDConfiguration dtdConfig = new DTDConfiguration();
|
57
|
+
dtd = new DOMParser(dtdConfig);
|
80
58
|
|
81
|
-
|
82
|
-
|
59
|
+
config.setDTDHandler(dtdConfig);
|
60
|
+
config.setDTDContentModelHandler(dtdConfig);
|
61
|
+
}
|
83
62
|
|
84
|
-
|
85
|
-
|
63
|
+
@Override
|
64
|
+
public void
|
65
|
+
parse(InputSource source) throws SAXException, IOException
|
66
|
+
{
|
67
|
+
dtd.reset();
|
68
|
+
if (xInclude) {
|
69
|
+
setEntityResolver(new NokogiriXInlcudeEntityResolver(source));
|
70
|
+
}
|
71
|
+
super.parse(source);
|
72
|
+
Document doc = getDocument();
|
73
|
+
if (doc == null) {
|
74
|
+
throw new RuntimeException("null document");
|
86
75
|
}
|
87
76
|
|
88
|
-
|
89
|
-
|
90
|
-
dtd.reset();
|
91
|
-
if (xInclude) {
|
92
|
-
setEntityResolver(new NokogiriXInlcudeEntityResolver(source));
|
93
|
-
}
|
94
|
-
super.parse(source);
|
95
|
-
Document doc = getDocument();
|
96
|
-
if (doc == null)
|
97
|
-
throw new RuntimeException("null document");
|
77
|
+
doc.setUserData(XmlDocument.DTD_RAW_DOCUMENT, dtd.getDocument(), null);
|
78
|
+
}
|
98
79
|
|
99
|
-
|
80
|
+
private static class NokogiriXInlcudeEntityResolver implements org.xml.sax.EntityResolver
|
81
|
+
{
|
82
|
+
InputSource source;
|
83
|
+
private
|
84
|
+
NokogiriXInlcudeEntityResolver(InputSource source)
|
85
|
+
{
|
86
|
+
this.source = source;
|
100
87
|
}
|
101
88
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
throws SAXException, IOException {
|
111
|
-
if (systemId != null) source.setSystemId(systemId);
|
112
|
-
if (publicId != null) source.setPublicId(publicId);
|
113
|
-
return source;
|
114
|
-
}
|
89
|
+
@Override
|
90
|
+
public InputSource
|
91
|
+
resolveEntity(String publicId, String systemId)
|
92
|
+
throws SAXException, IOException
|
93
|
+
{
|
94
|
+
if (systemId != null) { source.setSystemId(systemId); }
|
95
|
+
if (publicId != null) { source.setPublicId(publicId); }
|
96
|
+
return source;
|
115
97
|
}
|
98
|
+
}
|
116
99
|
}
|
@@ -18,104 +18,123 @@ import org.xml.sax.ext.EntityResolver2;
|
|
18
18
|
* entity resolution that uses relative paths must be translated
|
19
19
|
* to be relative to the current directory of the Ruby runtime.
|
20
20
|
*/
|
21
|
-
public class NokogiriEntityResolver implements EntityResolver2
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
public class NokogiriEntityResolver implements EntityResolver2
|
22
|
+
{
|
23
|
+
protected final Ruby runtime;
|
24
|
+
private final NokogiriErrorHandler handler;
|
25
|
+
private final Options options;
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
public
|
28
|
+
NokogiriEntityResolver(Ruby runtime, NokogiriErrorHandler handler, Options options)
|
29
|
+
{
|
30
|
+
super();
|
31
|
+
this.runtime = runtime;
|
32
|
+
this.handler = handler;
|
33
|
+
this.options = options;
|
34
|
+
}
|
32
35
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
@Override
|
37
|
+
public InputSource
|
38
|
+
getExternalSubset(String name, String baseURI)
|
39
|
+
throws SAXException, IOException
|
40
|
+
{
|
41
|
+
return null;
|
42
|
+
}
|
38
43
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
+
@Override
|
45
|
+
public InputSource
|
46
|
+
resolveEntity(String publicId, String systemId)
|
47
|
+
throws SAXException, IOException
|
48
|
+
{
|
49
|
+
return resolveEntity(runtime, null, publicId, null, systemId);
|
50
|
+
}
|
44
51
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
@Override
|
53
|
+
public InputSource
|
54
|
+
resolveEntity(String name,
|
55
|
+
String publicId,
|
56
|
+
String baseURI,
|
57
|
+
String systemId)
|
58
|
+
throws SAXException, IOException
|
59
|
+
{
|
60
|
+
return resolveEntity(runtime, name, publicId, baseURI, systemId);
|
61
|
+
}
|
53
62
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
63
|
+
private static File
|
64
|
+
join(String parent, String child)
|
65
|
+
{
|
66
|
+
if (new File(parent).isFile()) {
|
67
|
+
parent = new File(parent).getParent();
|
59
68
|
}
|
69
|
+
return new File(parent, child);
|
70
|
+
}
|
60
71
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
72
|
+
private static InputSource
|
73
|
+
emptyInputSource(InputSource source)
|
74
|
+
{
|
75
|
+
source.setByteStream(new ByteArrayInputStream(new byte[0]));
|
76
|
+
return source;
|
77
|
+
}
|
65
78
|
|
66
|
-
|
67
|
-
|
68
|
-
|
79
|
+
private boolean
|
80
|
+
shouldLoadDtd()
|
81
|
+
{
|
82
|
+
return options.dtdLoad || options.dtdValid;
|
83
|
+
}
|
69
84
|
|
70
|
-
|
71
|
-
|
72
|
-
|
85
|
+
private void
|
86
|
+
addError(String errorMessage)
|
87
|
+
{
|
88
|
+
if (handler != null) { handler.errors.add(new Exception(errorMessage)); }
|
89
|
+
}
|
73
90
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
s.setPublicId(publicId);
|
118
|
-
return s;
|
91
|
+
/**
|
92
|
+
* Create a file base input source taking into account the current
|
93
|
+
* directory of <code>runtime</code>.
|
94
|
+
* @throws SAXException
|
95
|
+
*/
|
96
|
+
protected InputSource
|
97
|
+
resolveEntity(Ruby runtime, String name, String publicId, String baseURI, String systemId)
|
98
|
+
throws IOException, SAXException
|
99
|
+
{
|
100
|
+
InputSource s = new InputSource();
|
101
|
+
if (name.equals("[dtd]") && !shouldLoadDtd()) {
|
102
|
+
return emptyInputSource(s);
|
103
|
+
} else if (!name.equals("[dtd]") && !options.noEnt) {
|
104
|
+
return emptyInputSource(s);
|
105
|
+
}
|
106
|
+
String adjustedSystemId;
|
107
|
+
URI uri = URI.create(systemId);
|
108
|
+
if (options.noNet && uri.getHost() != null) {
|
109
|
+
addError("Attempt to load network entity " + systemId);
|
110
|
+
return emptyInputSource(s);
|
111
|
+
}
|
112
|
+
// if this is a url or absolute file name then use it
|
113
|
+
if (uri.isAbsolute() && !uri.isOpaque()) {
|
114
|
+
adjustedSystemId = uri.toURL().toString();
|
115
|
+
} else if (new File(uri.getPath()).isAbsolute()) {
|
116
|
+
adjustedSystemId = uri.getPath();
|
117
|
+
} else if (baseURI != null) {
|
118
|
+
URI baseuri = URI.create(baseURI);
|
119
|
+
if (options.noNet && baseuri.getHost() != null) {
|
120
|
+
addError("Attempt to load network entity " + systemId);
|
121
|
+
return emptyInputSource(s);
|
122
|
+
}
|
123
|
+
if (baseuri.getHost() == null) {
|
124
|
+
// this is a local file
|
125
|
+
adjustedSystemId = join(baseuri.getPath(), uri.getPath()).getCanonicalPath();
|
126
|
+
} else {
|
127
|
+
// this is a url, then resolve uri using baseuri
|
128
|
+
adjustedSystemId = baseuri.resolve(systemId).toURL().toString();
|
129
|
+
}
|
130
|
+
} else {
|
131
|
+
// baseURI is null we have to use the current working directory to resolve the entity
|
132
|
+
String pwd = runtime.getCurrentDirectory();
|
133
|
+
adjustedSystemId = join(pwd, uri.getPath()).getCanonicalPath();
|
119
134
|
}
|
135
|
+
s.setSystemId(adjustedSystemId);
|
136
|
+
s.setPublicId(publicId);
|
137
|
+
return s;
|
138
|
+
}
|
120
139
|
|
121
140
|
}
|