Thank you Pete for the alternative to host LoadingContext/ResourceSet within DataFactory. How to browse from SDOSchemaSAX2Parser to DataFactory please? My prototype checks LoadingContext/ResourceSet within SDOSchemaSAX2Parser::startInclude
My LoadingContext/ResourceSet is internal to parsers, not a user context. On 12/9/06, Pete Robbins <[EMAIL PROTECTED]> wrote:
Yang, Yes we've noticed this when loading the Atom schema. On 09/12/06, Yang ZHONG <[EMAIL PROTECTED]> wrote: > > While working on http://issues.apache.org/jira/browse/TUSCANY-907 > I've observed duplicated XSD loading. It could be infinite loading. I > might > have a way to avoid that. > > Could you verify current implementation may load redundantly even > infinitely? > Could you brainstorm how to avoid that? > > http://pecl.php.net/bugs/bug.php?id=9243 > has the Test Case: > 1. http://ping.chip.org/phr/xml/insurance.xsd imports > http://ping.chip.org/phr/xml/types.xsd > 2. http://ping.chip.org/phr/xml/insurance.xsd imports > http://ping.chip.org/phr/xml/contact.xsd which also imports > http://ping.chip.org/phr/xml/types.xsd > > I've observed http://ping.chip.org/phr/xml/types.xsd is loaded/parsed > multiple times during loading http://ping.chip.org/phr/xml/insurance.xsd > > That impacts performance, especially types.xsd is remote. > > More deadly, that may cause infinite loading or stack overflow. > Imagine A imports B which imports A, or X imports Y which imports Z which > imports X. > > If above is true, let's brainstorm how to avoid that. > > We can have a LoadingContext/ResourceSet to cache loaded/parsed resources, > and reuse parsing results if a location/URI has been loaded/parsed > already. > > 3-1. The LoadingContext/ResourceSet can be a Thread Local > 3-2. The LoadingContext/ResourceSet can be explicitly passed into each > parser > 3-3. Currently ParserErrorSetter is explicitly passed into each parser, > which can host the LoadingContext/ResourceSet > > Do you have alternatives? Which would you prefer? The most basic problem is when a user uses XSDHelper to load X.xsd which imports other schema... which in turn include some of the same schema. At the moment his causes redundant parsing. A simple solution is to remember the schema namespace/location so the import/include of a schema we already have parsed can be ignored. This information could be held in the DataFactory so that if the user calls XSDHelper::define() for the same schema we could ignore it (as we know the types are already defined). I'm not sure if you are suggesting a wider ranging improvement of some context the user can pass into XSDHelper? Cheers, -- Pete
-- Yang ZHONG
