You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2016/02/27 18:42:21 UTC

svn commit: r1732654 - in /webservices/axiom/trunk: aspects/core-aspects/src/main/java/org/apache/axiom/core/ aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/ aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/ aspects/...

Author: veithen
Date: Sat Feb 27 17:42:21 2016
New Revision: 1732654

URL: http://svn.apache.org/viewvc?rev=1732654&view=rev
Log:
Correctly support processing of large CDATA sections.

Added:
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java   (with props)
    webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/adjacent-cdata-sections.xml   (with props)
    webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/large-cdata-section.xml   (with props)
Modified:
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CharacterData.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCDATASection.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataContainingParentNode.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreComment.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreProcessingInstruction.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreCDATASectionSupport.aj
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreDocumentSupport.aj
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreParentNodeSupport.aj
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandler.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/ContentHandlerXmlHandler.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/XmlHandlerContentHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/Context.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomCDATASectionSupport.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java
    webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/Woodstox4Dialect.java
    webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CharacterData.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CharacterData.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CharacterData.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CharacterData.java Sat Feb 27 17:42:21 2016
@@ -29,4 +29,5 @@ public interface CharacterData {
     <T> CharacterData clone(ClonePolicy<T> policy, T options);
     String toString();
     void writeTo(Writer writer) throws IOException;
+    void appendTo(StringBuilder buffer);
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCDATASection.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCDATASection.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCDATASection.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCDATASection.java Sat Feb 27 17:42:21 2016
@@ -18,6 +18,6 @@
  */
 package org.apache.axiom.core;
 
-public interface CoreCDATASection extends CoreChildNode, CoreCharacterDataContainingParentNode {
+public interface CoreCDATASection extends CoreChildNode, CoreCharacterDataContainingParentNode, DeferringParentNode {
 
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataContainingParentNode.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataContainingParentNode.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataContainingParentNode.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataContainingParentNode.java Sat Feb 27 17:42:21 2016
@@ -18,6 +18,6 @@
  */
 package org.apache.axiom.core;
 
-public interface CoreCharacterDataContainingParentNode extends CoreCharacterDataContainer, NonDeferringParentNode {
+public interface CoreCharacterDataContainingParentNode extends CoreCharacterDataContainer, CoreParentNode {
 
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreComment.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreComment.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreComment.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreComment.java Sat Feb 27 17:42:21 2016
@@ -18,6 +18,6 @@
  */
 package org.apache.axiom.core;
 
-public interface CoreComment extends CoreChildNode, CoreCharacterDataContainingParentNode {
+public interface CoreComment extends CoreChildNode, CoreCharacterDataContainingParentNode, NonDeferringParentNode {
 
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreProcessingInstruction.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreProcessingInstruction.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreProcessingInstruction.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreProcessingInstruction.java Sat Feb 27 17:42:21 2016
@@ -18,6 +18,6 @@
  */
 package org.apache.axiom.core;
 
-public interface CoreProcessingInstruction extends CoreChildNode, CoreCharacterDataContainingParentNode {
+public interface CoreProcessingInstruction extends CoreChildNode, CoreCharacterDataContainingParentNode, NonDeferringParentNode {
 
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreCDATASectionSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreCDATASectionSupport.aj?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreCDATASectionSupport.aj (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreCDATASectionSupport.aj Sat Feb 27 17:42:21 2016
@@ -34,7 +34,11 @@ public aspect CoreCDATASectionSupport {
     public final <T> void CoreCDATASection.init(ClonePolicy<T> policy, T options, CoreNode other) {
     }
 
-    public final void CoreCDATASection.internalSerialize(XmlHandler handler, boolean cache) throws CoreModelException, StreamException {
-        handler.processCDATASection(coreGetCharacterData().toString());
+    final void CoreCDATASection.serializeStartEvent(XmlHandler handler) throws CoreModelException, StreamException {
+        handler.startCDATASection();
+    }
+    
+    final void CoreCDATASection.serializeEndEvent(XmlHandler handler) throws StreamException {
+        handler.endCDATASection();
     }
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreDocumentSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreDocumentSupport.aj?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreDocumentSupport.aj (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreDocumentSupport.aj Sat Feb 27 17:42:21 2016
@@ -99,9 +99,11 @@ public aspect CoreDocumentSupport {
         coreSetInputEncoding(o.coreGetInputEncoding());
     }
 
-    public final void CoreDocument.internalSerialize(XmlHandler handler, boolean cache) throws CoreModelException, StreamException {
+    final void CoreDocument.serializeStartEvent(XmlHandler handler) throws CoreModelException, StreamException {
         handler.startDocument(coreGetInputEncoding(), coreGetXmlVersion(), coreGetXmlEncoding(), coreIsStandalone());
-        serializeChildren(handler, cache);
+    }
+    
+    final void CoreDocument.serializeEndEvent(XmlHandler handler) throws StreamException {
         handler.endDocument();
     }
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreParentNodeSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreParentNodeSupport.aj?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreParentNodeSupport.aj (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/impl/mixin/CoreParentNodeSupport.aj Sat Feb 27 17:42:21 2016
@@ -344,6 +344,20 @@ public aspect CoreParentNodeSupport {
         }
     }
 
+    void CoreParentNode.serializeStartEvent(XmlHandler handler) throws CoreModelException, StreamException {
+        throw new UnsupportedOperationException();
+    }
+
+    void CoreParentNode.serializeEndEvent(XmlHandler handler) throws StreamException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void CoreParentNode.internalSerialize(XmlHandler handler, boolean cache) throws CoreModelException, StreamException {
+        serializeStartEvent(handler);
+        serializeChildren(handler, cache);
+        serializeEndEvent(handler);
+    }
+
     public final void CoreParentNode.serializeChildren(XmlHandler handler, boolean cache) throws CoreModelException, StreamException {
         if (getState() == DISCARDED) {
             Builder builder = coreGetBuilder();

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandler.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandler.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandler.java Sat Feb 27 17:42:21 2016
@@ -80,7 +80,21 @@ public interface XmlHandler {
     
     void processComment(String content) throws StreamException;
     
-    void processCDATASection(String content) throws StreamException;
+    /**
+     * Notify the handler of the beginning of a CDATA section.
+     * 
+     * @throws StreamException
+     *             if an error occurs when processing the event
+     */
+    void startCDATASection() throws StreamException;
+    
+    /**
+     * Notify the handler of the end of a CDATA section.
+     * 
+     * @throws StreamException
+     *             if an error occurs when processing the event
+     */
+    void endCDATASection() throws StreamException;
     
     void processEntityReference(String name, String replacementText) throws StreamException;
 }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java Sat Feb 27 17:42:21 2016
@@ -79,8 +79,12 @@ public class XmlHandlerWrapper implement
         parent.processComment(content);
     }
 
-    public void processCDATASection(String content) throws StreamException {
-        parent.processCDATASection(content);
+    public void startCDATASection() throws StreamException {
+        parent.startCDATASection();
+    }
+
+    public void endCDATASection() throws StreamException {
+        parent.endCDATASection();
     }
 
     public void processEntityReference(String name, String replacementText) throws StreamException {

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/ContentHandlerXmlHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/ContentHandlerXmlHandler.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/ContentHandlerXmlHandler.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/ContentHandlerXmlHandler.java Sat Feb 27 17:42:21 2016
@@ -179,13 +179,19 @@ public class ContentHandlerXmlHandler im
     }
     
     @Override
-    public void processCDATASection(String content) throws StreamException {
+    public void startCDATASection() throws StreamException {
         try {
             if (lexicalHandler != null) {
                 lexicalHandler.startCDATA();
             }
-            char[] ch = content.toCharArray();
-            contentHandler.characters(ch, 0, ch.length);
+        } catch (SAXException ex) {
+            throw new StreamException(ex);
+        }
+    }
+
+    @Override
+    public void endCDATASection() throws StreamException {
+        try {
             if (lexicalHandler != null) {
                 lexicalHandler.endCDATA();
             }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/XmlHandlerContentHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/XmlHandlerContentHandler.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/XmlHandlerContentHandler.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/sax/XmlHandlerContentHandler.java Sat Feb 27 17:42:21 2016
@@ -78,8 +78,6 @@ public final class XmlHandlerContentHand
      */
     private int namespaceCount;
 
-    private boolean inCDATASection;
-    
     private boolean inEntityReference;
     private int entityReferenceDepth;
 
@@ -308,13 +306,21 @@ public final class XmlHandlerContentHand
 
     public void startCDATA() throws SAXException {
         if (!inEntityReference) {
-            inCDATASection = true;
+            try {
+                handler.startCDATASection();
+            } catch (StreamException ex) {
+                throw toSAXException(ex);
+            }
         }
     }
 
     public void endCDATA() throws SAXException {
         if (!inEntityReference) {
-            inCDATASection = false;
+            try {
+                handler.endCDATASection();
+            } catch (StreamException ex) {
+                throw toSAXException(ex);
+            }
         }
     }
 
@@ -322,12 +328,7 @@ public final class XmlHandlerContentHand
             throws SAXException {
         if (!inEntityReference) {
             try {
-                if (inCDATASection) {
-                    // TODO: incorrect because it may split CDATA sections
-                    handler.processCDATASection(new String(ch, start, length));
-                } else {
-                    handler.processCharacterData(new String(ch, start, length), false);
-                }
+                handler.processCharacterData(new String(ch, start, length), false);
             } catch (StreamException ex) {
                 throw toSAXException(ex);
             }

Added: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java?rev=1732654&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java (added)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java Sat Feb 27 17:42:21 2016
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.core.stream.util;
+
+import org.apache.axiom.core.CharacterData;
+
+public class CharacterDataAccumulator {
+    private Object content;
+    
+    public void append(Object data) {
+        if (content == null) {
+            content = data;
+        } else {
+            StringBuilder buffer;
+            if (content instanceof StringBuilder) {
+                buffer = (StringBuilder)content;
+            } else {
+                if (content instanceof CharacterData) {
+                    buffer = new StringBuilder();
+                    ((CharacterData)content).appendTo(buffer);
+                } else {
+                    buffer = new StringBuilder(content.toString());
+                }
+                content = buffer;
+            }
+            if (data instanceof CharacterData) {
+                ((CharacterData)data).appendTo(buffer);
+            } else {
+                buffer.append(data);
+            }
+        }
+    }
+    
+    public boolean isEmpty() {
+        return content == null;
+    }
+    
+    @Override
+    public String toString() {
+        return content == null ? "" : content.toString();
+    }
+    
+    public void clear() {
+        content = null;
+    }
+}

Propchange: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java Sat Feb 27 17:42:21 2016
@@ -18,7 +18,9 @@
  */
 package org.apache.axiom.om.impl.common;
 
+import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
+import org.apache.axiom.core.stream.util.CharacterDataAccumulator;
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMDocument;
@@ -32,12 +34,21 @@ public final  class SAXResultContentHand
     private final OMContainer root;
     private final OMFactory factory;
     private OMContainer target;
+    private final CharacterDataAccumulator buffer = new CharacterDataAccumulator();
+    private boolean buffering;
 
     public SAXResultContentHandler(OMContainer root) {
         this.root = root;
         factory = root.getOMFactory();
     }
     
+    private String stopBuffering() {
+        String content = buffer.toString();
+        buffer.clear();
+        buffering = false;
+        return content;
+    }
+
     public void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding, boolean standalone) {
         target = root;
     }
@@ -93,12 +104,21 @@ public final  class SAXResultContentHand
 
     @Override
     public void processCharacterData(Object data, boolean ignorable) {
-        factory.createOMText(target, data.toString(), ignorable ? OMNode.SPACE_NODE : OMNode.TEXT_NODE);
+        if (buffering) {
+            buffer.append(data);
+        } else {
+            factory.createOMText(target, data.toString(), ignorable ? OMNode.SPACE_NODE : OMNode.TEXT_NODE);
+        }
+    }
+
+    @Override
+    public void startCDATASection() throws StreamException {
+        buffering = true;
     }
 
     @Override
-    public void processCDATASection(String content) {
-        factory.createOMText(target, content, OMNode.CDATA_SECTION_NODE);
+    public void endCDATASection() throws StreamException {
+        factory.createOMText(target, stopBuffering(), OMNode.CDATA_SECTION_NODE);
     }
 
     public void processProcessingInstruction(String piTarget, String piData) {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java Sat Feb 27 17:42:21 2016
@@ -173,9 +173,15 @@ public final class BuilderHandler implem
         context.processComment(content);
     }
     
-    public void processCDATASection(String content) throws StreamException {
+    @Override
+    public void startCDATASection() throws StreamException {
         model.validateEventType(XMLStreamConstants.CDATA);
-        context.processCDATASection(content);
+        context = context.startCDATASection();
+    }
+
+    @Override
+    public void endCDATASection() throws StreamException {
+        context = context.endCDATASection();
     }
     
     public void processEntityReference(String name, String replacementText) throws StreamException {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/Context.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/Context.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/Context.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/Context.java Sat Feb 27 17:42:21 2016
@@ -19,7 +19,9 @@
 package org.apache.axiom.om.impl.common.builder;
 
 import org.apache.axiom.core.Builder;
+import org.apache.axiom.core.CoreCDATASection;
 import org.apache.axiom.core.CoreCharacterDataNode;
+import org.apache.axiom.core.CoreChildNode;
 import org.apache.axiom.core.CoreParentNode;
 import org.apache.axiom.core.InputContext;
 import org.apache.axiom.core.stream.StreamException;
@@ -28,9 +30,7 @@ import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
 import org.apache.axiom.om.impl.intf.AxiomAttribute;
-import org.apache.axiom.om.impl.intf.AxiomCDATASection;
 import org.apache.axiom.om.impl.intf.AxiomCharacterDataNode;
-import org.apache.axiom.om.impl.intf.AxiomChildNode;
 import org.apache.axiom.om.impl.intf.AxiomComment;
 import org.apache.axiom.om.impl.intf.AxiomContainer;
 import org.apache.axiom.om.impl.intf.AxiomDocType;
@@ -47,7 +47,7 @@ public final class Context implements In
     private final int depth;
     private Context nestedContext;
 
-    public AxiomContainer target;
+    public CoreParentNode target;
     
     private Object pendingCharacterData;
     
@@ -81,7 +81,7 @@ public final class Context implements In
         this.passThroughHandler = passThroughHandler;
     }
     
-    private Context newContext(AxiomContainer target) {
+    private Context newContext(CoreParentNode target) {
         if (nestedContext == null) {
             nestedContext = new Context(builderHandler, this, depth+1);
         }
@@ -90,6 +90,17 @@ public final class Context implements In
         return nestedContext;
     }
     
+    private Context endContext() {
+        target.coreSetState(CoreParentNode.COMPLETE);
+        target.coreSetInputContext(null);
+        if (pendingCharacterData != null) {
+            target.coreSetCharacterData(pendingCharacterData, null);
+            pendingCharacterData = null;
+        }
+        target = null;
+        return parentContext;
+    }
+    
     private Context decrementPassThroughDepth() {
         if (passThroughDepth == 0) {
             target.coreSetInputContext(null);
@@ -103,7 +114,7 @@ public final class Context implements In
         }
     }
     
-    private void addChild(AxiomChildNode node) {
+    private void addChild(CoreChildNode node) {
         if (pendingCharacterData != null) {
             AxiomCharacterDataNode cdataNode = builderHandler.nodeFactory.createNode(AxiomCharacterDataNode.class);
             cdataNode.coreSetCharacterData(pendingCharacterData);
@@ -146,7 +157,7 @@ public final class Context implements In
                 element = builderHandler.root;
             } else {
                 element = builderHandler.nodeFactory.createNode(builderHandler.model.determineElementType(
-                        target, depth+1, namespaceURI, localName));
+                        (AxiomContainer)target, depth+1, namespaceURI, localName));
                 element.coreSetState(CoreParentNode.ATTRIBUTES_PENDING);
                 element.initName(localName, ns, false);
                 addChild(element);
@@ -163,14 +174,7 @@ public final class Context implements In
             }
             return decrementPassThroughDepth();
         } else {
-            target.setComplete(true);
-            target.coreSetInputContext(null);
-            if (pendingCharacterData != null) {
-                target.coreSetCharacterData(pendingCharacterData, null);
-                pendingCharacterData = null;
-            }
-            target = null;
-            return parentContext;
+            return endContext();
         }
     }
 
@@ -245,13 +249,24 @@ public final class Context implements In
         }
     }
     
-    public void processCDATASection(String content) throws StreamException {
+    public Context startCDATASection() throws StreamException {
         if (passThroughHandler != null) {
-            passThroughHandler.processCDATASection(content);
+            passThroughDepth++;
+            passThroughHandler.startCDATASection();
+            return this;
         } else {
-            AxiomCDATASection node = builderHandler.nodeFactory.createNode(AxiomCDATASection.class);
-            node.coreSetCharacterData(content, AxiomSemantics.INSTANCE);
+            CoreCDATASection node = builderHandler.nodeFactory.createNode(CoreCDATASection.class);
             addChild(node);
+            return newContext(node);
+        }
+    }
+    
+    public Context endCDATASection() throws StreamException {
+        if (passThroughHandler != null) {
+            passThroughHandler.endCDATASection();
+            return decrementPassThroughDepth();
+        } else {
+            return endContext();
         }
     }
     
@@ -278,7 +293,7 @@ public final class Context implements In
                 throw new IllegalStateException();
             }
             if (target != null) {
-                target.setComplete(true);
+                target.coreSetState(CoreParentNode.COMPLETE);
                 target.coreSetInputContext(null);
             }
             target = null;

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java Sat Feb 27 17:42:21 2016
@@ -152,7 +152,9 @@ public class StAXHelper implements XmlRe
                     handler.processCharacterData(text, true);
                     break;
                 case XMLStreamConstants.CDATA:
-                    handler.processCDATASection(text);
+                    handler.startCDATASection();
+                    handler.processCharacterData(text, false);
+                    handler.endCDATASection();
                     break;
                 default:
                     throw new IllegalStateException();

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java Sat Feb 27 17:42:21 2016
@@ -22,6 +22,7 @@ import java.io.IOException;
 
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
+import org.apache.axiom.core.stream.util.CharacterDataAccumulator;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
 import org.apache.axiom.om.impl.intf.TextContent;
@@ -33,6 +34,8 @@ import javax.xml.stream.XMLStreamWriter;
 public class StAXSerializer implements XmlHandler {
     private final XMLStreamWriter writer;
     private DataHandlerWriter dataHandlerWriter;
+    private final CharacterDataAccumulator buffer = new CharacterDataAccumulator();
+    private boolean buffering;
     
     public StAXSerializer(XMLStreamWriter writer) {
         this.writer = writer;
@@ -42,6 +45,13 @@ public class StAXSerializer implements X
         return writer;
     }
 
+    private String stopBuffering() {
+        String content = buffer.toString();
+        buffer.clear();
+        buffering = false;
+        return content;
+    }
+
     @Override
     public void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding,
             boolean standalone) throws StreamException {
@@ -105,6 +115,10 @@ public class StAXSerializer implements X
     }
 
     public void processCharacterData(Object data, boolean ignorable) throws StreamException {
+        if (buffering) {
+            buffer.append(data);
+            return;
+        }
         try {
             if (data instanceof TextContent) {
                 TextContent textContent = (TextContent)data;
@@ -127,9 +141,14 @@ public class StAXSerializer implements X
     }
     
     @Override
-    public void processCDATASection(String content) throws StreamException {
+    public void startCDATASection() throws StreamException {
+        buffering = true;
+    }
+
+    @Override
+    public void endCDATASection() throws StreamException {
         try {
-            writer.writeCData(content);
+            writer.writeCData(stopBuffering());
         } catch (XMLStreamException ex) {
             throw new StreamException(ex);
         }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java Sat Feb 27 17:42:21 2016
@@ -30,6 +30,7 @@ import org.apache.axiom.ext.stax.datahan
 import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.util.UIDGenerator;
+import org.apache.axiom.util.base64.Base64EncodingStringBufferOutputStream;
 import org.apache.axiom.util.base64.Base64EncodingWriterOutputStream;
 import org.apache.axiom.util.base64.Base64Utils;
 
@@ -175,4 +176,19 @@ public final class TextContent implement
             writer.write(value);
         }
     }
+
+    @Override
+    public void appendTo(StringBuilder buffer) {
+        if (binary) {
+            Base64EncodingStringBufferOutputStream out = new Base64EncodingStringBufferOutputStream(buffer);
+            try {
+                getDataHandler().writeTo(out);
+                out.complete();
+            } catch (IOException ex) {
+                throw new OMException(ex);
+            }
+        } else {
+            buffer.append(value);
+        }
+    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomCDATASectionSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomCDATASectionSupport.aj?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomCDATASectionSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomCDATASectionSupport.aj Sat Feb 27 17:42:21 2016
@@ -38,4 +38,8 @@ public aspect AxiomCDATASectionSupport {
             throw AxiomExceptionTranslator.translate(ex);
         }
     }
+    
+    public final void AxiomCDATASection.build() {
+        // TODO
+    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java Sat Feb 27 17:42:21 2016
@@ -180,7 +180,9 @@ public class XmlHandlerStreamWriter exte
     protected void doWriteCData(String data) throws XMLStreamException {
         finishStartElement();
         try {
-            handler.processCDATASection(data);
+            handler.startCDATASection();
+            handler.processCharacterData(data, false);
+            handler.endCDATASection();
         } catch (StreamException ex) {
             throw toXMLStreamException(ex);
         }

Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/Woodstox4Dialect.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/Woodstox4Dialect.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/Woodstox4Dialect.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/Woodstox4Dialect.java Sat Feb 27 17:42:21 2016
@@ -40,8 +40,9 @@ class Woodstox4Dialect extends AbstractS
     }
 
     public XMLInputFactory enableCDataReporting(XMLInputFactory factory) {
-        // For Woodstox, this is sufficient
         factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
+        factory.setProperty("http://java.sun.com/xml/stream/properties/report-cdata-event", Boolean.TRUE);
+        factory.setProperty("com.ctc.wstx.minTextSegment", Integer.MAX_VALUE);
         return factory;
     }
 

Added: webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/adjacent-cdata-sections.xml
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/adjacent-cdata-sections.xml?rev=1732654&view=auto
==============================================================================
--- webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/adjacent-cdata-sections.xml (added)
+++ webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/adjacent-cdata-sections.xml Sat Feb 27 17:42:21 2016
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<root><![CDATA[AB]]><![CDATA[CD]]><![CDATA[EF]]></root>

Propchange: webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/adjacent-cdata-sections.xml
------------------------------------------------------------------------------
    svn:eol-style = LF

Added: webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/large-cdata-section.xml
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/large-cdata-section.xml?rev=1732654&view=auto
==============================================================================
--- webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/large-cdata-section.xml (added)
+++ webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/large-cdata-section.xml Sat Feb 27 17:42:21 2016
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<root><![CDATA[
+<0>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<1>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<2>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<3>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<4>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<5>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<6>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+<7>
+#################################################################################################### 0
+#################################################################################################### 1
+#################################################################################################### 2
+#################################################################################################### 3
+#################################################################################################### 4
+#################################################################################################### 5
+#################################################################################################### 6
+#################################################################################################### 7
+#################################################################################################### 8
+#################################################################################################### 9
+]]></root>

Propchange: webservices/axiom/trunk/testing/xml-testsuite/src/main/resources/org/apache/axiom/ts/xml/bulk/large-cdata-section.xml
------------------------------------------------------------------------------
    svn:eol-style = LF

Modified: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java?rev=1732654&r1=1732653&r2=1732654&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java (original)
+++ webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java Sat Feb 27 17:42:21 2016
@@ -26,6 +26,7 @@ import org.apache.axiom.truth.xml.spi.Tr
 import org.apache.axiom.truth.xml.spi.TraverserException;
 import org.apache.axiom.truth.xml.spi.XML;
 
+import com.ctc.wstx.api.WstxInputProperties;
 import com.ctc.wstx.stax.WstxInputFactory;
 
 abstract class StAXXML implements XML {
@@ -41,6 +42,7 @@ abstract class StAXXML implements XML {
         factory.setProperty(WstxInputFactory.P_AUTO_CLOSE_INPUT, Boolean.TRUE);
         factory.setProperty(WstxInputFactory.P_REPORT_PROLOG_WHITESPACE, Boolean.TRUE);
         factory.setProperty(WstxInputFactory.P_REPORT_CDATA, Boolean.TRUE);
+        factory.setProperty(WstxInputProperties.P_MIN_TEXT_SEGMENT, Integer.MAX_VALUE);
         try {
             return new StAXTraverser(createXMLStreamReader(factory));
         } catch (XMLStreamException ex) {