Monorepo/GUIs.ZooFlow/ClassInit.vb
2022-05-24 12:16:23 +02:00

477 lines
21 KiB
VB.net

Imports System.ComponentModel
Imports System.Threading
Imports System.Globalization
Imports DevExpress.XtraSplashScreen
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Language.Utils
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.EDMI.API
Imports DigitalData.GUIs.ZooFlow.ClassConstants
Imports DigitalData.GUIs.ZooFlow.ClassInitLoader
Imports DigitalData.Controls.SQLConfig
Imports System.Data.SqlClient
Imports DigitalData.Modules
Imports DevExpress.LookAndFeel
Imports DigitalData.Modules.Language
Imports DigitalData.GUIs.Common
Public Class ClassInit
Inherits Base.BaseClass
Private ReadOnly _MainForm As frmFlowForm
Private ReadOnly _Database As DatabaseWithFallback
Private ReadOnly _FormHelper As FormHelper
Private _Loader As ClassInitLoader
Public Event Completed As EventHandler
Public Sub New(LogConfig As LogConfig, ParentForm As frmFlowForm)
MyBase.New(LogConfig)
_MainForm = ParentForm
_FormHelper = New FormHelper(LogConfig, ParentForm)
End Sub
Public Sub InitializeApplication()
_Loader = New ClassInitLoader(LogConfig)
' === Init Schritte definieren
_Loader.AddStep("Initializing Base", AddressOf InitializeBase, True)
_Loader.AddStep("Initializing EDMI Service", AddressOf InitializeService, True)
_Loader.AddStep("Initializing Database", AddressOf InitializeDatabaseWithFallback, True)
_Loader.AddStep("Initializing User", AddressOf InitializeUser, True)
_Loader.AddStep("Initializing BasicCatalogues", AddressOf InitializeBasicsfromDB, True)
_Loader.AddStep("Initializing Language", AddressOf InitializeLanguage, False)
_Loader.AddStep("Initializing 3rd-party licenses", AddressOf Initialize3rdParty, False)
_Loader.AddStep("Initializing Basic Config", AddressOf InitBasicConfig, False)
' === Init Schritte definieren
AddHandler _Loader.ProgressChanged, AddressOf ProgressChanged
AddHandler _Loader.InitCompleted, AddressOf InitCompleted
_Loader.Run()
End Sub
Private Sub InitCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
If Not IsNothing(e.Error) Then
Dim oMessageStart = $"Beim Initialisieren des Programms ist folgender Fehler aufgetreten:"
Dim oMessageEnd = "Das Program wird nun beendet"
Dim oMessage1 = $"{vbNewLine}{vbNewLine}{e.Error.Message}"
Dim oMessage2 = ""
If TypeOf e.Error Is InitException Then
Dim oException As InitException = DirectCast(e.Error, InitException)
oMessage2 = $"{vbNewLine}{vbNewLine}Details: {oException?.InnerException?.Message}"
End If
Dim oMessage = $"{oMessageStart}{oMessage1}{oMessage2}{oMessageEnd}"
Dim oMsgBox As New frmDialog(oMessage, _MainForm.Text, frmDialog.DialogType.Error)
oMsgBox.ShowDialog()
Application.ExitThread()
Else
' Copy back state from MyApplication Helper to My.Application
Dim oMyApplication As My.MyApplication = DirectCast(e.Result, My.MyApplication)
My.Application.Settings = oMyApplication.Settings
My.Application.User = oMyApplication.User
My.Application.Modules = oMyApplication.Modules
My.Application.ModulesActive = oMyApplication.ModulesActive
My.Application.ClipboardWatcher = oMyApplication.ClipboardWatcher
RaiseEvent Completed(sender, Nothing)
End If
End Sub
#Region "=== Init Steps ==="
Private Sub InitializeBase(MyApplication As My.MyApplication)
End Sub
Private Sub InitializeDatabase(MyApplication As My.MyApplication)
'Dim oConnectionString = MSSQLServer.DecryptConnectionString(My.SystemConfig.ConnectionString)
'My.DatabaseECM = New MSSQLServer(My.LogConfig, oConnectionString)
'If My.DatabaseECM.DBInitialized = False Then
' Logger.Warn("Could not initialize DD_ECM-Database!")
' Throw New InitException("Could not initialize ECM-Database!")
'Else
' Dim oSQl = "SELECT * FROM TBDD_CONNECTION WHERE BEZEICHNUNG = 'IDB' AND AKTIV = 1"
' Dim oDatatable As DataTable = My.DatabaseECM.GetDatatable(oSQl)
' If IsNothing(oDatatable) OrElse oDatatable.Rows.Count = 0 Then
' Dim oForm As New frmSQLConfig(My.LogConfig) With {.FormTitle = "IDB Datenbank"}
' Dim oResult = oForm.ShowDialog()
' If oResult = DialogResult.OK Then
' Dim oConnectionStringSaved = SaveConnectionString(oForm.ConnectionString)
' If oConnectionStringSaved = False Then
' Throw New InitException("Fehler beim Laden der IDB Verbindungsdaten!")
' End If
' oDatatable = My.Database.GetDatatableECM(oSQl)
' End If
' End If
' If oDatatable.Rows.Count > 1 Then
' Logger.Warn("Multiple IDB connection entries in TBDD_CONNECTION found!")
' Throw New InitException("Fehler beim Laden der IDB Verbindungsdaten!")
' End If
' Dim oDataRow As DataRow = oDatatable.Rows.Item(0)
' Dim oConString = My.DatabaseECM.GetConnectionString(
' oDataRow.Item("SERVER").ToString,
' oDataRow.Item("DATENBANK").ToString,
' oDataRow.Item("USERNAME").ToString,
' oDataRow.Item("PASSWORD").ToString
' )
' Dim oDecryptedConnectionString = MSSQLServer.DecryptConnectionString(oConString)
' My.DatabaseIDB = New MSSQLServer(My.LogConfig, oDecryptedConnectionString)
'End If
'If My.DatabaseIDB.DBInitialized = False Then
' Logger.Warn("Could not initialize IDB-Database!")
' Throw New InitException("Could not initialize IDB-Database!")
'End If
End Sub
Private Sub InitializeService(MyApplication As My.MyApplication)
Try
If My.SystemConfig.AppServerConfig = String.Empty Then
Dim oForm As New frmServiceConfig()
Dim oResult = oForm.ShowDialog()
If oResult <> DialogResult.OK Then
Throw New InitException("Could not initialize IDB-Service!")
End If
My.SystemConfig.AppServerConfig = oForm.ServiceAddress
My.SystemConfigManager.Save()
End If
' These Properties need to be set directly on
My.Application.Service.Address = My.SystemConfig.AppServerConfig
MyApplication.Service.Address = My.SystemConfig.AppServerConfig
Dim oClient = New Client(LogConfig, My.SystemConfig.AppServerConfig)
MyApplication.Service.Client = oClient
My.Application.Service.Client = oClient
If oClient Is Nothing Then
Throw New InitException("Could not initialize IDB-Service!")
End If
Dim oConnectionResult = My.Application.Service.Client.Connect()
If oConnectionResult = False Then
Throw New InitException("Could not connect to Service!")
End If
Catch ex As Exception
Logger.Error(ex)
Throw New InitException("Error in InitializeService", ex)
End Try
End Sub
Private Sub InitializeDatabaseWithFallback(MyApplication As My.MyApplication)
Try
Logger.Debug("Loading client config..")
Dim oClientConfig = My.Application.Service.Client.ClientConfig
Logger.Debug("Establishing ECM connection..")
Dim oECMConnectionString = oClientConfig.ConnectionStringECM
My.DatabaseECM = New MSSQLServer(My.LogConfig, oECMConnectionString)
Logger.Debug("Establishing IDB connection..")
Dim oIDBConnectionString = oClientConfig.ConnectionStringIDB
My.DatabaseIDB = New MSSQLServer(My.LogConfig, oIDBConnectionString)
Logger.Debug("Establishing Database connection with fallback..")
My.Database = New DatabaseWithFallback(LogConfig, My.Application.Service.Client, My.DatabaseECM, My.DatabaseIDB)
Catch ex As Exception
Logger.Error(ex)
Throw New InitException("Error in InitializeDatabaseWithFallback!", ex)
End Try
End Sub
Private Sub InitializeUser(MyApplication As My.MyApplication)
Try
Dim oSql As String = My.Queries.Common.FNDD_MODULE_INIT(Environment.UserName)
Dim oDatatable As DataTable = My.Database.GetDatatableECM(oSql)
If oDatatable Is Nothing Then
Throw New InitException("Benutzer konnte nicht geladen werden!")
End If
If oDatatable.Rows.Count <= 1 Then
Throw New InitException("Benutzer konnte nicht gefunden werden!")
End If
For Each oRow As DataRow In oDatatable.Rows
Dim oType As String = oRow.ItemEx("TYPE", "")
Select Case oType
Case MODULE_USER
HandleUserInfo(MyApplication, oRow)
Case MODULE_CLIPBOARDWATCHER
HandleModuleInfo(MyApplication, oType, oRow)
Case MODULE_GLOBAL_INDEXER
HandleModuleInfo(MyApplication, oType, oRow)
Case MODULE_ZOOFLOW
HandleModuleInfo(MyApplication, oType, oRow)
Case MODULE_PROCESS_MANAGER
HandleModuleInfo(MyApplication, oType, oRow)
End Select
Next
Catch ex As InitException
Logger.Error(ex)
Throw ex
Catch ex As Exception
Logger.Error(ex)
Throw New InitException($"Unexpected error while initializing user!", ex)
End Try
End Sub
Private Sub InitializeBasicsfromDB(MyApplication As My.MyApplication)
Try
Dim oSql As String = My.Queries.Common.IDB_CATALOG()
Dim oDatatable As DataTable = My.Database.GetDatatableIDB(oSql)
For Each oRow As DataRow In oDatatable.Rows
Dim oCAT_TITLE As String = oRow.Item("CAT_TITLE")
Logger.Debug($"IDB_CATALOG_STRING: {oRow.Item("CAT_STRING")}")
Next
Catch ex As InitException
Logger.Error(ex)
Throw ex
Catch ex As Exception
Logger.Error(ex)
Throw New InitException($"Unexpected error while initializing basics from DB!", ex)
End Try
End Sub
Private Sub InitializeLanguage(MyApplication As My.MyApplication)
Dim oLanguage = MyApplication.User.Language
Dim oDateFormat = MyApplication.User.DateFormat
Dim oCultureInfo As New CultureInfo(oLanguage)
oCultureInfo.DateTimeFormat.ShortDatePattern = oDateFormat
Thread.CurrentThread.CurrentCulture = oCultureInfo
Thread.CurrentThread.CurrentUICulture = oCultureInfo
CultureInfo.DefaultThreadCurrentCulture = oCultureInfo
CultureInfo.DefaultThreadCurrentUICulture = oCultureInfo
End Sub
Private Sub Initialize3rdParty(MyApplication As My.MyApplication)
Try
Dim oSql = "Select LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE'"
Dim oDatatable As DataTable = My.Database.GetDatatable("TBDD_3RD_PARTY_MODULES", oSql, EDMI.API.Constants.DatabaseType.ECM, "NAME = 'GDPICTURE'")
If oDatatable.Rows.Count = 0 Then
Throw New InitException("Konfiguration 3RD_PARTY_MODULES konnte nicht geladen werden!")
End If
Dim oRow As DataRow = oDatatable.Rows.Item(0)
MyApplication.Settings.GdPictureKey = NotNull(oRow.Item("LICENSE"), String.Empty)
Catch ex As Exception
Logger.Error(ex)
Throw New InitException("Error Initialize3rdParty!", ex)
End Try
End Sub
Private Sub InitBasicConfig(MyApplication As My.MyApplication)
Try
Dim oSql As String
oSql = "Select * FROM TBIDB_COMMON_SQL WHERE ACTIVE = 1"
My.Tables.DTIDB_COMMON_SQL = My.Database.GetDatatable("TBIDB_COMMON_SQL", oSql, EDMI.API.Constants.DatabaseType.IDB)
For Each oRow As DataRow In My.Tables.DTIDB_COMMON_SQL.Rows
Dim oTITLE = oRow.Item("TITLE").ToString
Dim oBaseSQL = oRow.Item("SQL_COMMAND").ToString
oBaseSQL = oBaseSQL.Replace("@USER_ID", My.Application.User.UserId)
oBaseSQL = oBaseSQL.Replace("@USERID", My.Application.User.UserId)
oBaseSQL = oBaseSQL.Replace("@USRID", My.Application.User.UserId)
oBaseSQL = oBaseSQL.Replace("@USRNAME", My.Application.User.UserName)
oBaseSQL = oBaseSQL.Replace("@UserName", My.Application.User.UserName)
oBaseSQL = oBaseSQL.Replace("@LANG_CODE_SHORT", Right(My.Application.User.Language, 2))
oBaseSQL = oBaseSQL.Replace("@LANG_CODE", My.Application.User.Language)
oBaseSQL = oBaseSQL.Replace("{#INT#USERNAME}", My.Application.User.UserName)
If oTITLE = SQLCMD_FLOW_SEARCH_BASE Then
SQL_FLOW_SEARCH_BASE = oBaseSQL
ElseIf oTITLE = SQLCMD_AHW_LAYOUT_SELECT Then
SQL_AHW_LAYOUT_SELECT = oBaseSQL
ElseIf oTITLE = SQLCMD_AHW_USR_SELECT Then
SQL_AHW_USR_SELECT = oBaseSQL
ElseIf oTITLE = SQLCMD_RECENT_FILES_USER Then
SQL_RECENT_FILES_USER = oBaseSQL
End If
Next
oSql = $"SELECT * FROM TBIDB_CATALOG_USER WHERE USR_ID = {My.Application.User.UserId}"
My.Tables.DTIDB_CATALOG_USER = My.Database.GetDatatable("TBIDB_CATALOG_USER", oSql, EDMI.API.Constants.DatabaseType.IDB, $"USR_ID = {My.Application.User.UserId}")
For Each oRow As DataRow In My.Tables.DTIDB_CATALOG_USER.Rows
If oRow.Item("CAT_TITLE") = ClassConstants.USER_CATALOG_APPLICATION_THEME Then
Dim oThemeName As String = oRow.ItemEx("CAT_STRING", "Digital Data")
If oThemeName.Contains("|") Then
Dim oSkin = oThemeName.Split("|").ElementAt(0)
Dim oPalette = oThemeName.Split("|").ElementAt(1)
MyApplication.Skin = oSkin
MyApplication.Palette = oPalette
Else
MyApplication.Skin = oThemeName
MyApplication.Palette = ""
End If
ElseIf oRow.Item("CAT_TITLE") = ClassConstants.USER_CATALOG_GLOBIX_DROPAREA Then
My.Application.GlobixDropAreaStyle = oRow.Item("CAT_STRING")
End If
Next
oSql = $"Select * From VWIDB_BE_ATTRIBUTE Where LANG_CODE = '{MyApplication.User.Language}'"
My.Tables.DTIDB_ATTRIBUTE = My.Database.GetDatatable("VWIDB_BE_ATTRIBUTE", oSql, EDMI.API.Constants.DatabaseType.IDB, $"LANG_CODE = '{MyApplication.User.Language}'")
If SQL_FLOW_SEARCH_BASE = "" Then
Logger.Warn($"ATTENTION: NO DocResultBaseSearch - Check if entry {SQLCMD_FLOW_SEARCH_BASE} exists in TBIDB_COMMON_SQL")
End If
Catch ex As Exception
Logger.Error(ex)
Throw New InitException("Error in InitBasicData", ex)
End Try
End Sub
#End Region
Private Function SetupDatabase() As Boolean
'If My.SystemConfig.ConnectionString = String.Empty Then
' Dim oConnectionString = My.SystemConfig.ConnectionString
' Dim oForm As New frmSQLConfig(My.LogConfig) With {
' .ConnectionString = oConnectionString,
' .FormTitle = "ECM Datenbank"
' }
' Dim oResult = oForm.ShowDialog()
' If oResult = DialogResult.OK Then
' My.SystemConfig.ConnectionString = oForm.ConnectionString
' My.SystemConfigManager.Save()
' Return True
' Else
' Return False
' End If
'End If
Return True
End Function
Private Function SaveConnectionString(pConnectionString As String) As Boolean
Try
Dim oBuilder As New SqlConnectionStringBuilder(pConnectionString)
Dim oSql = $"
INSERT INTO TBDD_CONNECTION
(BEZEICHNUNG, SQL_PROVIDER, SERVER, DATENBANK, USERNAME, PASSWORD, BEMERKUNG, AKTIV, ERSTELLTWER)
VALUES ('IDB', 'MS-SQLServer', '{oBuilder.DataSource}', '{oBuilder.InitialCatalog}', '{oBuilder.UserID}', '{oBuilder.Password}', 'Created by Zooflow', 1, '{Environment.UserName}')"
Return My.Database.ExecuteNonQueryECM(oSql)
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
Private Sub ProgressChanged(sender As Object, Progress As InitProgress)
SplashScreenManager.Default.SendCommand(frmSplash.SplashScreenCommand.SetProgress, Progress.CurrentPercent)
SplashScreenManager.Default.SendCommand(frmSplash.SplashScreenCommand.SetActionName, Progress.CurrentStep.Name)
End Sub
Private Sub HandleUserInfo(MyApplication As My.MyApplication, Row As DataRow)
Dim oValue As Object = Row.Item("VALUE")
Dim oName As String = Row.Item("NAME").ToString
Select Case oName
Case "USER_ID"
MyApplication.User.UserId = CInt(oValue)
Case "USER_PRENAME"
MyApplication.User.GivenName = NotNull(oValue.ToString, String.Empty)
Case "USER_SURNAME"
MyApplication.User.Surname = NotNull(oValue.ToString, String.Empty)
Case "USER_SHORTNAME"
MyApplication.User.ShortName = NotNull(oValue.ToString, String.Empty)
Case "USER_EMAIL"
MyApplication.User.Email = NotNull(oValue.ToString, String.Empty)
Case "USER_DATE_FORMAT"
MyApplication.User.DateFormat = NotNull(oValue.ToString, "dd.MM.yyyy")
Case "USER_LANGUAGE"
MyApplication.User.Language = NotNull(oValue.ToString, "de-DE")
Case "USER_LANGUAGEID"
MyApplication.User.LanguageId = CShort(oValue)
End Select
End Sub
Private Sub HandleModuleInfo(MyApplication As My.MyApplication, ModuleName As String, Row As DataRow)
Dim oValue As Object = Row.Item("VALUE")
Dim oName As String = Row.Item("NAME").ToString
If Not MyApplication.Modules.ContainsKey(ModuleName) Then
MyApplication.Modules.Item(ModuleName) = New DigitalData.Modules.ZooFlow.State.ModuleState()
End If
Select Case oName
Case "MODULE_ACCESS"
If CBool(oValue) Then
SyncLock MyApplication.ModulesActive
MyApplication.ModulesActive.Add(ModuleName)
End SyncLock
End If
MyApplication.Modules.Item(ModuleName).HasAccess = CBool(oValue)
Case "IS_ADMIN"
MyApplication.Modules.Item(ModuleName).IsAdmin = CBool(oValue)
Case "USER_COUNT_LOGGED_IN"
MyApplication.Modules.Item(ModuleName).LoggedIn = CInt(oValue) + 1
Case "RESULT"
Dim oLines = oValue.ToString.Split("|"c)
Logger.Debug("Access Result for Module {0}", ModuleName)
For Each oLine In oLines
Logger.Debug(oLine.Trim)
Next
Case "WORKING_MODE"
Dim oLines = oValue.ToString.Split("|"c)
Logger.Debug("WORKING_MODEs for Module {0}", ModuleName)
For Each oLine In oLines
Logger.Debug(oLine.Trim)
If oLine = "NO_BASICCONF" Then
MyApplication.User.HideBasicConfig = True
ElseIf oLine.StartsWith("SEARCH_STRING_ATTRID") Then
Try
Dim oResult = oLine.Replace("SEARCH_STRING_ATTRID=", "")
MyApplication.Search.SelectInStringAttributeIds = oResult
Catch ex As Exception
MyApplication.Search.SelectInStringAttributeIds = ""
End Try
ElseIf oLine.StartsWith("SEARCH_INT_ATTRID") Then
Try
Dim oResult = oLine.Replace("SEARCH_INT_ATTRID=", "")
MyApplication.Search.SelectInIntegerAttributeIds = oResult
Catch ex As Exception
MyApplication.Search.SelectInIntegerAttributeIds = ""
End Try
Else
Logger.Info($"Wrong WorkingMode: {oLine}")
End If
Next
End Select
End Sub
End Class