re PR classpath/30718 (TransformerException in XSLURIResolver)
authorChris Burdess <dog@gnu.org>
Wed, 7 Feb 2007 18:22:26 +0000 (18:22 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 7 Feb 2007 18:22:26 +0000 (18:22 +0000)
2007-02-07  Chris Burdess  <dog@gnu.org>

Fixes PR 30718.
* gnu/xml/dom/ls/SAXEventSink.java: Add public accessor/mutators.
* gnu/xml/transform/XSLURIResolver.java: Add support for custom
  SAXSources without a backing URL or stream.

Fixes PR 27710.
* gnu/xml/dom/DomDocumentBuilderFactory.java: Fall back to synchronous
  LSParser if implementation does not support asynchronous.
* gnu/xml/stream/XMLParser.java,
  gnu/xml/stream/XIncludeFilter.java: Use custom code instead of
  java.net.URL to resolve to an an absolute URI, to avoid nonexistent
  protocol handler problems.

From-SVN: r121694

24 files changed:
libjava/classpath/ChangeLog
libjava/classpath/gnu/xml/dom/DomDocumentBuilderFactory.java
libjava/classpath/gnu/xml/dom/ls/SAXEventSink.java
libjava/classpath/gnu/xml/stream/XIncludeFilter.java
libjava/classpath/gnu/xml/stream/XMLParser.java
libjava/classpath/gnu/xml/transform/XSLURIResolver.java
libjava/classpath/lib/gnu/xml/dom/DomDocumentBuilderFactory.class
libjava/classpath/lib/gnu/xml/dom/ls/SAXEventSink.class
libjava/classpath/lib/gnu/xml/stream/XIncludeFilter.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$AnyContentModel.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$Attribute.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$AttributeDecl.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$ContentModel.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$ContentParticle.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$Doctype.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$ElementContentModel.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$EmptyContentModel.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$ExternalIds.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$Input.class
libjava/classpath/lib/gnu/xml/stream/XMLParser$MixedContentModel.class
libjava/classpath/lib/gnu/xml/stream/XMLParser.class
libjava/classpath/lib/gnu/xml/transform/XSLURIResolver.class
libjava/gnu/xml/dom/ls/SAXEventSink.h
libjava/gnu/xml/transform/XSLURIResolver.h

index efc151209660850eff3529e8e9de9a9b302b7463..a9a3449c3f06549a789dda6bfa8632190a10c958 100644 (file)
@@ -1,3 +1,18 @@
+2007-02-07  Chris Burdess  <dog@gnu.org>
+
+       Fixes PR 30718.
+       * gnu/xml/dom/ls/SAXEventSink.java: Add public accessor/mutators.
+       * gnu/xml/transform/XSLURIResolver.java: Add support for custom
+         SAXSources without a backing URL or stream.
+
+       Fixes PR 27710.
+       * gnu/xml/dom/DomDocumentBuilderFactory.java: Fall back to synchronous
+         LSParser if implementation does not support asynchronous.
+       * gnu/xml/stream/XMLParser.java,
+         gnu/xml/stream/XIncludeFilter.java: Use custom code instead of
+         java.net.URL to resolve to an an absolute URI, to avoid nonexistent
+         protocol handler problems.
+
 2007-02-06  Tom Tromey  <tromey@redhat.com>
 
        PR libgcj/30707:
index 02347858002c3c59c5d91daa2a68171c206c093c..4d2828af84edb8e84a8d172a25f75d674f332737 100644 (file)
@@ -43,6 +43,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.FactoryConfigurationError;
 import javax.xml.parsers.ParserConfigurationException;
 import org.w3c.dom.DOMConfiguration;
+import org.w3c.dom.DOMException;
 import org.w3c.dom.DOMImplementation;
 import org.w3c.dom.bootstrap.DOMImplementationRegistry;
 import org.w3c.dom.ls.DOMImplementationLS;
@@ -84,8 +85,38 @@ public class DomDocumentBuilderFactory
   public DocumentBuilder newDocumentBuilder()
     throws ParserConfigurationException
   {
-    LSParser parser = ls.createLSParser(DOMImplementationLS.MODE_ASYNCHRONOUS,
-                                        "http://www.w3.org/TR/REC-xml");
+    LSParser parser = null;
+    try
+      {
+        parser = ls.createLSParser(DOMImplementationLS.MODE_ASYNCHRONOUS,
+                                   "http://www.w3.org/TR/REC-xml");
+      }
+    catch (DOMException e)
+      {
+        if (e.code == DOMException.NOT_SUPPORTED_ERR)
+          {
+            // Fall back to synchronous parser
+            try
+              {
+                parser = ls.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS,
+                                           "http://www.w3.org/TR/REC-xml");
+              }
+            catch (DOMException e2)
+              {
+                ParserConfigurationException pce =
+                    new ParserConfigurationException();
+                pce.initCause(e2);
+                throw pce;
+              }
+          }
+        else
+          {
+            ParserConfigurationException pce =
+                new ParserConfigurationException();
+            pce.initCause(e);
+            throw pce;
+          }
+      }
     DOMConfiguration config = parser.getDomConfig();
     setParameter(config, "namespaces",
                  isNamespaceAware() ? Boolean.TRUE : Boolean.FALSE);
index 8c5b104b9f2f3b3007bcfa4cff348f2ff013d68c..285540060d95fd75418e8190d86338ffd14cb2f3 100644 (file)
@@ -111,11 +111,16 @@ public class SAXEventSink
     interrupted = true;
   }
 
-  protected Document getDocument()
+  public Document getDocument()
   {
     return doc;
   }
 
+  public void setReader(XMLReader reader)
+  {
+    this.reader = reader;
+  }
+
   // -- ContentHandler2 --
   
   public void setDocumentLocator(Locator locator)
index 7e707820d52c7cde637dada3e95261b53cad08e5..86961faea9157c90349cd901d0a6dace69c896ff 100644 (file)
@@ -42,7 +42,6 @@ import java.io.InputStreamReader;
 import java.io.IOException;
 import java.io.Reader;
 import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.HashSet;
@@ -122,17 +121,7 @@ class XIncludeFilter
                  boolean expandERefs)
   {
     super(reader);
-    try
-      {
-        this.systemId = XMLParser.absolutize(null, systemId);
-      }
-    catch (MalformedURLException e)
-      {
-        RuntimeException e2 = new RuntimeException("unsupported URL: " +
-                                                   systemId);
-        e2.initCause(e);
-        throw e2;
-      }
+    this.systemId = XMLParser.absolutize(null, systemId);
     this.namespaceAware = namespaceAware;
     this.validating = validating;
     this.expandERefs = expandERefs;
index ef3779944c3f08e36de63857b6388d4432298a6a..663a300f88c88f4819f7f7f50a8adfd577c72db9 100644 (file)
@@ -1592,7 +1592,6 @@ public class XMLParser
    * @param href the (absolute or relative) URL to resolve
    */
   public static String absolutize(String base, String href)
-    throws MalformedURLException
   {
     if (href == null)
       return null;
@@ -1622,7 +1621,60 @@ public class XMLParser
         if (!base.endsWith("/"))
           base += "/";
       }
-    return new URL(new URL(base), href).toString();
+    // We can't use java.net.URL here to do the parsing, as it searches for
+    // a protocol handler. A protocol handler may not be registered for the
+    // URL scheme here. Do it manually.
+    // 
+    // Set aside scheme and host portion of base URL
+    String basePrefix = null;
+    ci = base.indexOf(':');
+    if (ci > 1 && isURLScheme(base.substring(0, ci)))
+      {
+          if (base.length() > (ci + 3)  &&
+              base.charAt(ci + 1) == '/' &&
+              base.charAt(ci + 2) == '/')
+            {
+              int si = base.indexOf('/', ci + 3);
+              if (si == -1)
+                base = null;
+              else
+                {
+                  basePrefix = base.substring(0, si);
+                  base = base.substring(si);
+                }
+            }
+          else
+            base = null;
+      }
+    if (base == null) // unknown or malformed base URL, use href
+      return href;
+    if (href.startsWith("/")) // absolute href pathname
+      return (basePrefix == null) ? href : basePrefix + href;
+    // relative href pathname
+    if (!base.endsWith("/"))
+      {
+        int lsi = base.lastIndexOf('/');
+        if (lsi == -1)
+          base = "/";
+        else
+          base = base.substring(0, lsi + 1);
+      }
+    while (href.startsWith("../") || href.startsWith("./"))
+      {
+        if (href.startsWith("../"))
+          {
+            // strip last path component from base
+            int lsi = base.lastIndexOf('/', base.length() - 2);
+            if (lsi > -1)
+              base = base.substring(0, lsi + 1);
+            href = href.substring(3); // strip ../ prefix
+          }
+        else
+          {
+            href = href.substring(2); // strip ./ prefix
+          }
+      }
+    return (basePrefix == null) ? base + href : basePrefix + base + href;
   }
 
   /**
index 8d7e3fcb4851848d9a062d10fdf29391f34a8923..8bb8977315e34edd10b18c627f603608b7c79390 100644 (file)
@@ -55,9 +55,13 @@ import javax.xml.transform.URIResolver;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXSource;
 import javax.xml.transform.stream.StreamSource;
+import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import gnu.xml.dom.DomDocument;
+import gnu.xml.dom.ls.SAXEventSink;
 import gnu.xml.dom.ls.ReaderInputStream;
 
 /**
@@ -137,17 +141,14 @@ class XSLURIResolver
         else if (source != null && source instanceof SAXSource)
           {
             SAXSource ss = (SAXSource) source;
-            if (ss.getInputSource() != null)
+            InputSource input = ss.getInputSource();
+            if (input != null)
               {
-                in =  ss.getInputSource().getByteStream();
-                if (in == null)
-                  {
-                    Reader reader = ss.getInputSource().getCharacterStream();
-                    if (reader != null)
-                      {
-                        in = new ReaderInputStream(reader);
-                      }
-                  }
+                if (systemId == null)
+                  systemId = input.getSystemId();
+                XMLReader reader = ss.getXMLReader();
+                if (reader != null)
+                  return parse(input, reader);
               }
           }
         if (in == null)
@@ -294,6 +295,27 @@ class XSLURIResolver
         throw new TransformerException(e);
       }
   }
+
+  DOMSource parse(InputSource source, XMLReader reader)
+    throws SAXException, IOException
+  {
+    SAXEventSink eventSink = new SAXEventSink();
+    eventSink.setReader(reader);
+    reader.setContentHandler(eventSink);
+    reader.setDTDHandler(eventSink);
+    reader.setProperty("http://xml.org/sax/properties/lexical-handler",
+            eventSink);
+    reader.setProperty("http://xml.org/sax/properties/declaration-handler",
+            eventSink);
+    // XXX entityResolver
+    // XXX errorHandler
+    reader.parse(source);
+    Document doc = eventSink.getDocument();
+    String systemId = source.getSystemId();
+    if (systemId != null && doc instanceof DomDocument)
+      ((DomDocument) doc).setDocumentURI(systemId);
+    return new DOMSource(doc, systemId);
+  }
   
 }
 
index 4e082d19a9ddd773031267f8ca13de5493115959..69733b67a2e046af735113c636fcff027079790b 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/dom/DomDocumentBuilderFactory.class and b/libjava/classpath/lib/gnu/xml/dom/DomDocumentBuilderFactory.class differ
index f5f281ea1960d783a6d0f6caf380524c3179d0bb..d0caa3bd423f74a038d4eccc90e9160d3ba23ddc 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/dom/ls/SAXEventSink.class and b/libjava/classpath/lib/gnu/xml/dom/ls/SAXEventSink.class differ
index f659aa6cad5ad2f74ed8a8dce8f6dd3ee9e2ae8d..afd44e4a0743f007e5e3d5583622d60a8ac9d8ab 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XIncludeFilter.class and b/libjava/classpath/lib/gnu/xml/stream/XIncludeFilter.class differ
index df7b43baf038a06cec65b5fbf360e0afd3dde194..9be3b141ee4cea1b9d8697be91f5d8221d5e40ea 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$AnyContentModel.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$AnyContentModel.class differ
index b3457c542702091559116e62155b95ee92e46eeb..a529f6da6307fd268c8884ebbd5c0eabc929e09d 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$Attribute.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$Attribute.class differ
index 8ca9de327de93c9dcf3ae1df62abac257f671825..86380a679073ee911921e321279024585e8a7e90 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$AttributeDecl.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$AttributeDecl.class differ
index 95921cf64b5e8388cccb2cd1c0dadeaa6de30c72..c8e3969e2f5e4d7a5039c05d6838f5c3f730ef2d 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$ContentModel.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$ContentModel.class differ
index d6189eb3a473f7b954cb27ba16c982c3b46a1983..5341444e01afe0cd7da8e6ab90c7840503991632 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$ContentParticle.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$ContentParticle.class differ
index 405545d96041a71b19b373a80a9cc71b19dcbec6..e935c7476cd589bf21bbd433c007235efafddefa 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$Doctype.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$Doctype.class differ
index 30d2626e86fa553ab52d3573d8e0a06fb41593cb..71e6334a938654f45b3bf6fd6f04a3f050aaf48b 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$ElementContentModel.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$ElementContentModel.class differ
index fcfaca7a49eda7cc8fa91e8314801575fa19c2cd..e74252ef0e324795bbd841e598711c1e43036652 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$EmptyContentModel.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$EmptyContentModel.class differ
index e1a134fdba4f8fa142a2100a47b4593e978f0ead..8a6def15bfcc244a9981aeef9eec2d09ff717b96 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$ExternalIds.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$ExternalIds.class differ
index ddd6c4c2abfcf4cbf80ecf972375c41bc7c741dc..74a7e7916521b28028da19640b39d89e9a56f855 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$Input.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$Input.class differ
index 63bc30f3a03ac3f01fe3b68e2e52c2b9d02965fe..eded8c572d1676d57099e28972fb602c178de947 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser$MixedContentModel.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser$MixedContentModel.class differ
index 54792a1be55c0fab475c7b8fc31ef46c0f44766a..f1250985fa2e1a0715e075a8eeccbb572d46d320 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/stream/XMLParser.class and b/libjava/classpath/lib/gnu/xml/stream/XMLParser.class differ
index 5fc53be4fd5b4066e6628ae0a54054a89391c803..064742c935a5b7fb5c9a94e0b77dbb7c22e6d59f 100644 (file)
Binary files a/libjava/classpath/lib/gnu/xml/transform/XSLURIResolver.class and b/libjava/classpath/lib/gnu/xml/transform/XSLURIResolver.class differ
index ec35c66b68e49a89fb621f9b42d5bf9146ae4d83..54f4e5f159604f8d1e25454489e267264dc4111a 100644 (file)
@@ -57,9 +57,9 @@ public:
   SAXEventSink();
 public: // actually package-private
   virtual void interrupt();
-public: // actually protected
-  virtual ::org::w3c::dom::Document * getDocument();
 public:
+  virtual ::org::w3c::dom::Document * getDocument();
+  virtual void setReader(::org::xml::sax::XMLReader *);
   virtual void setDocumentLocator(::org::xml::sax::Locator *);
   virtual void startDocument();
   virtual void endDocument();
index a7e0aeae26e9a0392f8d7306b202f046c9d7c83a..394c4c7d0daaf13273b3253bae44994cf8936b6d 100644 (file)
@@ -46,6 +46,17 @@ extern "Java"
       }
     }
   }
+  namespace org
+  {
+    namespace xml
+    {
+      namespace sax
+      {
+          class InputSource;
+          class XMLReader;
+      }
+    }
+  }
 }
 
 class gnu::xml::transform::XSLURIResolver : public ::java::lang::Object
@@ -62,6 +73,7 @@ public: // actually package-private
   virtual ::javax::xml::transform::dom::DOMSource * resolveDOM(::javax::xml::transform::Source *, ::java::lang::String *, ::java::lang::String *);
   virtual ::java::net::URL * resolveURL(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
   virtual ::javax::xml::parsers::DocumentBuilder * getDocumentBuilder();
+  virtual ::javax::xml::transform::dom::DOMSource * parse(::org::xml::sax::InputSource *, ::org::xml::sax::XMLReader *);
   ::java::util::Map * __attribute__((aligned(__alignof__( ::java::lang::Object)))) lastModifiedCache;
   ::java::util::Map * nodeCache;
   ::javax::xml::parsers::DocumentBuilder * builder;