public void replay(ContentHandler handler) throws SAXException { SAXEvent saxEvent; Iterator itr = events.iterator(); while (itr.hasNext()) { saxEvent = (SAXEvent) itr.next(); switch (saxEvent.event) { // replay to ContentHandler case SAXEvent.PROCESSING_INSTRUCTION: handler.processingInstruction((String) saxEvent.getParm(0), (String) saxEvent.getParm(1)); break; case SAXEvent.START_PREFIX_MAPPING: handler.startPrefixMapping((String) saxEvent.getParm(0), (String) saxEvent.getParm(1)); break; case SAXEvent.END_PREFIX_MAPPING: handler.endPrefixMapping((String) saxEvent.getParm(0)); break; case SAXEvent.START_DOCUMENT: handler.startDocument(); break; case SAXEvent.END_DOCUMENT: handler.endDocument(); break; case SAXEvent.START_ELEMENT: AttributesImpl attributes = new AttributesImpl(); List attParmList = (List) saxEvent.getParm(3); if (attParmList != null) { Iterator attsItr = attParmList.iterator(); while (attsItr.hasNext()) { String[] attParms = (String[]) attsItr.next(); attributes.addAttribute( attParms[0], attParms[1], attParms[2], attParms[3], attParms[4]); } } handler.startElement( (String) saxEvent.getParm(0), (String) saxEvent.getParm(1), (String) saxEvent.getParm(2), attributes); break; case SAXEvent.END_ELEMENT: handler.endElement( (String) saxEvent.getParm(0), (String) saxEvent.getParm(1), (String) saxEvent.getParm(2)); break; case SAXEvent.CHARACTERS: char[] chars = (char[]) saxEvent.getParm(0); int start = ((Integer) saxEvent.getParm(1)).intValue(); int end = ((Integer) saxEvent.getParm(2)).intValue(); handler.characters(chars, start, end); break; // replay to LexicalHandler case SAXEvent.START_DTD: ((LexicalHandler) handler) .startDTD( (String) saxEvent.getParm(0), (String) saxEvent.getParm(1), (String) saxEvent.getParm(2)); break; case SAXEvent.END_DTD: ((LexicalHandler) handler).endDTD(); break; case SAXEvent.START_ENTITY: ((LexicalHandler) handler).startEntity((String) saxEvent.getParm(0)); break; case SAXEvent.END_ENTITY: ((LexicalHandler) handler).endEntity((String) saxEvent.getParm(0)); break; case SAXEvent.START_CDATA: ((LexicalHandler) handler).startCDATA(); break; case SAXEvent.END_CDATA: ((LexicalHandler) handler).endCDATA(); break; case SAXEvent.COMMENT: char[] cchars = (char[]) saxEvent.getParm(0); int cstart = ((Integer) saxEvent.getParm(1)).intValue(); int cend = ((Integer) saxEvent.getParm(2)).intValue(); ((LexicalHandler) handler).comment(cchars, cstart, cend); break; // replay to DeclHandler case SAXEvent.ELEMENT_DECL: ((DeclHandler) handler) .elementDecl((String) saxEvent.getParm(0), (String) saxEvent.getParm(1)); break; case SAXEvent.ATTRIBUTE_DECL: ((DeclHandler) handler) .attributeDecl( (String) saxEvent.getParm(0), (String) saxEvent.getParm(1), (String) saxEvent.getParm(2), (String) saxEvent.getParm(3), (String) saxEvent.getParm(4)); break; case SAXEvent.INTERNAL_ENTITY_DECL: ((DeclHandler) handler) .internalEntityDecl((String) saxEvent.getParm(0), (String) saxEvent.getParm(1)); break; case SAXEvent.EXTERNAL_ENTITY_DECL: ((DeclHandler) handler) .externalEntityDecl( (String) saxEvent.getParm(0), (String) saxEvent.getParm(1), (String) saxEvent.getParm(2)); break; default: throw new SAXException("Unrecognized event: " + saxEvent.event); } } }