org.apache.xml.dtm.ref
Class IncrementalSAXSource_Filter

java.lang.Object
  |
  +--org.apache.xml.dtm.ref.IncrementalSAXSource_Filter

public class IncrementalSAXSource_Filter
extends java.lang.Object
implements IncrementalSAXSource, ContentHandler, DTDHandler, LexicalHandler, ErrorHandler, java.lang.Runnable

IncrementalSAXSource_Filter implements IncrementalSAXSource, using a standard SAX2 event source as its input and parcelling out those events gradually in reponse to deliverMoreNodes() requests. Output from the filter will be passed along to a SAX handler registered as our listener, but those callbacks will pass through a counting stage which periodically yields control back to the controller coroutine.

%REVIEW%: This filter is not currenly intended to be reusable for parsing additional streams/documents. We may want to consider making it resettable at some point in the future. But it's a small object, so that'd be mostly a convenience issue; the cost of allocating each time is trivial compared to the cost of processing any nontrival stream.

For a brief usage example, see the unit-test main() method.

This is a simplification of the old CoroutineSAXParser, focusing specifically on filtering. The resulting controller protocol is _far_ simpler and less error-prone; the only controller operation is deliverMoreNodes(), and the only requirement is that deliverMoreNodes(false) be called if you want to discard the rest of the stream and the previous deliverMoreNodes() didn't return false.


Constructor Summary
IncrementalSAXSource_Filter()
           
IncrementalSAXSource_Filter(CoroutineManager co, int controllerCoroutineID)
          Create a IncrementalSAXSource_Filter which is not yet bound to a specific SAX event source.
 
Method Summary
 void characters(char[] ch, int start, int length)
           
 void comment(char[] ch, int start, int length)
           
static IncrementalSAXSource createIncrementalSAXSource(CoroutineManager co, int controllerCoroutineID)
           
 java.lang.Object deliverMoreNodes(boolean parsemore)
          deliverMoreNodes() is a simple API which tells the coroutine parser that we need more nodes.
 void endCDATA()
           
 void endDocument()
           
 void endDTD()
           
 void endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName)
           
 void endEntity(java.lang.String name)
           
 void endPrefixMapping(java.lang.String prefix)
           
 void error(SAXParseException exception)
           
 void fatalError(SAXParseException exception)
           
 int getControllerCoroutineID()
           
 CoroutineManager getCoroutineManager()
           
 int getSourceCoroutineID()
           
 void ignorableWhitespace(char[] ch, int start, int length)
           
 void init(CoroutineManager co, int controllerCoroutineID, int sourceCoroutineID)
           
 void notationDecl(java.lang.String a, java.lang.String b, java.lang.String c)
           
 void processingInstruction(java.lang.String target, java.lang.String data)
           
 void run()
           
 void setContentHandler(ContentHandler handler)
           
 void setDocumentLocator(Locator locator)
           
 void setDTDHandler(DTDHandler handler)
           
 void setErrHandler(ErrorHandler handler)
           
 void setLexicalHandler(LexicalHandler handler)
           
 void setReturnFrequency(int events)
           
 void setXMLReader(XMLReader eventsource)
          Bind our input streams to an XMLReader.
 void skippedEntity(java.lang.String name)
           
 void startCDATA()
           
 void startDocument()
           
 void startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
           
 void startElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName, Attributes atts)
           
 void startEntity(java.lang.String name)
           
 void startParse(InputSource source)
          Launch a thread that will run an XMLReader's parse() operation within a thread, feeding events to this IncrementalSAXSource_Filter.
 void startPrefixMapping(java.lang.String prefix, java.lang.String uri)
           
 void unparsedEntityDecl(java.lang.String a, java.lang.String b, java.lang.String c, java.lang.String d)
           
 void warning(SAXParseException exception)
           
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

IncrementalSAXSource_Filter

public IncrementalSAXSource_Filter()

IncrementalSAXSource_Filter

public IncrementalSAXSource_Filter(CoroutineManager co,
                                   int controllerCoroutineID)
Create a IncrementalSAXSource_Filter which is not yet bound to a specific SAX event source.
Method Detail

createIncrementalSAXSource

public static IncrementalSAXSource createIncrementalSAXSource(CoroutineManager co,
                                                              int controllerCoroutineID)

init

public void init(CoroutineManager co,
                 int controllerCoroutineID,
                 int sourceCoroutineID)

setXMLReader

public void setXMLReader(XMLReader eventsource)
Bind our input streams to an XMLReader. Just a convenience routine; obviously you can explicitly register this as a listener with the same effect.

setContentHandler

public void setContentHandler(ContentHandler handler)
Specified by:
setContentHandler in interface IncrementalSAXSource

setDTDHandler

public void setDTDHandler(DTDHandler handler)
Specified by:
setDTDHandler in interface IncrementalSAXSource

setLexicalHandler

public void setLexicalHandler(LexicalHandler handler)
Specified by:
setLexicalHandler in interface IncrementalSAXSource

setErrHandler

public void setErrHandler(ErrorHandler handler)

setReturnFrequency

public void setReturnFrequency(int events)

characters

public void characters(char[] ch,
                       int start,
                       int length)
                throws SAXException
Specified by:
characters in interface ContentHandler

endDocument

public void endDocument()
                 throws SAXException
Specified by:
endDocument in interface ContentHandler

endElement

public void endElement(java.lang.String namespaceURI,
                       java.lang.String localName,
                       java.lang.String qName)
                throws SAXException
Specified by:
endElement in interface ContentHandler

endPrefixMapping

public void endPrefixMapping(java.lang.String prefix)
                      throws SAXException
Specified by:
endPrefixMapping in interface ContentHandler

ignorableWhitespace

public void ignorableWhitespace(char[] ch,
                                int start,
                                int length)
                         throws SAXException
Specified by:
ignorableWhitespace in interface ContentHandler

processingInstruction

public void processingInstruction(java.lang.String target,
                                  java.lang.String data)
                           throws SAXException
Specified by:
processingInstruction in interface ContentHandler

setDocumentLocator

public void setDocumentLocator(Locator locator)
Specified by:
setDocumentLocator in interface ContentHandler

skippedEntity

public void skippedEntity(java.lang.String name)
                   throws SAXException
Specified by:
skippedEntity in interface ContentHandler

startDocument

public void startDocument()
                   throws SAXException
Specified by:
startDocument in interface ContentHandler

startElement

public void startElement(java.lang.String namespaceURI,
                         java.lang.String localName,
                         java.lang.String qName,
                         Attributes atts)
                  throws SAXException
Specified by:
startElement in interface ContentHandler

startPrefixMapping

public void startPrefixMapping(java.lang.String prefix,
                               java.lang.String uri)
                        throws SAXException
Specified by:
startPrefixMapping in interface ContentHandler

comment

public void comment(char[] ch,
                    int start,
                    int length)
             throws SAXException
Specified by:
comment in interface LexicalHandler

endCDATA

public void endCDATA()
              throws SAXException
Specified by:
endCDATA in interface LexicalHandler

endDTD

public void endDTD()
            throws SAXException
Specified by:
endDTD in interface LexicalHandler

endEntity

public void endEntity(java.lang.String name)
               throws SAXException
Specified by:
endEntity in interface LexicalHandler

startCDATA

public void startCDATA()
                throws SAXException
Specified by:
startCDATA in interface LexicalHandler

startDTD

public void startDTD(java.lang.String name,
                     java.lang.String publicId,
                     java.lang.String systemId)
              throws SAXException
Specified by:
startDTD in interface LexicalHandler

startEntity

public void startEntity(java.lang.String name)
                 throws SAXException
Specified by:
startEntity in interface LexicalHandler

notationDecl

public void notationDecl(java.lang.String a,
                         java.lang.String b,
                         java.lang.String c)
                  throws SAXException
Specified by:
notationDecl in interface DTDHandler

unparsedEntityDecl

public void unparsedEntityDecl(java.lang.String a,
                               java.lang.String b,
                               java.lang.String c,
                               java.lang.String d)
                        throws SAXException
Specified by:
unparsedEntityDecl in interface DTDHandler

error

public void error(SAXParseException exception)
           throws SAXException
Specified by:
error in interface ErrorHandler

fatalError

public void fatalError(SAXParseException exception)
                throws SAXException
Specified by:
fatalError in interface ErrorHandler

warning

public void warning(SAXParseException exception)
             throws SAXException
Specified by:
warning in interface ErrorHandler

getSourceCoroutineID

public int getSourceCoroutineID()

getControllerCoroutineID

public int getControllerCoroutineID()

getCoroutineManager

public CoroutineManager getCoroutineManager()
Returns:
the CoroutineManager this CoroutineFilter object is bound to. If you're using the do...() methods, applications should only need to talk to the CoroutineManager once, to obtain the application's Coroutine ID.

startParse

public void startParse(InputSource source)
                throws SAXException
Launch a thread that will run an XMLReader's parse() operation within a thread, feeding events to this IncrementalSAXSource_Filter. Mostly a convenience routine, but has the advantage that -- since we invoked parse() -- we can halt parsing quickly via a StopException rather than waiting for the SAX stream to end by itself.
Specified by:
startParse in interface IncrementalSAXSource
Throws:
SAXException - is parse thread is already in progress or parsing can not be started.

run

public void run()
Specified by:
run in interface java.lang.Runnable

deliverMoreNodes

public java.lang.Object deliverMoreNodes(boolean parsemore)
deliverMoreNodes() is a simple API which tells the coroutine parser that we need more nodes. This is intended to be called from one of our partner routines, and serves to encapsulate the details of how incremental parsing has been achieved.
Specified by:
deliverMoreNodes in interface IncrementalSAXSource
Parameters:
parsemore - If true, tells the incremental filter to generate another chunk of output. If false, tells the filter that we're satisfied and it can terminate parsing of this document.
Returns:
Boolean.TRUE if there may be more events available by invoking deliverMoreNodes() again. Boolean.FALSE if parsing has run to completion (or been terminated by deliverMoreNodes(false). Or an exception object if something malfunctioned. %REVIEW% We _could_ actually throw the exception, but that would require runinng deliverMoreNodes() in a try/catch... and for many applications, exception will be simply be treated as "not TRUE" in any case.


Copyright 2006 Apache XML Project. All Rights Reserved.