[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Re: [Sax-devel] SAX - endDocument() confusion again


sax locator2 getencoding
At 10:38 AM -0500 2/28/04, Karl Waclawek wrote:

>Good point. However, the docs say this:
>
><quote>
>Note that the locator will return correct information only during 
>the invocation
>SAX event callbacks after startDocument returns and before 
>endDocument is called.
>The application should not attempt to use it at any other time.
></quote>
>Karl


Yes, but the situation is this:

1. Parser opens stream.
2. Parser calls setDocumentLocator and passes in a Locator2.
3. Parser calls startDocument
4. Parser parses XML declaration. Oops there's an error!
5. Parser calls fatalError
6. In fatalError Client calls Locator2.getXMLVersion and/or getEncoding.
7. Parser calls endDocument.

What is the Locator2 supposed to return?

It's to avoid this problem, that Parsifal is not calling either 
setDocumentLocator or startDocument until the declaration (or lack 
thereof) has been successfully parsed.

Possibly, there's a loophole, however The Locator JavaDoc says:

Note that the results returned by the object will be valid only 
during the scope of each callback method: the application will 
receive unpredictable results if it attempts to use the locator at 
any other time, or after parsing completes.

I think it's reasonable to say that parsing was completed before 
fatalError was called; not completed successfully of course, but 
definitely completed. Therefore, there's no place in this chain where 
the Locator methods can be expected to return correct information. 
Therefore Parsifal (and other SAX parsers) should indeed call 
startDocument, fatalError, and endDocument in that order when they 
encounter an error very early in the XML document. If the client uses 
the Locator2 object at any point in this process, they deserve what 
they get.

Possible problem with this chain of reasoning: in more normal 
circumstances it's very useful to use a Locator in fatalError() to 
get the line and column number where the errror appears. This logic 
would forbid such use.

Hmm, still another tricky bit, thisn one not even requiring an error:

1. Parser opens stream.
2. Parser calls setDocumentLocator and passes in a Locator2.
3. Parser calls startDocument. startDocument returns.
4. Another thread uses the Locator2 object before the parser has 
parsed the XML declaration.

What do getXMLVersion and getEncoding return?

I think the best solution is to make a minor fix to the Locator2 
JavaDocs that allow (indeed require) these methods to return null at 
points where the version and encoding are not known.

-- 

   Elliotte Rusty Harold
   elharo@m...
   Effective XML (Addison-Wesley, 2003)
   http://www.cafeconleche.org/books/effectivexml            
   http://www.amazon.com/exec/obidos/ISBN%3D0321150406/ref%3Dnosim/cafeaulaitA 

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
 

Stylus Studio has published XML-DEV in RSS and ATOM formats, enabling users to easily subcribe to the list from their preferred news reader application.


Stylus Studio Sponsored Links are added links designed to provide related and additional information to the visitors of this website. they were not included by the author in the initial post. To view the content without the Sponsor Links please click here.

Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.