2007-02-07 Chris Burdess <dog@gnu.org>
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Feb 2007 18:22:26 +0000 (18:22 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Feb 2007 18:22:26 +0000 (18:22 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121694 138bc75d-0d04-0410-961f-82ee72b054a4

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 efc1512..a9a3449 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 0234785..4d2828a 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 8c5b104..2855400 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 7e70782..86961fa 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 ef37799..663a300 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 8d7e3fc..8bb8977 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 4e082d1..69733b6 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 f5f281e..d0caa3b 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 f659aa6..afd44e4 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 df7b43b..9be3b14 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 b3457c5..a529f6d 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 8ca9de3..86380a6 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 95921cf..c8e3969 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 d6189eb..5341444 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 405545d..e935c74 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 30d2626..71e6334 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 fcfaca7..e74252e 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 e1a134f..8a6def1 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 ddd6c4c..74a7e79 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 63bc30f..eded8c5 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 54792a1..f125098 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 5fc53be..064742c 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 ec35c66..54f4e5f 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 a7e0aea..394c4c7 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;