CMIS-987: fixed AtomPub extension handling

git-svn-id: https://svn.apache.org/repos/asf/chemistry/portcmis/trunk@1751286 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/PortCMIS/binding/atompub/XmlWalker.cs b/PortCMIS/binding/atompub/XmlWalker.cs
index 4293773..a32b927 100644
--- a/PortCMIS/binding/atompub/XmlWalker.cs
+++ b/PortCMIS/binding/atompub/XmlWalker.cs
@@ -127,54 +127,62 @@
                 {

                     attributes.Add(parser.Name, parser.Value);

                 }

+

+                parser.MoveToElement();

             }

 

-            XmlUtils.Next(parser);

-

-            while (true)

+            if (!parser.IsEmptyElement)

             {

-                XmlNodeType nodeType = parser.NodeType;

-                if (nodeType == XmlNodeType.EndElement)

+                XmlUtils.Next(parser);

+

+                while (true)

                 {

-                    break;

-                }

-                else if (nodeType == XmlNodeType.Text)

-                {

-                    string s = parser.Value;

-                    if (s != null)

+                    XmlNodeType nodeType = parser.NodeType;

+                    if (nodeType == XmlNodeType.EndElement)

                     {

-                        if (sb.Length + s.Length > XmlConstraints.MaxStringLength)

+                        break;

+                    }

+                    else if (nodeType == XmlNodeType.Text || nodeType == XmlNodeType.CDATA)

+                    {

+                        char[] buffer = new char[8 * 1024];

+

+                        int len;

+                        while ((len = parser.ReadValueChunk(buffer, 0, buffer.Length)) > 0)

                         {

-                            throw new CmisInvalidArgumentException("String limit exceeded! (String is longer than " + XmlConstraints.MaxStringLength + " characters.)");

+                            if (sb.Length + len > XmlConstraints.MaxStringLength)

+                            {

+                                throw new CmisInvalidArgumentException("String limit exceeded! (String is longer than " + XmlConstraints.MaxStringLength + " characters.)");

+                            }

+

+                            sb.Append(buffer, 0, len);

                         }

-                        sb.Append(s);

                     }

-                }

-                else if (nodeType == XmlNodeType.Element)

-                {

-                    if (level + 1 > XmlConstraints.MaxExtensionsDepth)

+                    else if (nodeType == XmlNodeType.Element)

                     {

-                        throw new CmisInvalidArgumentException("Extensions tree too deep! (More than " + XmlConstraints.MaxExtensionsDepth + " levels.)");

+                        if (level + 1 > XmlConstraints.MaxExtensionsDepth)

+                        {

+                            throw new CmisInvalidArgumentException("Extensions tree too deep! (More than " + XmlConstraints.MaxExtensionsDepth + " levels.)");

+                        }

+

+                        if (children == null)

+                        {

+                            children = new List<ICmisExtensionElement>();

+                        }

+

+                        if (children.Count + 1 > XmlConstraints.MaxExtensionsWidth)

+                        {

+                            throw new CmisInvalidArgumentException("Extensions tree too wide! (More than " + XmlConstraints.MaxExtensionsWidth + " extensions on one level.)");

+                        }

+

+                        children.Add(HandleExtensionLevel(parser, level + 1));

+

+                        continue;

                     }

 

-                    if (children == null)

+                    if (!XmlUtils.Next(parser))

                     {

-                        children = new List<ICmisExtensionElement>();

+                        break;

                     }

-

-                    if (children.Count + 1 > XmlConstraints.MaxExtensionsWidth)

-                    {

-                        throw new CmisInvalidArgumentException("Extensions tree too wide! (More than " + XmlConstraints.MaxExtensionsWidth + " extensions on one level.)");

-                    }

-

-                    children.Add(HandleExtensionLevel(parser, level + 1));

-

-                    continue;

-                }

-

-                if (!XmlUtils.Next(parser))

-                {

-                    break;

                 }

             }

 

diff --git a/PortCMIS/data/Extensions.cs b/PortCMIS/data/Extensions.cs
index b689937..bca80a5 100644
--- a/PortCMIS/data/Extensions.cs
+++ b/PortCMIS/data/Extensions.cs
@@ -75,6 +75,46 @@
 

         /// <inheritdoc/>

         public IList<ICmisExtensionElement> Children { get; set; }

+

+        /// <inheritdoc/>

+        public override string ToString()

+        {

+            StringBuilder sb = new StringBuilder();

+

+            if (Namespace != null)

+            {

+                sb.Append("{" + Namespace + "}");

+            }

+

+            sb.Append(Name);

+            sb.Append(": ");

+

+            if (Value != null)

+            {

+                sb.Append(Value);

+            }

+            else if (Children != null)

+            {

+                sb.Append("[");

+                bool first = true;

+                foreach (ICmisExtensionElement ext in Children)

+                {

+                    if (first)

+                    {

+                        first = false;

+                    }

+                    else

+                    {

+                        sb.Append(", ");

+                    }

+

+                    sb.Append(ext.ToString());

+                }

+                sb.Append("]");

+            }

+

+            return sb.ToString();

+        }

     }

 

     /// <summary>