You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by ce...@apache.org on 2005/04/29 02:25:08 UTC

svn commit: r165241 - /xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java

Author: cezar
Date: Thu Apr 28 17:25:07 2005
New Revision: 165241

URL: http://svn.apache.org/viewcvs?rev=165241&view=rev
Log:
bug fixes in ValidatingXmlStreamReader

Modified:
    xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java

Modified: xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
URL: http://svn.apache.org/viewcvs/xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java?rev=165241&r1=165240&r2=165241&view=diff
==============================================================================
--- xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java (original)
+++ xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java Thu Apr 28 17:25:07 2005
@@ -66,6 +66,7 @@
     private final ElementEventImpl _elemEvent;
     private final AttributeEventImpl _attEvent;
     private final SimpleEventImpl _simpleEvent;
+    private PackTextXmlStreamReader _packTextXmlStreamReader;
 
     private int _state;
     private final int STATE_FIRSTEVENT = 0;
@@ -89,6 +90,7 @@
         _elemEvent = new ElementEventImpl();
         _attEvent = new AttributeEventImpl();
         _simpleEvent = new SimpleEventImpl();
+        _packTextXmlStreamReader = new PackTextXmlStreamReader();
     }
 
     /**
@@ -103,14 +105,16 @@
     public void init(XMLStreamReader xsr, boolean startWithCurrentEvent, SchemaType contentType,
                      SchemaTypeLoader stl, XmlOptions options, Collection errorListener)
     {
-        setParent(xsr);
+        _packTextXmlStreamReader.init(xsr);
+
+        setParent(_packTextXmlStreamReader);
         _contentType = contentType;
         _stl = stl;
         _options = options;
         _errorListener = errorListener;
-        _elemEvent.setXMLStreamReader(xsr);
-        _attEvent.setXMLStreamReader(xsr);
-        _simpleEvent.setXMLStreamReader(xsr);
+        _elemEvent.setXMLStreamReader(_packTextXmlStreamReader);
+        _attEvent.setXMLStreamReader(_packTextXmlStreamReader);
+        _simpleEvent.setXMLStreamReader(_packTextXmlStreamReader);
         _validator = null;
         _state = STATE_FIRSTEVENT;
         if (_attNamesList!=null)
@@ -128,13 +132,136 @@
         }
     }
 
+    private static class PackTextXmlStreamReader
+        extends StreamReaderDelegate
+        implements XMLStreamReader
+    {
+        private boolean _hasBufferedText;
+        private StringBuffer _buffer = new StringBuffer();
+        private int _textEventType;
+
+        void init(XMLStreamReader xmlstream)
+        {
+            setParent(xmlstream);
+            _hasBufferedText = false;
+            _buffer.delete(0, _buffer.length());
+        }
+
+        public int next()
+            throws XMLStreamException
+        {
+            if (_hasBufferedText)
+            {
+                clearBuffer();
+                return super.getEventType();
+            }
+
+            int evType = super.next();
+
+            if (evType == XMLEvent.CHARACTERS || evType == XMLEvent.CDATA || evType == XMLEvent.SPACE)
+            {
+                _textEventType = evType;
+                bufferText();
+            }
+
+            return evType;
+        }
+
+        private void clearBuffer()
+        {
+            _buffer.delete(0, _buffer.length());
+            _hasBufferedText = false;
+        }
+
+        private void bufferText()
+            throws XMLStreamException
+        {
+            assert super.hasText();
+
+            _buffer.append( super.getText());
+
+            while (hasNext())
+            {
+                int evType = super.next();
+                _hasBufferedText = true;
+
+                switch (evType)
+                {
+                case XMLEvent.CHARACTERS:
+                case XMLEvent.CDATA:
+                case XMLEvent.SPACE:
+                    _buffer.append(super.getText());
+
+                case XMLEvent.COMMENT:
+                    //ignore
+                    continue;
+                default:
+                    return;
+                }
+            }
+        }
+
+        public String getText()
+        {
+            assert _hasBufferedText;
+            return _buffer.toString();
+        }
+
+        public int getTextLength()
+        {
+            assert _hasBufferedText;
+            return _buffer.length();
+        }
+
+        public int getTextStart()
+        {
+            assert _hasBufferedText;
+            return 0;
+        }
+
+        public char[] getTextCharacters()
+        {
+            assert _hasBufferedText;
+            return _buffer.toString().toCharArray();
+        }
+
+        public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length)
+        {
+            assert _hasBufferedText;
+            _buffer.getChars(sourceStart, sourceStart + length, target, targetStart);
+            return length;
+        }
+
+        public boolean isWhiteSpace()
+        {
+            assert _hasBufferedText;
+            return XmlWhitespace.isAllSpace(_buffer);
+        }
+
+        public boolean hasText()
+        {
+            if (_hasBufferedText)
+                return true;
+            else
+                return super.hasText();
+        }
+
+        public int getEventType()
+        {
+            if (_hasBufferedText)
+                return _textEventType;
+            else
+                return super.getEventType();
+        }
+    }
+
     private static class ElementEventImpl
         implements ValidatorListener.Event
     {
-        private static final int BUF_LENGTH = 1024;
-        private char[] _buf = new char[BUF_LENGTH];
-        private int _length;
-        private boolean _supportForGetTextCharacters = true;
+//        private static final int BUF_LENGTH = 1024;
+//        private char[] _buf = new char[BUF_LENGTH];
+//        private int _length;
+//        private boolean _supportForGetTextCharacters = true;
 
         private XMLStreamReader _xmlStream;
 
@@ -189,9 +316,10 @@
         // On TEXT and ATTR
         public String getText()
         {
-            _length = 0;
-            addTextToBuffer();
-            return new String( _buf, 0, _length );
+//            _length = 0;
+//            addTextToBuffer();
+//            return new String( _buf, 0, _length );
+            return _xmlStream.getText();
         }
 
         public String getText(int wsr)
@@ -209,45 +337,44 @@
             return _xmlStream.getNamespaceURI(prefix);
         }
 
-        private void addTextToBuffer()
-        {
-            int textLength = _xmlStream.getTextLength();
-            ensureBufferLength(textLength);
-
-            if (_supportForGetTextCharacters)
-                try
-                {
-                    _length = _xmlStream.getTextCharacters(0, _buf, _length, textLength);
-                }
-                catch(Exception e)
-                {
-                    _supportForGetTextCharacters = false;
-                }
-
-            if(!_supportForGetTextCharacters)
-            {
-                System.arraycopy(_xmlStream.getTextCharacters(), _xmlStream.getTextStart(), _buf, _length, textLength);
-                _length = _length + textLength;
-            }
-        }
-
-        private void ensureBufferLength(int lengthToAdd)
-        {
-            if (_length + lengthToAdd>_buf.length)
-            {
-                char[] newBuf = new char[_length + lengthToAdd];
-                if (_length>0)
-                    System.arraycopy(_buf, 0, newBuf, 0, _length);
-                _buf = newBuf;
-            }
-        }
+//        private void addTextToBuffer()
+//        {
+//            int textLength = _xmlStream.getTextLength();
+//            ensureBufferLength(textLength);
+//
+//            if (_supportForGetTextCharacters)
+//                try
+//                {
+//                    _length = _xmlStream.getTextCharacters(0, _buf, _length, textLength);
+//                }
+//                catch(Exception e)
+//                {
+//                    _supportForGetTextCharacters = false;
+//                }
+//
+//            if(!_supportForGetTextCharacters)
+//            {
+//                System.arraycopy(_xmlStream.getTextCharacters(), _xmlStream.getTextStart(), _buf, _length, textLength);
+//                _length = _length + textLength;
+//            }
+//        }
+//
+//        private void ensureBufferLength(int lengthToAdd)
+//        {
+//            if (_length + lengthToAdd>_buf.length)
+//            {
+//                char[] newBuf = new char[_length + lengthToAdd];
+//                if (_length>0)
+//                    System.arraycopy(_buf, 0, newBuf, 0, _length);
+//                _buf = newBuf;
+//            }
+//        }
     }
 
     private static final class AttributeEventImpl
         implements ValidatorListener.Event
     {
         private int _attIndex;
-        private int _length;
         private XMLStreamReader _xmlStream;
 
         private void setXMLStreamReader(XMLStreamReader xsr)
@@ -338,7 +465,6 @@
         implements ValidatorListener.Event
     {
         private String _text;
-        private int _length;
         private QName  _qname;
         private XMLStreamReader _xmlStream;
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: commits-help@xmlbeans.apache.org