1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.sun.syndication.io;
18
19 import java.io.ByteArrayInputStream;
20 import java.io.File;
21 import java.io.FileNotFoundException;
22 import java.io.FileReader;
23 import java.io.IOException;
24 import java.io.Reader;
25 import java.util.List;
26
27 import org.jdom.Document;
28 import org.jdom.JDOMException;
29 import org.jdom.input.DOMBuilder;
30 import org.jdom.input.JDOMParseException;
31 import org.xml.sax.EntityResolver;
32 import org.xml.sax.InputSource;
33 import org.xml.sax.SAXNotRecognizedException;
34 import org.xml.sax.SAXNotSupportedException;
35 import org.xml.sax.XMLReader;
36
37 import com.sun.syndication.feed.WireFeed;
38 import com.sun.syndication.io.impl.FeedParsers;
39 import com.sun.syndication.io.impl.XmlFixerReader;
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public class WireFeedInput {
54 private static FeedParsers FEED_PARSERS = new FeedParsers();
55 private static final InputSource EMPTY_INPUTSOURCE = new InputSource(new ByteArrayInputStream(new byte[0]));
56 private static final EntityResolver RESOLVER = new EmptyEntityResolver();
57
58 private static class EmptyEntityResolver implements EntityResolver {
59 public InputSource resolveEntity(String publicId, String systemId) {
60 if(systemId != null && systemId.endsWith(".dtd")) return EMPTY_INPUTSOURCE;
61 return null;
62 }
63 }
64
65 private boolean _validate;
66
67 private boolean _xmlHealerOn;
68
69
70
71
72
73
74
75
76
77 public static List getSupportedFeedTypes() {
78 return FEED_PARSERS.getSupportedFeedTypes();
79 }
80
81
82
83
84
85
86 public WireFeedInput() {
87 this (false);
88 }
89
90
91
92
93
94
95
96 public WireFeedInput(boolean validate) {
97 _validate = false;
98 _xmlHealerOn = true;
99 }
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 public void setXmlHealerOn(boolean heals) {
116 _xmlHealerOn = heals;
117 }
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 public boolean getXmlHealerOn() {
134 return _xmlHealerOn;
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 public WireFeed build(File file) throws FileNotFoundException,IOException,IllegalArgumentException,FeedException {
151 WireFeed feed;
152 Reader reader = new FileReader(file);
153 if (_xmlHealerOn) {
154 reader = new XmlFixerReader(reader);
155 }
156 feed = build(reader);
157 reader.close();
158 return feed;
159 }
160
161
162
163
164
165
166
167
168
169
170
171
172 public WireFeed build(Reader reader) throws IllegalArgumentException,FeedException {
173 SAXBuilder saxBuilder = createSAXBuilder();
174 try {
175 if (_xmlHealerOn) {
176 reader = new XmlFixerReader(reader);
177 }
178 Document document = saxBuilder.build(reader);
179 return build(document);
180 }
181 catch (JDOMParseException ex) {
182 throw new ParsingFeedException("Invalid XML: " + ex.getMessage(), ex);
183 }
184 catch (Exception ex) {
185 throw new ParsingFeedException("Invalid XML",ex);
186 }
187 }
188
189
190
191
192
193
194
195
196
197
198
199
200 public WireFeed build(InputSource is) throws IllegalArgumentException,FeedException {
201 SAXBuilder saxBuilder = createSAXBuilder();
202 try {
203 Document document = saxBuilder.build(is);
204 return build(document);
205 }
206 catch (JDOMParseException ex) {
207 throw new ParsingFeedException("Invalid XML: " + ex.getMessage(), ex);
208 }
209 catch (Exception ex) {
210 throw new ParsingFeedException("Invalid XML",ex);
211 }
212 }
213
214
215
216
217
218
219
220
221
222
223
224
225 public WireFeed build(org.w3c.dom.Document document) throws IllegalArgumentException,FeedException {
226 DOMBuilder domBuilder = new DOMBuilder();
227 try {
228 Document jdomDoc = domBuilder.build(document);
229 return build(jdomDoc);
230 }
231 catch (Exception ex) {
232 throw new ParsingFeedException("Invalid XML",ex);
233 }
234 }
235
236
237
238
239
240
241
242
243
244
245
246
247 public WireFeed build(Document document) throws IllegalArgumentException,FeedException {
248 WireFeedParser parser = FEED_PARSERS.getParserFor(document);
249 if (parser==null) {
250 throw new IllegalArgumentException("Invalid document");
251 }
252 return parser.parse(document, _validate);
253 }
254
255
256
257
258
259
260 protected SAXBuilder createSAXBuilder() {
261 SAXBuilder saxBuilder = new SAXBuilder(_validate);
262 saxBuilder.setEntityResolver(RESOLVER);
263
264
265
266
267
268
269
270
271
272
273 try {
274 XMLReader parser = saxBuilder.createParser();
275 try {
276 parser.setFeature("http://xml.org/sax/features/external-general-entities", false);
277 saxBuilder.setFeature("http://xml.org/sax/features/external-general-entities", false);
278 } catch (SAXNotRecognizedException e) {
279
280 } catch (SAXNotSupportedException e) {
281
282 }
283
284 try {
285 parser.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
286 saxBuilder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
287 } catch (SAXNotRecognizedException e) {
288
289 } catch (SAXNotSupportedException e) {
290
291 }
292
293 try {
294 parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
295 saxBuilder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
296 } catch (SAXNotRecognizedException e) {
297
298 } catch (SAXNotSupportedException e) {
299
300 }
301
302 } catch (JDOMException e) {
303 throw new IllegalStateException("JDOM could not create a SAX parser");
304 }
305
306 saxBuilder.setExpandEntities(false);
307 return saxBuilder;
308 }
309 }