Hello,

Try setting the systemId on the LSInput by adding the line 
"ret.setSystemId(systemId);" to the resolveResource() method of 
TestResolver, just before the return statement.  That solved the problem 
for me when I ran your test.

Xerces' XIncludeHandler checks for recursive includes by doing String 
comparison on the full pathnames of included resources (including a path 
that was included before will lead to an infinite recursion of includes). 
Because of this, it needs a String version of location of the included 
resource, which it gets from the systemId of the InputSource.

However, it's bad form for the XIncludeHandler to throw a 
NullPointerException instead of a useful error.  I'll file a bug about 
that.

Cheers,
-- 
Peter McCracken
XML Parser Development
IBM Toronto Lab
Email: [EMAIL PROTECTED]

[EMAIL PROTECTED] wrote on 03/14/2006 09:14:44 AM:

> Hi,
> 
> I'm running into problems when using xinclude with my own
> LSResourceResolver. I want to catch the call to the resolver and
> return my own LSInput that the parser should use for retrieving the
> included contents. What I really want is to filter the included file
> myself before letting the parser see it but it fails even for the
> simple example provided below. I get the following
> NullPointerException:
> 
> java.lang.NullPointerException
>         at
> 
org.apache.xerces.xinclude.XIncludeHandler.searchForRecursiveIncludes(Unknown
> Source)
>         at
> org.apache.xerces.xinclude.XIncludeHandler.startDocument(Unknown
> Source)
>         at
> org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(Unknown
> Source)
>         at
> org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown
> Source)
>         at
> org.apache.xerces.impl.XMLVersionDetector.startDocumentParsing(Unknown
> Source)
>         at org.apache.xerces.parsers.XML11Configuration.parse(Unknown 
Source)
>         at org.apache.xerces.parsers.XML11Configuration.parse(Unknown 
Source)
>         at
> org.apache.xerces.xinclude.XIncludeHandler.handleIncludeElement(Unknown
> Source)
>         at 
org.apache.xerces.xinclude.XIncludeHandler.emptyElement(Unknown
> Source)
>         at
> org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown
> Source)
>         at
> org.apache.xerces.impl.
> 
XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown
> Source)
>         at
> 
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown
> Source)
>         at org.apache.xerces.parsers.XML11Configuration.parse(Unknown 
Source)
>         at org.apache.xerces.parsers.XML11Configuration.parse(Unknown 
Source)
>         at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
>         at org.apache.xerces.parsers.DOMParserImpl.parse(Unknown Source)
>         at Error.main(Error.java:44)
> 
> 
> Letting the resolver return null and thereby let the default handler 
take
> care of the include works just fine in the example below. I'm using 
xerces
> 2.8.0 and jsdk 1.4.2 and 1.5.
> 
> Anyone got a clue what I'm missing?
> 
> Many thanks in advance,
> 
> /Per
> 
> 
> 
> ================
> Example class 'Error.java'
> 
> run
> 
> java Error err.xml
> 
> in order to reproduce the error.
> 
> ================
> import java.io.FileInputStream;
> import java.io.FileNotFoundException;
> import java.io.IOException;
> import java.net.MalformedURLException;
> import java.net.URL;
> import org.w3c.dom.Document;
> import org.w3c.dom.DOMError;
> import org.w3c.dom.DOMErrorHandler;
> import org.w3c.dom.bootstrap.DOMImplementationRegistry;
> import org.w3c.dom.ls.DOMImplementationLS;
> import org.w3c.dom.ls.LSException;
> import org.w3c.dom.ls.LSInput;
> import org.w3c.dom.ls.LSOutput;
> import org.w3c.dom.ls.LSParser;
> import org.w3c.dom.ls.LSResourceResolver;
> 
> 
> public class Error {
>      public static void main(String[] args) {
>      if (args.length != 1) {
>           System.out.println("Usage: java Error <instance file>");
>           System.exit(0);
>      }
>      String instanceFile = args[0];
>      try {
>           System.setProperty(DOMImplementationRegistry.PROPERTY,
>               "org.apache.xerces.dom.DOMImplementationSourceImpl");
>           DOMImplementationRegistry registry =
>           DOMImplementationRegistry.newInstance();
>           final DOMImplementationLS domImplementationLS =
>           (DOMImplementationLS)registry.getDOMImplementation("LS");
>           LSParser parser =
>           domImplementationLS.createLSParser(DOMImplementationLS.
> MODE_SYNCHRONOUS,
>                          "http://www.w3.org/2001/XMLSchema";);
>           parser.getDomConfig().setParameter("http://apache.
> org/xml/features/xinclude",
>                     Boolean.TRUE);
>           parser.getDomConfig().setParameter("resource-resolver",
>                     new TestResolver(domImplementationLS));
>           parser.getDomConfig().setParameter("error-handler", new
> DOMErrorHandler() {
>           public boolean handleError(DOMError error) {
> ((Exception)error.getRelatedException()).printStackTrace();
>                throw new LSException(LSException.PARSE_ERR, error.
> getMessage());
>           }
>           });
> 
>           LSInput input = domImplementationLS.createLSInput();
>           LSOutput output = domImplementationLS.createLSOutput();
>           input.setByteStream(new FileInputStream(instanceFile));
>           output.setByteStream(System.out);
>           Document doc = parser.parse(input);
>           domImplementationLS.createLSSerializer().write(doc, output);
>           System.err.println();
>      } catch (ClassNotFoundException e) {
>           System.err.println("Unable to find DOM Parser: " + 
e.getMessage());
>           System.exit(1);
>      } catch (InstantiationException e) {
>           System.err.println("Unable to find DOM Parser: " + 
e.getMessage());
>           System.exit(1);
>      } catch (IllegalAccessException e) {
>           System.err.println("Unable to find DOM Parser: " + 
e.getMessage());
>           System.exit(1);
>      } catch (FileNotFoundException e) {
>           System.err.println("Unable to find file: " + instanceFile);
>           System.exit(1);
>      }
>      catch (Throwable t) {
>           t.printStackTrace();
>           System.exit(1);
>      }
>      }
> }
> 
> class TestResolver implements LSResourceResolver {
>      private DOMImplementationLS domImplementationLS;
> 
>      public TestResolver(DOMImplementationLS domImplementationLS) {
>      this.domImplementationLS = domImplementationLS;
>      }
> 
>      public LSInput resolveResource(String type,
>                 String namespaceURI,
>                 String publicId,
>                 String systemId,
>                 String baseURI) {
>       System.err.println("==== Resolving '" + type + "' '" + 
namespaceURI +
> "' '" +
>                publicId + "' '" + systemId + "' '" + baseURI + "'");
> 
>      LSInput ret = domImplementationLS.createLSInput();
>      FileInputStream is = null;
>      try {
>           is = new FileInputStream((new URL(systemId)).getPath());
>      } catch (IOException e) {
>           e.printStackTrace();
>           System.exit(1);
>      }
>      ret.setByteStream(is);
>      return ret;
> //     return null;
>      }
> }
> 
> ====================
> Example xml file 'err.xml'
> ====================
> <?xml version="1.0"?>
> <elem xmlns:xi="http://www.w3.org/2001/XInclude";>
>     <xi:include href="file:errinclude.xml"/>
> </elem>
> 
> ====================
> Example xml file 'errinclude.xml'
> ====================
> <anotherElement>Some text for example</anotherElement>
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to