flatten grouped results, add try..catch blocks at crititcal places

This commit is contained in:
Jonathan Jenne 2019-06-18 13:55:52 +02:00
parent 8127760eff
commit 617315667c
2 changed files with 76 additions and 27 deletions

View File

@ -301,7 +301,6 @@ Public Class ImportZUGFeRDFiles
Function(Item) Item) Function(Item) Item)
_logger.Debug("Found {0} properties grouped in {1} group(s)", args.PropertyMap.Count - oDefaultProperties.Count, oGroupedProperties.Count) _logger.Debug("Found {0} properties grouped in {1} group(s)", args.PropertyMap.Count - oDefaultProperties.Count, oGroupedProperties.Count)
' Iterate through groups to get group scope and group items ' Iterate through groups to get group scope and group items
For Each oGroup In oGroupedProperties For Each oGroup In oGroupedProperties
Dim oGroupScope As String = oGroup.Key Dim oGroupScope As String = oGroup.Key
@ -312,8 +311,20 @@ Public Class ImportZUGFeRDFiles
' get properties as a nested object, see `oPropertyList` ' get properties as a nested object, see `oPropertyList`
For Each oProperty As KeyValuePair(Of String, XmlItemProperty) In oGroup For Each oProperty As KeyValuePair(Of String, XmlItemProperty) In oGroup
Dim oPropertyValues As List(Of Object) = oPropertyExtractor.GetPropValue(oDocument, oProperty.Key) Dim oPropertyValues As List(Of Object)
Try
oPropertyValues = oPropertyExtractor.GetPropValue(oDocument, oProperty.Key)
Catch ex As Exception
_logger.Warn("Unknown error occurred while fetching property {0} in group {1}:", oProperty.Value.Description, oGroupScope)
_logger.Error(ex)
oPropertyValues = New List(Of Object)
End Try
' Flatten result value
oPropertyValues = oPropertyExtractor.GetFinalPropValue(oPropertyValues)
' Add to list
oPropertyList.Add(oProperty.Value, oPropertyValues) oPropertyList.Add(oProperty.Value, oPropertyValues)
' check the first batch of values to determine the row count ' check the first batch of values to determine the row count
@ -379,16 +390,6 @@ Public Class ImportZUGFeRDFiles
_logger.Debug("Processing property {0}.", oPropertyDescription) _logger.Debug("Processing property {0}.", oPropertyDescription)
If TypeOf oPropertyValue Is List(Of Object) Then
Select Case oPropertyValue.Count
Case 0
oPropertyValue = String.Empty
Case Else
Dim oList As List(Of Object) = DirectCast(oPropertyValue, List(Of Object))
oPropertyValue = oList.Item(0)
End Select
End If
If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then
If oColumn.Key.IsRequired Then If oColumn.Key.IsRequired Then
_logger.Warn("Property {0} is empty or not found but was required. Continuing with Empty String.", oPropertyDescription) _logger.Warn("Property {0} is empty or not found but was required. Continuing with Empty String.", oPropertyDescription)
@ -423,26 +424,41 @@ Public Class ImportZUGFeRDFiles
' Iterate through default properties ' Iterate through default properties
For Each Item As KeyValuePair(Of String, XmlItemProperty) In oDefaultProperties For Each Item As KeyValuePair(Of String, XmlItemProperty) In oDefaultProperties
Dim oPropertyValueList As List(Of Object) = oPropertyExtractor.GetPropValue(oDocument, Item.Key) Dim oPropertyValueList As List(Of Object)
Dim oPropertyDescription As String = Item.Value.Description Dim oPropertyDescription As String = Item.Value.Description
Dim oPropertyValue As Object = Nothing Dim oPropertyValue As Object = Nothing
If IsNothing(oPropertyValueList) Then Try
oPropertyValue = Nothing oPropertyValueList = oPropertyExtractor.GetPropValue(oDocument, Item.Key)
ElseIf TypeOf oPropertyValueList Is List(Of Object) Then Catch ex As Exception
Select Case oPropertyValueList.Count _logger.Warn("Unknown error occurred while fetching property {0} in group {1}:", oPropertyDescription, Item.Value.GroupScope)
Case 0 _logger.Error(ex)
oPropertyValue = Nothing oPropertyValueList = New List(Of Object)
Case Else End Try
oPropertyValue = oPropertyValueList.First()
' This should hopefully show config errors Try
If TypeOf oPropertyValue Is List(Of Object) Then If IsNothing(oPropertyValueList) Then
_logger.Warn("Property with Description {0} may be configured incorrectly", oPropertyDescription) oPropertyValue = Nothing
ElseIf TypeOf oPropertyValueList Is List(Of Object) Then
Select Case oPropertyValueList.Count
Case 0
oPropertyValue = Nothing oPropertyValue = Nothing
End If Case Else
End Select Dim oList As List(Of Object) = DirectCast(oPropertyValueList, List(Of Object))
End If oPropertyValue = oList.Item(0)
' This should hopefully show config errors
If TypeOf oPropertyValue Is List(Of Object) Then
_logger.Warn("Property with Description {0} may be configured incorrectly", oPropertyDescription)
oPropertyValue = Nothing
End If
End Select
End If
Catch ex As Exception
_logger.Warn("Unknown error occurred while processing property {0}:", oPropertyDescription)
_logger.Error(ex)
oPropertyValue = Nothing
End Try
If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then
If Item.Value.IsRequired Then If Item.Value.IsRequired Then

View File

@ -1,4 +1,5 @@
Imports System.Collections.Generic Imports System.Collections.Generic
Imports System.Linq
Imports System.Reflection Imports System.Reflection
Imports System.Text.RegularExpressions Imports System.Text.RegularExpressions
Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Logging
@ -87,6 +88,38 @@ Public Class PropertyValues
Return New List(Of Object) From {Obj} Return New List(Of Object) From {Obj}
End Function End Function
Public Function GetFinalPropValue(List As List(Of Object)) As List(Of Object)
Dim oResult As New List(Of Object)
For Each Item In List
Dim oItemValue = DoGetFinalPropValue(Item)
If Not IsNothing(oItemValue) Then
oResult.Add(oItemValue)
End If
Next
Return oResult
End Function
Private Function DoGetFinalPropValue(Value As Object) As String
If TypeOf Value Is List(Of Object) Then
Dim oList = DirectCast(Value, List(Of Object))
Dim oCount = oList.Count
Select Case oCount
Case 0
Return Nothing
Case Else
Return DoGetFinalPropValue(oList.First())
End Select
Return DoGetFinalPropValue(Value)
Else
Return Value.ToString
End If
End Function
Private Function GetIndex(Prop As String) As Integer Private Function GetIndex(Prop As String) As Integer
If Regex.IsMatch(Prop, _indexPattern) Then If Regex.IsMatch(Prop, _indexPattern) Then
Dim oMatch = _indexRegex.Match(Prop) Dim oMatch = _indexRegex.Match(Prop)