EDMI.API: WIP Client

This commit is contained in:
Jonathan Jenne 2021-07-19 16:40:46 +02:00
parent 9168474530
commit 464dc1d4ad

View File

@ -18,43 +18,12 @@ Public Class Client
Private _dummy_table_attributes As DataTable
Private _channel As IEDMIServiceChannel
Public Class StreamedFile
Public Stream As MemoryStream
Public FileName As String
End Class
Public Class FileList
Public Datatable As DataTable
End Class
Public Class DocumentInfo
Public FullPath As String
Public AccessRight As AccessRight
End Class
Public Class VariableValue
Public ReadOnly Property IsVector As Boolean = False
Public Property Value As Object
Public Property Type As Type
Public Sub New(pValue As Object)
' Check if value is a collection
If TypeOf pValue Is IEnumerable Then
IsVector = True
End If
' Try to determine the type
If IsNothing(pValue) Then
Type = Nothing
Else
Type = pValue.GetType
End If
Value = pValue
End Sub
End Class
''' <summary>
''' Parse a IPAddress:Port String into its parts
''' </summary>
''' <param name="AddressWithOptionalPort"></param>
''' <returns></returns>
Public Shared Function ParseServiceAddress(AddressWithOptionalPort As String) As Tuple(Of String, Integer)
Dim oSplit() As String = AddressWithOptionalPort.Split(":"c)
Dim oAppServerAddress As String = oSplit(0)
@ -131,10 +100,6 @@ Public Class Client
End Try
End Function
Private Function PreloadAttributes()
End Function
''' <summary>
''' TODO: Creates a new object
''' </summary>
@ -143,23 +108,7 @@ Public Class Client
Throw New NotImplementedException()
End Function
''' <summary>
''' Import options for NewFileAsync.
''' </summary>
Public Class NewFileOptions
''' <summary>
''' Option to keep the original extension when importing. Defaults to false.
''' </summary>
Public KeepExtension As Boolean = False
''' <summary>
''' Windows username of the user responsible for the import. Defaults to the currently logged in user.
''' </summary>
Public Username As String = Environment.UserName
''' <summary>
''' Date when the file was imported. Can be in the past. Defaults to now.
''' </summary>
Public DateImported As Date = Date.Now
End Class
''' <summary>
''' Imports a file from a filepath, creating a IDB ObjectId and Filesystem Object
@ -236,30 +185,27 @@ Public Class Client
End Try
End Function
Public Class SetVariableValueOptions
Public CheckDeleted As Boolean = False
Public Username As String = String.Empty
Public Language As String = String.Empty
End Class
''' <summary>
''' Sets a value to an attribute
''' </summary>
''' <param name="pObjectId">IDB ObjectId</param>
''' <param name="pAttributeName">Name of the attribute</param>
''' <param name="pAttributeType">The type of Attribute</param>
''' <param name="pValue"></param>
''' <param name="pOptions"></param>
''' <returns></returns>
Public Function SetVariableValue(pObjectId As Long, pAttributeName As String, pAttributeType As AttributeType, pValue As Object, Optional pOptions As SetVariableValueOptions = Nothing) As Boolean
Public Function SetVariableValue(pObjectId As Long, pAttributeName As String, pValue As Object, Optional pOptions As SetVariableValueOptions = Nothing) As Boolean
Try
' Set default options
If pOptions Is Nothing Then
pOptions = New SetVariableValueOptions()
End If
Dim oLanguage = NotNull(pOptions.Language, GetUserLanguage())
Dim oUsername = NotNull(pOptions.Username, Environment.UserName)
Dim oLanguage = GetUserLanguage(pOptions.UserLanguage)
Dim oUsername = GetUserName(pOptions.UserName)
Dim oOptions As New GetVariableValueOptions With {
.UserLanguage = oLanguage,
.UserName = oUsername
}
Try
Dim oResponse = _channel.TestObjectIdExists(New TestObjectIdExistsRequest With {.ObjectId = pObjectId})
@ -272,96 +218,85 @@ Public Class Client
Return False
End Try
' TODO: Check if Attribute exists
Dim oType = pValue.GetType.Name
If oType = GetType(DataTable).Name Then
Dim oValueTable As DataTable = pValue
Dim oCurrentValue As VariableValue
If pOptions.CheckDeleted = True Then
Dim oOptions As New GetVariableValueOptions With {
.Language = oLanguage,
.Username = oUsername
}
' Get current value
oCurrentValue = GetVariableValue(pObjectId, pAttributeName, oOptions)
' Get current value
oCurrentValue = GetVariableValue(pObjectId, pAttributeName, pAttributeType, oOptions)
' If current value is datatable
If oCurrentValue.Type = GetType(DataTable) Then
' If current value is datatable
If oCurrentValue.Type = GetType(DataTable) Then
' Convert value to Datatable
Dim oTable As DataTable = oCurrentValue.Value
' Convert value to Datatable
Dim oTable As DataTable = oCurrentValue.Value
If oTable.Rows.Count > 1 Then
If oTable.Rows.Count > 1 Then
'now Checking whether the old row still remains in Vector? If not it will be deleted as it cannot be replaced in multivalues
For Each oRow As DataRow In oTable.Rows
Dim oExists As Boolean = False
For Each oNewValueRow As DataRow In oValueTable.Rows
Dim oInfo = $"Checking oldValue[{oRow.Item(0)}] vs NewValue [{oNewValueRow.Item(1)}]"
If oNewValueRow.Item(1).ToString.ToUpper = oRow.Item(0).ToString.ToUpper Then
oExists = True
Exit For
End If
Next
If oExists = False Then
_logger.Debug($"Value [{oRow.Item(0)}] no longer existing in Vector-Attribute [{pAttributeName}] - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oRow.Item(0))
End If
Next
End If
Else
If oValueTable.Rows.Count > 1 Then
'now Checking whether the old row still remains in Vector? If not it will be deleted as it cannot be replaced in multivalues
For Each oRow As DataRow In oTable.Rows
Dim oExists As Boolean = False
For Each oNewValueRow As DataRow In oValueTable.Rows
_logger.Debug($"Checking oldValue[{oCurrentValue}] vs NewValue [{oNewValueRow.Item(1)}]")
If oNewValueRow.Item(1).ToString.ToUpper = oCurrentValue.ToString.ToUpper Then
If oNewValueRow.Item(1).ToString.ToUpper = oRow.Item(0).ToString.ToUpper Then
oExists = True
Exit For
End If
Next
If oExists = False Then
_logger.Debug($"Value [{oCurrentValue}] no longer existing in Vector-Attribute [{pAttributeName}] - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue.Value)
_logger.Debug($"Value [{oRow.Item(0)}] no longer existing in Vector-Attribute [{pAttributeName}] - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oRow.Item(0))
End If
Else
_logger.Debug($"Value [{oCurrentValue}] of Attribute [{pAttributeName}] obviously was updated during runtime - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue.Value)
Next
End If
Else
If oValueTable.Rows.Count > 1 Then
'now Checking whether the old row still remains in Vector? If not it will be deleted as it cannot be replaced in multivalues
Dim oExists As Boolean = False
For Each oNewValueRow As DataRow In oValueTable.Rows
_logger.Debug($"Checking oldValue[{oCurrentValue}] vs NewValue [{oNewValueRow.Item(1)}]")
If oNewValueRow.Item(1).ToString.ToUpper = oCurrentValue.ToString.ToUpper Then
oExists = True
Exit For
End If
Next
If oExists = False Then
_logger.Debug($"Value [{oCurrentValue}] no longer existing in Vector-Attribute [{pAttributeName}] - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue.Value)
End If
Else
_logger.Debug($"Value [{oCurrentValue}] of Attribute [{pAttributeName}] obviously was updated during runtime - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue.Value)
End If
End If
For Each oNewValueRow As DataRow In oValueTable.Rows
Dim oSuccess As Boolean = False
Dim oSQL = $"DECLARE @NEW_OBJ_MD_ID BIGINT
EXEC PRIDB_NEW_OBJ_DATA({pObjectId}, '{pAttributeName}', '{oUsername}', '{oNewValueRow.Item(1)}', '{oLanguage}', 0, @OMD_ID = @NEW_OBJ_MD_ID OUTPUT)"
Dim oResult As Boolean = NewObjectData(pObjectId, pAttributeName, pValue, New NewObjectOptions With {
.UserLanguage = oLanguage,
.UserName = oUsername
})
Dim oResult = _channel.ExecuteNonQuery_MSSQL_IDB(oSQL)
If Not oResult.OK Then
If oResult = False Then
Return False
End If
Next
Return True
Else
Dim oSql = $"DECLARE @NEW_OBJ_MD_ID BIGINT
EXEC PRIDB_NEW_OBJ_DATA({pObjectId}, '{pAttributeName}', '{oUsername}', '{pValue}', '{oLanguage}', 0, @OMD_ID = @NEW_OBJ_MD_ID OUTPUT)"
Dim oResult = _channel.ExecuteNonQuery_MSSQL_IDB(oSql)
Return oResult.OK
Return NewObjectData(pObjectId, pAttributeName, pValue, New NewObjectOptions With {
.UserLanguage = oLanguage,
.UserName = oUsername
})
End If
Catch ex As Exception
@ -370,112 +305,60 @@ Public Class Client
End Try
End Function
Public Class GetVariableValueOptions
Public Username As String = String.Empty
Public Language As String = String.Empty
End Class
Public Function GetVariableValue(pObjectId As Long, pAttributeName As String, pAttributeType As AttributeType, Optional pOptions As GetVariableValueOptions = Nothing) As VariableValue
''' <summary>
'''
''' </summary>
''' <param name="pObjectId"></param>
''' <param name="pAttributeName"></param>
''' <param name="pOptions"></param>
''' <returns></returns>
Public Function GetVariableValue(pObjectId As Long, pAttributeName As String, Optional pOptions As GetVariableValueOptions = Nothing) As VariableValue
If pOptions Is Nothing Then
pOptions = New GetVariableValueOptions()
End If
pOptions.Language = NotNull(pOptions.Language, GetUserLanguage())
pOptions.Username = NotNull(pOptions.Username, Environment.UserName)
pOptions.UserLanguage = GetUserLanguage(pOptions.UserLanguage)
pOptions.UserName = GetUserName(pOptions.UserName)
' Check if ObjectId exists
Try
Dim oResponse = _channel.TestObjectIdExists(New TestObjectIdExistsRequest With {.ObjectId = pObjectId})
If oResponse.Exists = False Then
Return Nothing
Return New VariableValue()
End If
Catch ex As Exception
_logger.Error(ex)
Return Nothing
Return New VariableValue()
End Try
' Get Attributes and Values from Database
Dim oAttributes As DataTable = GetAttributesForObject(pObjectId, pOptions.Language)
' TODO: Check if Attribute exists & REfactor
Try
Dim oVectorAttribute As Boolean = False
Select Case pAttributeType
Case AttributeType.VectorInteger
oVectorAttribute = True
Case AttributeType.VectorString
oVectorAttribute = True
Case Else
oVectorAttribute = False
End Select
Dim oValues As New List(Of Object)
Dim oRows As List(Of DataRow) = oAttributes.AsEnumerable().
Where(Function(pRow As DataRow) pRow.Item("AttributeTitle") = pAttributeName).
' Get Attributes and Values from Database
Dim oAttributes As List(Of ObjectAttribute) = GetAttributesForObject(pObjectId, pOptions.UserLanguage)
Dim oValues = oAttributes.AsEnumerable().
Where(Function(pAttr)
Return pAttr.Title.ToUpper = pAttributeName.ToUpper
End Function).
Select(Function(pAttr) pAttr.Value).
ToList()
'If Not IsNothing(oAttributes) Then
' If oVectorAttribute = True And _dummy_table_attributes.Rows.Count = 1 And pOptions.FromIDB = False Then
' Try
' If pAttributeName = "IDBCreatedWhen" Then
' pAttributeName = "ADDED_WHEN"
' ElseIf pAttributeName = "IDBCreatedWho" Then
' pAttributeName = "ADDED_WHO"
' ElseIf pAttributeName = "IDBChangedWhen" Then
' pAttributeName = "CHANGED_WHEN"
' ElseIf pAttributeName = "IDBChangedWho" Then
' pAttributeName = "CHANGED_WHO"
' End If
' oAttributeValue = _dummy_table_attributes.Rows(0).Item(pAttributeName)
' Catch ex As Exception
' _logger.Debug($"Error getting Attribute from IDB_DT_DOC_DATA: {ex.Message}")
' End Try
' End If
'Else
' Throw New ApplicationException($"Could not get Attributes for ObjectId [{pObjectId}]")
'End If
'TODO: BRAUCHEN SIE DAS ÜBERHAUPT??????11111?!!1!1
'If Not IsNothing(oAttributeValue) Then
' Return oAttributeValue
'Else
' _logger.Debug($"oAttributeValue for Attribute [{pAttributeName}] is so far nothing..Now trying FNIDB_PM_GET_VARIABLE_VALUE ")
'End If
'Dim oFNSQL = $"SELECT * FROM [dbo].[FNIDB_PM_GET_VARIABLE_VALUE] ({pObjectId},'{pAttributeName}','{pOptions.Language}',CONVERT(BIT,'0'))"
'Dim oDatatable As TableResult = _channel.ReturnDatatable_MSSQL_IDB(oFNSQL)
'If oDatatable.OK = False Then
' Throw New ApplicationException(oDatatable.ErrorMessage)
'End If
'If oDatatable.Table.Rows.Count = 1 Then
' oAttributeValue = oDatatable.Table.Rows.Item(0).Item(0)
'End If
If oVectorAttribute = False Then
Dim oRow As DataRow = oRows.FirstOrDefault()
Dim oType As String = oRow.Item("AttributeType")
Dim oValue = GetValueByType(oRow, oType)
'oValues.Add(oValue)
Return New VariableValue(oValue)
Else
For Each oRow As DataRow In oRows
Dim oType As String = oRow.Item("AttributeType")
Dim oValue = GetValueByType(oRow, oType)
oValues.Add(oValue)
Next
' Either return a list or a single value or nothing, always wrapped in VariableValue
If oValues.Count > 1 Then
Return New VariableValue(oValues)
ElseIf oValues.Count = 1 Then
Return New VariableValue(oValues.First())
Else
Return New VariableValue()
End If
Catch ex As Exception
_logger.Error(ex)
Return Nothing
Return New VariableValue()
End Try
End Function
@ -525,11 +408,62 @@ Public Class Client
End Try
End Function
Private Function GetAttributesForObject(pObjectId As Long, pLanguage As String) As DataTable
Dim oTable As DataTable
Private Class ObjectAttribute
Public Property Id As Long
Public Property Title As String
Public Property Type As String
Public Property ValueBigInt As Long
Public Property ValueText As String
Public Property ValueDecimal As Decimal
Public Property ValueDate As DateTime
Public ReadOnly Property Value As Object
Get
Return GetValue()
End Get
End Property
Private Function GetValue() As Object
Select Case Type
Case AttributeTypeName.VECTOR_INTEGER
Return ValueBigInt
Case AttributeTypeName.BIG_INTEGER
Return ValueBigInt
Case AttributeTypeName.VECTOR_STRING
Return ValueText
Case AttributeTypeName.VARCHAR
Return ValueText
Case AttributeTypeName.BIT
Return IIf(ValueBigInt = 1, True, False)
Case AttributeTypeName.DATE
Return ValueDate
Case AttributeTypeName.DATETIME
Return ValueDate
Case AttributeTypeName.DECIMAL
Return ValueDecimal
Case AttributeTypeName.FLOAT
Return ValueDecimal
Case Else
Return Nothing
End Select
End Function
End Class
Private Function GetAttributesForObject(pObjectId As Long, pLanguage As String) As List(Of ObjectAttribute)
Dim oAttributes As New List(Of ObjectAttribute)
Try
Dim oResult As TableResult = _channel.ReturnDatatable_MSSQL_IDB($"EXEC [PRIDB_GET_VALUE_DT]({pObjectId}, '{pLanguage}')")
Dim oResult As TableResult = _channel.ReturnDatatable_MSSQL_IDB($"EXEC [PRIDB_GET_VALUE_DT] {pObjectId}, '{pLanguage}'")
If oResult.OK = False Then
Throw New ApplicationException(oResult.ErrorMessage)
@ -539,24 +473,61 @@ Public Class Client
Return Nothing
End If
oTable = oResult.Table
For Each oRow As DataRow In oResult.Table.Rows
Dim oAttribute As New ObjectAttribute With {
.Id = oRow.Item("AttributeId"),
.Title = oRow.Item("AttributeTitle"),
.Type = oRow.Item("AttributeType"),
.ValueBigInt = NotNull(oRow.Item("ValueBigInt"), Nothing),
.ValueDate = NotNull(oRow.Item("ValueDate"), Nothing),
.ValueDecimal = NotNull(oRow.Item("ValueDecimal"), Nothing),
.ValueText = NotNull(oRow.Item("ValueText"), Nothing)
}
Return oTable
oAttributes.Add(oAttribute)
Next
Return oAttributes
Catch ex As Exception
_logger.Error(ex)
Return Nothing
End Try
End Function
Private Function NewObjectData(pObjectId As Long, pAttributeName As String, pValue As Object, pOptions As NewObjectOptions)
If pOptions Is Nothing Then
pOptions = New NewObjectOptions()
End If
Dim oLanguage = GetUserLanguage(pOptions.UserLanguage)
Dim oUsername = GetUserName(pOptions.UserName)
Dim oSql = $"DECLARE @NEW_OBJ_MD_ID BIGINT
EXEC PRIDB_NEW_OBJ_DATA({pObjectId}, '{pAttributeName}', '{oUsername}', '{pValue}', '{oLanguage}', 0, @OMD_ID = @NEW_OBJ_MD_ID OUTPUT)"
Dim oResult = _channel.ExecuteNonQuery_MSSQL_IDB(oSql)
If oResult.OK = False Then
_logger.Warn("Error while deleting Term object")
_logger.Error(oResult.ErrorMessage)
End If
Return oResult.OK
End Function
Private Function DeleteTermObjectFromMetadata(pObjectId As Long, pAttributeName As String, pTerm2Delete As String, Optional pUsername As String = "", Optional pLanguage As String = "") As Boolean
Try
Dim oLanguage = NotNull(pLanguage, GetUserLanguage())
Dim oUsername = NotNull(pUsername, Environment.UserName)
Dim oLanguage = GetUserLanguage(pLanguage)
Dim oUsername = GetUserName(pUsername)
Dim oIdIsForeign As Integer = 1
Dim oDELSQL = $"EXEC PRIDB_DELETE_TERM_OBJECT_METADATA {pObjectId},'{pAttributeName}','{pTerm2Delete}','{oUsername}','{oLanguage}',{oIdIsForeign}"
Dim oResult = _channel.ExecuteNonQuery_MSSQL_IDB(oDELSQL)
If oResult.OK = False Then
_logger.Warn("Error while deleting Term object")
_logger.Error(oResult.ErrorMessage)
End If
Return oResult.OK
Catch ex As Exception
_logger.Error(ex)
@ -574,7 +545,6 @@ Public Class Client
End Try
End Function
Public Async Function GetDatatableFromIDBAsync(SQL As String) As Task(Of TableResult)
Try
Dim oResponse = Await _channel.ReturnDatatable_MSSQL_IDBAsync(SQL)
@ -699,8 +669,93 @@ Public Class Client
End Try
End Function
Private Function GetUserLanguage() As String
Return Threading.Thread.CurrentThread.CurrentUICulture.Name
Private Function GetUserLanguage(pOverrideLanguage As String) As String
Return NotNull(pOverrideLanguage, Threading.Thread.CurrentThread.CurrentUICulture.Name)
End Function
Private Function GetUserName(pOverrideName) As String
Return NotNull(pOverrideName, Environment.UserName)
End Function
#Region "Option & Parameter Classes"
''' <summary>
''' Import options for NewFileAsync.
''' </summary>
Public Class NewFileOptions
''' <summary>
''' Option to keep the original extension when importing. Defaults to false.
''' </summary>
Public KeepExtension As Boolean = False
''' <summary>
''' Windows username of the user responsible for the import. Defaults to the currently logged in user.
''' </summary>
Public Username As String = Environment.UserName
''' <summary>
''' Date when the file was imported. Can be in the past. Defaults to now.
''' </summary>
Public DateImported As Date = Date.Now
End Class
Public Class NewObjectOptions
Public UserName As String
Public UserLanguage As String
End Class
Public Class VariableValueOptions
Public UserName As String
Public UserLanguage As String
End Class
Public Class GetVariableValueOptions
Inherits VariableValueOptions
End Class
Public Class SetVariableValueOptions
Inherits VariableValueOptions
End Class
#End Region
#Region "Response Classes"
Public Class StreamedFile
Public Stream As MemoryStream
Public FileName As String
End Class
Public Class FileList
Public Datatable As DataTable
End Class
Public Class DocumentInfo
Public FullPath As String
Public AccessRight As AccessRight
End Class
Public Class VariableValue
Public ReadOnly Property IsVector As Boolean = False
Public Property Value As Object
Public Property Type As Type
Public Sub New()
MyClass.New(Nothing)
End Sub
Public Sub New(pValue As Object)
' Check if value is a collection
If TypeOf pValue Is IEnumerable Then
IsVector = True
End If
' Try to determine the type
If IsNothing(pValue) Then
Type = Nothing
Else
Type = pValue.GetType
End If
Value = pValue
End Sub
End Class
#End Region
End Class