Hi Alberto,
One problem I noticed with your fix is the call to resolveEntity() in the
various overloads of resolveSystemId() always result in a null pointer for
the public ID, meaning that any mechanism that relies on public IDs will
not work. For example, in IGXMLScanner.::resolveSystemId():
XMLResourceIdentifier
resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
expSysId.getRawBuffer(), 0,
XMLUni::fgZeroLenString, lastInfo.systemId);
srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
You can see the XMLResourceIdentifier instance here is constructed with a
null pointer for the public ID parameter.
Perhaps changing the signature for resolveSystemId() to provide the public
ID, if any, will solve this problem?
Thanks!
Dave
Alberto Massari <[EMAIL PROTECTED]>
12/03/2004 09:14 AM
Please respond to xerces-c-dev
To: [EMAIL PROTECTED]
cc: (bcc: David N Bertoni/Cambridge/IBM)
Subject: Re: DTD caching problems
Hi David,
At 12.05 03/12/2004 -0500, David Cargill wrote:
>Hi Alberto,
>Looks like we are both working on the same problem. I have a different
>solution for #1 and that is to call switchGrammar in scanDocType. That
is
>what happens in IGXMLScanner but not DGXMLScanner and that is why it
works
>for IG and not DG.
I have thought about that, but I think that changing orphanGrammar would
be
a safer also for other cases when we forget to keep the two maps in synch.
But feel free to revert my change.
>For #2, still looking at how to avoid the 2nd call. Another customer
>reported a similar problem as this as well...
Have a look at what I committed, and let me know if this solves your
problem too.
Alberto
>Regards,
>David A. Cargill
>XML Parser Development
>IBM Toronto Lab
>(905) 413-2371, tie 969
>[EMAIL PROTECTED]
>
>
>
> Alberto Massari
> <[EMAIL PROTECTED]
> s.com> To
> [EMAIL PROTECTED]
> 12/03/2004 11:51 cc
> AM
> Subject
> Re: DTD caching problems
> Please respond to
> xerces-c-dev
>
>
>
>
>
>
>
>
>Hi Daniel,
>I have looked at the testcase you submitted, and I found two things:
>1) the exception you get when using cached grammars and the DGXMLScanner
is
>
>caused by GrammarResolver::orphanGrammar; to fix it, apply this diff
>
>diff -u -r1.29 GrammarResolver.cpp
>--- GrammarResolver.cpp 29 Sep 2004 19:27:07 -0000 1.29
>+++ GrammarResolver.cpp 3 Dec 2004 16:16:23 -0000
>@@ -439,7 +439,8 @@
> Grammar* grammar = fGrammarPool->orphanGrammar(nameSpaceKey);
> if (grammar)
> {
>- fGrammarFromPool->removeKey(nameSpaceKey);
>+ if (fGrammarFromPool->containsKey(nameSpaceKey))
>+ fGrammarFromPool->removeKey(nameSpaceKey);
> return grammar;
> }
> // It failed to remove it from the grammar pool either because
it
>
>2) as for the extra resolveEntity() you see, it's by design;
>GrammarResolver now stores the DTDs using their systemID as key (instead
of
>
>the root element name), so, when caching is on, an extra call to
>resolveEntity is done in order to be able to invoke
>InputSource::getSystemId(). At that point, if the systemId is already in
>the cache, the input source is not parsed; if it is not in the cache, a
new
>
>reader is created (and this triggers a new resolveEntity call)
>I will change this to at least avoid the second call (as we have already
>resolved the DTD).
>
>Thanks for the testcase,
>Alberto
>
>At 16.42 03/12/2004 +1100, Daniel McLean wrote:
> >I've put together a demo based on one of the sample programs shipped
with
> >Xerces. The demo creates a Xerces GrammarPoolImpl then conducts a
number
> >of validating XML parses using that grammar pool when caching is
enabled
> >for the parser. The test documents include an XML file referring to a
DTD
> >and an XML file referring to an XML schema. Each type of parse is done
> >twice in succession to observe the caching behaviour of Xerces, with a
new
> >parser instance created for each parse. The parses done include:
> >
> > DGXMLScanner without caching involving DTD validation
> > DGXMLScanner with caching involving DTD validation
> >
> > IGXMLScanner without caching involving DTD validation
> > IGXMLScanner with caching involving DTD validation
> >
> > SGXMLScanner without caching involving XML schema validation
> > SGXMLScanner with caching involving XML schema validation
> >
> >I ran with on an Fedora Core 1 linux x86 platform using Xerces 2.6.0.
> >
> >I see a number of surprising things (refer to output below):
> > - parsing fails when caching is enabled whilst using the DGXMLScanner
> > - when using DGXMLScanner or IGXMLScanner for DTD validation, the DTD
> > appears to be re-resolved for each parse. I haven't checked
whether
> > the DTD is actually being re-parsed after being resolved each time,
>but
> > I wonder why it is being resolved each time if it is supposedly
being
> > cached
> > - the DTD is being resolved twice on the first parse when parsing
with a
> > DTD and caching enabled. This seems questionable.
> >
> >I've attached a tarball containing the files for the demo, which should
> >work after being unpacked into the samples directory.
> >
> >Regards,
> >
> >Daniel
> >
> >doParse dtdDGXML
> >parse #1
> >resolveEntity("", "example.dtd")
> >parse #2
> >resolveEntity("", "example.dtd")
> >----------------------------
> >doParse dtdDGXMLCaching
> >parse #1
> >resolveEntity(null, "example.dtd")
> >resolveEntity("", "example.dtd")
> >
> >Fatal Error at (file
>
>/home/daniel/xerces/xerces-c-src_2_6_0/samples/GrammarCache/example-dtd.xml,
>
> >line 2, char 40): An exception occurred! Type:NoSuchElementException,
> >Message:The key '{0}' could not be found in the hash table
> >parse #2
> >resolveEntity(null, "example.dtd")
> >resolveEntity("", "example.dtd")
> >
> >Fatal Error at (file
>
>/home/daniel/xerces/xerces-c-src_2_6_0/samples/GrammarCache/example-dtd.xml,
>
> >line 2, char 40): An exception occurred! Type:NoSuchElementException,
> >Message:The key '{0}' could not be found in the hash table
> >----------------------------
> >doParse dtdIGXML
> >parse #1
> >resolveEntity("", "example.dtd")
> >parse #2
> >resolveEntity("", "example.dtd")
> >----------------------------
> >doParse dtdIGXMLCaching
> >parse #1
> >resolveEntity("", "example.dtd")
> >resolveEntity("", "example.dtd")
> >parse #2
> >resolveEntity("", "example.dtd")
> >----------------------------
> >doParse xsd
> >parse #1
> >resolveEntity("", "example.xsd")
> >parse #2
> >resolveEntity("", "example.xsd")
> >----------------------------
> >doParse xsdCaching
> >parse #1
> >resolveEntity("", "example.xsd")
> >parse #2
> >----------------------------
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]