Skip to content

Commit 6b1eb17

Browse files
[Refactor] reading xml attributes, set properties to a default value when an overflow exception on XmlConvert is handled; fixes #60
[Update] all int properties to long to harmonize integer properties; as per ReqIF specification integers are mathematically unbounded integer. Practically long is a useful type [Improve] logging when element not know -> include LineNumber and LinePosition
1 parent 1279bf0 commit 6b1eb17

31 files changed

Lines changed: 697 additions & 187 deletions

ReqIFSharp/AccessControlledElement.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,31 @@
2020

2121
namespace ReqIFSharp
2222
{
23+
using System;
24+
using System.Runtime.Serialization;
2325
using System.Threading;
2426
using System.Threading.Tasks;
2527
using System.Xml;
2628

2729
using Microsoft.Extensions.Logging;
30+
using Microsoft.Extensions.Logging.Abstractions;
2831

2932
/// <summary>
3033
/// The <see cref="AccessControlledElement"/> is the base class for classes that may restrict user access to their information.
3134
/// </summary>
3235
public abstract class AccessControlledElement : Identifiable
3336
{
37+
/// <summary>
38+
/// The <see cref="ILogger"/> used to log
39+
/// </summary>
40+
private readonly ILogger<AccessControlledElement> logger;
41+
3442
/// <summary>
3543
/// Initializes a new instance of the <see cref="AccessControlledElement"/> class
3644
/// </summary>
3745
protected AccessControlledElement()
3846
{
47+
this.logger = NullLogger<AccessControlledElement>.Instance;
3948
}
4049

4150
/// <summary>
@@ -47,6 +56,7 @@ protected AccessControlledElement()
4756
protected AccessControlledElement(ILoggerFactory loggerFactory)
4857
: base(loggerFactory)
4958
{
59+
this.logger = this.loggerFactory == null ? NullLogger<AccessControlledElement>.Instance : this.loggerFactory.CreateLogger<AccessControlledElement>();
5060
}
5161

5262
/// <summary>
@@ -68,11 +78,21 @@ internal override void ReadXml(XmlReader reader)
6878
{
6979
base.ReadXml(reader);
7080

71-
var isEditable = reader.GetAttribute("IS-EDITABLE");
81+
var xmlLineInfo = reader as IXmlLineInfo;
82+
83+
this.logger.LogTrace("reading IS-EDITABLE at line:position {LineNumber}:{LinePosition}", xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
7284

73-
if (isEditable != null)
85+
var isEditable = reader.GetAttribute("IS-EDITABLE");
86+
if (!string.IsNullOrWhiteSpace(isEditable))
7487
{
75-
this.IsEditable = XmlConvert.ToBoolean(isEditable);
88+
try
89+
{
90+
this.IsEditable = XmlConvert.ToBoolean(isEditable);
91+
}
92+
catch (Exception e)
93+
{
94+
throw new SerializationException($"The AccessControlledElement.IS-EDITABLE {isEditable} at line:position {xmlLineInfo?.LineNumber}:{xmlLineInfo?.LinePosition} could not be converted to a BOOLEAN", e);
95+
}
7696
}
7797
}
7898

ReqIFSharp/AttributeDefinition/AttributeDefinitionBoolean.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ internal override void ReadXml(XmlReader reader)
137137
{
138138
if (reader.MoveToContent() == XmlNodeType.Element)
139139
{
140+
var xmlLineInfo = reader as IXmlLineInfo;
141+
140142
switch (reader.LocalName)
141143
{
142144
case "ALTERNATIVE-ID":
@@ -162,7 +164,7 @@ internal override void ReadXml(XmlReader reader)
162164
}
163165
break;
164166
default:
165-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
167+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
166168
break;
167169
}
168170
}
@@ -191,6 +193,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
191193

192194
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
193195
{
196+
var xmlLineInfo = reader as IXmlLineInfo;
197+
194198
switch (reader.LocalName)
195199
{
196200
case "ALTERNATIVE-ID":
@@ -216,7 +220,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
216220
}
217221
break;
218222
default:
219-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
223+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
220224
break;
221225
}
222226
}

ReqIFSharp/AttributeDefinition/AttributeDefinitionDate.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ internal override void ReadXml(XmlReader reader)
138138
{
139139
if (reader.MoveToContent() == XmlNodeType.Element)
140140
{
141+
var xmlLineInfo = reader as IXmlLineInfo;
142+
141143
switch (reader.LocalName)
142144
{
143145
case "ALTERNATIVE-ID":
@@ -162,7 +164,7 @@ internal override void ReadXml(XmlReader reader)
162164
}
163165
break;
164166
default:
165-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
167+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
166168
break;
167169
}
168170
}
@@ -191,6 +193,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
191193

192194
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
193195
{
196+
var xmlLineInfo = reader as IXmlLineInfo;
197+
194198
switch (reader.LocalName)
195199
{
196200
case "ALTERNATIVE-ID":
@@ -215,7 +219,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
215219
}
216220
break;
217221
default:
218-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
222+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
219223
break;
220224
}
221225
}

ReqIFSharp/AttributeDefinition/AttributeDefinitionEnumeration.cs

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ namespace ReqIFSharp
2222
{
2323
using System;
2424
using System.Linq;
25-
using System.Threading;
2625
using System.Runtime.Serialization;
26+
using System.Threading;
2727
using System.Threading.Tasks;
2828
using System.Xml;
2929

3030
using Microsoft.Extensions.Logging;
3131
using Microsoft.Extensions.Logging.Abstractions;
3232

3333
/// <summary>
34-
/// The purpose of the <see cref="AttributeDefinitionEnumeration"/> class is to define a enumeration attribute.
34+
/// The purpose of the <see cref="AttributeDefinitionEnumeration"/> class is to define an enumeration attribute.
3535
/// </summary>
3636
/// <remarks>
3737
/// An <see cref="AttributeDefinitionEnumeration"/> element relates an <see cref="AttributeValueEnumeration"/> element to a
@@ -130,7 +130,7 @@ protected override void SetDatatypeDefinition(DatatypeDefinition datatypeDefinit
130130
/// <value>If set to true, this means that the user of a requirements authoring tool can pick one or more than one of the values in
131131
/// the set of specified values as an enumeration attribute value.
132132
/// </value>
133-
/// <value>
133+
/// <value>
134134
/// If set to false, this means that the user of a requirements authoring tool can pick exactly one of the values in the set of
135135
/// specified values as an enumeration attribute value.
136136
/// </value>
@@ -146,15 +146,14 @@ internal override void ReadXml(XmlReader reader)
146146
{
147147
base.ReadXml(reader);
148148

149-
if (reader.GetAttribute("MULTI-VALUED") == "true")
150-
{
151-
this.IsMultiValued = true;
152-
}
149+
this.ReadXmlAttributes(reader);
153150

154151
while (reader.Read())
155152
{
156153
if (reader.MoveToContent() == XmlNodeType.Element)
157154
{
155+
var xmlLineInfo = reader as IXmlLineInfo;
156+
158157
switch (reader.LocalName)
159158
{
160159
case "ALTERNATIVE-ID":
@@ -180,7 +179,7 @@ internal override void ReadXml(XmlReader reader)
180179
}
181180
break;
182181
default:
183-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
182+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
184183
break;
185184
}
186185
}
@@ -200,10 +199,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
200199
{
201200
base.ReadXml(reader);
202201

203-
if (reader.GetAttribute("MULTI-VALUED") == "true")
204-
{
205-
this.IsMultiValued = true;
206-
}
202+
this.ReadXmlAttributes(reader);
207203

208204
while (await reader.ReadAsync())
209205
{
@@ -214,6 +210,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
214210

215211
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
216212
{
213+
var xmlLineInfo = reader as IXmlLineInfo;
214+
217215
switch (reader.LocalName)
218216
{
219217
case "ALTERNATIVE-ID":
@@ -239,13 +237,39 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
239237
}
240238
break;
241239
default:
242-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
240+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
243241
break;
244242
}
245243
}
246244
}
247245
}
248246

247+
/// <summary>
248+
/// Reads the properties that are defined as XML Attributes (MULTI-VALUED)
249+
/// </summary>
250+
/// <param name="reader">
251+
/// an instance of <see cref="XmlReader"/>
252+
/// </param>
253+
private void ReadXmlAttributes(XmlReader reader)
254+
{
255+
var xmlLineInfo = reader as IXmlLineInfo;
256+
257+
this.logger.LogTrace("reading MULTI-VALUED at line:position {LineNumber}:{LinePosition}", xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
258+
259+
var multiValuedValue = reader.GetAttribute("MULTI-VALUED");
260+
if (!string.IsNullOrWhiteSpace(multiValuedValue))
261+
{
262+
try
263+
{
264+
this.IsMultiValued = XmlConvert.ToBoolean(multiValuedValue);
265+
}
266+
catch (Exception e)
267+
{
268+
throw new SerializationException($"The AttributeDefinitionEnumeration.MULTI-VALUED {multiValuedValue} at line:position {xmlLineInfo?.LineNumber}:{xmlLineInfo?.LinePosition} could not be converted to a BOOLEAN", e);
269+
}
270+
}
271+
}
272+
249273
/// <summary>
250274
/// Converts a <see cref="AttributeDefinitionEnumeration"/> object into its XML representation.
251275
/// </summary>

ReqIFSharp/AttributeDefinition/AttributeDefinitionInteger.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ internal override void ReadXml(XmlReader reader)
139139
{
140140
if (reader.MoveToContent() == XmlNodeType.Element)
141141
{
142+
var xmlLineInfo = reader as IXmlLineInfo;
143+
142144
switch (reader.LocalName)
143145
{
144146
case "ALTERNATIVE-ID":
@@ -164,7 +166,7 @@ internal override void ReadXml(XmlReader reader)
164166
}
165167
break;
166168
default:
167-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
169+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
168170
break;
169171
}
170172
}
@@ -193,6 +195,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
193195

194196
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
195197
{
198+
var xmlLineInfo = reader as IXmlLineInfo;
199+
196200
switch (reader.LocalName)
197201
{
198202
case "ALTERNATIVE-ID":
@@ -218,7 +222,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
218222
}
219223
break;
220224
default:
221-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
225+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
222226
break;
223227
}
224228
}

ReqIFSharp/AttributeDefinition/AttributeDefinitionReal.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ internal override void ReadXml(XmlReader reader)
138138
{
139139
if (reader.MoveToContent() == XmlNodeType.Element)
140140
{
141+
var xmlLineInfo = reader as IXmlLineInfo;
142+
141143
switch (reader.LocalName)
142144
{
143145
case "ALTERNATIVE-ID":
@@ -163,7 +165,7 @@ internal override void ReadXml(XmlReader reader)
163165
}
164166
break;
165167
default:
166-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
168+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
167169
break;
168170
}
169171
}
@@ -192,6 +194,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
192194

193195
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
194196
{
197+
var xmlLineInfo = reader as IXmlLineInfo;
198+
195199
switch (reader.LocalName)
196200
{
197201
case "ALTERNATIVE-ID":
@@ -217,7 +221,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
217221
}
218222
break;
219223
default:
220-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
224+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
221225
break;
222226
}
223227
}

ReqIFSharp/AttributeDefinition/AttributeDefinitionString.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ internal override void ReadXml(XmlReader reader)
137137
{
138138
if (reader.MoveToContent() == XmlNodeType.Element)
139139
{
140+
var xmlLineInfo = reader as IXmlLineInfo;
141+
140142
switch (reader.LocalName)
141143
{
142144
case "ALTERNATIVE-ID":
@@ -162,7 +164,7 @@ internal override void ReadXml(XmlReader reader)
162164
}
163165
break;
164166
default:
165-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
167+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
166168
break;
167169
}
168170
}
@@ -191,6 +193,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
191193

192194
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
193195
{
196+
var xmlLineInfo = reader as IXmlLineInfo;
197+
194198
switch (reader.LocalName)
195199
{
196200
case "ALTERNATIVE-ID":
@@ -216,7 +220,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
216220
}
217221
break;
218222
default:
219-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
223+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
220224
break;
221225
}
222226
}

ReqIFSharp/AttributeDefinition/AttributeDefinitionXHTML.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ internal override void ReadXml(XmlReader reader)
137137
{
138138
if (reader.MoveToContent() == XmlNodeType.Element)
139139
{
140+
var xmlLineInfo = reader as IXmlLineInfo;
141+
140142
switch (reader.LocalName)
141143
{
142144
case "ALTERNATIVE-ID":
@@ -162,7 +164,7 @@ internal override void ReadXml(XmlReader reader)
162164
}
163165
break;
164166
default:
165-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
167+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
166168
break;
167169
}
168170
}
@@ -191,6 +193,8 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
191193

192194
if (await reader.MoveToContentAsync() == XmlNodeType.Element)
193195
{
196+
var xmlLineInfo = reader as IXmlLineInfo;
197+
194198
switch (reader.LocalName)
195199
{
196200
case "ALTERNATIVE-ID":
@@ -216,7 +220,7 @@ internal override async Task ReadXmlAsync(XmlReader reader, CancellationToken to
216220
}
217221
break;
218222
default:
219-
this.logger.LogWarning("The {LocalName} is not supported", reader.LocalName);
223+
this.logger.LogWarning("The {LocalName} element at line:position {LineNumber}:{LinePosition} is not supported", reader.LocalName, xmlLineInfo?.LineNumber, xmlLineInfo?.LinePosition);
220224
break;
221225
}
222226
}

0 commit comments

Comments
 (0)