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>