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
