Not sure what's going on, but a few other things worth pointing out... 1) <include>s for the same target namespace get mashed into the same Grammar object. 2) <import>s are attached to the grammars which imported them. The XSGrammarBucket used by the validator will dig them out. 3) The Schema object holds on to the SoftReferenceGrammarPool through a WeakReference, meaning it's going to get cleared if nothing else (i.e. parser or validator) has a reference to it. Keeps the Schema object from wasting memory if the application is no longer actively using it with a parser or validator. 4) You can tell if Grammars got GC'd if the clean() method on SoftReferenceGrammarPool actually does real work; removing stale SoftReferences.
Thanks. Michael Glavassevich XML Parser Development IBM Toronto Lab E-mail: [EMAIL PROTECTED] E-mail: [EMAIL PROTECTED] "Adam Retter" <[EMAIL PROTECTED]> wrote on 11/11/2008 10:48:18 AM: > Okay I have placed some breakpoints in SoftReferenceGrammarPool, for > the simple example of A and B it seems to work very well, thanks J > > Now with more complicated schemas that include multiple schemas that > include even more schemas, I am not sure whether they are being > cached in the pool correctly and then being garbage collected or > whether the caching is not working how I would expect. > > For example after validating a ChangeReportStatusRequest document > there are 3 grammars in the pool - ?../Reports/CEPC-Reports.xsd?, > ?../CommonFiles/CommonStructures.xsd?, ?ChangeReportStatusRequest.xsd? > I then validate a LodgeReportRequest document and after that, there > are now only 2 grammars in the pool ? ?.. > /CommonFiles/CommonStructures.xsd?, ?LodgeReportRequest.xsd? > > I would have assumed that after validating both of those documents, > there would now be 4 grammars in the pool. I understand that GC may > kick in under strict memory but I am not sure that is the case here? > > Thanks Adam. > > From: Michael Glavassevich [mailto:[EMAIL PROTECTED] > Sent: 11 November 2008 14:23 > To: j-users@xerces.apache.org > Cc: Adam Retter > Subject: RE: Problem validating using XMLGrammarPool with different > Grammars with no namespace > > Hi Adam, > > If you want to debug it I would suggest putting breakpoints inside > of SoftReferenceGrammarPool [1]. Technically this grammar pool could > dump some of the grammars from the cache later (and then reload them > if needed) but only if the JVM is starving for memory. > > Thanks. > > [1] http://svn.apache. > org/viewvc/xerces/java/trunk/src/org/apache/xerces/jaxp/validation/SoftReferenceGrammarPool. > java?view=log > > Michael Glavassevich > XML Parser Development > IBM Toronto Lab > E-mail: [EMAIL PROTECTED] > E-mail: [EMAIL PROTECTED] > > "Adam Retter" <[EMAIL PROTECTED]> wrote on 11/11/2008 > 07:42:45 AM: > > > Ahhhh? > > > > Great J This seems to work initially. > > > > Is there a way I can interrogate the GrammarPool or schema loader in > > this approach so that I can confirm that grammars are being loaded > > once and then re-loaded from the Cache? > > > > Thanks Adam. > > > > From: Michael Glavassevich [mailto:[EMAIL PROTECTED] > > Sent: 11 November 2008 12:29 > > To: j-users@xerces.apache.org > > Cc: Adam Retter > > Subject: RE: Problem validating using XMLGrammarPool with different > > Grammars with no namespace > > > > Hi Adam, > > > > Try using the SchemaFactory.newSchema() method. The one which takes > > no arguments. It caches based on schema location. That's the one I meant. > > > > Thanks. > > > > Michael Glavassevich > > XML Parser Development > > IBM Toronto Lab > > E-mail: [EMAIL PROTECTED] > > E-mail: [EMAIL PROTECTED] > > > > "Adam Retter" <[EMAIL PROTECTED]> wrote on 11/11/2008 > > 06:56:06 AM: > > > > > Michael again thanks for the prompt reply ? > > > > > > I have attempted to use SAXParserFactory, set up the Schemas and > > > then use the XMLReader, unfortunately I get exactly the same > > > problems as with the XMLGrammarPool approach. I guess internally > > > both of these approaches are looking for a documents Schema based on > > > its namespace. Because we have duplicate namespaces the second > > > document/schema that uses the same namespace as the first > > > document/schema fails. > > > > > > SchemaFactory schemaFactory = SchemaFactory. > > > newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); > > > > > > Source schemas[] = new Source[] { > > > new StreamSource(new File("c:\\1.xsd")), > > > new StreamSource(new File("c:\\2.xsd")) > > > }; > > > > > > Schema schema = schemaFactory.newSchema(schemas); > > > SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); > > > saxParserFactory.setNamespaceAware(true); > > > saxParserFactory.setValidating(true); > > > saxParserFactory.setSchema(schema); > > > XMLReader reader = saxParserFactory.newSAXParser().getXMLReader(); > > > > > > > > > If I then go on to use XMLReader to validate document a - > > > > > > <a xsi:noNamespaceSchemaLocation="c:\\1.xsd"></a> > > > > > > Then validation is fine. > > > > > > > > > However if I try and validate document b - > > > > > > <b xsi:noNamespaceSchemaLocation="c:\\2.xsd"></b> > > > > > > Then validation fails with the message - SXXP0003: Error reported by > > > XML parser: cvc-elt.1: Cannot find the declaration of element > > > 'b'. > > > > > > > > > If however I change the order of the loading of Schemas so that 2. > > > xsd is loaded before 1.xsd then document b validates fine and > > > document a fails validation (Cannot find declaration of element). > > > > > > This implies to me that the Validator identifies the relationship > > > between documents and their grammar by namespace, because the > > > namespace is the same in this case (and probably many other cases), > > > validating document b fails because the validator attempts to use > > > the schema 1.xsd. > > > > > > I may have missed something? Or there may be another approach that I > > > have not seen? > > > > > > Otherwise, I would be happy to work with the Xerces team to fix this > > > problem; I am sure there must be many different documents and > > > grammars out there that whilst different use the same namespace and > > > because of this collide - I know I am not the only person who has > > > experiences issue. > > > > > > I would propose that the Schemas location should be used for > > > comparison, falling back to the namespace if no location exists.Thoughts? > > > > > > How can we move this forward please? > > > > > > > > > Thanks Adam. > > > ________________________________________ > > > From: Michael Glavassevich [mailto:[EMAIL PROTECTED] > > > Sent: 10 November 2008 16:56 > > > To: j-users@xerces.apache.org > > > Subject: RE: Problem validating using XMLGrammarPool with different > > > Grammars with no namespace > > > > > > Hi Adam, > > > > > > "Adam Retter" <[EMAIL PROTECTED]> wrote on 11/10/2008 > > > 11:00:53 AM: > > > > > > > Thanks for the reply Michael, > > > > > > > > Regarding the JAXP Validation API - I don't really understand how I > > > > can use that with XMLReader for document parsing and validation > > > > using SAX. Any ideas? > > > > > > Start with a SAXParserFactory [1], set the Schema object on it and > > > namespace awareness to true. Getting the XMLReader [2] should be > > > straightforward from there. > > > > > > > Regards Xerces, I naively assumed that the Sun JDK fork of Xerces > > > > would have very minor changes. > > > > > > A lot of people assume that but they actually are quite different > > > and seem to keep moving on divergent paths. > > > > > > > Subsequently I have downloaded Xerces 2.9.1 and tried this in place > > > > of Sun's Xerces fork, unfortunately I am still getting the same > > > > problem and have doubly checked that I am now using org.apache. > > > > xerces.* classes and not the Sun ones. > > > > > > > > Again, looking through the (real) Xerces source I see the same > > > > comment in Xerces XMLSchemaValidator albeit now on line 1452. > > > > > > > > // store the external schema locations. they are set when > reset is called, > > > > // so any other schemaLocation declaration for the same > namespace will be > > > > // effectively ignored. becuase we choose to take first location hint > > > > // available for a particular namespace. > > > > > > Unless you're setting the external schema location properties on the > > > parser the comment you found is probably a red herring. > > > > > > > Thanks > > > > > > Thanks. > > > > > > [1] http://xerces.apache.org/xerces2- > > > j/javadocs/api/javax/xml/parsers/SAXParserFactory.html > > > [2] http://xerces.apache.org/xerces2- > > > j/javadocs/api/javax/xml/parsers/SAXParser.html#getXMLReader() > > > > > > Michael Glavassevich > > > XML Parser Development > > > IBM Toronto Lab > > > E-mail: [EMAIL PROTECTED] > > > E-mail: [EMAIL PROTECTED] > > > > > > Registered Office: 7 Abbey Court, Eagle Way, Sowton, Exeter, > Devon, EX2 7HY > > > Registered Number 2892803 Registered in England and Wales > > > > > > This email has been scanned by the MessageLabs Email Security System. > > > For more information please visit http://www.messagelabs.com/email > > > > > > The information contained in this e-mail is confidential and may be > > > subject to > > > legal privilege. If you are not the intended recipient, you must not > > > use, copy, > > > distribute or disclose the e-mail or any part of its contents ortake any > > > action in reliance on it. If you have received this e-mail in > error, please > > > e-mail the sender by replying to this message. All reasonable > > > precautions have > > > been taken to ensure no viruses are present in this e-mail. Landmark > > > Information > > > Group Limited cannot accept responsibility for loss or damage > > > arising from the > > > use of this e-mail or attachments and recommend that you subjectthese to > > > your virus checking procedures prior to use. > > > > Registered Office: 7 Abbey Court, Eagle Way, Sowton, Exeter, Devon, EX2 7HY > > Registered Number 2892803 Registered in England and Wales > > > > This email has been scanned by the MessageLabs Email Security System. > > For more information please visit http://www.messagelabs.com/email > > > > The information contained in this e-mail is confidential and may be > > subject to legal privilege. If you are not the intended recipient, > > you must not use, copy, distribute or disclose the e-mail or any > > part of its contents or take any action in reliance on it. If you > > have received this e-mail in error, please e-mail the sender by > > replying to this message. All reasonable precautions have been taken > > to ensure no viruses are present in this e-mail. Landmark > > Information Group Limited cannot accept responsibility for loss or > > damage arising from the use of this e-mail or attachments and > > recommend that you subject these to your virus checking procedures > > prior to use. > > > > www.landmarkinfo.co.uk > > Please don't print this email unless you really need to > > Registered Office: 7 Abbey Court, Eagle Way, Sowton, Exeter, Devon, EX2 7HY > Registered Number 2892803 Registered in England and Wales > > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > > The information contained in this e-mail is confidential and may be > subject to legal privilege. If you are not the intended recipient, > you must not use, copy, distribute or disclose the e-mail or any > part of its contents or take any action in reliance on it. If you > have received this e-mail in error, please e-mail the sender by > replying to this message. All reasonable precautions have been taken > to ensure no viruses are present in this e-mail. Landmark > Information Group Limited cannot accept responsibility for loss or > damage arising from the use of this e-mail or attachments and > recommend that you subject these to your virus checking procedures > prior to use. > > www.landmarkinfo.co.uk > Please don't print this email unless you really need to