OSDN Git Service

Latest updates from FSF 4.7 branch
[pf3gnuchains/gcc-fork.git] / libjava / classpath / external / sax / org / xml / sax / helpers / XMLReaderAdapter.java
1 // XMLReaderAdapter.java - adapt an SAX2 XMLReader to a SAX1 Parser
2 // http://www.saxproject.org
3 // Written by David Megginson
4 // NO WARRANTY!  This class is in the public domain.
5 // $Id: XMLReaderAdapter.java,v 1.10 2012/04/18 17:29:05 nickc Exp $
6
7 package org.xml.sax.helpers;
8
9 import java.io.IOException;
10 import java.util.Locale;
11
12 import org.xml.sax.Parser;      // deprecated
13 import org.xml.sax.Locator;
14 import org.xml.sax.InputSource;
15 import org.xml.sax.AttributeList; // deprecated
16 import org.xml.sax.EntityResolver;
17 import org.xml.sax.DTDHandler;
18 import org.xml.sax.DocumentHandler; // deprecated
19 import org.xml.sax.ErrorHandler;
20 import org.xml.sax.SAXException;
21
22 import org.xml.sax.XMLReader;
23 import org.xml.sax.Attributes;
24 import org.xml.sax.ContentHandler;
25 import org.xml.sax.SAXNotSupportedException;
26
27
28 /**
29  * Adapt a SAX2 XMLReader as a SAX1 Parser.
30  *
31  * <blockquote>
32  * <em>This module, both source code and documentation, is in the
33  * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
34  * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
35  * for further information.
36  * </blockquote>
37  *
38  * <p>This class wraps a SAX2 {@link org.xml.sax.XMLReader XMLReader}
39  * and makes it act as a SAX1 {@link org.xml.sax.Parser Parser}.  The XMLReader
40  * must support a true value for the
41  * http://xml.org/sax/features/namespace-prefixes property or parsing will fail
42  * with a {@link org.xml.sax.SAXException SAXException}; if the XMLReader
43  * supports a false value for the http://xml.org/sax/features/namespaces
44  * property, that will also be used to improve efficiency.</p>
45  *
46  * @since SAX 2.0
47  * @author David Megginson
48  * @version 2.0.1 (sax2r2)
49  * @see org.xml.sax.Parser
50  * @see org.xml.sax.XMLReader
51  */
52 public class XMLReaderAdapter implements Parser, ContentHandler
53 {
54
55
56     ////////////////////////////////////////////////////////////////////
57     // Constructor.
58     ////////////////////////////////////////////////////////////////////
59
60
61     /**
62      * Create a new adapter.
63      *
64      * <p>Use the "org.xml.sax.driver" property to locate the SAX2
65      * driver to embed.</p>
66      *
67      * @exception org.xml.sax.SAXException If the embedded driver
68      *            cannot be instantiated or if the
69      *            org.xml.sax.driver property is not specified.
70      */
71     public XMLReaderAdapter ()
72       throws SAXException
73     {
74         setup(XMLReaderFactory.createXMLReader());
75     }
76
77
78     /**
79      * Create a new adapter.
80      *
81      * <p>Create a new adapter, wrapped around a SAX2 XMLReader.
82      * The adapter will make the XMLReader act like a SAX1
83      * Parser.</p>
84      *
85      * @param xmlReader The SAX2 XMLReader to wrap.
86      * @exception java.lang.NullPointerException If the argument is null.
87      */
88     public XMLReaderAdapter (XMLReader xmlReader)
89     {
90         setup(xmlReader);
91     }
92
93
94
95     /**
96      * Internal setup.
97      *
98      * @param xmlReader The embedded XMLReader.
99      */
100     private void setup (XMLReader xmlReader)
101     {
102         if (xmlReader == null) {
103             throw new NullPointerException("XMLReader must not be null");
104         }
105         this.xmlReader = xmlReader;
106         qAtts = new AttributesAdapter();
107     }
108
109
110
111     ////////////////////////////////////////////////////////////////////
112     // Implementation of org.xml.sax.Parser.
113     ////////////////////////////////////////////////////////////////////
114
115
116     /**
117      * Set the locale for error reporting.
118      *
119      * <p>This is not supported in SAX2, and will always throw
120      * an exception.</p>
121      *
122      * @param locale the locale for error reporting.
123      * @see org.xml.sax.Parser#setLocale
124      * @exception org.xml.sax.SAXException Thrown unless overridden.
125      */
126     public void setLocale (Locale locale)
127         throws SAXException
128     {
129         throw new SAXNotSupportedException("setLocale not supported");
130     }
131
132
133     /**
134      * Register the entity resolver.
135      *
136      * @param resolver The new resolver.
137      * @see org.xml.sax.Parser#setEntityResolver
138      */
139     public void setEntityResolver (EntityResolver resolver)
140     {
141         xmlReader.setEntityResolver(resolver);
142     }
143
144
145     /**
146      * Register the DTD event handler.
147      *
148      * @param handler The new DTD event handler.
149      * @see org.xml.sax.Parser#setDTDHandler
150      */
151     public void setDTDHandler (DTDHandler handler)
152     {
153         xmlReader.setDTDHandler(handler);
154     }
155
156
157     /**
158      * Register the SAX1 document event handler.
159      *
160      * <p>Note that the SAX1 document handler has no Namespace
161      * support.</p>
162      *
163      * @param handler The new SAX1 document event handler.
164      * @see org.xml.sax.Parser#setDocumentHandler
165      */
166     public void setDocumentHandler (DocumentHandler handler)
167     {
168         documentHandler = handler;
169     }
170
171
172     /**
173      * Register the error event handler.
174      *
175      * @param handler The new error event handler.
176      * @see org.xml.sax.Parser#setErrorHandler
177      */
178     public void setErrorHandler (ErrorHandler handler)
179     {
180         xmlReader.setErrorHandler(handler);
181     }
182
183
184     /**
185      * Parse the document.
186      *
187      * <p>This method will throw an exception if the embedded
188      * XMLReader does not support the
189      * http://xml.org/sax/features/namespace-prefixes property.</p>
190      *
191      * @param systemId The absolute URL of the document.
192      * @exception java.io.IOException If there is a problem reading
193      *            the raw content of the document.
194      * @exception org.xml.sax.SAXException If there is a problem
195      *            processing the document.
196      * @see #parse(org.xml.sax.InputSource)
197      * @see org.xml.sax.Parser#parse(java.lang.String)
198      */
199     public void parse (String systemId)
200         throws IOException, SAXException
201     {
202         parse(new InputSource(systemId));
203     }
204
205
206     /**
207      * Parse the document.
208      *
209      * <p>This method will throw an exception if the embedded
210      * XMLReader does not support the
211      * http://xml.org/sax/features/namespace-prefixes property.</p>
212      *
213      * @param input An input source for the document.
214      * @exception java.io.IOException If there is a problem reading
215      *            the raw content of the document.
216      * @exception org.xml.sax.SAXException If there is a problem
217      *            processing the document.
218      * @see #parse(java.lang.String)
219      * @see org.xml.sax.Parser#parse(org.xml.sax.InputSource)
220      */
221     public void parse (InputSource input)
222         throws IOException, SAXException
223     {
224         setupXMLReader();
225         xmlReader.parse(input);
226     }
227
228
229     /**
230      * Set up the XML reader.
231      */
232     private void setupXMLReader ()
233         throws SAXException
234     {
235         xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
236         try {
237             xmlReader.setFeature("http://xml.org/sax/features/namespaces",
238                                  false);
239         } catch (SAXException e) {
240             // NO OP: it's just extra information, and we can ignore it
241         }
242         xmlReader.setContentHandler(this);
243     }
244
245
246
247     ////////////////////////////////////////////////////////////////////
248     // Implementation of org.xml.sax.ContentHandler.
249     ////////////////////////////////////////////////////////////////////
250
251
252     /**
253      * Set a document locator.
254      *
255      * @param locator The document locator.
256      * @see org.xml.sax.ContentHandler#setDocumentLocator
257      */
258     public void setDocumentLocator (Locator locator)
259     {
260         if (documentHandler != null)
261             documentHandler.setDocumentLocator(locator);
262     }
263
264
265     /**
266      * Start document event.
267      *
268      * @exception org.xml.sax.SAXException The client may raise a
269      *            processing exception.
270      * @see org.xml.sax.ContentHandler#startDocument
271      */
272     public void startDocument ()
273         throws SAXException
274     {
275         if (documentHandler != null)
276             documentHandler.startDocument();
277     }
278
279
280     /**
281      * End document event.
282      *
283      * @exception org.xml.sax.SAXException The client may raise a
284      *            processing exception.
285      * @see org.xml.sax.ContentHandler#endDocument
286      */
287     public void endDocument ()
288         throws SAXException
289     {
290         if (documentHandler != null)
291             documentHandler.endDocument();
292     }
293
294
295     /**
296      * Adapt a SAX2 start prefix mapping event.
297      *
298      * @param prefix The prefix being mapped.
299      * @param uri The Namespace URI being mapped to.
300      * @see org.xml.sax.ContentHandler#startPrefixMapping
301      */
302     public void startPrefixMapping (String prefix, String uri)
303     {
304     }
305
306
307     /**
308      * Adapt a SAX2 end prefix mapping event.
309      *
310      * @param prefix The prefix being mapped.
311      * @see org.xml.sax.ContentHandler#endPrefixMapping
312      */
313     public void endPrefixMapping (String prefix)
314     {
315     }
316
317
318     /**
319      * Adapt a SAX2 start element event.
320      *
321      * @param uri The Namespace URI.
322      * @param localName The Namespace local name.
323      * @param qName The qualified (prefixed) name.
324      * @param atts The SAX2 attributes.
325      * @exception org.xml.sax.SAXException The client may raise a
326      *            processing exception.
327      * @see org.xml.sax.ContentHandler#endDocument
328      */
329     public void startElement (String uri, String localName,
330                               String qName, Attributes atts)
331         throws SAXException
332     {
333         if (documentHandler != null) {
334             qAtts.setAttributes(atts);
335             documentHandler.startElement(qName, qAtts);
336         }
337     }
338
339
340     /**
341      * Adapt a SAX2 end element event.
342      *
343      * @param uri The Namespace URI.
344      * @param localName The Namespace local name.
345      * @param qName The qualified (prefixed) name.
346      * @exception org.xml.sax.SAXException The client may raise a
347      *            processing exception.
348      * @see org.xml.sax.ContentHandler#endElement
349      */
350     public void endElement (String uri, String localName,
351                             String qName)
352         throws SAXException
353     {
354         if (documentHandler != null)
355             documentHandler.endElement(qName);
356     }
357
358
359     /**
360      * Adapt a SAX2 characters event.
361      *
362      * @param ch An array of characters.
363      * @param start The starting position in the array.
364      * @param length The number of characters to use.
365      * @exception org.xml.sax.SAXException The client may raise a
366      *            processing exception.
367      * @see org.xml.sax.ContentHandler#characters
368      */
369     public void characters (char ch[], int start, int length)
370         throws SAXException
371     {
372         if (documentHandler != null)
373             documentHandler.characters(ch, start, length);
374     }
375
376
377     /**
378      * Adapt a SAX2 ignorable whitespace event.
379      *
380      * @param ch An array of characters.
381      * @param start The starting position in the array.
382      * @param length The number of characters to use.
383      * @exception org.xml.sax.SAXException The client may raise a
384      *            processing exception.
385      * @see org.xml.sax.ContentHandler#ignorableWhitespace
386      */
387     public void ignorableWhitespace (char ch[], int start, int length)
388         throws SAXException
389     {
390         if (documentHandler != null)
391             documentHandler.ignorableWhitespace(ch, start, length);
392     }
393
394
395     /**
396      * Adapt a SAX2 processing instruction event.
397      *
398      * @param target The processing instruction target.
399      * @param data The remainder of the processing instruction
400      * @exception org.xml.sax.SAXException The client may raise a
401      *            processing exception.
402      * @see org.xml.sax.ContentHandler#processingInstruction
403      */
404     public void processingInstruction (String target, String data)
405         throws SAXException
406     {
407         if (documentHandler != null)
408             documentHandler.processingInstruction(target, data);
409     }
410
411
412     /**
413      * Adapt a SAX2 skipped entity event.
414      *
415      * @param name The name of the skipped entity.
416      * @see org.xml.sax.ContentHandler#skippedEntity
417      * @exception org.xml.sax.SAXException Throwable by subclasses.
418      */
419     public void skippedEntity (String name)
420         throws SAXException
421     {
422     }
423
424
425
426     ////////////////////////////////////////////////////////////////////
427     // Internal state.
428     ////////////////////////////////////////////////////////////////////
429
430     XMLReader xmlReader;
431     DocumentHandler documentHandler;
432     AttributesAdapter qAtts;
433
434
435
436     ////////////////////////////////////////////////////////////////////
437     // Internal class.
438     ////////////////////////////////////////////////////////////////////
439
440
441     /**
442      * Internal class to wrap a SAX2 Attributes object for SAX1.
443      */
444     final class AttributesAdapter implements AttributeList
445     {
446         AttributesAdapter ()
447         {
448         }
449
450
451         /**
452          * Set the embedded Attributes object.
453          *
454          * @param The embedded SAX2 Attributes.
455          */
456         void setAttributes (Attributes attributes)
457         {
458             this.attributes = attributes;
459         }
460
461
462         /**
463          * Return the number of attributes.
464          *
465          * @return The length of the attribute list.
466          * @see org.xml.sax.AttributeList#getLength
467          */
468         public int getLength ()
469         {
470             return attributes.getLength();
471         }
472
473
474         /**
475          * Return the qualified (prefixed) name of an attribute by position.
476          *
477          * @return The qualified name.
478          * @see org.xml.sax.AttributeList#getName
479          */
480         public String getName (int i)
481         {
482             return attributes.getQName(i);
483         }
484
485
486         /**
487          * Return the type of an attribute by position.
488          *
489          * @return The type.
490          * @see org.xml.sax.AttributeList#getType(int)
491          */
492         public String getType (int i)
493         {
494             return attributes.getType(i);
495         }
496
497
498         /**
499          * Return the value of an attribute by position.
500          *
501          * @return The value.
502          * @see org.xml.sax.AttributeList#getValue(int)
503          */
504         public String getValue (int i)
505         {
506             return attributes.getValue(i);
507         }
508
509
510         /**
511          * Return the type of an attribute by qualified (prefixed) name.
512          *
513          * @return The type.
514          * @see org.xml.sax.AttributeList#getType(java.lang.String)
515          */
516         public String getType (String qName)
517         {
518             return attributes.getType(qName);
519         }
520
521
522         /**
523          * Return the value of an attribute by qualified (prefixed) name.
524          *
525          * @return The value.
526          * @see org.xml.sax.AttributeList#getValue(java.lang.String)
527          */
528         public String getValue (String qName)
529         {
530             return attributes.getValue(qName);
531         }
532
533         private Attributes attributes;
534     }
535
536 }
537
538 // end of XMLReaderAdapter.java