Post XInclude testing in several scenarios.

2005-12-13  Chris Burdess  <[EMAIL PROTECTED]>

        * gnu/xml/stream/XIncludeFilter.java,
          gnu/xml/stream/XMLStreamWriterImpl.java,
          gnu/xml/stream/XMLParser.java: XInclude fixes.

-- 
Chris Burdess
Index: gnu/xml/stream/XIncludeFilter.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/xml/stream/XIncludeFilter.java,v
retrieving revision 1.1
diff -u -r1.1 XIncludeFilter.java
--- gnu/xml/stream/XIncludeFilter.java  13 Dec 2005 18:37:00 -0000      1.1
+++ gnu/xml/stream/XIncludeFilter.java  13 Dec 2005 22:12:24 -0000
@@ -45,6 +45,7 @@
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.HashSet;
+import java.util.NoSuchElementException;
 import java.util.StringTokenizer;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
@@ -101,6 +102,8 @@
   Node current;
   TreeWalker walker;
   HashSet seen = new HashSet();
+  boolean backtracking;
+  boolean lookahead;
   
   Reader includedText;
   char[] buf;
@@ -270,6 +273,13 @@
     return super.getName();
   }
 
+  public String getNamespaceURI()
+  {
+    if (current != null)
+      return current.getNamespaceURI();
+    return super.getNamespaceURI();
+  }
+
   // TODO namespaces
 
   public String getPIData()
@@ -366,77 +376,79 @@
   public boolean hasNext()
     throws XMLStreamException
   {
-    if (current != null)
-      return true;
-    if (walker != null)
+    if (!lookahead)
       {
-        Node n = walker.getCurrentNode();
-        if (n.getNodeType() == Node.ELEMENT_NODE)
-          return true;
-        Node next = walker.nextNode();
-        walker.setCurrentNode(n);
-        if (next != null)
-          return true;
-      }
-    if (result != null)
-      {
-        switch (result.getResultType())
+        try
           {
-          case XPathResult.BOOLEAN_TYPE:
-          case XPathResult.NUMBER_TYPE:
-          case XPathResult.STRING_TYPE:
-            return true;
-          case XPathResult.ANY_UNORDERED_NODE_TYPE:
-          case XPathResult.FIRST_ORDERED_NODE_TYPE:
-            return result.getSingleNodeValue() != null;
-          case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
-          case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
-            return !result.getInvalidIteratorState();
-          case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
-          case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
-            return snapshotIndex < result.getSnapshotLength();
+            next();
+          }
+        catch (NoSuchElementException e)
+          {
+            event = -1;
           }
+        lookahead = true;
       }
-    if (includedText != null)
-      return true;
-    return super.hasNext();
+    return (event != -1);
   }
 
   public int next()
     throws XMLStreamException
   {
+    if (lookahead)
+      {
+        lookahead = false;
+        return event;
+      }
+    buf = null;
+    len = 0;
     if (walker != null)
       {
         Node c = walker.getCurrentNode();
-        boolean isStartElement = seen.contains(c);
-        seen.add(c);
-        if (isStartElement)
-          return (event = XMLStreamConstants.START_ELEMENT);
-        Node n = walker.firstChild();
-        if (n == null)
-          n = walker.nextSibling();
+        Node n = null;
+        if (c.getNodeType() == Node.ELEMENT_NODE)
+          {
+            boolean isStartElement = !seen.contains(c);
+            if (isStartElement)
+              {
+                seen.add(c);
+                current = c;
+                event = XMLStreamConstants.START_ELEMENT;
+                return event;
+              }
+            else if (backtracking)
+              {
+                n = walker.nextSibling();
+                if (n != null)
+                  backtracking = false;
+              }
+            else
+              {
+                n = walker.firstChild();
+                if (n == null)
+                  n = walker.nextSibling();
+              }
+          }
+        else
+          {
+            n = walker.firstChild();
+            if (n == null)
+              n = walker.nextSibling();
+          }
         if (n == null)
           {
-            if (c.getNodeType() == Node.ELEMENT_NODE)
+            current = walker.parentNode();
+            if (current != null && current.getNodeType() == Node.ELEMENT_NODE)
               {
                 // end-element
-                seen.remove(c);
-                do
-                  {
-                    n = walker.parentNode();
-                    if (n == null)
-                      {
-                        walker = null;
-                        break;
-                      }
-                    n = walker.nextSibling();
-                  }
-                while (n == null);
-                current = c;
-                return (event = XMLStreamConstants.END_ELEMENT);
+                backtracking = true;
+                event = XMLStreamConstants.END_ELEMENT;
+                return event;
               }
             else
-              current = null;
+              {
+                walker = null;
+                current = null;
+              }
           }
         else
           {
@@ -449,17 +461,24 @@
                 String text = n.getNodeValue();
                 buf = text.toCharArray();
                 len = buf.length;
-                return (event = isSpace(buf, len) ?
-                        XMLStreamConstants.SPACE :
-                        XMLStreamConstants.CHARACTERS);
+                event = isSpace(buf, len) ?
+                  XMLStreamConstants.SPACE :
+                  XMLStreamConstants.CHARACTERS;
+                return event;
               case Node.CDATA_SECTION_NODE:
-                return (event = XMLStreamConstants.CDATA);
+                event = XMLStreamConstants.CDATA;
+                return event;
               case Node.COMMENT_NODE:
-                return (event = XMLStreamConstants.COMMENT);
+                event = XMLStreamConstants.COMMENT;
+                return event;
               case Node.PROCESSING_INSTRUCTION_NODE:
-                return (event = XMLStreamConstants.PROCESSING_INSTRUCTION);
+                event = XMLStreamConstants.PROCESSING_INSTRUCTION;
+                return event;
               case Node.ENTITY_REFERENCE_NODE:
-                return (event = XMLStreamConstants.ENTITY_REFERENCE);
+                event = XMLStreamConstants.ENTITY_REFERENCE;
+                return event;
+              default:
+                throw new IllegalStateException();
               }
           }
       }
@@ -473,22 +492,25 @@
             buf = btext.toCharArray();
             len = buf.length;
             result = null;
-            return (event = XMLStreamConstants.CHARACTERS);
+            event = XMLStreamConstants.CHARACTERS;
+            return event;
           case XPathResult.NUMBER_TYPE:
             double nval = result.getNumberValue();
             String ntext = new Double(nval).toString();
             buf = ntext.toCharArray();
             len = buf.length;
             result = null;
-            return (event = XMLStreamConstants.CHARACTERS);
+            event = XMLStreamConstants.CHARACTERS;
+            return event;
           case XPathResult.STRING_TYPE:
             String stext = result.getStringValue();
             buf = stext.toCharArray();
             len = buf.length;
             result = null;
-            return (event = isSpace(buf, len) ?
-                    XMLStreamConstants.SPACE :
-                    XMLStreamConstants.CHARACTERS);
+            event = isSpace(buf, len) ?
+              XMLStreamConstants.SPACE :
+              XMLStreamConstants.CHARACTERS;
+            return event;
           case XPathResult.ANY_UNORDERED_NODE_TYPE:
           case XPathResult.FIRST_ORDERED_NODE_TYPE:
             Node n1 = result.getSingleNodeValue();
@@ -521,6 +543,8 @@
             walker = getDocumentTraversal(d3)
               .createTreeWalker(n3, SHOW_FLAGS, null, expandERefs);
             return next();
+          default:
+            throw new IllegalStateException();
           }
       }
     if (includedText != null)
@@ -564,7 +588,8 @@
                 String xpointer = getAttributeValue(null, "xpointer");
                 String encoding = getAttributeValue(null, "encoding");
                 String accept = getAttributeValue(null, "accept");
-                String acceptLanguage = getAttributeValue(null, 
"accept-language");
+                String acceptLanguage = getAttributeValue(null,
+                                                          "accept-language");
                 if (includeResource(href, parse, xpointer, encoding,
                                     accept, acceptLanguage))
                   {
@@ -666,6 +691,7 @@
             snapshotIndex = 0;
             walker = null;
             current = null;
+            backtracking = false;
             
             URLConnection connection = getURLConnection(href, accept,
                                                         acceptLanguage);
@@ -677,7 +703,7 @@
                 result = null;
                 Node item = doc.getDocumentElement();
                 walker = dt.createTreeWalker(item, SHOW_FLAGS, null,
-                                              expandERefs);
+                                             expandERefs);
               }
             else
               {
Index: gnu/xml/stream/XMLParser.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/xml/stream/XMLParser.java,v
retrieving revision 1.3
diff -u -r1.3 XMLParser.java
--- gnu/xml/stream/XMLParser.java       13 Dec 2005 18:37:00 -0000      1.3
+++ gnu/xml/stream/XMLParser.java       13 Dec 2005 22:12:24 -0000
@@ -82,6 +82,8 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import gnu.java.net.CRLFInputStream;
+
 /**
  * An XML parser.
  *
@@ -422,7 +424,9 @@
 
   public String getEncoding()
   {
-    return (input.forceReader) ? null : input.inputEncoding;
+    if (input.forceReader)
+      return null;
+    return (input.inputEncoding == null) ? "UTF-8" : input.inputEncoding;
   }
 
   public int getEventType()
@@ -506,7 +510,7 @@
         int ci = qName.indexOf(':');
         if (ci == -1)
           return null;
-        String prefix = qName.substring(ci + 1);
+        String prefix = qName.substring(0, ci);
         return getNamespaceURI(prefix);
       default:
         return null;
@@ -611,7 +615,7 @@
 
   public String getVersion()
   {
-    return xmlVersion;
+    return (xmlVersion == null) ? "1.0" : xmlVersion;
   }
 
   public boolean hasName()
@@ -720,7 +724,14 @@
   {
     if (!lookahead)
       {
-        next();
+        try
+          {
+            next();
+          }
+        catch (NoSuchElementException e)
+          {
+            event = -1;
+          }
         lookahead = true;
       }
     return event != -1;
@@ -2496,57 +2507,64 @@
   public static void main(String[] args)
     throws Exception
   {
+    boolean xIncludeAware = false;
+    if (args.length > 1 && "-x".equals(args[1]))
+      xIncludeAware = true;
     XMLParser p = new XMLParser(new java.io.FileInputStream(args[0]), args[0]);
+    XMLStreamReader reader = p;
+    if (xIncludeAware)
+      reader = new XIncludeFilter(p, args[0], true, true, true);
     try
       {
         int event;
-        do
+        //do
+        while (reader.hasNext())
           {
-            event = p.next();
+            event = reader.next();
             switch (event)
               {
               case XMLStreamConstants.START_DOCUMENT:
-                System.out.println("START_DOCUMENT version="+p.getVersion()+
-                                   " encoding="+p.getEncoding());
+                System.out.println("START_DOCUMENT 
version="+reader.getVersion()+
+                                   " encoding="+reader.getEncoding());
                 break;
               case XMLStreamConstants.END_DOCUMENT:
                 System.out.println("END_DOCUMENT");
                 break;
               case XMLStreamConstants.START_ELEMENT:
-                System.out.println("START_ELEMENT "+p.getName());
-                int l = p.getNamespaceCount();
+                System.out.println("START_ELEMENT "+reader.getName());
+                int l = reader.getNamespaceCount();
                 for (int i = 0; i < l; i++)
-                  System.out.println("\tnamespace "+p.getNamespacePrefix(i)+
-                                     "='"+p.getNamespaceURI(i)+"'");
-                l = p.getAttributeCount();
+                  System.out.println("\tnamespace 
"+reader.getNamespacePrefix(i)+
+                                     "='"+reader.getNamespaceURI(i)+"'");
+                l = reader.getAttributeCount();
                 for (int i = 0; i < l; i++)
-                  System.out.println("\tattribute "+p.getAttributeQName(i)+
-                                     "='"+p.getAttributeValue(i)+"'");
+                  System.out.println("\tattribute 
"+reader.getAttributeQName(i)+
+                                     "='"+reader.getAttributeValue(i)+"'");
                 break;
               case XMLStreamConstants.END_ELEMENT:
-                System.out.println("END_ELEMENT "+p.getName());
+                System.out.println("END_ELEMENT "+reader.getName());
                 break;
               case XMLStreamConstants.CHARACTERS:
-                System.out.println("CHARACTERS '"+p.getText()+"'");
+                System.out.println("CHARACTERS '"+reader.getText()+"'");
                 break;
               case XMLStreamConstants.CDATA:
-                System.out.println("CDATA '"+p.getText()+"'");
+                System.out.println("CDATA '"+reader.getText()+"'");
                 break;
               case XMLStreamConstants.SPACE:
-                System.out.println("SPACE '"+p.getText()+"'");
+                System.out.println("SPACE '"+reader.getText()+"'");
                 break;
               case XMLStreamConstants.DTD:
-                System.out.println("DTD "+p.getText());
+                System.out.println("DTD "+reader.getText());
                 break;
               case XMLStreamConstants.ENTITY_REFERENCE:
-                System.out.println("ENTITY_REFERENCE "+p.getText());
+                System.out.println("ENTITY_REFERENCE "+reader.getText());
                 break;
               case XMLStreamConstants.COMMENT:
-                System.out.println("COMMENT '"+p.getText()+"'");
+                System.out.println("COMMENT '"+reader.getText()+"'");
                 break;
               case XMLStreamConstants.PROCESSING_INSTRUCTION:
-                System.out.println("PROCESSING_INSTRUCTION "+p.getPITarget()+
-                                   " "+p.getPIData());
+                System.out.println("PROCESSING_INSTRUCTION 
"+reader.getPITarget()+
+                                   " "+reader.getPIData());
                 break;
               case XMLStreamConstants.START_ENTITY:
                 System.out.println("START_ENTITY");
@@ -2558,11 +2576,11 @@
                 System.out.println("Unknown event: "+event);
               }
           }
-        while (event != -1 && event != XMLStreamConstants.END_DOCUMENT);
+        //while (event != XMLStreamConstants.END_DOCUMENT);
       }
     catch (XMLStreamException e)
       {
-        Location l = p.getLocation();
+        Location l = reader.getLocation();
         System.out.println("At line "+l.getLineNumber()+
                            ", column "+l.getColumnNumber()+
                            " of "+l.getLocationURI());
@@ -2698,6 +2716,7 @@
         {
           try
             {
+              in = new CRLFInputStream(in);
               reader = new XMLInputStreamReader(in, defaultEncoding);
             }
           catch (UnsupportedEncodingException e)
@@ -2710,8 +2729,10 @@
             }
         }
       else
-        forceReader = true;
-      reader = new CRLFReader(reader);
+        {
+          forceReader = true;
+          reader = new CRLFReader(reader);
+        }
       this.reader = reader;
     }
 
@@ -2725,7 +2746,7 @@
     void mark(int len)
       throws IOException
     {
-      //System.out.println("mark");
+      //System.out.println("  mark:"+len);
       markOffset = offset;
       markLine = line;
       markColumn = column;
@@ -2784,7 +2805,7 @@
     void reset()
       throws IOException
     {
-      //System.out.println("reset");
+      //System.out.println("  reset");
       reader.reset();
       offset = markOffset;
       line = markLine;
@@ -2884,9 +2905,13 @@
     private void setInputEncoding(String encoding)
       throws UnsupportedEncodingException
     {
-      inputEncoding = encoding;
-      reader = new XMLInputStreamReader((XMLInputStreamReader) reader, 
encoding);
-      reader = new CRLFReader(reader);
+      if (!encoding.equals(inputEncoding) &&
+          reader instanceof XMLInputStreamReader)
+        {
+          inputEncoding = encoding;
+          reader = new XMLInputStreamReader((XMLInputStreamReader) reader,
+                                            encoding);
+        }
     }
 
   }
Index: gnu/xml/stream/XMLStreamWriterImpl.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/xml/stream/XMLStreamWriterImpl.java,v
retrieving revision 1.3
diff -u -r1.3 XMLStreamWriterImpl.java
--- gnu/xml/stream/XMLStreamWriterImpl.java     6 Nov 2005 20:19:25 -0000       
1.3
+++ gnu/xml/stream/XMLStreamWriterImpl.java     13 Dec 2005 22:12:25 -0000
@@ -282,6 +282,8 @@
   public void writeEndElement()
     throws XMLStreamException
   {
+    if (elements.isEmpty())
+      throw new IllegalStateException("no matching start element");
     try
       {
         endStartElement();
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to