From 590407fbce5d35e1e652c895557d4317f839bc35 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 23 Dec 2020 14:19:47 +0100 Subject: [PATCH] EDMIService: Small fixes and exception handling --- ...alData.Services.EDMIService.Exceptions.xsd | 36 +++ .../DigitalData.Services.EDMIService.wsdl | 65 ++++ .../EDMIServiceReference/Reference.svcmap | 1 + .../EDMIServiceReference/Reference.vb | 191 +++++++++++- .../EDMIServiceReference/System.xsd | 10 +- .../EDMIServiceReference/service.wsdl | 48 +++ Modules.EDMIAPI/EDMI.API.vbproj | 3 + Service.EDMIService/EDMIService.vb | 280 ++++++++++++------ Service.EDMIService/EDMIService.vbproj | 13 +- Service.EDMIService/Exceptions.vb | 13 - .../{Results => Helpers}/AccessRightResult.vb | 0 .../{Results => Helpers}/BaseResult.vb | 0 .../{Results => Helpers}/DatabaseResult.vb | 0 Service.EDMIService/Helpers/Exceptions.vb | 71 +++++ .../{Results => Helpers}/Messages.vb | 0 Service.EDMIService/IEDMIService.vb | 18 +- Service.EDMIService/Results.vb | 2 - Service.EDMIService/Scheduler/DatatableJob.vb | 59 +--- Service.EDMIService/Scheduler/JobListener.vb | 13 +- .../{ => Scheduler}/Scheduler.vb | 0 20 files changed, 630 insertions(+), 193 deletions(-) create mode 100644 Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Exceptions.xsd delete mode 100644 Service.EDMIService/Exceptions.vb rename Service.EDMIService/{Results => Helpers}/AccessRightResult.vb (100%) rename Service.EDMIService/{Results => Helpers}/BaseResult.vb (100%) rename Service.EDMIService/{Results => Helpers}/DatabaseResult.vb (100%) create mode 100644 Service.EDMIService/Helpers/Exceptions.vb rename Service.EDMIService/{Results => Helpers}/Messages.vb (100%) delete mode 100644 Service.EDMIService/Results.vb rename Service.EDMIService/{ => Scheduler}/Scheduler.vb (100%) diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Exceptions.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Exceptions.xsd new file mode 100644 index 00000000..1b35f58a --- /dev/null +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Exceptions.xsd @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl index 0a4f00a0..b1d36f6e 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl @@ -4,6 +4,7 @@ + @@ -23,66 +24,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -92,16 +129,28 @@ + + + + + + + + + + + + @@ -110,58 +159,74 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap index 317fffe7..2d855184 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap @@ -29,6 +29,7 @@ + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb index 1b1c5bcc..ba1f7fdb 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb @@ -92,6 +92,11 @@ Namespace EDMIServiceReference System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.BaseResult)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.NonQueryResult)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(System.DBNull)), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(System.Exception)), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault)), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.BaseFault)), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.DataTableDoesNotExistFault)), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.ObjectDoesNotExistFault)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.RightsAccessRight))> _ Partial Public Class ScalarResult Inherits EDMIServiceReference.BaseResult @@ -147,6 +152,116 @@ Namespace EDMIServiceReference End Property End Class + _ + Partial Public Class UnexpectedErrorFault + Inherits EDMIServiceReference.BaseFault + End Class + + _ + Partial Public Class BaseFault + Inherits Object + Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged + + _ + Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject + + _ + Private ErrorMessageField As String + + _ + Private InnerExceptionField As System.Exception + + _ + Private IsRecoverableField As Boolean + + _ + Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData + Get + Return Me.extensionDataField + End Get + Set + Me.extensionDataField = value + End Set + End Property + + _ + Public Property ErrorMessage() As String + Get + Return Me.ErrorMessageField + End Get + Set + If (Object.ReferenceEquals(Me.ErrorMessageField, value) <> true) Then + Me.ErrorMessageField = value + Me.RaisePropertyChanged("ErrorMessage") + End If + End Set + End Property + + _ + Public Property InnerException() As System.Exception + Get + Return Me.InnerExceptionField + End Get + Set + If (Object.ReferenceEquals(Me.InnerExceptionField, value) <> true) Then + Me.InnerExceptionField = value + Me.RaisePropertyChanged("InnerException") + End If + End Set + End Property + + _ + Public Property IsRecoverable() As Boolean + Get + Return Me.IsRecoverableField + End Get + Set + If (Me.IsRecoverableField.Equals(value) <> true) Then + Me.IsRecoverableField = value + Me.RaisePropertyChanged("IsRecoverable") + End If + End Set + End Property + + Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged + + Protected Sub RaisePropertyChanged(ByVal propertyName As String) + Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent + If (Not (propertyChanged) Is Nothing) Then + propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName)) + End If + End Sub + End Class + + _ + Partial Public Class DataTableDoesNotExistFault + Inherits EDMIServiceReference.BaseFault + End Class + + _ + Partial Public Class ObjectDoesNotExistFault + Inherits EDMIServiceReference.BaseFault + End Class + _ Public Enum RightsAccessRight As Integer @@ -172,7 +287,13 @@ Namespace EDMIServiceReference Function HeartbeatAsync() As System.Threading.Tasks.Task(Of Boolean) _ + "onse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatableFromCacheUnex"& _ + "pectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.DataTableDoesNotExistFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatableFromCacheData"& _ + "TableDoesNotExistFaultFault", Name:="DataTableDoesNotExistFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnDatatableFromCache(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As EDMIServiceReference.TableResult _ + "onse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatable_FirebirdUnex"& _ + "pectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnDatatable_Firebird(ByVal SQL As String) As EDMIServiceReference.TableResult _ + "e"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnScalar_FirebirdUnexpec"& _ + "tedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnScalar_Firebird(ByVal SQL As String) As EDMIServiceReference.ScalarResult _ + "onse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ExecuteNonQuery_FirebirdUnex"& _ + "pectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ExecuteNonQuery_Firebird(ByVal SQL As String) As EDMIServiceReference.NonQueryResult _ + "ponse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatable_MSSQL_IDBUne"& _ + "xpectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnDatatable_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.TableResult _ + "se"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnScalar_MSSQL_IDBUnexpe"& _ + "ctedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnScalar_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.ScalarResult _ + "ponse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ExecuteNonQuery_MSSQL_IDBUne"& _ + "xpectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ExecuteNonQuery_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.NonQueryResult _ + "ponse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatable_MSSQL_ECMUne"& _ + "xpectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnDatatable_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.TableResult _ + "se"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnScalar_MSSQL_ECMUnexpe"& _ + "ctedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ReturnScalar_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.ScalarResult _ + "ponse"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/ExecuteNonQuery_MSSQL_ECMUne"& _ + "xpectedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function ExecuteNonQuery_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.NonQueryResult _ + _ Function ImportFile(ByVal request As EDMIServiceReference.DocumentImportRequest) As EDMIServiceReference.DocumentImportResponse _ Function ImportFileAsync(ByVal request As EDMIServiceReference.DocumentImportRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentImportResponse) 'CODEGEN: Der Nachrichtenvertrag wird generiert, da der Wrappername (DocumentStreamRequest) von Nachricht "DocumentStreamRequest" nicht mit dem Standardwert (GetFileByObjectId) übereinstimmt. - _ + _ Function GetFileByObjectId(ByVal request As EDMIServiceReference.DocumentStreamRequest) As EDMIServiceReference.DocumentStreamResponse _ Function GetFileByObjectIdAsync(ByVal request As EDMIServiceReference.DocumentStreamRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentStreamResponse) _ + "e"), _ + System.ServiceModel.FaultContractAttribute(GetType(EDMIServiceReference.UnexpectedErrorFault), Action:="http://DigitalData.Services.EDMIService/IEDMIService/GetFileInfoByObjectIdUnexpec"& _ + "tedErrorFaultFault", Name:="UnexpectedErrorFault", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Exceptio"& _ + "ns")> _ Function GetFileInfoByObjectId(ByVal request As EDMIServiceReference.DocumentInfoRequest) As EDMIServiceReference.DocumentInfoResponse 'CODEGEN: Der Nachrichtenvertrag wird generiert, da der Vorgang mehrere Rückgabewerte aufweist. @@ -275,7 +435,10 @@ Namespace EDMIServiceReference Function GetFileInfoByObjectIdAsync(ByVal request As EDMIServiceReference.DocumentInfoRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentInfoResponse) 'CODEGEN: Der Nachrichtenvertrag wird generiert, da der Vorgang ListFilesForUser weder in RPC noch in einem Dokument eingeschlossen ist. - _ + _ Function ListFilesForUser(ByVal request As EDMIServiceReference.ListFilesForUserRequest) As EDMIServiceReference.DocumentListResponse _ diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/System.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/System.xsd index 554d75bc..bdecebdc 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/System.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/System.xsd @@ -1,7 +1,15 @@  - + + + + + + + + + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl index 1f3071f6..7331e682 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl @@ -58,6 +58,12 @@ + + + + + + @@ -67,6 +73,9 @@ + + + @@ -76,6 +85,9 @@ + + + @@ -85,6 +97,9 @@ + + + @@ -94,6 +109,9 @@ + + + @@ -103,6 +121,9 @@ + + + @@ -112,6 +133,9 @@ + + + @@ -121,6 +145,9 @@ + + + @@ -130,6 +157,9 @@ + + + @@ -139,6 +169,9 @@ + + + @@ -148,6 +181,9 @@ + + + @@ -158,6 +194,12 @@ + + + + + + @@ -167,6 +209,9 @@ + + + @@ -176,6 +221,9 @@ + + + diff --git a/Modules.EDMIAPI/EDMI.API.vbproj b/Modules.EDMIAPI/EDMI.API.vbproj index bb970afc..e6fb780c 100644 --- a/Modules.EDMIAPI/EDMI.API.vbproj +++ b/Modules.EDMIAPI/EDMI.API.vbproj @@ -133,6 +133,9 @@ Designer + + Designer + Designer diff --git a/Service.EDMIService/EDMIService.vb b/Service.EDMIService/EDMIService.vb index 6bbe3664..a64eb0ca 100644 --- a/Service.EDMIService/EDMIService.vb +++ b/Service.EDMIService/EDMIService.vb @@ -8,6 +8,7 @@ Imports System.Data.SqlClient Imports System.ServiceModel.Description Imports DigitalData.Services.EDMIService.Messages Imports DigitalData.Modules.EDMI.API.Rights +Imports DigitalData.Services.EDMIService.Exceptions Public Class EDMIService @@ -23,6 +24,9 @@ Public Class EDMIService Public Shared GlobalState As GlobalState Public Shared Scheduler As Scheduler + Public Const TBIDB_DOC_INFO = "TBIDB_DOC_INFO" + Public Const TBIDB_ACCESSRIGHT = "TBIDB_ACCESSRIGHT" + Private ReadOnly _Logger As Logger Private ReadOnly _Debug As Boolean = False Private ReadOnly _Username As String @@ -100,11 +104,20 @@ Public Class EDMIService Return New TableResult(oFilteredTable) Else - Throw New ApplicationException($"DataTable {Name} does not exist") + _Logger.Warn($"Datatable {Name} does not exist") + Dim oDetails As New DataTableDoesNotExistFault(Name) + Throw New FaultException(Of DataTableDoesNotExistFault)(oDetails) End If + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Throw New FaultException(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function #End Region @@ -115,9 +128,16 @@ Public Class EDMIService _Logger.Info($"ReturnDatatable_MSSQL_IDB, SQL: {SQL}") Dim oResult As DataTable = MSSQL_IDB.GetDatatable(SQL) Return New TableResult(oResult) + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New TableResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function @@ -126,9 +146,16 @@ Public Class EDMIService _Logger.Info($"ReturnScalar_MSSQL_IDB, SQL: {SQL}") Dim oResult As Object = MSSQL_IDB.GetScalarValue(SQL) Return New ScalarResult(oResult) + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New ScalarResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function @@ -137,9 +164,16 @@ Public Class EDMIService _Logger.Info($"ExecuteNonQuery_MSSQL_IDB, SQL: {SQL}") Dim oResult As Boolean = MSSQL_IDB.ExecuteNonQuery(SQL) Return New NonQueryResult() + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New NonQueryResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function #End Region @@ -150,9 +184,16 @@ Public Class EDMIService _Logger.Info($"ReturnDatatable_MSSQL_ECM, SQL: {SQL}") Dim oResult As DataTable = MSSQL_ECM.GetDatatable(SQL) Return New TableResult(oResult) + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New TableResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function @@ -161,9 +202,16 @@ Public Class EDMIService _Logger.Info($"ReturnScalar_MSSQL_ECM, SQL: {SQL}") Dim oResult As Object = MSSQL_ECM.GetScalarValue(SQL) Return New ScalarResult(oResult) + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New ScalarResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function @@ -172,9 +220,16 @@ Public Class EDMIService _Logger.Info($"ExecuteNonQuery_MSSQL_ECM, SQL: {SQL}") Dim oResult As Boolean = MSSQL_ECM.ExecuteNonQuery(SQL) Return New NonQueryResult() + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New NonQueryResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function #End Region @@ -185,9 +240,16 @@ Public Class EDMIService _Logger.Info($"ReturnDatatable, SQL: {SQL}") Dim oResult As DataTable = Firebird.GetDatatable(SQL) Return New TableResult(oResult) + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New TableResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function @@ -196,9 +258,16 @@ Public Class EDMIService _Logger.Info($"ReturnScalar, SQL: {SQL}") Dim oResult As Object = Firebird.GetScalarValue(SQL) Return New ScalarResult(oResult) + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New ScalarResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function @@ -207,9 +276,16 @@ Public Class EDMIService _Logger.Info($"ExecuteNonQuery, SQL: {SQL}") Dim oResult As Boolean = Firebird.ExecuteNonQuery(SQL) Return New NonQueryResult() + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Return New NonQueryResult(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function #End Region @@ -220,14 +296,7 @@ Public Class EDMIService ''' ''' Public Function ImportFile(Data As DocumentImportRequest) As DocumentImportResponse Implements IEDMIService.ImportFile - Dim oObjectStore = GlobalState.ObjectStores. - Where(Function(s) s.Id = Data.ObjectStoreId). - FirstOrDefault() - - If oObjectStore Is Nothing Then - Throw New FaultException($"Object Store with Id [{Data.ObjectStoreId}] does not exist!") - End If - + Dim oObjectStore = GlobalState.ObjectStores.First() Dim EDMIPath = New EDMI.File.Path(LogConfig, oObjectStore.Path) ' TODO: @@ -244,12 +313,7 @@ Public Class EDMIService Try Directory.CreateDirectory(oDirectoryPath) - Catch ex As Exception - _Logger.Error(ex) - Throw New FaultException(ex.Message) - End Try - Try Dim oVersionedFileName As String = Filesystem.GetVersionedFilename(oAbsolutePath) _Logger.Info("ImportFile: Saving file [{0}] to path [{1}]", Data.FileName, oVersionedFileName) @@ -270,37 +334,37 @@ Public Class EDMIService Dim oObjectId = MSSQL_IDB.GetScalarValue(oCommand, "@IDB_OBJ_ID") Return New DocumentImportResponse() With {.ObjectId = oObjectId} + + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Throw New FaultException(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) + End Try End Function Public Function GetFileByObjectId(Data As DocumentStreamRequest) As DocumentStreamResponse Implements IEDMIService.GetFileByObjectId Try - Dim oSQL As String = $"SELECT ObjectStoreId FROM VWIDB_DOC_DATA WHERE IDB_OBJ_ID = {Data.ObjectId}" - Dim oObjectStoreId = MSSQL_IDB.GetScalarValue(oSQL) - - Dim oObjectStore = GlobalState.ObjectStores. - Where(Function(s) s.Id = oObjectStoreId). - FirstOrDefault() + Dim oFullPath = GetFullPathForObjectId(Data.ObjectId) - Dim oSQL2 As String = $"SELECT DocRelativePath FROM VWIDB_DOC_DATA WHERE IDB_OBJ_ID = {Data.ObjectId}" - Dim oPath As String = MSSQL_IDB.GetScalarValue(oSQL2) - - If IsNothing(oPath) Then - Throw New FaultException($"Object [{Data.ObjectId}] does not exist in database!") + If oFullPath = String.Empty Then + Dim oDetails As New ObjectDoesNotExistFault(Data.ObjectId) + _Logger.Warn("GetFileByObjectId: " & oDetails.ErrorMessage) + Throw New FaultException(Of ObjectDoesNotExistFault)(oDetails, oDetails.ErrorMessage) End If - Dim EDMIPath As New EDMI.File.Path(LogConfig, oObjectStore.Path) - Dim oFullPath = EDMIPath.GetFullPathFromRelativePath(oPath) - _Logger.Debug("GetFileByObjectId: Loading file [{0}]", oFullPath) Dim oFileInfo As New FileInfo(oFullPath) If Not oFileInfo.Exists Then - Throw New FaultException($"Object [{Data.ObjectId}] does not exist on filesystem!") + Dim oDetails As New ObjectDoesNotExistFault(Data.ObjectId) + _Logger.Warn("GetFileByObjectId: " & oDetails.ErrorMessage) + Throw New FaultException(Of ObjectDoesNotExistFault)(oDetails, oDetails.ErrorMessage) End If Dim oDestination As New MemoryStream() @@ -309,109 +373,145 @@ Public Class EDMIService End Using oDestination.Seek(0, SeekOrigin.Begin) - Dim oMessage As New Messages.DocumentStreamResponse() With { + Dim oMessage As New DocumentStreamResponse() With { .FileName = oFileInfo.Name, .FileContents = oDestination } Return oMessage - Catch ex As IOException + Catch ex As FaultException _Logger.Error(ex) - Throw New FaultException($"Object [{Data.ObjectId}] could not be streamed!") + Throw ex Catch ex As Exception _Logger.Error(ex) - Throw New FaultException(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) End Try End Function Public Function ListFilesForUser() As DocumentListResponse Implements IEDMIService.ListFilesForUser Try - Dim oSQL = $"SELECT * FROM VWIDB_DOC_DATA" - Dim oDatatable As DataTable = MSSQL_IDB.GetDatatable(oSQL) - oDatatable.TableName = "DocumentList" + Dim oDatatable = GetFileList() Return New DocumentListResponse() With { .Datatable = oDatatable } + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Throw New FaultException(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) End Try End Function Public Function GetFileInfoByObjectId(Data As DocumentInfoRequest) As DocumentInfoResponse Implements IEDMIService.GetFileInfoByObjectId Try - Dim oAccessRight = GetAccessRight(Data.UserId, Data.ObjectId) - Dim oFullPath = GetFullPath(Data.ObjectId) + Dim oAccessRight = GetAccessRightForObjectId(Data.UserId, Data.ObjectId) + Dim oFullPath = GetFullPathForObjectId(Data.ObjectId) + + If oFullPath = String.Empty Then + Dim oDetails As New ObjectDoesNotExistFault(Data.ObjectId) + Throw New FaultException(Of ObjectDoesNotExistFault)(oDetails) + End If Return New DocumentInfoResponse With { .FileRight = oAccessRight, .FullPath = oFullPath } + Catch ex As FaultException + _Logger.Error(ex) + Throw ex + Catch ex As Exception _Logger.Error(ex) - Throw New FaultException(ex.Message) + Dim oDetails As New UnexpectedErrorFault(ex) + Throw New FaultException(Of UnexpectedErrorFault)(oDetails, oDetails.ErrorMessage) End Try End Function - Private Function GetFullPath(ObjectId As Long) As String - Dim oTableName As String = "TBIDB_DOC_INFO" + Public Function GetFileList() As DataTable + Try + If Not GlobalState.TableStore.Tables.Contains(TBIDB_DOC_INFO) Then + _Logger.Warn("GetFileList: Document info table does not exist!") + Return Nothing + End If - If Not GlobalState.TableStore.Tables.Contains(oTableName) Then - _Logger.Warn("GetFullPath: Document info table does not exist!") - Return String.Empty - End If + Dim oTable As DataTable = GlobalState.TableStore.Tables.Item(TBIDB_DOC_INFO) + Return oTable + Catch ex As Exception + _Logger.Warn("GetFileList: Unexpected Error while getting file list.") + _Logger.Error(ex) + Return Nothing + End Try + End Function + Private Function GetFullPathForObjectId(ObjectId As Long) As String + Try + If Not GlobalState.TableStore.Tables.Contains(TBIDB_DOC_INFO) Then + _Logger.Warn("GetFullPathForObjectId: Document info table does not exist!") + Return String.Empty + End If - Dim oTable As DataTable = GlobalState.TableStore.Tables.Item(oTableName) - Dim oRows As List(Of DataRow) = oTable.Select($"IDB_OBJ_ID = {ObjectId}").ToList() + Dim oTable As DataTable = GlobalState.TableStore.Tables.Item(TBIDB_DOC_INFO) + Dim oRows As List(Of DataRow) = oTable.Select($"IDB_OBJ_ID = {ObjectId}").ToList() - Dim oFullPath As String + Dim oFullPath As String - If oRows.Count = 0 Then - _Logger.Warn("GetFullPath: Full path does not exist for on object [{1}]", ObjectId) - oFullPath = String.Empty - Else - Dim oRow As DataRow = oRows.First() - oFullPath = oRow.Item("FULL_PATH") - End If + If oRows.Count = 0 Then + _Logger.Warn("GetFullPathForObjectId: Full path does not exist for on object [{1}]", ObjectId) + oFullPath = String.Empty + Else + Dim oRow As DataRow = oRows.First() + oFullPath = oRow.Item("FULL_PATH") + End If - Return oFullPath + Return oFullPath + Catch ex As Exception + _Logger.Warn("GetFullPathForObjectId: Unexpected Error while getting full path for object [{0}].", ObjectId) + _Logger.Error(ex) + Return String.Empty + End Try End Function + Private Function GetAccessRightForObjectId(UserId As Long, ObjectId As Long) As AccessRight + Try + If Not GlobalState.TableStore.Tables.Contains(TBIDB_ACCESSRIGHT) Then + _Logger.Warn("GetAccessRightForObjectId: Access right table does not exist!") + Return AccessRight.VIEW_ONLY + End If - Private Function GetAccessRight(UserId As Long, ObjectId As Long) As AccessRight - Dim oTableName As String = "TBIDB_ACCESSRIGHT" + Dim oTable As DataTable = GlobalState.TableStore.Tables.Item(TBIDB_ACCESSRIGHT) + Dim oRows As List(Of DataRow) = oTable.Select($"IDB_OBJ_ID = {ObjectId} AND USR_ID = {UserId}").ToList() + Dim oRight As AccessRight - If Not GlobalState.TableStore.Tables.Contains(oTableName) Then - _Logger.Warn("GetAccessRight: Access right table does not exist!") - Return AccessRight.VIEW_ONLY - End If + If oRows.Count = 0 Then + _Logger.Warn("GetAccessRightForObjectId: Access right assignment does not exist for user [{0}] on object [{1}]", UserId, ObjectId) + Return AccessRight.VIEW_ONLY + Else + If oRows.Count > 1 Then + _Logger.Warn("GetAccessRightForObjectId: More than one access right assignment found for user [{0}] on object [{1}]", UserId, ObjectId) + End If - Dim oTable As DataTable = GlobalState.TableStore.Tables.Item(oTableName) - Dim oRows As List(Of DataRow) = oTable.Select($"IDB_OBJ_ID = {ObjectId} AND USR_ID = {UserId}").ToList() - Dim oRight As AccessRight = AccessRight.VIEW_ONLY + Dim oRow As DataRow = oRows.First() + Dim oRightAsInt = oRow.Item("ACCESSRIGHT") - If oRows.Count = 0 Then - _Logger.Warn("GetAccessRight: Access right assignment does not exist for user [{0}] on object [{1}]", UserId, ObjectId) - Return AccessRight.VIEW_ONLY - Else - If oRows.Count > 1 Then - _Logger.Warn("GetAccessRight: More than one access right assignment found for user [{0}] on object [{1}]", UserId, ObjectId) + oRight = Utils.ToEnum(Of AccessRight)(oRightAsInt) End If - Dim oRow As DataRow = oRows.First() - Dim oRightAsInt = oRow.Item("ACCESSRIGHT") - - oRight = Utils.ToEnum(Of AccessRight)(oRightAsInt) - End If - - Return oRight + Return oRight + Catch ex As Exception + _Logger.Warn("GetAccessRightForObjectId: Unexpected Error while getting access right for object [{0}].", ObjectId) + _Logger.Error(ex) + Return AccessRight.VIEW_ONLY + End Try End Function #End Region End Class \ No newline at end of file diff --git a/Service.EDMIService/EDMIService.vbproj b/Service.EDMIService/EDMIService.vbproj index b77d578f..244edba0 100644 --- a/Service.EDMIService/EDMIService.vbproj +++ b/Service.EDMIService/EDMIService.vbproj @@ -126,14 +126,13 @@ - - - - - - + + + + + - + diff --git a/Service.EDMIService/Exceptions.vb b/Service.EDMIService/Exceptions.vb deleted file mode 100644 index 750f7df2..00000000 --- a/Service.EDMIService/Exceptions.vb +++ /dev/null @@ -1,13 +0,0 @@ -Imports System.ServiceModel - -Public Class Exceptions - - Public Class BaseException - Inherits FaultException - End Class - - Public Class NoRequestException - Inherits BaseException - End Class - -End Class diff --git a/Service.EDMIService/Results/AccessRightResult.vb b/Service.EDMIService/Helpers/AccessRightResult.vb similarity index 100% rename from Service.EDMIService/Results/AccessRightResult.vb rename to Service.EDMIService/Helpers/AccessRightResult.vb diff --git a/Service.EDMIService/Results/BaseResult.vb b/Service.EDMIService/Helpers/BaseResult.vb similarity index 100% rename from Service.EDMIService/Results/BaseResult.vb rename to Service.EDMIService/Helpers/BaseResult.vb diff --git a/Service.EDMIService/Results/DatabaseResult.vb b/Service.EDMIService/Helpers/DatabaseResult.vb similarity index 100% rename from Service.EDMIService/Results/DatabaseResult.vb rename to Service.EDMIService/Helpers/DatabaseResult.vb diff --git a/Service.EDMIService/Helpers/Exceptions.vb b/Service.EDMIService/Helpers/Exceptions.vb new file mode 100644 index 00000000..a5dc9735 --- /dev/null +++ b/Service.EDMIService/Helpers/Exceptions.vb @@ -0,0 +1,71 @@ +Imports System.Runtime.Serialization +Imports System.ServiceModel + +Namespace Exceptions + + + Public Class UnexpectedErrorException(Of UnexpectedErrorFault) + Inherits FaultException + + Public Sub New() + MyBase.New() + End Sub + End Class + + + + + + + Public Class BaseFault + ''' + ''' The human readable error message + ''' + + Public Property ErrorMessage As String + + + Public Property InnerException As Exception + + + Public Property IsRecoverable As Boolean = True + End Class + + + Public Class UnexpectedErrorFault + Inherits BaseFault + + Public Sub New(Exception As Exception) + MyBase.New() + ErrorMessage = "Unexpected Error" + IsRecoverable = True + InnerException = Exception + + End Sub + End Class + + + Public Class DataTableDoesNotExistFault + Inherits BaseFault + + Public Sub New(Name As String) + MyBase.New() + ErrorMessage = $"Datatable {Name} does not exist" + IsRecoverable = True + InnerException = Nothing + End Sub + End Class + + + Public Class ObjectDoesNotExistFault + Inherits BaseFault + + Public Sub New(ObjectId As Long) + MyBase.New() + ErrorMessage = $"Object with Id {ObjectId} does not exist" + IsRecoverable = True + InnerException = Nothing + End Sub + End Class + +End Namespace diff --git a/Service.EDMIService/Results/Messages.vb b/Service.EDMIService/Helpers/Messages.vb similarity index 100% rename from Service.EDMIService/Results/Messages.vb rename to Service.EDMIService/Helpers/Messages.vb diff --git a/Service.EDMIService/IEDMIService.vb b/Service.EDMIService/IEDMIService.vb index 7a76c450..8aa325d3 100644 --- a/Service.EDMIService/IEDMIService.vb +++ b/Service.EDMIService/IEDMIService.vb @@ -1,8 +1,8 @@ Imports System.IO Imports System.ServiceModel Imports DigitalData.Modules.Filesystem +Imports DigitalData.Services.EDMIService.Exceptions Imports DigitalData.Services.EDMIService.Messages -Imports DigitalData.Services.EDMIService.Results Interface IEDMIService @@ -14,53 +14,69 @@ Interface IEDMIService #Region "Database" + + Function ReturnDatatableFromCache(Name As String, FilterExpression As String, SortByColumn As String) As TableResult #End Region #Region "Database (Firebird)" + Function ReturnDatatable_Firebird(SQL As String) As TableResult + Function ReturnScalar_Firebird(SQL As String) As ScalarResult + Function ExecuteNonQuery_Firebird(SQL As String) As NonQueryResult #End Region #Region "Database (MSSQL IDB)" + Function ReturnDatatable_MSSQL_IDB(SQL As String) As TableResult + Function ReturnScalar_MSSQL_IDB(SQL As String) As ScalarResult + Function ExecuteNonQuery_MSSQL_IDB(SQL As String) As NonQueryResult #End Region #Region "Database (MSSQL ECM)" + Function ReturnDatatable_MSSQL_ECM(SQL As String) As TableResult + Function ReturnScalar_MSSQL_ECM(SQL As String) As ScalarResult + Function ExecuteNonQuery_MSSQL_ECM(SQL As String) As NonQueryResult #End Region #Region "Document (New)" + Function ImportFile(Data As DocumentImportRequest) As DocumentImportResponse + + Function GetFileByObjectId(Data As DocumentStreamRequest) As DocumentStreamResponse + Function GetFileInfoByObjectId(Data As DocumentInfoRequest) As DocumentInfoResponse + Function ListFilesForUser() As DocumentListResponse #End Region diff --git a/Service.EDMIService/Results.vb b/Service.EDMIService/Results.vb deleted file mode 100644 index 12c058df..00000000 --- a/Service.EDMIService/Results.vb +++ /dev/null @@ -1,2 +0,0 @@ -Friend Class Results -End Class diff --git a/Service.EDMIService/Scheduler/DatatableJob.vb b/Service.EDMIService/Scheduler/DatatableJob.vb index e327fad0..f5636425 100644 --- a/Service.EDMIService/Scheduler/DatatableJob.vb +++ b/Service.EDMIService/Scheduler/DatatableJob.vb @@ -64,7 +64,7 @@ Public Class DatatableJob oResultTable.TableRelationColumn = oParentColumn End If - oLogger.Info("Fetched Datatable [{0}]", oDatatableName) + oLogger.Debug("Fetched Datatable [{0}]", oDatatableName) oResult.Tables.Add(oResultTable) Catch ex As Exception oLogger.Warn("Execute: Error while saving Table: [{0}]", oDatatableName) @@ -72,6 +72,8 @@ Public Class DatatableJob End Try Next + oLogger.Info("Fetched [{0}] Datatables", oResult.Tables.Count) + ' Das Ergebnis speichern context.Result = oResult @@ -81,60 +83,5 @@ Public Class DatatableJob End Try Return Task.FromResult(True) - -#Region "OLD" - 'Dim oJobData = context.MergedJobDataMap - 'Dim oLogConfig As LogConfig = oJobData.Item("LogConfig") - 'Dim oLogger As Logger = oLogConfig.GetLogger() - 'Dim oDetailRow As DataRow = oJobData.Item("CronJobDetails") - 'Dim oDatatableName As String = NotNull(oDetailRow.Item("DT_NAME"), String.Empty) - - 'Try - ' Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") - ' Dim oMSSQL As MSSQLServer = oJobData.Item("MSSQL") - - ' Dim oConnectionId As Integer = NotNull(oDetailRow.Item("CON_ID"), String.Empty) - ' Dim oTitle As String = NotNull(oDetailRow.Item("TITLE"), String.Empty) - ' Dim oSQL As String = NotNull(oDetailRow.Item("COMMAND"), String.Empty) - - ' oLogger.Debug("Running Command-Job [{0}]", oTitle) - ' oLogger.Debug("Datatable Name: {0}", oDatatableName) - ' oLogger.Debug("Connection Id: {0}", oConnectionId) - - ' Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) - - ' Dim oTable = oMSSQL.GetDatatableWithConnection(oSQL, oConnectionString) - ' oTable.TableName = oDatatableName - ' oLogger.Debug("Result Datatable [{0}] contains [{1}] rows", oTable.TableName, oTable.Rows.Count) - - ' Dim oResult = New JobResult() With { - ' .Table = oTable - ' } - - ' Dim oChildTableNAme As String = NotNull(oDetailRow.Item("CHILD_DT_NAME"), String.Empty) - - ' If oChildTableNAme <> String.Empty Then - ' Dim oParentColumn As String = NotNull(oDetailRow.Item("DT_COLUMN"), String.Empty) - ' Dim oChildColumn As String = NotNull(oDetailRow.Item("CHILD_DT_COLUMN"), String.Empty) - ' oLogger.Debug("Child Datatable [{0}] defined, Relation: Parent [{1}] -> Child [{2}]", oChildTableName, oParentColumn, oChildColumn) - - ' Dim oChildTable As DataTable = oMSSQL.GetDatatableWithConnection($"SELECT * FROM {oChildTableName}", oConnectionString) - ' oChildTable.TableName = oChildTableName - ' oLogger.Debug("Child Datatable [{0}] contains [{1}] rows", oChildTable.TableName, oChildTable.Rows.Count) - - ' oResult.ChildTable = oChildTable - ' oResult.ChildRelationColumn = oChildColumn - ' oResult.TableRelationColumn = oParentColumn - ' End If - - ' ' Das Ergebnis speichern - ' context.Result = oResult - 'Catch ex As Exception - ' oLogger.Error(ex) - ' oLogger.Warn("Unhandled exception while executing SQL for Datatable {0}", oDatatableName) - 'End Try - - 'Return Task.FromResult(True) -#End Region End Function End Class diff --git a/Service.EDMIService/Scheduler/JobListener.vb b/Service.EDMIService/Scheduler/JobListener.vb index 50714c6b..42f2d4f6 100644 --- a/Service.EDMIService/Scheduler/JobListener.vb +++ b/Service.EDMIService/Scheduler/JobListener.vb @@ -167,8 +167,8 @@ Public Class JobListener Dim oDatatableNameTemp As String = oName & "-TEMP" ' Used for debugging relations and constraints - _Logger.Debug("Dataset BEFORE saving datatables") - ListTables(Dataset) + '_Logger.Debug("Dataset BEFORE saving datatables") + 'ListTables(Dataset) If Dataset.Tables.Contains(oName) Then ' Replace existing table @@ -193,14 +193,9 @@ Public Class JobListener _Logger.Debug(oDataTable.TableName) Next - _Logger.Debug("Listing Relations in Dataset") - For Each oRelation As DataRelation In Dataset.Relations - _Logger.Debug(oRelation.RelationName) - Next - ' Used for debugging relations and constraints - _Logger.Debug("Dataset AFTER saving datatables") - ListTables(Dataset) + '_Logger.Debug("Dataset AFTER saving datatables") + 'ListTables(Dataset) _MSSQL.ExecuteNonQuery($"INSERT INTO TBAPPSERV_CRON_DETAIL_HISTORY (DETAIL_ID) VALUES ({oDetailId})") Catch ex As Exception diff --git a/Service.EDMIService/Scheduler.vb b/Service.EDMIService/Scheduler/Scheduler.vb similarity index 100% rename from Service.EDMIService/Scheduler.vb rename to Service.EDMIService/Scheduler/Scheduler.vb