GNU Classpath (0.95) | |
Frames | No Frames |
1: // XMLFilterImpl.java - base SAX2 filter implementation. 2: // http://www.saxproject.org 3: // Written by David Megginson 4: // NO WARRANTY! This class is in the Public Domain. 5: // $Id: XMLFilterImpl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ 6: 7: package org.xml.sax.helpers; 8: 9: import java.io.IOException; 10: 11: import org.xml.sax.XMLReader; 12: import org.xml.sax.XMLFilter; 13: import org.xml.sax.InputSource; 14: import org.xml.sax.Locator; 15: import org.xml.sax.Attributes; 16: import org.xml.sax.EntityResolver; 17: import org.xml.sax.DTDHandler; 18: import org.xml.sax.ContentHandler; 19: import org.xml.sax.ErrorHandler; 20: import org.xml.sax.SAXException; 21: import org.xml.sax.SAXParseException; 22: import org.xml.sax.SAXNotSupportedException; 23: import org.xml.sax.SAXNotRecognizedException; 24: 25: 26: /** 27: * Base class for deriving an XML filter. 28: * 29: * <blockquote> 30: * <em>This module, both source code and documentation, is in the 31: * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> 32: * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> 33: * for further information. 34: * </blockquote> 35: * 36: * <p>This class is designed to sit between an {@link org.xml.sax.XMLReader 37: * XMLReader} and the client application's event handlers. By default, it 38: * does nothing but pass requests up to the reader and events 39: * on to the handlers unmodified, but subclasses can override 40: * specific methods to modify the event stream or the configuration 41: * requests as they pass through.</p> 42: * 43: * @since SAX 2.0 44: * @author David Megginson 45: * @version 2.0.1 (sax2r2) 46: * @see org.xml.sax.XMLFilter 47: * @see org.xml.sax.XMLReader 48: * @see org.xml.sax.EntityResolver 49: * @see org.xml.sax.DTDHandler 50: * @see org.xml.sax.ContentHandler 51: * @see org.xml.sax.ErrorHandler 52: */ 53: public class XMLFilterImpl 54: implements XMLFilter, EntityResolver, DTDHandler, ContentHandler, ErrorHandler 55: { 56: 57: 58: //////////////////////////////////////////////////////////////////// 59: // Constructors. 60: //////////////////////////////////////////////////////////////////// 61: 62: 63: /** 64: * Construct an empty XML filter, with no parent. 65: * 66: * <p>This filter will have no parent: you must assign a parent 67: * before you start a parse or do any configuration with 68: * setFeature or setProperty, unless you use this as a pure event 69: * consumer rather than as an {@link XMLReader}.</p> 70: * 71: * @see org.xml.sax.XMLReader#setFeature 72: * @see org.xml.sax.XMLReader#setProperty 73: * @see #setParent 74: */ 75: public XMLFilterImpl () 76: { 77: super(); 78: } 79: 80: 81: /** 82: * Construct an XML filter with the specified parent. 83: * 84: * @see #setParent 85: * @see #getParent 86: */ 87: public XMLFilterImpl (XMLReader parent) 88: { 89: super(); 90: setParent(parent); 91: } 92: 93: 94: 95: //////////////////////////////////////////////////////////////////// 96: // Implementation of org.xml.sax.XMLFilter. 97: //////////////////////////////////////////////////////////////////// 98: 99: 100: /** 101: * Set the parent reader. 102: * 103: * <p>This is the {@link org.xml.sax.XMLReader XMLReader} from which 104: * this filter will obtain its events and to which it will pass its 105: * configuration requests. The parent may itself be another filter.</p> 106: * 107: * <p>If there is no parent reader set, any attempt to parse 108: * or to set or get a feature or property will fail.</p> 109: * 110: * @param parent The parent XML reader. 111: * @see #getParent 112: */ 113: public void setParent (XMLReader parent) 114: { 115: this.parent = parent; 116: } 117: 118: 119: /** 120: * Get the parent reader. 121: * 122: * @return The parent XML reader, or null if none is set. 123: * @see #setParent 124: */ 125: public XMLReader getParent () 126: { 127: return parent; 128: } 129: 130: 131: 132: //////////////////////////////////////////////////////////////////// 133: // Implementation of org.xml.sax.XMLReader. 134: //////////////////////////////////////////////////////////////////// 135: 136: 137: /** 138: * Set the value of a feature. 139: * 140: * <p>This will always fail if the parent is null.</p> 141: * 142: * @param name The feature name. 143: * @param value The requested feature value. 144: * @exception org.xml.sax.SAXNotRecognizedException If the feature 145: * value can't be assigned or retrieved from the parent. 146: * @exception org.xml.sax.SAXNotSupportedException When the 147: * parent recognizes the feature name but 148: * cannot set the requested value. 149: */ 150: public void setFeature (String name, boolean value) 151: throws SAXNotRecognizedException, SAXNotSupportedException 152: { 153: if (parent != null) { 154: parent.setFeature(name, value); 155: } else { 156: throw new SAXNotRecognizedException("Feature: " + name); 157: } 158: } 159: 160: 161: /** 162: * Look up the value of a feature. 163: * 164: * <p>This will always fail if the parent is null.</p> 165: * 166: * @param name The feature name. 167: * @return The current value of the feature. 168: * @exception org.xml.sax.SAXNotRecognizedException If the feature 169: * value can't be assigned or retrieved from the parent. 170: * @exception org.xml.sax.SAXNotSupportedException When the 171: * parent recognizes the feature name but 172: * cannot determine its value at this time. 173: */ 174: public boolean getFeature (String name) 175: throws SAXNotRecognizedException, SAXNotSupportedException 176: { 177: if (parent != null) { 178: return parent.getFeature(name); 179: } else { 180: throw new SAXNotRecognizedException("Feature: " + name); 181: } 182: } 183: 184: 185: /** 186: * Set the value of a property. 187: * 188: * <p>This will always fail if the parent is null.</p> 189: * 190: * @param name The property name. 191: * @param value The requested property value. 192: * @exception org.xml.sax.SAXNotRecognizedException If the property 193: * value can't be assigned or retrieved from the parent. 194: * @exception org.xml.sax.SAXNotSupportedException When the 195: * parent recognizes the property name but 196: * cannot set the requested value. 197: */ 198: public void setProperty (String name, Object value) 199: throws SAXNotRecognizedException, SAXNotSupportedException 200: { 201: if (parent != null) { 202: parent.setProperty(name, value); 203: } else { 204: throw new SAXNotRecognizedException("Property: " + name); 205: } 206: } 207: 208: 209: /** 210: * Look up the value of a property. 211: * 212: * @param name The property name. 213: * @return The current value of the property. 214: * @exception org.xml.sax.SAXNotRecognizedException If the property 215: * value can't be assigned or retrieved from the parent. 216: * @exception org.xml.sax.SAXNotSupportedException When the 217: * parent recognizes the property name but 218: * cannot determine its value at this time. 219: */ 220: public Object getProperty (String name) 221: throws SAXNotRecognizedException, SAXNotSupportedException 222: { 223: if (parent != null) { 224: return parent.getProperty(name); 225: } else { 226: throw new SAXNotRecognizedException("Property: " + name); 227: } 228: } 229: 230: 231: /** 232: * Set the entity resolver. 233: * 234: * @param resolver The new entity resolver. 235: */ 236: public void setEntityResolver (EntityResolver resolver) 237: { 238: entityResolver = resolver; 239: } 240: 241: 242: /** 243: * Get the current entity resolver. 244: * 245: * @return The current entity resolver, or null if none was set. 246: */ 247: public EntityResolver getEntityResolver () 248: { 249: return entityResolver; 250: } 251: 252: 253: /** 254: * Set the DTD event handler. 255: * 256: * @param handler the new DTD handler 257: */ 258: public void setDTDHandler (DTDHandler handler) 259: { 260: dtdHandler = handler; 261: } 262: 263: 264: /** 265: * Get the current DTD event handler. 266: * 267: * @return The current DTD handler, or null if none was set. 268: */ 269: public DTDHandler getDTDHandler () 270: { 271: return dtdHandler; 272: } 273: 274: 275: /** 276: * Set the content event handler. 277: * 278: * @param handler the new content handler 279: */ 280: public void setContentHandler (ContentHandler handler) 281: { 282: contentHandler = handler; 283: } 284: 285: 286: /** 287: * Get the content event handler. 288: * 289: * @return The current content handler, or null if none was set. 290: */ 291: public ContentHandler getContentHandler () 292: { 293: return contentHandler; 294: } 295: 296: 297: /** 298: * Set the error event handler. 299: * 300: * @param handler the new error handler 301: */ 302: public void setErrorHandler (ErrorHandler handler) 303: { 304: errorHandler = handler; 305: } 306: 307: 308: /** 309: * Get the current error event handler. 310: * 311: * @return The current error handler, or null if none was set. 312: */ 313: public ErrorHandler getErrorHandler () 314: { 315: return errorHandler; 316: } 317: 318: 319: /** 320: * Parse a document. 321: * 322: * @param input The input source for the document entity. 323: * @exception org.xml.sax.SAXException Any SAX exception, possibly 324: * wrapping another exception. 325: * @exception java.io.IOException An IO exception from the parser, 326: * possibly from a byte stream or character stream 327: * supplied by the application. 328: */ 329: public void parse (InputSource input) 330: throws SAXException, IOException 331: { 332: setupParse(); 333: parent.parse(input); 334: } 335: 336: 337: /** 338: * Parse a document. 339: * 340: * @param systemId The system identifier as a fully-qualified URI. 341: * @exception org.xml.sax.SAXException Any SAX exception, possibly 342: * wrapping another exception. 343: * @exception java.io.IOException An IO exception from the parser, 344: * possibly from a byte stream or character stream 345: * supplied by the application. 346: */ 347: public void parse (String systemId) 348: throws SAXException, IOException 349: { 350: parse(new InputSource(systemId)); 351: } 352: 353: 354: 355: //////////////////////////////////////////////////////////////////// 356: // Implementation of org.xml.sax.EntityResolver. 357: //////////////////////////////////////////////////////////////////// 358: 359: 360: /** 361: * Filter an external entity resolution. 362: * 363: * @param publicId The entity's public identifier, or null. 364: * @param systemId The entity's system identifier. 365: * @return A new InputSource or null for the default. 366: * @exception org.xml.sax.SAXException The client may throw 367: * an exception during processing. 368: * @exception java.io.IOException The client may throw an 369: * I/O-related exception while obtaining the 370: * new InputSource. 371: */ 372: public InputSource resolveEntity (String publicId, String systemId) 373: throws SAXException, IOException 374: { 375: if (entityResolver != null) { 376: return entityResolver.resolveEntity(publicId, systemId); 377: } else { 378: return null; 379: } 380: } 381: 382: 383: 384: //////////////////////////////////////////////////////////////////// 385: // Implementation of org.xml.sax.DTDHandler. 386: //////////////////////////////////////////////////////////////////// 387: 388: 389: /** 390: * Filter a notation declaration event. 391: * 392: * @param name The notation name. 393: * @param publicId The notation's public identifier, or null. 394: * @param systemId The notation's system identifier, or null. 395: * @exception org.xml.sax.SAXException The client may throw 396: * an exception during processing. 397: */ 398: public void notationDecl (String name, String publicId, String systemId) 399: throws SAXException 400: { 401: if (dtdHandler != null) { 402: dtdHandler.notationDecl(name, publicId, systemId); 403: } 404: } 405: 406: 407: /** 408: * Filter an unparsed entity declaration event. 409: * 410: * @param name The entity name. 411: * @param publicId The entity's public identifier, or null. 412: * @param systemId The entity's system identifier, or null. 413: * @param notationName The name of the associated notation. 414: * @exception org.xml.sax.SAXException The client may throw 415: * an exception during processing. 416: */ 417: public void unparsedEntityDecl (String name, String publicId, 418: String systemId, String notationName) 419: throws SAXException 420: { 421: if (dtdHandler != null) { 422: dtdHandler.unparsedEntityDecl(name, publicId, systemId, 423: notationName); 424: } 425: } 426: 427: 428: 429: //////////////////////////////////////////////////////////////////// 430: // Implementation of org.xml.sax.ContentHandler. 431: //////////////////////////////////////////////////////////////////// 432: 433: 434: /** 435: * Filter a new document locator event. 436: * 437: * @param locator The document locator. 438: */ 439: public void setDocumentLocator (Locator locator) 440: { 441: this.locator = locator; 442: if (contentHandler != null) { 443: contentHandler.setDocumentLocator(locator); 444: } 445: } 446: 447: 448: /** 449: * Filter a start document event. 450: * 451: * @exception org.xml.sax.SAXException The client may throw 452: * an exception during processing. 453: */ 454: public void startDocument () 455: throws SAXException 456: { 457: if (contentHandler != null) { 458: contentHandler.startDocument(); 459: } 460: } 461: 462: 463: /** 464: * Filter an end document event. 465: * 466: * @exception org.xml.sax.SAXException The client may throw 467: * an exception during processing. 468: */ 469: public void endDocument () 470: throws SAXException 471: { 472: if (contentHandler != null) { 473: contentHandler.endDocument(); 474: } 475: } 476: 477: 478: /** 479: * Filter a start Namespace prefix mapping event. 480: * 481: * @param prefix The Namespace prefix. 482: * @param uri The Namespace URI. 483: * @exception org.xml.sax.SAXException The client may throw 484: * an exception during processing. 485: */ 486: public void startPrefixMapping (String prefix, String uri) 487: throws SAXException 488: { 489: if (contentHandler != null) { 490: contentHandler.startPrefixMapping(prefix, uri); 491: } 492: } 493: 494: 495: /** 496: * Filter an end Namespace prefix mapping event. 497: * 498: * @param prefix The Namespace prefix. 499: * @exception org.xml.sax.SAXException The client may throw 500: * an exception during processing. 501: */ 502: public void endPrefixMapping (String prefix) 503: throws SAXException 504: { 505: if (contentHandler != null) { 506: contentHandler.endPrefixMapping(prefix); 507: } 508: } 509: 510: 511: /** 512: * Filter a start element event. 513: * 514: * @param uri The element's Namespace URI, or the empty string. 515: * @param localName The element's local name, or the empty string. 516: * @param qName The element's qualified (prefixed) name, or the empty 517: * string. 518: * @param atts The element's attributes. 519: * @exception org.xml.sax.SAXException The client may throw 520: * an exception during processing. 521: */ 522: public void startElement (String uri, String localName, String qName, 523: Attributes atts) 524: throws SAXException 525: { 526: if (contentHandler != null) { 527: contentHandler.startElement(uri, localName, qName, atts); 528: } 529: } 530: 531: 532: /** 533: * Filter an end element event. 534: * 535: * @param uri The element's Namespace URI, or the empty string. 536: * @param localName The element's local name, or the empty string. 537: * @param qName The element's qualified (prefixed) name, or the empty 538: * string. 539: * @exception org.xml.sax.SAXException The client may throw 540: * an exception during processing. 541: */ 542: public void endElement (String uri, String localName, String qName) 543: throws SAXException 544: { 545: if (contentHandler != null) { 546: contentHandler.endElement(uri, localName, qName); 547: } 548: } 549: 550: 551: /** 552: * Filter a character data event. 553: * 554: * @param ch An array of characters. 555: * @param start The starting position in the array. 556: * @param length The number of characters to use from the array. 557: * @exception org.xml.sax.SAXException The client may throw 558: * an exception during processing. 559: */ 560: public void characters (char ch[], int start, int length) 561: throws SAXException 562: { 563: if (contentHandler != null) { 564: contentHandler.characters(ch, start, length); 565: } 566: } 567: 568: 569: /** 570: * Filter an ignorable whitespace event. 571: * 572: * @param ch An array of characters. 573: * @param start The starting position in the array. 574: * @param length The number of characters to use from the array. 575: * @exception org.xml.sax.SAXException The client may throw 576: * an exception during processing. 577: */ 578: public void ignorableWhitespace (char ch[], int start, int length) 579: throws SAXException 580: { 581: if (contentHandler != null) { 582: contentHandler.ignorableWhitespace(ch, start, length); 583: } 584: } 585: 586: 587: /** 588: * Filter a processing instruction event. 589: * 590: * @param target The processing instruction target. 591: * @param data The text following the target. 592: * @exception org.xml.sax.SAXException The client may throw 593: * an exception during processing. 594: */ 595: public void processingInstruction (String target, String data) 596: throws SAXException 597: { 598: if (contentHandler != null) { 599: contentHandler.processingInstruction(target, data); 600: } 601: } 602: 603: 604: /** 605: * Filter a skipped entity event. 606: * 607: * @param name The name of the skipped entity. 608: * @exception org.xml.sax.SAXException The client may throw 609: * an exception during processing. 610: */ 611: public void skippedEntity (String name) 612: throws SAXException 613: { 614: if (contentHandler != null) { 615: contentHandler.skippedEntity(name); 616: } 617: } 618: 619: 620: 621: //////////////////////////////////////////////////////////////////// 622: // Implementation of org.xml.sax.ErrorHandler. 623: //////////////////////////////////////////////////////////////////// 624: 625: 626: /** 627: * Filter a warning event. 628: * 629: * @param e The warning as an exception. 630: * @exception org.xml.sax.SAXException The client may throw 631: * an exception during processing. 632: */ 633: public void warning (SAXParseException e) 634: throws SAXException 635: { 636: if (errorHandler != null) { 637: errorHandler.warning(e); 638: } 639: } 640: 641: 642: /** 643: * Filter an error event. 644: * 645: * @param e The error as an exception. 646: * @exception org.xml.sax.SAXException The client may throw 647: * an exception during processing. 648: */ 649: public void error (SAXParseException e) 650: throws SAXException 651: { 652: if (errorHandler != null) { 653: errorHandler.error(e); 654: } 655: } 656: 657: 658: /** 659: * Filter a fatal error event. 660: * 661: * @param e The error as an exception. 662: * @exception org.xml.sax.SAXException The client may throw 663: * an exception during processing. 664: */ 665: public void fatalError (SAXParseException e) 666: throws SAXException 667: { 668: if (errorHandler != null) { 669: errorHandler.fatalError(e); 670: } 671: } 672: 673: 674: 675: //////////////////////////////////////////////////////////////////// 676: // Internal methods. 677: //////////////////////////////////////////////////////////////////// 678: 679: 680: /** 681: * Set up before a parse. 682: * 683: * <p>Before every parse, check whether the parent is 684: * non-null, and re-register the filter for all of the 685: * events.</p> 686: */ 687: private void setupParse () 688: { 689: if (parent == null) { 690: throw new NullPointerException("No parent for filter"); 691: } 692: parent.setEntityResolver(this); 693: parent.setDTDHandler(this); 694: parent.setContentHandler(this); 695: parent.setErrorHandler(this); 696: } 697: 698: 699: 700: //////////////////////////////////////////////////////////////////// 701: // Internal state. 702: //////////////////////////////////////////////////////////////////// 703: 704: private XMLReader parent = null; 705: private Locator locator = null; 706: private EntityResolver entityResolver = null; 707: private DTDHandler dtdHandler = null; 708: private ContentHandler contentHandler = null; 709: private ErrorHandler errorHandler = null; 710: 711: } 712: 713: // end of XMLFilterImpl.java
GNU Classpath (0.95) |