Skip to content

Commit

Permalink
Fix bug when element has both content and xsi:nil present.
Browse files Browse the repository at this point in the history
  • Loading branch information
janno-p committed Mar 23, 2016
1 parent 24d697c commit 9987e64
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 10 deletions.
3 changes: 3 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#### 1.0.0-beta014 - 23.03.2016
* Fix deserialization bug when element with xsi:nil attribute has content.

#### 1.0.0-beta013 - 22.03.2016
* Fix X-Road namespace import when title attributes are used.

Expand Down
24 changes: 24 additions & 0 deletions src/XRoadLib/Extensions/XmlReaderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,30 @@ public static void ReadToEndElement(this XmlReader reader)
{ }
}

public static void ConsumeNilElement(this XmlReader reader, bool isNil)
{
if (!isNil)
return;

if (reader.IsEmptyElement)
{
reader.Read();
return;
}

var content = reader.ReadString();
if (!string.IsNullOrEmpty(content))
throw XRoadException.InvalidQuery($@"An element labeled with `xsi:nil=""true""` must be empty, but had `{content}` as content.");

reader.ReadToEndElement();
}

public static void ConsumeUnusedElement(this XmlReader reader)
{
if (reader.IsEmptyElement) reader.Read();
else reader.ReadToEndElement();
}

public static bool IsCurrentElement(this XmlReader reader, int depth, string name, string @namespace = "")
{
return reader.NodeType == XmlNodeType.Element && reader.Depth == depth && reader.LocalName == name && reader.NamespaceURI == @namespace;
Expand Down
6 changes: 2 additions & 4 deletions src/XRoadLib/Serialization/Mapping/AllTypeMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@ private static bool ReadPropertyValue(XmlReader reader, IPropertyMap propertyMap
var propertyNode = templateNode[templateName, message.Version];
if (propertyNode == null)
{
if (reader.IsEmptyElement) reader.Read();
else reader.ReadToEndElement();
reader.ConsumeUnusedElement();
return false;
}

Expand All @@ -76,8 +75,7 @@ private static bool ReadPropertyValue(XmlReader reader, IPropertyMap propertyMap
if ((isNull || propertyMap.Deserialize(reader, dtoObject, propertyNode, message)) && !string.IsNullOrWhiteSpace(templateName))
dtoObject.OnMemberDeserialized(templateName);

if (isNull && reader.IsEmptyElement)
reader.Read();
reader.ConsumeNilElement(isNull);

return propertyNode.IsRequired;
}
Expand Down
3 changes: 1 addition & 2 deletions src/XRoadLib/Serialization/Mapping/PropertyMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ public bool Deserialize(XmlReader reader, IXRoadSerializable dtoObject, IXmlTemp
{
if (message.EnableFiltering && !filters.Contains(message.FilterName))
{
if (reader.IsEmptyElement) reader.Read();
else reader.ReadToEndElement();
reader.ConsumeUnusedElement();
return false;
}

Expand Down
6 changes: 2 additions & 4 deletions src/XRoadLib/Serialization/Mapping/SequenceTypeMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ private static void ReadPropertyValue(XmlReader reader, IPropertyMap propertyMap
{
if (propertyNode == null)
{
if (reader.IsEmptyElement) reader.Read();
else reader.ReadToEndElement();
reader.ConsumeUnusedElement();
return;
}

Expand All @@ -68,8 +67,7 @@ private static void ReadPropertyValue(XmlReader reader, IPropertyMap propertyMap
if ((isNull || propertyMap.Deserialize(reader, dtoObject, propertyNode, message)) && !string.IsNullOrWhiteSpace(templateName))
dtoObject.OnMemberDeserialized(templateName);

if (isNull && reader.IsEmptyElement)
reader.Read();
reader.ConsumeNilElement(isNull);
}

private IXmlTemplateNode MoveToProperty(XmlReader reader, IEnumerator<IPropertyMap> properties, IXmlTemplateNode templateNode, XRoadMessage message, bool validateRequired)
Expand Down

0 comments on commit 9987e64

Please sign in to comment.