[ https://issues.apache.org/jira/browse/DIGESTER-173?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Simone Tripodi resolved DIGESTER-173. ------------------------------------- Resolution: Fixed Fix Version/s: 3.3 testcase added at r1457663, thanks Ivan for contributing!!! :) > No way to enable schema validation from DigesterLoader > ------------------------------------------------------ > > Key: DIGESTER-173 > URL: https://issues.apache.org/jira/browse/DIGESTER-173 > Project: Commons Digester > Issue Type: Improvement > Affects Versions: 3.2 > Reporter: Nick Williams > Assignee: Simone Tripodi > Priority: Critical > Fix For: 3.3 > > Attachments: DIGESTER-173.patch, LoaderDTDValidation.patch > > Original Estimate: 24h > Remaining Estimate: 24h > > It's possible that I'm using DigesterLoader with the improper assumptions, > but my belief is that it is meant to be a factor of sorts for creating > Digesters. If this is the case, the DigesterLoader interface is incomplete > (and, for that matter, even if it is not the case, the documentation > surrounding the use of Digester and DigesterLoader is seriously lacking). > I originally used the following code to digest my XML files: > {code}this.loader = DigesterLoader.newLoader(module); > this.loader.setNamespaceAware(true); > this.loader.setSchema(schema); > this.loader.setValidating(true); > this.loader.setErrorHandler(new DefaultThrowingErrorHandler()); > this.loader.setUseContextClassLoader(false); > this.loader.setClassLoader(Digester.class.getClassLoader()); > ... > this.loader.newDigester().parse(myFile);{code} > However, I was getting strange errors "Document is invalid: no grammar found" > and "must match DOCTYPE root null". Since I wasn't using a DOCTYPE, I had no > idea why this was happening. Much Googling of other sources (the > documentation did not help me with this) finally made me realize that > setValidating() was turning on DTD validating, regardless of the fact that I > was actually using schemas. > I finally figured out my code needed to be this: > {code}this.loader = DigesterLoader.newLoader(module); > this.loader.setNamespaceAware(true); > this.loader.setSchema(schema); > this.loader.setErrorHandler(new DefaultThrowingErrorHandler()); > this.loader.setUseContextClassLoader(false); > this.loader.setClassLoader(Digester.class.getClassLoader()); > ... > Digester digester = this.loader.newDigester(); > digester.setFeature("http://xml.org/sax/features/validation", true); > digester.setFeature("http://apache.org/xml/features/validation/schema", true); > digester.setFeature("http://apache.org/xml/features/validation/schema-full-checking", > true);{code} > As you can see, I have to first get a Digester from the factory and THEN > configure the digester further before I can use it. This is contrary to the > standard factory pattern. > *Proposal 1* > - Deprecate setValidating(boolean) in DigesterLoader and Digester and replace > them with setDoctypeValidating(boolean). > - Add a setSchemaValidating(boolean) method to DigesterLoader and Digester. > - Add a setFeature() method in DigesterLoader to mirror the one in Digester. > *Proposal 2* > - Document the setValidating(boolean) DigesterLoader and Digester methods > better to indicate that it is for DOCTYPE validation and should not be used > when using schemas. > - Add a setFeature() method in DigesterLoader to mirror the one in Digester. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira