Uploaded image for project: 'Commons Digester'
  1. Commons Digester
  2. DIGESTER-173

No way to enable schema validation from DigesterLoader

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Critical
    • Resolution: Fixed
    • 3.2
    • 3.3
    • None

    Description

      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:

      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);

      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:

      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);

      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.

      Attachments

        1. DIGESTER-173.patch
          7 kB
          Ivan Diana
        2. LoaderDTDValidation.patch
          8 kB
          Ivan Diana

        Activity

          People

            simone.tripodi Simone Tripodi
            beamerblvd Nick Williams
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - 24h
                24h
                Remaining:
                Remaining Estimate - 24h
                24h
                Logged:
                Time Spent - Not Specified
                Not Specified