Skip to content

Commit 2912b39

Browse files
authored
Small fixes (#375)
* [IssueAllowedStatus] Implement Read Xml/Json * [TrackerCoreFiled] Set correct root * [Wiki] Fix get parent attribute value * [Xml] Set totalItems if total_count missing
1 parent 286ae36 commit 2912b39

File tree

4 files changed

+100
-12
lines changed

4 files changed

+100
-12
lines changed

src/redmine-net-api/Serialization/Xml/XmlRedmineSerializer.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace Redmine.Net.Api.Serialization
2727
internal sealed class XmlRedmineSerializer : IRedmineSerializer
2828
{
2929

30-
public XmlRedmineSerializer(): this(new XmlWriterSettings
30+
public XmlRedmineSerializer() : this(new XmlWriterSettings
3131
{
3232
OmitXmlDeclaration = true
3333
}) { }
@@ -126,6 +126,11 @@ public string Serialize<T>(T entity) where T : class
126126
var limit = xmlReader.ReadAttributeAsInt(RedmineKeys.LIMIT);
127127
var result = xmlReader.ReadElementContentAsCollection<T>();
128128

129+
if (totalItems == 0 && result.Count > 0)
130+
{
131+
totalItems = result.Count;
132+
}
133+
129134
return new PagedResults<T>(result, totalItems, offset, limit);
130135
}
131136
}

src/redmine-net-api/Types/IssueAllowedStatus.cs

+40
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ limitations under the License.
1515
*/
1616

1717
using System.Diagnostics;
18+
using System.Xml;
1819
using System.Xml.Serialization;
20+
using Newtonsoft.Json;
21+
using Redmine.Net.Api.Extensions;
1922

2023
namespace Redmine.Net.Api.Types
2124
{
@@ -26,6 +29,43 @@ namespace Redmine.Net.Api.Types
2629
[XmlRoot(RedmineKeys.STATUS)]
2730
public sealed class IssueAllowedStatus : IdentifiableName
2831
{
32+
/// <summary>
33+
///
34+
/// </summary>
35+
public bool? IsClosed { get; internal set; }
36+
37+
/// <inheritdoc />
38+
public override void ReadXml(XmlReader reader)
39+
{
40+
Id = reader.ReadAttributeAsInt(RedmineKeys.ID);
41+
Name = reader.GetAttribute(RedmineKeys.NAME);
42+
IsClosed = reader.ReadAttributeAsBoolean(RedmineKeys.IS_CLOSED);
43+
reader.Read();
44+
}
45+
46+
/// <inheritdoc />
47+
public override void ReadJson(JsonReader reader)
48+
{
49+
while (reader.Read())
50+
{
51+
if (reader.TokenType == JsonToken.EndObject)
52+
{
53+
return;
54+
}
55+
56+
if (reader.TokenType == JsonToken.PropertyName)
57+
{
58+
switch (reader.Value)
59+
{
60+
case RedmineKeys.ID: Id = reader.ReadAsInt(); break;
61+
case RedmineKeys.NAME: Name = reader.ReadAsString(); break;
62+
case RedmineKeys.IS_CLOSED: IsClosed = reader.ReadAsBoolean(); break;
63+
default: reader.Read(); break;
64+
}
65+
}
66+
}
67+
}
68+
2969
private string DebuggerDisplay => $"[{nameof(IssueAllowedStatus)}: {ToString()}]";
3070
}
3171
}

src/redmine-net-api/Types/TrackerCoreField.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Redmine.Net.Api.Types
1313
///
1414
/// </summary>
1515
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
16-
[XmlRoot(RedmineKeys.TRACKER)]
16+
[XmlRoot(RedmineKeys.FIELD)]
1717
public sealed class TrackerCoreField: IXmlSerializable, IJsonSerializable, IEquatable<TrackerCoreField>
1818
{
1919
/// <summary>
@@ -40,7 +40,6 @@ public XmlSchema GetSchema()
4040
///
4141
/// </summary>
4242
/// <param name="reader"></param>
43-
/// <exception cref="NotImplementedException"></exception>
4443
public void ReadXml(XmlReader reader)
4544
{
4645
reader.Read();
@@ -66,7 +65,6 @@ public void WriteJson(JsonWriter writer) { }
6665
///
6766
/// </summary>
6867
/// <param name="reader"></param>
69-
/// <exception cref="NotImplementedException"></exception>
7068
public void ReadJson(JsonReader reader)
7169
{
7270
while (reader.Read())

src/redmine-net-api/Types/WikiPage.cs

+53-8
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,16 @@ public override void ReadXml(XmlReader reader)
123123
case RedmineKeys.TITLE: Title = reader.ReadElementContentAsString(); break;
124124
case RedmineKeys.UPDATED_ON: UpdatedOn = reader.ReadElementContentAsNullableDateTime(); break;
125125
case RedmineKeys.VERSION: Version = reader.ReadElementContentAsInt(); break;
126-
case RedmineKeys.PARENT: ParentTitle = reader.GetAttribute(RedmineKeys.PARENT); break;
126+
case RedmineKeys.PARENT:
127+
{
128+
if (reader.HasAttributes)
129+
{
130+
ParentTitle = reader.GetAttribute(RedmineKeys.TITLE);
131+
reader.Read();
132+
}
133+
134+
break;
135+
}
127136
default: reader.Read(); break;
128137
}
129138
}
@@ -206,14 +215,28 @@ public override bool Equals(WikiPage other)
206215
{
207216
if (other == null) return false;
208217

209-
return Id == other.Id
210-
&& Title == other.Title
211-
&& Text == other.Text
212-
&& Comments == other.Comments
218+
return base.Equals(other)
219+
&& string.Equals(Title, other.Title, StringComparison.Ordinal)
220+
&& string.Equals(Text, other.Text, StringComparison.Ordinal)
221+
&& string.Equals(Comments, other.Comments, StringComparison.Ordinal)
213222
&& Version == other.Version
214-
&& Author == other.Author
215-
&& CreatedOn == other.CreatedOn
216-
&& UpdatedOn == other.UpdatedOn;
223+
&& Equals(Author, other.Author)
224+
&& CreatedOn.Equals(other.CreatedOn)
225+
&& UpdatedOn.Equals(other.UpdatedOn)
226+
&& Equals(Attachments, other.Attachments);
227+
}
228+
229+
/// <summary>
230+
///
231+
/// </summary>
232+
/// <param name="obj"></param>
233+
/// <returns></returns>
234+
public override bool Equals(object obj)
235+
{
236+
if (ReferenceEquals(null, obj)) return false;
237+
if (ReferenceEquals(this, obj)) return true;
238+
if (obj.GetType() != GetType()) return false;
239+
return Equals(obj as WikiPage);
217240
}
218241

219242
/// <summary>
@@ -236,6 +259,28 @@ public override int GetHashCode()
236259
return hashCode;
237260
}
238261
}
262+
263+
/// <summary>
264+
///
265+
/// </summary>
266+
/// <param name="left"></param>
267+
/// <param name="right"></param>
268+
/// <returns></returns>
269+
public static bool operator ==(WikiPage left, WikiPage right)
270+
{
271+
return Equals(left, right);
272+
}
273+
274+
/// <summary>
275+
///
276+
/// </summary>
277+
/// <param name="left"></param>
278+
/// <param name="right"></param>
279+
/// <returns></returns>
280+
public static bool operator !=(WikiPage left, WikiPage right)
281+
{
282+
return !Equals(left, right);
283+
}
239284
#endregion
240285

241286
/// <summary>

0 commit comments

Comments
 (0)