
Imports WINDREAMLib
Imports WINDREAMLib.WMCOMEvent
Imports WINDREAMLib.WMEntity
Imports WINDREAMLib.WMObjectEditMode
Imports WINDREAMLib.WMSearchOperator
Imports WINDREAMLib.WMSearchRelation
Imports WMOBRWSLib
Imports WMOSRCHLib
Imports System.IO
Imports System.Text.RegularExpressions

Public Class ClassWindream

#Region "+++++ Konstanten +++++"
    Const DEBUG = AUS
    Const AUS = 0
    Const WINDREAM = 1
    Const VARIABLEN = 2
    Const WMObjectStreamOpenModeReadWrite = 2

    Const STREAM_BinaryObject = "BinaryObject"

    Public Const WMObjectVariableValueTypeUndefined = 0
    Public Const WMObjectVariableValueTypeString = 1
    Public Const WMObjectVariableValueTypeInteger = 2
    Public Const WMObjectVariableValueTypeFloat = 3
    Public Const WMObjectVariableValueTypeBoolean = 4
    Public Const WMObjectVariableValueTypeDate = 5
    Public Const WMObjectVariableValueTypeFixedPoint = 6
    Public Const WMObjectVariableValueTypeTimeStamp = 7
    Public Const WMObjectVariableValueTypeCurrency = 8
    Public Const WMObjectVariableValueTypeTime = 9
    Public Const WMObjectVariableValueTypeVariant = 10
    Public Const WMObjectVariableValueTypeMask = &HFFF
    Public Const WMObjectVariableValueFlagMask = &HFFFFF000
    Public Const WMObjectVariableValueTypeVector = &H1000
    Public Const WMObjectVariableValueTypeFulltext = &H2000
    Public Const WMObjectVariableValueTypeDefaultValue = &H4000
#End Region

#Region "+++++ Variablen +++++"
    Public Shared oConnect ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht)
    Public Shared _session 'As WINDREAMLib.WMSession ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht)
    Public Shared oBrowser As New WMOBRWSLib.ServerBrowser
    Public Shared _DocumentTypes As WINDREAMLib.WMObjects
    Private _SearchController As New WMOSearchController
    Public Shared _WDObjekttyp As String
    Private Shared _currentWMObject As WINDREAMLib.WMObject
#End Region


#Region "+++++ Allgemeine Methoden und Funktionen +++++"

    ''' <summary>
    ''' Konstruktor für die windream-Klasse
    ''' </summary>
    ''' <remarks></remarks>
    Sub New()
        ' wenn ein Unexpected error in der Initialisierung auftrat
        If Not ClassWindream.Init() Then
            ' Nachricht ausgeben
            MsgBox("Es trat ein Unexpected error in der Initialisierung der Klasse windream auf. Bitte prüfen Sie ob der windream-Server aktiv ist und alle Dienste gestartet sind.", MsgBoxStyle.Exclamation, "Unexpected error in Initialisierung")

            ' das Programm "abschießen"
            Process.GetCurrentProcess.Kill()
        End If
    End Sub
    Public Function GetSearchDocuments(ByVal wdfLocation As String)

        If System.IO.File.Exists(wdfLocation) Then

            Try
                Dim ProfileName = wdfLocation.Substring(wdfLocation.LastIndexOf("\") + 1)
                Dim ProfilePath = wdfLocation.Substring(0, wdfLocation.Length - ProfileName.Length)

                _SearchController = New WMOSearchController

                Me._SearchController.CheckSearchProfile(wdfLocation.ToLower)
                Dim suchTyp = Me._SearchController.SearchProfileTargetProgID
                Dim ExSettings As Object
                Dim oSearch As Object
                ExSettings = Me._SearchController.SearchProfileExSettings
                If ExSettings = 0 Then ExSettings = 7

                Dim srchQuick As WMOSRCHLib.WMQuickSearch = CreateObject("WMOSrch.WMQuickSearch")
                Dim srchIndex As WMOSRCHLib.WMIndexSearch = CreateObject("WMOSrch.WMIndexSearch")
                Dim srchObjectType As WMOSRCHLib.WMObjectTypeSearch = CreateObject("WMOSrch.WMObjectTypeSearch")

                ''  Der öffentliche Member CheckSearchProfile für den Typ IWMQuickSearch7 wurde nicht gefunden. [Microsoft.VisualBasic] => GetSearchDocuments()
                Select Case suchTyp.ToString.ToUpper
                    Case "WMOSRCH.WMQUICKSEARCH"
                        srchQuick.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)

                        Me.oConnect.LoginSession(srchQuick.WMSession)

                        srchQuick.ClearSearch()
                        srchQuick.SearchProfilePath = ProfilePath
                        srchQuick.LoadSearchProfile(ProfileName)

                        oSearch = srchQuick.GetSearch()

                    Case "WMOSRCH.WMINDEXSEARCH"
                        srchIndex.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)

                        Me.oConnect.LoginSession(srchIndex.WMSession)

                        srchIndex.ClearSearch()
                        srchIndex.SearchProfilePath = ProfilePath
                        srchIndex.LoadSearchProfile(ProfileName)

                        oSearch = srchIndex.GetSearch()

                    Case "WMOSRCH.WMOBJECTTYPESEARCH"
                        srchObjectType.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)

                        Me.oConnect.LoginSession(srchObjectType.WMSession)

                        srchObjectType.ClearSearch()
                        srchObjectType.SearchProfilePath = ProfilePath
                        srchObjectType.LoadSearchProfile(ProfileName)

                        oSearch = srchObjectType.GetSearch()

                    Case Else
                        MsgBox("KEIN GÜLTIGER WINDREAM-SUCHTYP")
                        Return Nothing
                End Select
                Dim WMObjects As Object
                WMObjects = oSearch.Execute
                Return oSearch.execute

            Catch ex As Exception
                ' bei einem Fehler einen Eintrag in der Logdatei machen
                MsgBox("Fehler in GetSearchDocuments: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
                Return Nothing
            End Try

        End If

        Return Nothing

    End Function
    Public Function GetSearchDocuments_Objekttype(ByVal wdfLocation As String)

        If System.IO.File.Exists(wdfLocation) Then

            Try
                Dim ProfileName = wdfLocation.Substring(wdfLocation.LastIndexOf("\") + 1)
                Dim ProfilePath = wdfLocation.Substring(0, wdfLocation.Length - ProfileName.Length)



                ' Me.oController.CheckSearchProfile(wdfLocation.ToLower)
                ' Dim suchTyp = Me.oController.SearchProfileTargetProgID
                'Dim ExSettings As Object
                Dim oSearch As Object
                'ExSettings = Me.oController.SearchProfileExSettings
                'If ExSettings = 0 Then ExSettings = 7

                Dim srchObjectType As WMOSRCHLib.WMObjectTypeSearch = CreateObject("WMOSrch.WMObjectTypeSearch")

                ''  Der öffentliche Member CheckSearchProfile für den Typ IWMQuickSearch7 wurde nicht gefunden. [Microsoft.VisualBasic] => GetSearchDocuments()

                srchObjectType.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)

                Me.oConnect.LoginSession(srchObjectType.WMSession)

                srchObjectType.ClearSearch()
                srchObjectType.SearchProfilePath = ProfilePath
                srchObjectType.LoadSearchProfile(ProfileName)

                oSearch = srchObjectType.GetSearch()


                Dim WMObjects As Object
                WMObjects = oSearch.Execute
                Return oSearch.execute

            Catch ex As Exception
                ' bei einem Fehler einen Eintrag in der Logdatei machen
                MsgBox("Fehler in GetSearchDocuments()" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
                Return Nothing
            End Try

        End If

        Return Nothing

    End Function

    ''' <summary>
    ''' Initialisiert die statische Klasse (Login, Session starten, usw.)
    ''' </summary>
    ''' <returns>Liefert True wenn das Anmelden erfolgreich war, sonst False</returns>
    ''' <remarks></remarks>
    Public Shared Function Init() As Boolean
        Try
            Try
                ' Session-Objekt instanziieren und mit dem im Client ausgewählten Server belegen
                _session = CreateObject("Windream.WMSession", GetCurrentServer)
                LOGGER.Info(" ...windream-Server: '" & GetCurrentServer() & "'")
                ' Connection-Objekt instanziieren
                oConnect = CreateObject("Windream.WMConnect")
                'MsgBox("windrem init 'ed")
            Catch ex As Exception
                LOGGER.Info("Windream konnte nicht initiiert werden: " & ex.Message)
                LOGGER.Error(ex.Message)
                Return False
            End Try


            ' wenn windream nicht angemeldet ist
            If Not IsLoggedIn() Then

                ' Art der Anmeldung an windream festlegen
                '   0x0L (also 0)                   = Standard windream Benutzer
                '   WM_ODULE_ID_DOCTYPEEDITOR_LIC  = ermöglicht Zugriff auf die windream Management Funktionen (Z.B. zur Verwaltung der windream Dokumententypen, Auswahllisten, etc.)
                '   WM_MODULE_ID_INDEXSERVICE       = ermöglicht der Session die Indexierungs-Events vom windream DMS-Service zu empfangen
                oConnect.ModuleID = 0

                ' setzt die minimal erwartete windream-Version 
                oConnect.MinReqVersion = "4"

                ' -- Impersonifizierung nur möglich mit registry-eintrag --
                ' oConnect.UserName "\schulung\windream"
                ' oConnect.Password "windream"

                ' Verbindung mit Session-Objekt (und dem ausgewählten Server) aufbauen
                oConnect.LoginSession(_session)
                If _session.aLoggedin = False Then
                    MsgBox("Es konnte keine Verbindung mit dem windream-Server hergestellt werden", MsgBoxStyle.Exclamation, "Verbindung konnte nicht hergestellt werden")
                    Return False
                End If

                'If My.Settings.vDetailLog Then
                '    LOGGER.Info(" >> windream-Version: '" & oSession.GetSystemInfo("WindreamVersion") & "'")
                'End If

                ' AUSGABE VON SYSTEMINFORMATIONEN
                ' Gibt die Versionsart (Lizenztyp) also Small-Business-Edition (SBE), Small-Business-Extension (SBX) 
                ' oder Business-Edition (BE) aus
                'MsgBox("WindreamVersion: " & oSession.GetSystemInfo("WindreamVersion") & vbNewLine & "LicenceKey: " & oSession.GetSystemInfo("LicenceKey") & vbNewLine & _
                '       vbNewLine & "LicenceName: " & oSession.GetSystemInfo("LicenceName"))

                'Dim WMCtrl As AISCONTROLDATACOMLib.AISControlData
                'WMCtrl = New AISCONTROLDATACOMLib.AISControlData

                '' liefert die Versionsnummer des Clients

                'MsgBox(WMCtrl.WMWorkstationBuildNo)
                'MsgBox(WMCtrl.W
                '' liefert den Servernamen des angemeldeten windreams
                'MsgBox(WMCtrl.WMServerName)

                Try
                    _session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
                    ' der Parameter WMEntityDocument definiert, dass nur Dokumenttypen und keine 
                    ' Ordnertypen ausgelesen werden
                    _DocumentTypes = _session.GetWMObjectTypes(WINDREAMLib.WMEntity.WMEntityDocument)
                Catch ex As Exception
                    Return False
                End Try

            End If

            Return True

        Catch ex As Exception
            If Err.Number = -2147220985 Then
                MsgBox("Die installierte windream-Version ist nicht ausreichend für den Betrieb der Tool Collection für windream." & vbNewLine &
                       "Bitte kontaktieren Sie Digital Data." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & Err.Description, MsgBoxStyle.Exclamation, "Unzureichende windream-Version")
            Else
                MsgBox("Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Login an windream")
            End If
            Return False
        End Try

    End Function

#End Region



#Region "+++++ Funktionen die für den Objekttyp relevate Informationen zurückliefern +++++"

    ''' <summary>
    ''' Liefert alle Objekttypen des aktuellen Servers als windream-Objekte.
    ''' </summary>
    ''' <returns>Alle Objekttypen als WMObjects-Objekt</returns>
    ''' <remarks></remarks>
    Public Shared Function GetObjecttypesAsObjects() As WMObjects
        Try
            Return _DocumentTypes
        Catch ex As Exception
            MsgBox("Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Auslesen der Objekttypen")
            Return Nothing
        End Try
    End Function


    ''' <summary>
    ''' Liefert alle Indexe eines Objekttypen.
    ''' </summary>
    ''' <param name="Objecttype_name">Name des Objekttyps</param>
    ''' <returns>Array mit allen Objekttyp zugeordneten Indexen als String</returns>
    ''' <remarks></remarks>
    Public Shared Function GetIndicesByObjecttype(ByVal Objecttype_name As String) As String()
        Try
            Dim oObjectType As WMObject
            Dim oIndexAttributes As WMObjectRelation
            Dim oIndexAttribute As WMObject
            Dim oIndex As WMObject
            Dim oRelProperties As WMObjectRelationClass

            ' den Objekttyp laden
            oObjectType = _session.GetWMObjectByName(WMEntityObjectType, Objecttype_name)

            ' Beziehung zu Indizes des Objekttyp auslesen
            oIndexAttributes = oObjectType.GetWMObjectRelationByName("TypeAttributes")

            ' Array für Indizes vorbereiten
            Dim aIndexNames(oIndexAttributes.Count - 1) As String

            ' alle Indizes durchlaufen
            For j As Integer = 0 To oIndexAttributes.Count - 1

                ' aktuellen Index auslesen
                oIndexAttribute = oIndexAttributes.Item(j)

                ' Eigenschaften des Index auslesen
                oRelProperties = oIndexAttribute.GetWMObjectRelationByName("Attribute")

                ' Index aus den Eigenschaften auslesen
                oIndex = oRelProperties.Item(0)
                'Dim o = oRelProperties.Item(2)
                ' Indexname speichern
                aIndexNames(j) = oIndex.aName
            Next
            'Indexarray sortiert zurückgeben
            Array.Sort(aIndexNames)
            ' Indexarray zurückgeben
            Return aIndexNames

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Auslesen der windream-Indexe")
            Return Nothing
        End Try
    End Function

    ''' <summary>
    ''' Überprüft ob der angegebene Index im Objekttyp existiert
    ''' </summary>
    ''' <param name="objekttyp">Name des zu durchsuchenden Objekttyps</param>
    ''' <param name="indexname">Name des zu suchenden Indexes</param>
    ''' <returns>Liefert True wenn der Index im Objekttyp existiert, sonst False</returns>
    ''' <remarks></remarks>
    Public Shared Function ExistIndexInObjekttyp(ByVal objekttyp As String, ByVal indexname As String) As Boolean
        Try
            Dim indexnamen() As String = GetIndicesByObjecttype(objekttyp)

            If indexnamen Is Nothing Then Return False

            Return indexnamen.Contains(indexname)
        Catch ex As Exception
            MsgBox("Beim Prüfen ob ein Index für einen Objekttypen existiert, ist ein Fehler aufgetreten." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Prüfen auf Existenz eines Index in einem Objekttyp")
        End Try

        Return False

    End Function

#End Region



#Region "+++++ Allgemeine Funktionen die Informationen zurückliefern +++++"

    ''' <summary>
    ''' Liefert True wenn die windream-Session angemeldet ist und False für den Fall, dass die Session nicht eingeloggt ist.
    ''' </summary>
    ''' <returns>Anmeldestatus als Boolean</returns>
    ''' <remarks></remarks>
    Public Shared Function IsLoggedIn() As Boolean
        Try
            Return _session.aLoggedin
        Catch ex As Exception
            MsgBox("Es konnte nicht erfolgreich geprüft werden, ob das Programm am windream-Server angemeldted ist." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error in Loggedin-Prüfung")
        End Try

        Return False
    End Function

    ''' <summary>
    ''' Liefert den Servernamen an dem windream aktuell angemeldet ist.
    ''' </summary>
    ''' <returns>Servername als String</returns>
    ''' <remarks></remarks>
    Public Shared Function GetCurrentServer() As String
        Try
            Return oBrowser.GetCurrentServer 'ClassWindream.oBrowser.GetCurrentServer
        Catch ex As Exception
            MsgBox("Der aktuell gewählte windream-Server konnte nicht ausgelesen werden." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Auslesen des windream-Servers")
        End Try

        Return ""
    End Function

#End Region
    Public Shared Function Stream_File(ByVal SourceFilePath As String, ByVal NewFileName As String)
        _currentWMObject = Nothing

        Dim oWindreamFilename As String = NewFileName
        Dim oFileName As String = NewFileName
        Dim oWDriveRegex As New Regex("^\w{1}:")

        If oWDriveRegex.IsMatch(NewFileName) Then
            oFileName = oWDriveRegex.Replace(NewFileName, vWLaufwerk)
            oWindreamFilename = oWDriveRegex.Replace(NewFileName, String.Empty)
        Else
            oWindreamFilename = NewFileName.Replace(vWLaufwerk, String.Empty)
        End If

        'If NewFileName.StartsWith("W:") Then
        '    oFileName = NewFileName.Replace("W:", vWLaufwerk)
        '    oWindreamFilename = NewFileName.Replace("W:", String.Empty)
        'Else
        '    oWindreamFilename = NewFileName.Replace(vWLaufwerk, String.Empty)
        'End If

        Dim oSourceFilename As String = Path.GetFileName(SourceFilePath)
        Dim oDestination As String = Path.GetDirectoryName(oFileName)

        If My.Computer.FileSystem.DirectoryExists(oDestination) = False Then
            My.Computer.FileSystem.CreateDirectory(oDestination)
            LOGGER.Info(" - Zielverzeichnis neu erzeugt!")
        End If

        LOGGER.Info(" ...Stream_File wurde gestartet")

        ' Objekt für Datei und Zielverzeichnis anlegen


        LOGGER.Info(" ...Quelldatei gelesen")

        If My.Computer.FileSystem.DirectoryExists(oDestination) Then
            LOGGER.Info(" ...targetPath existiert")
            ' Überprüfen ob der zu Kopieren notwendige Speicherplatz auf Ziellaufwerk vorhanden ist

            Dim oFileInfo As New FileInfo(SourceFilePath)
            Dim oFileLength As Long = oFileInfo.Length


            LOGGER.Info(" ...Datei kopieren von '" & SourceFilePath & "' nach '" & NewFileName & "'.")
            Dim Connect
            Dim Session
            Dim WMObject
            Dim aFileIO
            Dim aWMStream
            Dim wmbrwsr
            Dim dmsServer As String
            LOGGER.Info(" ...Connect definieren:  CreateObject('Windream.WMConnect')")
            Connect = CreateObject("Windream.WMConnect")
            aFileIO = New WMOTOOLLib.WMFileIO

            wmbrwsr = CreateObject("WMOBrws.ServerBrowser")
            '==================================================================
            ' get the current DMS-server to log in
            '==================================================================
            dmsServer = wmbrwsr.GetCurrentServer
            '==================================================================
            ' create a session
            '==================================================================
            Session = CreateObject("Windream.WMSession", dmsServer)
            '==================================================================
            ' login session
            '==================================================================
            Connect.LoginSession(Session)
            Dim LoggedIn = Session.aLoggedin
            If LoggedIn Then
                LOGGER.Info(" ...Login ok. You are logged in as '" & Connect.UserName & "' on Server '" & dmsServer)
                'MsgBox("Login ok. You are logged in as '" + Connect.UserName + "' on Server '" + dmsServer + "'")
            Else
                LOGGER.Info(" >> Login on dms-Server failed")
                ' MsgBox("Login failed. ")
            End If
            _session = Session
            Const WMCOMEventWMSessionNeedIndex = 1

            'windream Objekte erstellen ohne Indexierungs-Event
            Session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
            '==================================================================
            ' check if files exist
            '==================================================================
            LOGGER.Info(" ...ÜBERPRÜFTER DATEINAME => " & oWindreamFilename)
            Dim wdFilexists As Boolean
            LOGGER.Info(" ...Versuch auf die Datei in W: zuzugreifen und zu sperren...")
            wdFilexists = Session.WMObjectExists(WMEntityDocument, oWindreamFilename, 0, 0)
            Err.Clear()
            If wdFilexists = False Then
                LOGGER.Info(" ...Datei ist NICHT vorhanden, kann also einfach neu angelegt werden")

                '==================================================================
                ' create an object
                '==================================================================
                WMObject = Session.GetNewWMObjectFS(WMEntityDocument, oWindreamFilename, WMObjectEditModeObject) 'WMEntityDocument, windreamFilename, WMObjectEditModeObject
                If Err.Number > 0 Then
                    LOGGER.Info(" FEHLER: WMObject konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
                    'MsgBox(Err.Description)
                End If
                '  MsgBox("Created file: " + windreamFilename)
            Else
                ' wenn auf die Datei zugeriffen werden konnte ist sie bereits vorhanden -> Datum anhängen
                LOGGER.Info(" ...Es konnte zugegriffen werden -> DATEI IST BEREITS VORHANDEN")


                Select Case CURRENT_DOKART_DUPLICATE_HANDLING

                    Case "New version"
                        LOGGER.Info("Creating new version of file [{0}]", NewFileName)
                        oWindreamFilename = ClassFilehandle.Versionierung_Datei(NewFileName).ToString.Substring(2)
                        CURRENT_NEWFILENAME = oWindreamFilename
                    Case "Question"
                        Dim oMessage = $"Eine Datei mit identischem Namen {vbNewLine}'{NewFileName}'{vbNewLine}existiert bereits!{vbNewLine}Wollen Sie die bestehende Datei ersetzen?"
                        If USER_LANGUAGE <> "de-DE" Then
                            oMessage = $"There is already a file with the name {NewFileName}!{vbNewLine}Would You like to replace the file?"
                        End If

                        Dim oResult = MessageBox.Show(oMessage, "File exists", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

                        If oResult = DialogResult.No Then
                            oWindreamFilename = ClassFilehandle.Versionierung_Datei(NewFileName).ToString.Substring(2)
                        Else
                            If Delete_WDFile(oWindreamFilename) = False Then
                                Return False
                            End If
                        End If
                    Case Else
                        If Delete_WDFile(oWindreamFilename) = False Then
                            Return False
                        End If
                End Select

                WMObject = Session.GetNewWMObjectFS(1, oWindreamFilename, 31) 'WMEntityDocument, windreamFilename, WMObjectEditModeObject
                If Err.Number > 0 Then
                    LOGGER.Info(" FEHLER: Neues WMObject (Kopie) konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
                    'MsgBox(Err.Description)
                End If
                LOGGER.Info(" ...WMObject zugewiesen")
            End If
            LOGGER.Info(" ...ENDGÜLTIGER DATEINAME => " & oWindreamFilename)
            If WMObject IsNot Nothing Then
                'NewFileName = vWLaufwerk & ":" & oWindreamFilename
                ' lock object for file system access (to change the file itself)
                WMObject.lock()
                ' set fileIO the local source file
                aFileIO.bstrOriginalFileName = SourceFilePath
                If Err.Number > 0 Then
                    LOGGER.Info(" FEHLER: fileIO konnte nicht gesetzt werden - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    LOGGER.Info(" HINWEIS: Überprüfen Sie den Verweis auf die Bibliotheken 'WMOTool.WMFileIO' UND 'WMOTOOLLib.WMFileIO' und ändern diese in den Anwendungseinstellungen (DLL_WMOTOOL)'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)

                    Return False
                    ' MsgBox(Err.Description)
                End If
                ' open the windream object's file stream for writing
                aWMStream = WMObject.OpenStream(STREAM_BinaryObject, WMObjectStreamOpenModeReadWrite)
                If Err.Number > 0 Then
                    LOGGER.Info(" Unexpected error in OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)
                    Return False
                    'MsgBox(Err.Description)
                End If
                LOGGER.Info(" ...oWMStream erzeugt")
                ' give fileIO helper object the windream stream
                aFileIO.aWMStream = aWMStream
                If Err.Number > 0 Then
                    LOGGER.Info(" Unexpected error in Zuweisen aWMStream zu aFileIO - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)
                    Return False
                    'MsgBox(Err.Description)
                End If
                ' let fileIO object import the original file into windream
                aFileIO.ImportOriginal(True)
                If Err.Number > 0 Then
                    LOGGER.Info(" Unexpected error in FileIO.ImportOriginal(True) - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)
                    Return False
                    ' MsgBox(Err.Description)
                End If
                LOGGER.Info(" ...Inhalt der Datei konnte übertragen werden")
                ' close the windream file stream
                aWMStream.Close()
                If Err.Number > 0 Then
                    LOGGER.Info(" Unexpected error in aWMStream.Close() - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)
                    Return False
                    'MsgBox(Err.Description)
                End If
                ' save new windream object
                WMObject.save()
                If Err.Number > 0 Then
                    LOGGER.Info(" Unexpected error in WMObject.save - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)
                    Return False
                    'MsgBox(Err.Description)
                End If
                LOGGER.Info(" ...Datei konnte gespeichert werden")
                ' unlock the windream object
                WMObject.unlock()
                If Err.Number > 0 Then
                    LOGGER.Info(" Unexpected error in WMObject.unlock - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
                    WMObject.Unlock()
                    Delete_WDFile(oWindreamFilename)
                    Return False
                    'MsgBox(Err.Description)
                End If
                'DATEI GRÖSSE ERMITTELN - MANCHMAL KOMMT ES VOR DAS DATEIGRÖße 0 ist
                Dim info2 As New FileInfo(oFileName)
                Dim length1 As Long = info2.Length
                LOGGER.Info(" ...Length der Zieldatei: " & length1.ToString)
                If oFileLength > 0 And Err.Number = 0 Then

                    'Dim p As String
                    'If oWindreamFilename.StartsWith("\") Then
                    '    If oWindreamFilename.StartsWith("\\") Then
                    '        p = oWindreamFilename.Replace("\\", "\")
                    '    Else
                    '        p = oWindreamFilename
                    '    End If
                    'Else
                    '    p = "\" & oWindreamFilename
                    'End If
                    'CURRENT_NEWFILENAME = vWLaufwerk & ":" & p

                    CURRENT_NEWFILENAME = oFileName

                    LOGGER.Info(" >> Datei '" & CURRENT_NEWFILENAME & "' wurde erfolgreich importiert!")
                    _currentWMObject = WMObject
                    Return True
                Else
                    Delete_WDFile(oWindreamFilename)
                    LOGGER.Info("Error Number: [{0}]", Err.Number)
                    LOGGER.Info(" Unexpected error in Datei-Übertragen - FileLength ist 0, Übertragene Datei wurde gelöscht")
                    Return False
                End If
            Else
                LOGGER.Info(" Could not create a WMObject for file:'" & oWindreamFilename)
                If Not Err() Is Nothing Then
                    If Not Err.Description Is Nothing Then
                        LOGGER.Info(Err.Description)
                    End If
                End If
                Return False
            End If
        Else
            LOGGER.Info("...targetPath existiert NICHT")
            Return False
        End If

    End Function
    Public Shared Function Delete_WDFile(ByVal WD_File As String)
        Try
            If Not WD_File.StartsWith("\") Then
                WD_File = WD_File.Substring(2)
            End If
            Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject")  'New WINDREAMLib.WMObject
            Try
                WMObject = _session.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument
            Catch ex As Exception
                LOGGER.Info(">> Could not create WMObject for file '" & WD_File & "' - so it is not existing")
                LOGGER.Error(ex.Message)
                Return False
            End Try

            LOGGER.Info(" >> Deleting started - Object created")
            WMObject.Delete()
            Return True
        Catch ex As Exception
            MsgBox("Unexpected Error in Delete_WDFile: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
            LOGGER.Info("Unexpected Error in Delete_WDFile: " & ex.Message)
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Übergibt einer in windream gespeicherten Datei Indexwerte
    ''' </summary>
    ''' <param name="filenameQuelle">Name der zu indexierenden Datei</param>
    ''' <param name="filenameZiel">neuer Name der zu indexierenden Datei</param>
    ''' <returns>Liefert True wenn das Indexieren erfolgreich war, sonst False</returns>
    ''' <remarks></remarks>
    Public Shared Function DateiIndexieren(ByVal WD_File As String, ByVal _Indexname As String, ByVal _Value As String)
        Try

            LOGGER.Info(" ...DateiIndexieren wurde aufgerufen")
            WD_File = WD_File.Substring(2)
            Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject")  'New WINDREAMLib.WMObject
            'MsgBox("DateiIndexieren:" & vbNewLine & ClassDateiimportWindream.GetWindreamDriveLetter & filenameZiel & vbNewLine & Me.selectedProfile.DokumenttypString)
            ' den Dokumenttyp schreiben
            LOGGER.Info(" ## Indexieren wird gestartet ##")
            ' ein windream-Objekt der Datei anlegen
            WMObject = _currentWMObject 'oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File)
            Try
                LOGGER.Info(" ...Datei wird gesperrt")
                ' die Datei sperren
                WMObject.lock()
            Catch ex As Exception
                LOGGER.Info(" ...Datei ist bereits gesperrt")
                ' nichts tun (Datei ist bereits gesperrt)
            End Try

            If IsNothing(WMObject) Then
                LOGGER.Info(" ...Windream Object ist nothing, Indexierung wird abgebrochen")
                Return False
            End If

            If IsNothing(WMObject.aObjectType) Then
                LOGGER.Info(" ...Kein Objekttyp gesetzt, Indexierung wird abgebrochen")
                Return False
            End If

            LOGGER.Info($" ...Objekttyp wird gesetzt: " & _WDObjekttyp)
            ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
            If WMObject.aObjectType.aName = "Standard" Then

                ' ihr den entsprechenden Dokumenttyp zuweisen
                WMObject.aObjectType = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
                ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
                LOGGER.Info(" ...Objekttyp wurde gesetzt")
            Else
                LOGGER.Info(" ...Objekttyp war bereits gesetzt")
            End If

            Try
                WMObject.Save()
            Catch ex As Exception
                ' wenn es einen Unexpected error inm speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine
                ' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden
                Return False
            End Try

            Try
                WMObject.unlock()
            Catch ex As Exception
                ' wenn das entsperren nicht geklappt hat, dann war die Datei auch nicht gesperrt
            End Try
            LOGGER.Info(" ...Datei wurde gespeichert / Unlock wurde durchgeführt")
            ' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben

            LOGGER.Info(" ...Objekttyp: " & _WDObjekttyp)


            ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden

            Dim indexe As String = ""

            LOGGER.Info(" ...Indexname: '" & _Indexname & "'")
            Dim werte = New ArrayList
            If (GetTypeOfIndexAsIntByName(_Indexname) = WMObjectVariableValueTypeVector) Or GetTypeOfIndexAsIntByName(_Indexname) = 4097 Then
                LOGGER.Info(" ...Es handelt sich um ein Vektor-Feld")


                'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
                LOGGER.Info(" ...Wert vor Überprüfung: " & _Value)
                _Value = CheckIndexValue(_Value)
                'Ausstieg da Fehler in der Überprüfung
                If _Value Is Nothing Then
                    Return False
                End If
                LOGGER.Info(" ...Value für Indexierung: " & _Value)
                werte.Add(_Value)

                LOGGER.Info(" ...Werte zu Array hinzugefügt!")
            Else
                'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
                LOGGER.Info(" ...Value vor Überprüfung: " & _Value)
                _Value = CheckIndexValue(_Value)
                'Ausstieg da Fehler in der Überprüfung
                If _Value Is Nothing Then
                    Return False
                End If
                LOGGER.Info(" ...Value für Indexierung: " & _Value)
                werte.Add(_Value)

            End If

            Dim arrIndex() As String = Nothing
            Dim arrValue() As String = Nothing
            ReDim Preserve arrIndex(0)
            ReDim Preserve arrValue(0)
            arrIndex(0) = _Indexname
            arrValue(0) = _Value
            Return RunIndexing(WMObject, arrIndex, arrValue)

        Catch ex As Exception
            LOGGER.Info("Hinweis: Die Datei " & WD_File & " konnte nicht indexiert werden.")
            LOGGER.Error(ex.Message)
            LOGGER.Info("Fehler: " & ex.Message)
            ' Me.TreeNodeInfos.Add(temp)
            Return False
        End Try
    End Function
    Private Shared Function RunIndexing(ByVal oDocument As WMObject, ByVal Indizes() As String, ByVal aValues() As Object)
        Dim vektInsState As Integer = 1
        Try
            If Indizes IsNot Nothing And aValues IsNot Nothing Then
                If Not oDocument.aLocked Then
                    oDocument.lock()
                    Dim i As Integer = 0
                    Dim indexname As String
                    If aValues.Length = 1 And aValues(0) = "" Then
                        LOGGER.Info(" ...Indexwert ist leer/Nothing - Keine Nachindexierung")
                    End If
                    ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
                    If oDocument.aObjectType.aName <> _WDObjekttyp Then
                        ' ihr den entsprechenden Dokumenttyp zuweisen
                        oDocument.aObjectType = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
                        ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
                        LOGGER.Info(" ...Objekttyp '" & oDocument.aObjectType.aName & "' wurde in '" & _WDObjekttyp & "' geändert.")
                    Else
                        LOGGER.Info(" ...Objekttyp war bereits gesetzt")
                    End If

                    Try
                        oDocument.Save()
                    Catch ex As Exception
                        ' wenn es einen Unexpected error inm speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine
                        ' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden
                        Return False
                    End Try

                    'Jetzt jeden Indexwert durchlaufen
                    For Each aName As String In Indizes
                        indexname = aName
                        If LogErrorsOnly = False Then
                            LOGGER.Info(" ")
                            LOGGER.Info(" >> Indexierung von Index '" & indexname & "'")
                        End If
                        ' das entsprechende Attribut aus windream auslesen
                        Dim oAttribute = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, Indizes(i))
                        ' den Variablentyp (String, Integer, ...) auslesen 
                        Dim vType = oAttribute.getVariableValue("dwAttrType")
                        ' wenn in aValues an Position i ein Wert steht
                        If IsNotEmpty(aValues(i)) Then
                            Dim _int As Boolean = False
                            Dim _date As Boolean = False
                            Dim _dbl As Boolean = False
                            Dim _bool As Boolean = False
                            'If indexname = "Tournr" Then
                            '    MsgBox("Index: " & indexname & vbNewLine & "wert: " & aValues(i), MsgBoxStyle.Information, "Index: " & aName.ToString)
                            'End If


                            'MsgBox(oDocument.aName & vbNewLine & aValues(i) & vbNewLine & vType, MsgBoxStyle.Exclamation, "Zeile 87")
                            Dim value = aValues(i)
                            Dim convertValue
                            Dim vektor As Boolean = False
                            'Den Typ des Index-Feldes auslesen
                            'MsgBox(value.GetType.ToString)
                            Select Case (vType)
                                'Case WMObjectVariableValueTypeUndefined
                                Case WMObjectVariableValueTypeString
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeString")
                                    convertValue = CStr(value)
                                Case WMObjectVariableValueTypeInteger
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeInteger")
                                    value = value.ToString.Replace(" ", "")
                                    If IsNumeric(value) = False Then
                                        LOGGER.Info(" ...Achtung: Value '" & value & "' kann nicht in Zahl konvertiert werden!")
                                    End If
                                    value = value.ToString.Replace(" ", "")
                                    convertValue = CInt(value)
                                    _int = True
                                Case WMObjectVariableValueTypeFloat
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFloat")
                                    value = value.ToString.Replace(" ", "")
                                    convertValue = CDbl(value)
                                Case WMObjectVariableValueTypeFixedPoint
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFixedPoint")
                                    value = value.ToString.Replace(" ", "")
                                    convertValue = CDbl(value)
                                    _dbl = True
                                Case WMObjectVariableValueTypeBoolean
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeBoolean")
                                    convertValue = CBool(value)
                                    _bool = True
                                Case WMObjectVariableValueTypeDate
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeDate")
                                    _date = True
                                    'Dim _date As Date = value
                                    convertValue = value
                                Case WMObjectVariableValueTypeTimeStamp
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeTimeStamp")
                                    convertValue = value
                                Case WMObjectVariableValueTypeCurrency
                                    LOGGER.Info(" - Typ des windream-Indexes: WMObjectVariableValueTypeCurrency")
                                    'Wegen currency muß ein eigenes Objekt vom typ Variant erzeugt werden
                                    Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(value))
                                    convertValue = aValueWrapper
                                Case WMObjectVariableValueTypeTime
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeTime")
                                    'If ((value)) Then
                                    '    convertValue = CDate(value)
                                    'Else
                                    '    convertValue = ""
                                    'End If
                                    'Dim _date As Date = value
                                    convertValue = convertValue '*_date.ToShortTimeString
                                Case WMObjectVariableValueTypeFloat
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFloat")
                                    convertValue = CStr(value)
                                Case WMObjectVariableValueTypeVariant
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeVariant")
                                    convertValue = CStr(value)
                                Case WMObjectVariableValueTypeFulltext
                                    LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFulltext")
                                    convertValue = CStr(value)
                                Case 4097
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4097 Vektor alphanumerisch")
                                    'Vektor alphanumerisch
                                    convertValue = CStr(value)
                                Case 4098
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4098 Vektor Numerisch")
                                    'Vektor Numerisch
                                    convertValue = CStr(value)
                                Case 4099
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4099 Vektor Kommazahl")
                                    'Vektor Kommazahl
                                    convertValue = CStr(value)
                                Case 4100
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4100 Vektor Boolean")
                                    'Vektor Kommazahl
                                    convertValue = ToBoolean(value)
                                Case 4101
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4101 Vektor Date")
                                    'Vektor Kommazahl
                                    convertValue = CStr(value)
                                Case 4103
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4103 Vektor DateTime")
                                    'Vektor DateTime
                                    convertValue = CStr(value)
                                Case 4107
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 4107 Integer 64bit")
                                    convertValue = CStr(value)
                                Case 36865
                                    vektor = True
                                    LOGGER.Info(" ...Typ des windream-Indexes: 36865 Vektor alphanumerisch")
                                    'Vektor Kommazahl
                                    convertValue = CStr(value)
                                Case Else
                                    LOGGER.Info(" ...Typ des windream-Indexes konnte nicht bestimmt werden!")
                                    LOGGER.Info(" ...Versuch des Auslesens (vType): " & vType)
                                    'MsgBox(vType & vbNewLine & CStr(value), MsgBoxStyle.Exclamation, "Marlon-Case Else")
                                    convertValue = ""
                            End Select
                            If vektor = False Then
                                If convertValue.ToString Is Nothing = False Then
                                    LOGGER.Info(" ...Konvertierter Wert: '" & convertValue.ToString & "'")
                                End If
                            End If
                            '############################################################################################
                            '####################### Der eigentliche Indexierungsvorgang ################################
                            '############################################################################################
                            If vektor = False Then
                                If convertValue.ToString Is Nothing = False Then
                                    LOGGER.Info(" ...Versuch dem Dok einen Index zuzuweisen: oDocument.SetVariableValue(" & aName & ", " & convertValue & ")")
                                    If _int = True Then
                                        convertValue = convertValue.ToString.Replace(" ", "")
                                        oDocument.SetVariableValue(aName, CInt(convertValue))
                                    ElseIf _date = True Then
                                        oDocument.SetVariableValue(aName, CDate(convertValue))
                                    ElseIf _bool Then
                                        oDocument.SetVariableValue(aName, CBool(convertValue))
                                    ElseIf _dbl Then
                                        convertValue = convertValue.ToString.Replace(" ", "")
                                        oDocument.SetVariableValue(aName, CDbl(convertValue))
                                    Else
                                        oDocument.SetVariableValue(aName, convertValue)
                                    End If
                                    'Die Datei speichern
                                    oDocument.Save()

                                    If LogErrorsOnly = False Then
                                        LOGGER.Info(" ...Index '" & aName & "' wurde geschrieben")
                                        LOGGER.Info("")
                                    End If
                                Else
                                    LOGGER.Info(" >> Kein Indexwert vorhanden")
                                End If
                            Else
                                'VEKTORFELDER, ALSO ÜBERPRÜFEN OB ERGEBNIS-ARRAY GEFÜLLT IST
                                LOGGER.Info(" >> VEKTORFELD: Vorbereiten des Arrays")

                                Dim myArray()



                                'For Each row As DataRow In DT.Rows
                                'MsgBox(aName & vbNewLine & row.Item("Indexname") & vbNewLine & CStr(row.Item("Wert")))
                                'Next
                                Dim Anzahl As Integer = aValues.Length
                                'Vektorfeld wird mit EINEM Wert gefüllt
                                If Anzahl = 1 Then
                                    LOGGER.Info(" >> Vektorfeld wird mit EINEM Wert gefüllt ")
                                    ReDim myArray(0)
                                    Select Case vType
                                        Case 36865
                                            'Umwandeln in String
                                            myArray(0) = CStr(value)
                                        Case 4097
                                            'Umwandeln in String
                                            myArray(0) = CStr(value)
                                        Case 4098
                                            'Umwandeln in Integer
                                            value = value.ToString.Replace(" ", "")
                                            myArray(0) = CInt(value)
                                        Case 4099
                                            Dim Str As String = value
                                            Str = Str.ToString.Replace(" ", "")
                                            'Umwandeln in Double
                                            myArray(0) = CDbl(Str.Replace(".", ","))

                                        Case 4100
                                            ' Umwandeln in Boolean
                                            myArray(0) = ToBoolean(value)
                                        Case 4101
                                            'Umwandeln in Date
                                            myArray(0) = CDate(value)
                                        Case 4107
                                            myArray(0) = Convert.ToInt64(value)
                                        Case 4103
                                            'Umwandeln in Datum Uhrzeit
                                            myArray(0) = value
                                        Case Else
                                            'Umwandeln in String
                                            myArray(0) = CStr(value)
                                    End Select

                                    'Jetzt überprüfen ob Werte in Vektorfeld angefügt oder überschrieben werden sollen
                                    LOGGER.Info(" >> Konvertierter Wert: " & myArray(0).ToString)

                                    Dim VektorArray()

                                    'Immer anfügen
                                    LOGGER.Info(" >> Check Existing Vektorvalues")

                                    Dim indicies As New List(Of Object)

                                    For Each element In myArray
                                        If TypeOf element Is String Then
                                            Dim splitted = element.ToString.Split(ClassConstants.VECTORSEPARATOR)
                                            For Each s In splitted
                                                indicies.Add(s)
                                            Next
                                        Else
                                            indicies.Add(element)
                                        End If
                                    Next

                                    myArray = indicies.ToArray()

                                    VektorArray = Return_VektorArray(oDocument, aName, myArray)

                                    If VektorArray Is Nothing = False Then
                                        ReDim myArray(VektorArray.Length - 1)
                                        Array.Copy(VektorArray, myArray, VektorArray.Length)

                                        'Jetzt die Nachindexierung für Vektor-Felder
                                        oDocument.SetVariableValue(aName, myArray)
                                        'myArray)
                                        LOGGER.Info(" >> 'SetVariableValue' für VEKTOR mit einem Wert erfolgreich")

                                        'Die Änderungen festsschreiben/speichern
                                        oDocument.Save()

                                    End If
                                Else
                                    LOGGER.Info(" >> Vektorfeld wird mit MEHREREN Werten gefüllt ")
                                    ' das ausgewählte Profil in _selectedProfile laden


                                    'Die Größe des Arrays festlegen
                                    ReDim myArray(Anzahl - 1)
                                    Dim i1 As Integer = 0
                                    'Die Datatable durchlaufen und Werte für den Index in Array schreiben
                                    For Each obj In myArray
                                        myArray(i1) = CStr(obj)
                                        LOGGER.Info(" >> Wert (" & i1 & ") aus Datatable: '" & myArray(i1).ToString & "'")
                                        i1 = i1 + 1
                                    Next
                                    LOGGER.Info(" >> Array wurde erfolgreich erzeugt")


                                    Dim VektorArray()

                                    VektorArray = Return_VektorArray(oDocument, aName, myArray)

                                    If VektorArray Is Nothing = False Then
                                        'Das Array wieder anpassen
                                        ReDim myArray(VektorArray.Length - 1)
                                        'Array.Copy(VektorArray, myArray, VektorArray.Length)
                                        i1 = 0
                                        For Each _value As Object In VektorArray
                                            Select Case vType
                                                Case 36865
                                                    myArray(i1) = CStr(_value)
                                                Case 4097
                                                    myArray(i1) = CStr(_value)
                                                Case 4098
                                                    Dim v As String = _value.ToString.Replace(" ", "")
                                                    myArray(i1) = CInt(v)
                                                Case 4099
                                                    'Vektroryp Double
                                                    Dim Str As String = _value
                                                    Str = Str.ToString.Replace(" ", "")
                                                    myArray(i1) = CDbl(Str.Replace(".", ","))
                                                Case 4101
                                                    'Vektortyp DATE
                                                    Dim dat As String = _value
                                                    myArray(i1) = CDate(dat.Replace(".", ","))
                                                Case 4107
                                                    myArray(i1) = Convert.ToInt64(_value)
                                                Case Else
                                                    'Vektortyp ALPHANUMERISCH
                                                    'Die Größe des Arrays festlegen
                                                    myArray(i1) = CStr(myArray(0))
                                            End Select
                                            LOGGER.Info(" >> Konvertierter Wert (" & i1 & ") : '" & myArray(i1).ToString & "'")
                                            i1 += 1
                                        Next
                                        'Jetzt die Nachindexierung für Vektor-Felder
                                        Try
                                            oDocument.SetVariableValue(aName, myArray)
                                        Catch ex As Exception
                                            LOGGER.Info("RunIndexing -Unexpected error in indexing Vectorfield: " & ex.Message)
                                            LOGGER.Error(ex.Message)
                                            oDocument.Save()
                                            oDocument.unlock()
                                            Return False
                                        End Try

                                        LOGGER.Info(" >> 'SetVariableValue' für VEKTOR erfolgreich")

                                        ' oDocument.LockRights()

                                        'Die Änderungen festsschreiben/speichern
                                        oDocument.Save()
                                        LOGGER.Info(">> Indexierung erfolgreich beendet (Save ...")
                                    Else
                                        LOGGER.Info(" - Achtung: VektorArray Is NOTHING")
                                        oDocument.Save()
                                        Return True
                                    End If
                                End If
                            End If
                        End If

                        i += 1

                    Next
                    oDocument.unlock()
                    If LogErrorsOnly = False Then
                        LOGGER.Info(">> ...und Unlock durchgeführt)")
                        LOGGER.Info("")
                    End If
                    Return True
                Else
                    LOGGER.Info(" >> Dokument ist gesperrt, Indexierung erst im nächsten Durchlauf!")
                    'oDocument.unlock()
                    Return False
                End If
            End If
        Catch ex As Exception
            LOGGER.Info("ClassNiWindream.RunIndexing: " & ex.Message)
            LOGGER.Error(ex.Message)
            oDocument.Save()
            oDocument.unlock()
            Return False
        End Try
    End Function
    Private Shared Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, NIIndexe As Object)
        Try
            Dim missing As Boolean = False
            Dim Anzahl As Integer = 0
            Dim ValueArray()
            'Jeden Wert des Vektorfeldes durchlaufen
            Dim wertWD = oDocument.GetVariableValue(vktIndexName)
            If wertWD Is Nothing = False Then
                'Nochmals prüfen ob wirklich Array
                If wertWD.GetType.ToString.Contains("System.Object") Then
                    'Keine Duplikatprüfung also einfach neues Array füllen
                    LOGGER.Info(" >> Duplikatprüfung soll durchgeführt werden.")
                    'Duplikat Prüfung an, also nur anhängen wenn Wert <>
                    For Each WDValue As Object In wertWD
                        If WDValue Is Nothing = False Then
                            'Erst einmal die ALten Werte schreiben
                            ReDim Preserve ValueArray(Anzahl)
                            'Den Wert im Array speichern
                            ValueArray(Anzahl) = WDValue.ToString
                            Anzahl += 1
                        End If
                    Next
                    'Jetzt die Neuen Werte auf Duplikate überprüfen
                    For Each NewValue As Object In NIIndexe
                        If NewValue Is Nothing = False Then
                            If ValueArray.Contains(NewValue) = False Then
                                'Das Array anpassen
                                ReDim Preserve ValueArray(Anzahl)
                                'Den Wert im Array speichern
                                ValueArray(Anzahl) = NewValue.ToString
                                Anzahl += 1
                            Else
                                LOGGER.Info(" >> Value '" & NewValue.ToString & "' bereits in Vektorfeld enthalten")
                            End If
                        End If
                    Next

                End If
            Else
                LOGGER.Info(" >> Vektorfeld ist noch leer....")
                'Den/die Neuen Wert(e) anfügen
                For Each NewValue As Object In NIIndexe
                    If NewValue Is Nothing = False Then

                        If ValueArray Is Nothing = False Then
                            If ValueArray.Contains(NewValue) = False Then
                                'Das Array anpassen
                                ReDim Preserve ValueArray(Anzahl)
                                'Den Wert im Array speichern
                                ValueArray(Anzahl) = NewValue '.ToString
                                Anzahl += 1
                            Else
                                LOGGER.Info(" >> Value '" & NewValue.ToString & "' bereits in Array enthalten")
                            End If
                        Else 'Dererste Wert, also hinzufügen
                            'Das Array anpassen
                            ReDim Preserve ValueArray(Anzahl)
                            'Den Wert im Array speichern
                            ValueArray(Anzahl) = NewValue '.ToString
                            Anzahl += 1

                        End If

                    End If
                Next
            End If

            Return ValueArray
        Catch ex As Exception
            LOGGER.Info("Unexpected Error in ClassWindream.Return_VektorArray: " & ex.Message)
            LOGGER.Error(ex.Message)
        End Try


    End Function
    Private Shared Function IsNotEmpty(ByVal aValue As Object)

        If aValue IsNot Nothing Then
            Dim itsType As Type = aValue.GetType
            If itsType Is GetType(String) Then

                If Not aValue = "" Then
                    Return True
                End If

                Return False
            Else
                Return True
            End If
        Else
            Return False
        End If

    End Function
    ''' <summary>
    ''' Führt das eigendliche Indexieren aus
    ''' </summary>
    ''' <param name="filenameZiel">
    ''' der zu indexierenden Datei</param>
    ''' <param name="index">Name des zu indexierenden Indexfeldes</param>
    ''' <param name="werte">Der Wert/die Werte die dem Index zugewiesen werden sollen</param>
    ''' <returns>Liefert True wenn das Indexieren erfolgreich war, sonst False</returns>
    ''' <remarks></remarks>
    Public Shared Function Indexiere(ByVal filenameZiel As String, ByVal index As String, ByVal werte As Object) As Boolean
        LOGGER.Info(" - In Indexierungsvorgang für: " & filenameZiel)
        Try
            Dim WMObject As WINDREAMLib.WMObject = Nothing '= CreateObject("WINDREAMLib.WMObject") '= New WINDREAMLib.WMObject 'CreateObject("WINDREAMLib.WMObject")
            'MsgBox("Indexiere: " & vbNewLine & filenameZiel)
            'werte Is Nothing Or _
            ' überprüfen ob alle notwendigen Informationen angegeben wurden (sonst abbrechen)
            If filenameZiel Is Nothing Or
               filenameZiel = "" Or
               index Is Nothing Or
               index = "" Or
               Not ExistIndexInObjekttyp(_WDObjekttyp, index) Then
                LOGGER.Info("=> Hinweis: Die Datei wurde auf Grund eines Problems in der Initialisierung nicht vollständig indexiert.")
                Return False
            End If

            Dim fileExists As Boolean

            ' prüfen ob die zu indexierende Datei existiert
            fileExists = My.Computer.FileSystem.FileExists(vWLaufwerk & ":" & filenameZiel) '_windream.GetWindreamDriveLetter

            Dim an As Integer = 0
            Do While My.Computer.FileSystem.FileExists(vWLaufwerk & ":" & filenameZiel) = False
                If an > 500 Then
                    fileExists = False
                    Exit Do
                Else
                    LOGGER.Info(" Achtung: Datei exisitiert noch nicht: " & My.Computer.Clock.LocalTime)
                End If
                an = an + 1
            Loop
            ' wenn die Datei existiert
            If fileExists Then
                WMObject = _session.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel)

                ' eine Variable für den umgewandelten Indexwert anlegen (kein Typ, da noch unklar ist was reingeschrieben wird)
                'Dim convertValue = Nothing

                ' den Typ des Zielindexes auslesen
                Dim TypDesIndexes As Integer

                Try

                    ' ein windream-Objekt der Datei anlegen
                    WMObject = _session.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel)
                    If LogErrorsOnly = False Then
                        LOGGER.Info(" - windream-Objekt der Datei erzeugt")
                        LOGGER.Info(" - Ziel: W:\" & filenameZiel)
                    End If

                    'Me.singleInfoNode.Add("Ziel: " & ClassDateiimportWindream.GetWindreamDriveLetter & filenameZiel)

                    Try
                        ' die Datei sperren
                        WMObject.lock()

                        'WMObject.LockFor(WINDREAMLib.WMObjectEditMode.WMObjectEditModeObject)
                    Catch ex As Exception

                    End Try

                    ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
                    If WMObject.aObjectType.aName = "Standard" Then
                        ' ihr den entsprechenden Dokumenttyp zuweisen
                        WMObject.aObjectType = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
                        ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
                    End If


                    ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden
                    If werte Is Nothing Then

                        Try
                            WMObject.Save()
                            WMObject.unlock()
                        Catch ex As Exception

                        End Try

                        Return Nothing
                    End If

                    ' den Typ des Zielindexes auslesen
                    TypDesIndexes = GetTypeOfIndexAsIntByName(index)

                    ' wenn es sich bei dem Index NICHT um ein Vektorfeld handelt
                    If TypDesIndexes < WMObjectVariableValueTypeVector Then
                        LOGGER.Info(" - Bei dem Zielindex handelt es sich um einen Einzelindex.")
                    Else
                        LOGGER.Info(" Bei dem Zielindex handelt es sich um ein Vektorfeld.")
                        ' ein Backup der Indexwerte anlegen 
                        Dim temp As Object = werte
                        ' und die eigendliche Variable zurücksetzen
                        werte = Nothing
                        ' dann soll nur der letzte Wert des Arrays übernommen werden, damit nicht versucht wird ein
                        ' Array in einen Einzelindex zu speichern
                        werte = temp
                        LOGGER.Info(" - Array geleert und erneuert!")
                    End If
                Catch ex As Exception
                    LOGGER.Info("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.")
                    LOGGER.Error(ex.Message)
                    Return False
                End Try


                'Try
                ' den Typ des Zielindexes 
                LOGGER.Info(" - Typ des Indexes: " & TypDesIndexes.ToString)
                Select Case (TypDesIndexes)
                    Case WMObjectVariableValueTypeUndefined  ' zu klären !!!!
                        'convertValue = vbEmpty
                    Case WMObjectVariableValueTypeString
                        ''Führende Nullen Entfernen
                        'If werte.ToString.StartsWith("0") Then
                        '    Dim wert As String = CStr(CInt(werte.ToString))
                        '    convertValue = wert
                        '    LOGGER.Info(" - Führende Nullen wurden entfernt")
                        'Else
                        '    Dim wert As String = CStr(CInt(werte.ToString))
                        '    convertValue = wert
                        'End If
                        'If convertValue.ToString.Contains("~1") Then
                        '    convertValue = convertValue.ToString.Replace("~1", "")
                        'End If
                        'If convertValue.ToString.Contains("~2") Then
                        '    convertValue = convertValue.ToString.Replace("~2", "")
                        'End If
                        'If convertValue.ToString.Contains("~3") Then
                        '    convertValue = convertValue.ToString.Replace("~3", "")
                        'End If
                        'If convertValue.ToString.Contains("~4") Then
                        '    convertValue = convertValue.ToString.Replace("~4", "")
                        'End If

                    Case WMObjectVariableValueTypeInteger
                        ' convertValue = CInt(werte)
                    Case WMObjectVariableValueTypeFloat
                        werte = werte.ToString.Replace(".", ",")
                        'convertValue = CDbl(werte)

                    Case WMObjectVariableValueTypeBoolean
                        Try
                            '    convertValue = CBool(werte)
                        Catch ex As Exception
                            ' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird
                            'convertValue = Nothing
                        End Try
                    Case WMObjectVariableValueTypeDate
                        If (IsDate(werte)) Then
                            '    convertValue = CDate(werte)
                        Else
                            '    convertValue = vbEmpty
                        End If

                    Case WMObjectVariableValueTypeFixedPoint
                        werte = werte.ToString.Replace(".", ",")
                        '  convertValue = CDbl(werte)

                    Case WMObjectVariableValueTypeTimeStamp
                        Dim timestamp As Integer = GetTimestamp(werte)
                        If timestamp > 0 Then
                            '   convertValue = timestamp
                        Else
                            '   convertValue = vbEmpty
                        End If

                    Case WMObjectVariableValueTypeCurrency
                        Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte)
                        '  convertValue = aValue

                    Case WMObjectVariableValueTypeTime
                        If (IsDate(werte)) Then
                            '  convertValue = CDate(werte) ' ggf. aber nur die Zeit
                        Else
                            '   convertValue = vbEmpty
                        End If

                    Case WMObjectVariableValueTypeVariant
                        '  convertValue = werte

                    Case WMObjectVariableValueTypeMask  ' zu klären !!!!
                        '  convertValue = vbEmpty

                    Case WMObjectVariableValueFlagMask  ' zu klären !!!!
                        '  convertValue = vbEmpty


                    Case WMObjectVariableValueTypeFulltext
                        'convertValue = CStr(werte)

                    Case WMObjectVariableValueTypeDefaultValue  ' zu klären !!!!
                        ' convertValue = vbEmpty

                    Case Else
                        ' wenn es sich um einen TypVektorIndex handelt
                        If TypDesIndexes >= 4096 And TypDesIndexes < 8192 Then
                            LOGGER.Info("- Es handelt sich um einen Vektorindex")
                            'Dim temp_arr As New ArrayList

                            Dim arrayIndex = 0
                            Dim temp_arr As Object
                            Dim arrayLength As Integer = 0
                            For Each element In werte
                                arrayLength = arrayLength + 1
                            Next

                            ReDim temp_arr(arrayLength - 1)

                            Select Case (TypDesIndexes - WMObjectVariableValueTypeVector)
                                'VektorIndex vom Typ String 64'
                                Case 1
                                    LOGGER.Info("- VektorIndex vom Typ String 1")

                                    For Each wert As Object In werte
                                        'Führende Nullen Entfernen
                                        If werte.ToString.StartsWith("0") Then
                                            Dim werteString As String = CStr(CInt(wert.ToString))
                                            wert = werteString
                                            temp_arr(arrayIndex) = CStr(wert)
                                            LOGGER.Info("- Führende Nullen wurden entfernt")
                                        Else
                                            temp_arr(arrayIndex) = CStr(wert)

                                        End If

                                        arrayIndex = arrayIndex + 1

                                        LOGGER.Info("- Wert " & CStr(wert) & " konvertiert")
                                    Next
                                Case WMObjectVariableValueTypeUndefined
                                    ' convertValue = ""

                                Case WMObjectVariableValueTypeString
                                    LOGGER.Info("- VektorIndex vom Typ String 2")
                                    For Each wert As Object In werte
                                        'Führende Nullen Entfernen
                                        If werte.ToString.StartsWith("0") Then
                                            wert = CInt(wert)
                                            temp_arr(arrayIndex) = CStr(wert)
                                            LOGGER.Info("- Führende Nullen wurden entfernt")
                                        Else
                                            temp_arr(arrayIndex) = CStr(wert)
                                        End If

                                        arrayIndex = arrayIndex + 1

                                        LOGGER.Info("- Wert " & CStr(wert) & " konvertiert")
                                    Next

                                Case WMObjectVariableValueTypeInteger
                                    LOGGER.Info("- VektorIndex vom Typ Integer")
                                    For Each wert As Object In werte
                                        temp_arr(arrayIndex) = CInt(wert)
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeFloat
                                    For Each wert As Object In werte
                                        wert = wert.ToString.Replace(".", ",")
                                        temp_arr(arrayIndex) = CDbl(wert)
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeBoolean
                                    For Each wert As Object In werte
                                        Try
                                            temp_arr(arrayIndex) = CBool(wert)
                                        Catch ex As Exception
                                            ' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird
                                            temp_arr = Nothing
                                        End Try
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeDate
                                    For Each wert As Object In werte
                                        'wert = 
                                        temp_arr(arrayIndex) = CDate(wert)
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeFixedPoint
                                    For Each wert As Object In werte
                                        temp_arr(arrayIndex) = CDbl(wert)
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeTimeStamp
                                    For Each wert As Object In werte
                                        temp_arr(arrayIndex) = CInt(wert)
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeCurrency
                                    For Each wert As Object In werte
                                        Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte)
                                        temp_arr(arrayIndex) = aValue
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeTime
                                    For Each wert As Object In werte
                                        temp_arr(arrayIndex) = CDate(wert)
                                        arrayIndex = arrayIndex + 1
                                    Next

                                Case WMObjectVariableValueTypeVariant
                                    ' dann bleiben alle Werte wie sie sind

                            End Select

                            werte = temp_arr

                            LOGGER.Info("- Werte erfolgreich konvertiert")
                        Else
                            '  convertValue = vbEmpty
                        End If

                End Select

                'Catch ex As Exception
                '    ' einen Hinweis über einen aufgetretenen Fehler an das Array für den TreeView-Log anhängen
                '    LOGGER.Info("Unexpected error in Auswerten/Konvertieren des Typs!", ex.Message)
                '    ' die Indexierungsinformationen für den TreeView-Log zurückgeben
                '    Return False
                'End Try


                ' Try
                ' ***** Anmerkung: das Nachindexieren mit vbEmpty ist möglich (siehe oben) jedoch nicht *****
                ' *****            das Indexieren mit einem Nothing-Wert !!!                            *****
                ' wenn das Konvertieren soweit gut gelaufen ist (also kein Nothing-Wert zugewiesen wurde)
                ' If (convertValue Is Nothing) = False Then
                ' den konvertierten Indexwert dem entsprechenden Index zuweisen
                WMObject.SetVariableValue(index, werte)
                If LogErrorsOnly = False Then
                    LOGGER.Info(" - den konvertierten Indexwert dem entsprechenden Index zuweisen")
                    LOGGER.Info(" - Indexname: " & index.ToString)
                    LOGGER.Info(" - Indexwert: " & werte.ToString)
                End If
                'End If

                ' die Indexinformationen des Dokuments speichern
                WMObject.Save()
                LOGGER.Info(" - die Indexinformationen des Dokuments speichern")
                ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, 
                ' wenn eine Datei nicht gesperrt ist
                Try
                    ' die Sperrung des Dokuments aufheben
                    WMObject.unlock()
                    LOGGER.Info(" - die Sperrung des Dokuments aufheben")
                Catch ex As Exception

                    ' nichts tun (Datei war nicht gesperrt)
                End Try

                ' die Indexierungsinformationen für den TreeView-Log zurückgeben
                Return True
            Else
                ' die Indexierungsinformationen für den TreeView-Log zurückgeben
                LOGGER.Info(" Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.")
            End If

        Catch ex As Exception
            LOGGER.Info(" Hinweis: Unbekannter Unexpected error inm Indexieren der Datei.")
            LOGGER.Error(ex.Message)
            LOGGER.Info(ex.Message)
        End Try

        Return True

    End Function

    ''' <summary>
    ''' Diese Funktion überprüft ob eine Variable ein Array ist, oder nicht.
    ''' </summary>
    ''' <param name="arrayOrNot">Variable die überprüft werden soll</param>
    ''' <returns>Liefert True wenn es sich um ein Array handelt, sonst False</returns>
    ''' <remarks></remarks>
    Private Shared Function IsArray(ByVal arrayOrNot As Object)

        Dim arrayType As String = UCase(arrayOrNot.GetType.ToString)

        ' überprüft an welcher Stelle sich ein '['-Zeichen befindet
        Dim position = InStr(arrayType, "[")

        ' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[])
        If Not position = 0 Then
            Return True
        Else
            Return False
        End If
    End Function


    ''' <summary>
    ''' Diese Funktion überprüft ob eine Variable eine ArrayList ist, oder nicht.
    ''' </summary>
    ''' <param name="arrayOrNot">Variable die überprüft werden soll</param>
    ''' <returns>Liefert True wenn es sich um eine ArrayList handelt, sonst False</returns>
    ''' <remarks></remarks>
    Private Shared Function IsArrayList(ByVal arrayOrNot As Object)

        Dim arrayType As String = UCase(arrayOrNot.GetType.ToString)

        ' überprüft an welcher Stelle sich ein '['-Zeichen befindet
        Dim position = InStr(arrayType, "[")

        ' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[])
        If arrayOrNot.GetType.ToString = "System.Collections.ArrayList" Then
            Return True
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Diese Funktion errechnet aus einem Datum den Unix-Timestamp
    ''' </summary>
    ''' <param name="FromDateTime">Datum, für das der Timestamp errechnet werden soll</param>
    ''' <returns>Liefert den Timestamp als Integer</returns>
    ''' <remarks></remarks>
    Private Shared Function GetTimestamp(ByVal FromDateTime As DateTime) As Integer

        If IsDate(FromDateTime) Then
            Dim Startdate As DateTime = #1/1/1970#
            Dim Spanne As TimeSpan

            ' vom Datum das Datum des "Beginns der Zeitrechnung" abziehen
            Spanne = FromDateTime.Subtract(Startdate)

            ' die Zeitspanne in einen Integer umwandeln
            Return CType(Math.Abs(Spanne.TotalSeconds()), Integer)
        Else
            Return 0
        End If
    End Function
    ''' <summary>
    ''' Liefert den Typen eines Indexes als Integer.
    ''' </summary>
    ''' <param name="indexname">Name des zu überprüfenden Indexfeldes</param>
    ''' <returns>Liefert eine Zahl, die einen Typen beschreibt</returns>
    ''' <remarks></remarks>
    Public Shared Function GetTypeOfIndexAsIntByName(ByVal indexname As String) As Integer
        Try
            Dim oAttribute = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname)
            Dim vType = oAttribute.getVariableValue("dwAttrType")
            Return vType
        Catch ex As Exception
            Return Nothing
        End Try
    End Function
    Private Shared Function CheckIndexValue(ByVal input)
        Try
            'Ersetzt die Versionierungen Tilde(~) und Klammern ((1))
            For i As Integer = 1 To 20
                If input.ToString.EndsWith("~" & i.ToString) Then
                    input = input.ToString.Replace("~" & i.ToString, "")
                ElseIf input.ToString.EndsWith("(" & i.ToString & ")") Then
                    input = input.ToString.Replace("(" & i.ToString & ")", "")
                End If

            Next

            Return input
        Catch ex As Exception
            LOGGER.Info("Fehler in CheckIndexValue: " & ex.Message)
            LOGGER.Error(ex.Message)
            Return Nothing
        End Try

    End Function

    Private Shared Function ToBoolean(input As String) As Boolean
        If String.IsNullOrEmpty(input) Then Return False
        Return (input.Trim().ToLower() = "true") OrElse (input.Trim() = "1")
    End Function

End Class
