Imports WINDREAMLib
Imports WINDREAMLib.WMCOMEvent
Imports WINDREAMLib.WMEntity
Imports WINDREAMLib.WMObjectEditMode
Imports WINDREAMLib.WMSearchOperator
Imports WINDREAMLib.WMSearchRelation
Imports WMOBRWSLib
Imports WMOSRCHLib
Imports WMCNNCTDLLLib
Imports WMOTOOLLib
Public Class Windream_alt
    Inherits Constants
#Region "+++++ Variables +++++"
    Private Shared Logger As NLog.Logger = NLog.LogManager.GetCurrentClassLogger

    Private ServerBrowser As IServerBrowser

    Private CurrentController As WMOSearchController
    Private CurrentSession As WMSession
    Private CurrentConnect As WMConnect
    Private CurrentServer As String
    Private CurrentObjecttypes As WMObjects

    Public ReadOnly Property ReconnectSession As Boolean
    Public ReadOnly Property DriveLetter As String
    Public ReadOnly Property Support64Bit As Boolean
    Public Property LoggedInSession As Boolean = False
#End Region
#Region "+++++ Init +++++"
    ''' <summary>
    ''' Initializes windream and creates a windream session with the actual user
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(
                  Optional DriveLetter As String = "W",
                  Optional ReconnectSession As Boolean = False,
                  Optional Support64Bit As Boolean = False,
                  Optional ServerName As String = Nothing,
                  Optional UserName As String = Nothing,
                  Optional UserPass As String = Nothing,
                  Optional UserDomain As String = Nothing
                  )
        Try
            Me.DriveLetter = DriveLetter
            Me.ReconnectSession = ReconnectSession
            Me.Support64Bit = Support64Bit

            Dim session As WMSession = NewSession(ServerName, UserName, UserPass, UserDomain)

            If session Is Nothing Then
                Throw New Exception("Login failed")
            End If

            CurrentSession = session
            CurrentServer = ServerName
            CurrentObjecttypes = GetObjectTypes()

        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub

    Public Function NewSession(Optional serverName As String = Nothing) As WMSession
        Dim browser As ServerBrowser
        Dim connect As WMConnect
        Dim session As WMSession
        Dim credentials As WMUserIdentity

        Try
            browser = New ServerBrowser()
            connect = New WMConnect()
            Logger.Info("Successfully created windream objects")
        Catch ex As Exception
            Logger.Error(ex, "Error while creating windream objects")
            Return Nothing
        End Try

        Try
            If serverName Is Nothing OrElse serverName.Length = 0 Then
                serverName = browser.GetCurrentServer()
            End If
        Catch ex As Exception
            Logger.Error(ex, "Error while getting current server")
            Return Nothing
        End Try

        Try
            credentials = New WMUserIdentity() With {
                .aServerName = serverName
            }
        Catch ex As Exception
            Logger.Error(ex, "Error while creating user identity")
            Return Nothing
        End Try

        Try
            session = connect.Login(credentials)
            'LoggedInSession = True
            CurrentServer = serverName

            Return session
        Catch ex As Exception
            Logger.Error(ex, "Error while logging in")
            Return Nothing
        End Try
    End Function

    Public Function NewSession(Optional serverName As String = Nothing, Optional userName As String = Nothing, Optional password As String = Nothing, Optional domain As String = Nothing) As WMSession
        Dim browser As ServerBrowser
        Dim connect As WMConnect
        Dim session As WMSession
        Dim credentials As WMUserIdentity

        Dim impersonation As Boolean
        Dim serverNameFromClient As Boolean

        Try
            browser = New ServerBrowser()
            connect = New WMConnect()
            Logger.Info("Successfully created windream objects")
        Catch ex As Exception
            Logger.Error(ex, "Error while creating windream objects")
            Return Nothing
        End Try

        ' If no server was supplied, try to get the current server set in the client
        Try
            If serverName Is Nothing OrElse serverName.Length = 0 Then
                serverName = browser.GetCurrentServer
                serverNameFromClient = True
            Else
                serverNameFromClient = False
            End If
        Catch ex As Exception
            Logger.Error(ex, "Error while getting Servername")
            Return Nothing
        End Try

        Logger.Info("Servername: {0}", serverName)
        Logger.Info("Servername aquired from client: {0}", serverNameFromClient)

        'TODO: Test connection to windream server

        ' If username, password and domain are set, login with impersonation
        ' Else, login with current credentials
        If userName IsNot Nothing And password IsNot Nothing And domain IsNot Nothing Then
            impersonation = True
            credentials = New WMUserIdentity() With {
                .aServerName = serverName,
                .aUserName = userName,
                .aPassword = password,
                .aDomain = domain
            }

            connect.ModuleId = 9

            Logger.Info("Impersonated Login: True")
            Logger.Info("Username: {0}", userName)
            Logger.Info("Domain: {0}", domain)
        Else
            impersonation = False
            credentials = New WMUserIdentity() With {
                .aServerName = serverName
            }

            Logger.Info("Impersonated Login: False")
            Logger.Info("Username: {0}", Environment.UserName)
            Logger.Info("Domain: {0}", Environment.UserDomainName)
        End If

        Try
            session = connect.Login(credentials)
        Catch ex As Exception
            Logger.Error(ex, "Error while logging in")
            Return Nothing
        End Try

        Try
            ' Standardmässig hinterlegen dass abgelegte Dateien keine Indexmaske öffnet
            session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
        Catch ex As Exception
            Logger.Error(ex, "Could not SwitchEvents")
            Return Nothing
        End Try

        If session.aLoggedin = False Then
            Logger.Warn("Session created but user {0} could not be logged in", Environment.UserName)
            Return Nothing
        End If

        Return session
    End Function


    Private Function GetObjectTypes() As WMObjects
        Dim objectTypes As WMObjects

        Try
            objectTypes = CurrentSession.GetWMObjectTypes(WMEntityDocument)
            Return objectTypes
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try
    End Function

    ''' <summary>
    ''' Returns all Objecttypes of current server as list of strings
    ''' </summary>
    ''' <returns>List of String of all objecttypes</returns>
    ''' <remarks></remarks>
    Public Function GetObjecttypeNames() As List(Of String)
        Dim objectTypes As New List(Of String)

        Try
            For i As Integer = 0 To CurrentObjecttypes.Count
                objectTypes.Add(CurrentObjecttypes.Item(i).aName)
            Next
            Return objectTypes
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try
    End Function

    Private Function NormalizePath(path As String)
        Dim normalizedPath = path

        If Not path.StartsWith("\") And path.ToUpper().StartsWith(DriveLetter.ToUpper) Then
            normalizedPath = path.Substring(2)
        End If

        Return normalizedPath
    End Function


    ''' <summary>
    ''' Creates a windream session with the current user and the current server
    ''' </summary>
    ''' <returns>Returns true when created, false if not</returns>
    ''' <remarks></remarks>
    'Public Function NewSession() As Boolean
    '    Try
    '        ServerBrowser = New ServerBrowser()
    '        CurrentServer = ServerBrowser.GetCurrentServer
    '    Catch ex As Exception
    '        Logger.Error(ex, "Could not create ServerBrowser")
    '        Return False
    '    End Try

    '    Try
    '        ' Create Connect Object for Session
    '        CurrentConnect = New WMConnect
    '    Catch ex As Exception
    '        Logger.Error(ex, "Could not create WMConnect")
    '        Return False
    '    End Try

    '    Try
    '        ' Create session object with severname set
    '        CurrentSession = CreateObject("Windream.WMSession", ServerBrowser.GetCurrentServer)
    '    Catch ex As Exception
    '        Logger.Error(ex, "Could not create WMConnect")
    '        Return False
    '    End Try

    '    Try
    '        CurrentConnect.LoginSession(CurrentSession)
    '        LoggedInSession = True
    '    Catch ex As Exception
    '        Logger.Error(ex, "Could not login session")
    '        Return False
    '    End Try

    '    Try
    '        ' Standardmässig hinterlegen dass abgelegte Dateien keine Indexmaske öffnet
    '        CurrentSession.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
    '    Catch ex As Exception
    '        Logger.Error(ex, "Could not SwitchEvents")
    '        Return False
    '    End Try

    '    If TestLoggedInSession() = False Then
    '        Logger.Warn("Session created but user {0} could not be logged in", Environment.UserName)
    '        Return False
    '    End If

    '    Return True
    'End Function
#End Region
#Region "+++++ New +++++"
    ''' <summary>
    ''' Creates a folder in windream. All folder-parts will be checked
    ''' </summary>
    ''' <param name="folderpath">full path of new folder</param>
    ''' <returns>Returns true when folder was created, false if not</returns>
    ''' <remarks></remarks>
    Public Function NewFolder(ByVal folderpath As String)
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            folderpath = NormalizePath(folderpath)
            Dim folders() As String = folderpath.Split("\")
            For Each folder As String In folders
                Dim WMObject As WINDREAMLib.WMObject
                If TestFolderExists(folder) = False Then
                    Try
                        WMObject = CurrentSession.GetNewWMObjectFS(WMEntityFolder, folder, WMObjectEditModeNoEdit)
                    Catch ex As Exception
                        Logger.Error(ex)
                        'clsLogger.Add("Could not create WMObject for folderpath '" & folder & "': " & ex.Message, True)
                        Return False
                    End Try

                End If
            Next
            Return True
        Catch ex As Exception
            Logger.Error(ex)
            'clsLogger.Add("Unexpected error in NewFolder: " & ex.Message, True)
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Indexes the file with the given values
    ''' </summary>
    ''' <param name="WMFile">full filepath</param>
    ''' <param name="indexname">Name of the index</param>
    ''' <param name="aValues">values as array</param>
    ''' <returns>Returns true when folder was created, false if not</returns>
    ''' <remarks></remarks>
    Public Function NewIndexFile(WMFile As String, ByVal indexname As String, ByVal aValues() As String) As Boolean
        If TestLoggedInSession() = False Then
            Return False
        End If
        Dim oWMFile As WMObject = GetWMObjectForFile(WMFile)
        If IsNothing(oWMFile) Then
            Return False
        End If
        Dim vektInsState As Integer = 1
        Try
            If Not oWMFile.aLocked Then
                oWMFile.lock()
            Else
                Logger.Info("WMDoc is locked already!")
                Return False
            End If


            If aValues.Length = 1 And aValues(0) = "" Then
                Logger.Info("Indexvalue is empty - No indexing")

                Return False
            End If
            Logger.Info("Indexing of index '" & indexname)

            Dim oWMType
            Try
                ' das entsprechende Attribut aus windream auslesen
                Dim oAttribute = CurrentSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname)
                ' den Variablentyp (String, Integer, ...) auslesen 
                oWMType = oAttribute.GetVariableValue("dwAttrType")
            Catch ex As Exception
                Logger.Error(ex)
                Return False
            End Try

            ' wenn in aValues an Position i ein Wert steht
            Dim i As Integer = 0
            Dim value = aValues(i)

            Dim oWMValueConverted = Nothing

            Dim vektor As Boolean = False
            'Den Typ des Index-Feldes auslesen
            Logger.Info("type of windreamIndex: " & oWMType.ToString)
            Select Case (oWMType)

                Case INDEX_TYPE_STRING
                    oWMValueConverted = CStr(value)
                Case INDEX_TYPE_INTEGER
                    value = value.ToString.Replace(" ", "")
                    value = value.ToString.Replace(" ", "")
                    oWMValueConverted = CInt(value)
                Case INDEX_TYPE_FLOAT
                    value = value.ToString.Replace(" ", "")
                    oWMValueConverted = CDbl(value)
                Case INDEX_TYPE_FIXED_POINT
                    value = value.ToString.Replace(" ", "")
                    oWMValueConverted = CDbl(value)
                Case INDEX_TYPE_BOOLEAN
                    oWMValueConverted = CBool(value)
                Case INDEX_TYPE_DATE
                    'Dim _date As Date = value
                    oWMValueConverted = value
                Case INDEX_TYPE_TIME
                    oWMValueConverted = CDbl(value)
                Case INDEX_TYPE_CURRENCY
                    '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))
                    oWMValueConverted = aValueWrapper
                Case INDEX_TYPE_TIME
                    'If ((value)) Then
                    '    oWMValueConverted = CDate(value)
                    'Else
                    '    oWMValueConverted = ""
                    'End If
                    'Dim _date As Date = value
                    oWMValueConverted = oWMValueConverted '*_date.ToShortTimeString
                Case INDEX_TYPE_FLOAT
                    oWMValueConverted = CStr(value)
                Case INDEX_TYPE_VARIANT

                    oWMValueConverted = CStr(value)
                Case INDEX_TYPE_FULLTEXT
                    oWMValueConverted = CStr(value)
                Case 4097
                    'Vektor alphanumerisch
                    vektor = True
                Case 4098
                    'Vektor Numerisch
                    vektor = True
                Case 4099
                    'Vektor Kommazahl
                    vektor = True
                Case 4100
                    'Vektor Kommazahl
                    vektor = True
                Case 4101
                    'Vektor Kommazahl
                    vektor = True
                Case 4103
                    'Vektor DateTime
                    vektor = True
                Case 4107
                    vektor = True
                Case 36865
                    'Vektor Kommazahl
                    vektor = True
                Case Else
                    oWMValueConverted = ""
            End Select
            If vektor = False Then
                If oWMValueConverted.ToString Is Nothing = False Then
                    Logger.Info("Converted value is: " & oWMValueConverted.ToString)
                End If
            End If
            '############################################################################################
            '####################### Der eigentliche Indexierungsvorgang ################################
            '############################################################################################
            If vektor = False Then
                Try
                    If oWMValueConverted.ToString Is Nothing = False Then
                        Logger.Info("Now: oWMFile.SetVariableValue(" & indexname & ", " & oWMValueConverted & ")")
                        oWMFile.SetVariableValue(indexname, oWMValueConverted)
                        'Die Datei speichern
                        oWMFile.Save()
                        Logger.Info("Index has been written!")
                    Else
                        Logger.Info("No indexvalue exists!")
                    End If
                Catch ex As Exception
                    Logger.Error(ex)
                    oWMFile.Save()
                    oWMFile.unlock()
                    Return False
                End Try

            Else
                Logger.Info("Vectorfield: Preparing of Array!")
                Dim myArray()
                Dim Anzahl As Integer = aValues.Length
                'Vektorfeld wird mit EINEM Wert gefüllt
                If Anzahl = 1 Then
                    Logger.Info("Vectorfield will be filled with ONE VALUE!")
                    ReDim myArray(0)
                    myArray(0) = Helpers.ConvertVectorType(oWMType, value)
                    'Jetzt überprüfen ob Werte in Vektorfeld angefügt oder überschrieben werden sollen
                    Logger.Info("Converted Value: " & myArray(0).ToString)
                    Dim VektorArray()
                    VektorArray = Return_VektorArray(oWMFile, indexname, myArray, oWMType)
                    If VektorArray Is Nothing = False Then
                        ReDim myArray(VektorArray.Length - 1)
                        Array.Copy(VektorArray, myArray, VektorArray.Length)
                        'Jetzt die Nachindexierung 
                        oWMFile.SetVariableValue(indexname, myArray) '
                        Logger.Info("Vectorindex has been written!")
                        'Die Änderungen festsschreiben/speichern
                        oWMFile.Save()
                    End If

                End If

            End If
            i += 1

            oWMFile.unlock()
            Logger.Info("...and unlock")
            Return True
        Catch ex As Exception
            Logger.Error(ex)
            oWMFile.Save()
            oWMFile.unlock()
            Return False
        End Try
    End Function
    Private Function NewLockWMFile(oWMFile As WMObject) As Boolean
        Try
            oWMFile.lock()
            Return True
        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Sets the folder-objecttype.
    ''' </summary>
    ''' <param name="folderpath">full path of folder</param>
    ''' <param name="folderObjecttype">Obcjectype Name</param>
    ''' <returns>Returns true when Otype was set, false if not</returns>
    ''' <remarks></remarks>
    Public Function NewObjecttypeForFolder(folderpath As String, folderObjecttype As String) As Boolean
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            Dim result As Boolean = False
            Dim WMFolder As WINDREAMLib.WMObject
            folderpath = NormalizePath(folderpath)

            If TestFolderExists(folderpath) = True Then
                WMFolder = CurrentSession.GetWMObjectByPath(WMEntityFolder, folderpath)
                Try
                    ' die Datei sperren
                    WMFolder.lock()
                Catch ex As Exception
                    ' nichts tun (Datei ist bereits gesperrt)
                End Try

                ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
                If WMFolder.aObjectType.aName = "Standard" Then

                    ' ihr den entsprechenden Dokumenttyp zuweisen
                    WMFolder.aObjectType = CurrentSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, folderObjecttype)
                    ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
                    Logger.Info("Objecttype has been set")
                    result = True
                Else
                    If WMFolder.aObjectType.aName <> "Standard" Then
                        Logger.Warn("An Objecttype has already been set!")
                    End If
                End If

                Try
                    WMFolder.Save()
                Catch ex As Exception
                    ' wenn es einen Fehler beim 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
                    WMFolder.unlock()
                Catch ex As Exception
                    ' wenn das entsperren nicht geklappt hat, dann war die Datei auch nicht gesperrt
                End Try
            End If
            Return result

        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Creates a new version of the file
    ''' </summary>
    ''' <param name="WMPath">full path to the file</param>
    ''' <param name="Comment">Comment</param>
    ''' <returns>Returns true when version was created, false if not</returns>
    ''' <remarks></remarks>
    Public Function NewVersion(ByVal WMPath As String, ByVal Comment As String)
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            WMPath = NormalizePath(WMPath)

            Dim WMObject As WMObject '= CreateObject("WINDREAMLib.WMObject")  'New WINDREAMLib.WMObject
            Try
                WMObject = CurrentSession.GetWMObjectByPath(WMEntityDocument, WMPath) 'WINDREAMLib.WMEntity.WMEntityDocument
            Catch ex As Exception
                Logger.Warn("Could not create WMObject in Create_Version for file '" & WMPath & "': " & ex.Message)
                Return False
            End Try
            WMObject.CreateVersion2(False, "HISTORY_New_From_Version", Comment)
            Return True
        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
#End Region
#Region "+++++ Get +++++"
    ''' <summary>
    ''' Returns all choicelists
    ''' </summary>
    ''' <returns>Choicelists as List of Strings or empty list if no choice lists are found</returns>
    Public Function GetChoiceLists() As List(Of String)
        Dim items As New List(Of String)

        If TestLoggedInSession() = False Then
            Return items
        End If

        Try
            Dim choiceLists As WMObjects
            Dim choiceList As IWMObject2
            'load list of choicelists
            choiceLists = CurrentSession.GetAllObjects(WMEntityChoiceList)

            For Each choiceList In choiceLists
                items.Add(choiceList.aName)
            Next

            Return items
        Catch ex As Exception
            Logger.Error(ex)
            Return items
        End Try
    End Function

    ''' <summary>
    ''' Returns all indices for an objecttype
    ''' </summary>
    ''' <param name="ObjecttypeName">Name of objecttype</param>
    ''' <returns>Names of indices as list of String</returns>
    ''' <remarks></remarks>
    Public Function GetIndicesByObjecttype(ByVal ObjecttypeName As String) As List(Of String)
        Try
            If TestLoggedInSession() = False Then
                Return Nothing
            End If

            Dim oObjectType As WMObject
            Dim oIndexAttributes As WMObjectRelation
            Dim oIndexAttribute As WMObject
            Dim oIndex As WMObject
            Dim oRelProperties As WMObjectRelation
            ' den Objekttyp laden
            oObjectType = CurrentSession.GetWMObjectByName(WMEntityObjectType, ObjecttypeName)

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

            ' Array für Indizes vorbereiten
            'Dim aIndexNames(oIndexAttributes.Count - 1) As String
            Dim indexNames As New List(Of 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)

                ' Indexname speichern
                'aIndexNames(j) = oIndex.aName
                indexNames.Add(oIndex.aName)
            Next

            ' Indexarray zurückgeben
            'Return aIndexNames
            Return indexNames

        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try
    End Function

    ''' <summary>
    ''' Returns all items of a choicelist
    ''' </summary>
    ''' <param name="NameChoicelist">name of choicelist</param>
    ''' <returns>Items as list of String</returns>
    ''' <remarks></remarks>
    Public Function GetChoicelistItems(ByVal NameChoicelist As String) As List(Of String)
        Dim items As New List(Of String)

        If TestLoggedInSession() = False Then
            Return Nothing
        End If

        Dim choiceList As WMObject

        ' Try to get the choicelist first and abort if an error occurs
        Try
            Dim session As IWMSession2 = DirectCast(CurrentSession, IWMSession2)
            choiceList = session.GetWMObjectByName(WMEntityChoiceList, NameChoicelist)
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try

        ' Try to get choicelist items
        Try
            Dim values As Object = choiceList.GetVariableValue("vItems")

            ' If values is nothing, the list is empty
            If values Is Nothing Then
                Return items
            End If

            For Each value In values
                items.Add(value)
            Next
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try

        Return items
    End Function

    ''' <summary>
    ''' Returns the result of windream-search
    ''' </summary>
    ''' <param name="wdfLocation">filepath of windreamSearch-file</param>
    ''' <param name="NameIndexDocID">Name of the Docid Index </param>
    ''' <returns>Returns datatable</returns>
    ''' <remarks></remarks>
    Public Function GetSearchDocuments(ByVal wdfLocation As String, NameIndexDocID As String) As DataTable
        Dim dtresult As New DataTable
        dtresult.Columns.Add("DOC_ID", GetType(Integer))
        dtresult.Columns.Add("PATH", GetType(String))
        If TestLoggedInSession() = False Then
            Return dtresult
        End If
        If TestWMFileExists(wdfLocation) = False Then
            Return dtresult
        End If
        Try
            Dim ProfileName = wdfLocation.Substring(wdfLocation.LastIndexOf("\") + 1)
            Dim ProfilePath = wdfLocation.Substring(0, wdfLocation.Length - ProfileName.Length)

            CurrentController = New WMOSearchController
            CurrentController.CheckSearchProfile(wdfLocation.ToLower)
            Dim suchTyp = CurrentController.SearchProfileTargetProgID
            Dim ExSettings As Object
            Dim oSearch As Object
            ExSettings = CurrentController.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")
            Dim suchTyp1 = suchTyp.ToString.ToUpper
            ''  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", CurrentServer)

                    CurrentConnect.LoginSession(srchQuick.WMSession)

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

                    oSearch = srchQuick.GetSearch()

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

                    CurrentConnect.LoginSession(srchIndex.WMSession)

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

                    oSearch = srchIndex.GetSearch()

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

                    CurrentConnect.LoginSession(srchObjectType.WMSession)

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

                    oSearch = srchObjectType.GetSearch()

                Case Else
                    Logger.Warn("No valid WM-SearchType")
                    Return dtresult
            End Select
            Dim WMObjects As Object
            WMObjects = oSearch.Execute
            'If returnDT = True Then
            If WMObjects.Count > 0 Then

                For Each dok As WMObject In WMObjects
                    Dim path As String = dok.aPath
                    Dim DOC_ID = dok.GetVariableValue(NameIndexDocID)
                    Logger.Info("Adding DocInfo for DocID: " & DOC_ID.ToString)
                    dtresult.Rows.Add(DOC_ID, path)

                Next
                dtresult.AcceptChanges()
            End If
            Return dtresult
        Catch ex As Exception
            Logger.Error(ex)
            Return dtresult
        End Try
    End Function
    ''' <summary>
    ''' Returns a windream-type as Integer.
    ''' </summary>
    ''' <param name="indexname">Name of indexfield</param>
    ''' <returns>Returns integer, which describes the type</returns>
    ''' <remarks></remarks>
    Public Function GetTypeOfIndexAsInt(ByVal indexname As String) As Integer
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            Dim oAttribute = CurrentSession.GetWMObjectByName(WMEntityAttribute, indexname)
            Dim vType = oAttribute.GetVariableValue("dwAttrType")
            Return vType
        Catch ex As Exception
            Return Nothing
        End Try
    End Function
    ''' <summary>
    ''' Returns the value(s) for an index as a datatable
    ''' </summary>
    ''' <param name="WMFile">filepath of windream-file</param>
    ''' <param name="NameIndex">Name of the index </param>
    ''' <returns>Datatable</returns>
    ''' <remarks></remarks>
    Public Function GetValueforIndex(ByVal WMFile As String, ByVal NameIndex As String) As DataTable
        Dim dt As New DataTable
        dt.Columns.Add("RESULT", GetType(String))
        If TestLoggedInSession() = False Then
            Return dt
        End If
        Try

            If Not WMFile.StartsWith("\") And WMFile.ToUpper.StartsWith(DriveLetter.ToUpper) Then
                WMFile = WMFile.Substring(2)
            End If
            Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject")  'New WINDREAMLib.WMObject
            Try
                WMObject = CurrentSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WMFile) 'WINDREAMLib.WMEntity.WMEntityDocument
            Catch ex As Exception
                Logger.Error(ex)
                Return dt
            End Try

            Dim result = WMObject.GetVariableValue(NameIndex)
            If IsNothing(result) Then
                Return Nothing
            Else
                If result.GetType.ToString.Contains("System.Object") Then
                    For Each val As String In result
                        dt.Rows.Add(val)
                    Next
                    dt.AcceptChanges()
                Else
                    dt.Rows.Add(result)
                End If
            End If
            Return dt
        Catch ex As Exception
            Logger.Error(ex)
            Return dt
        End Try
    End Function
    ''' <summary>
    ''' Returns the values for a vektorfield plus the new ones
    ''' </summary>
    ''' <param name="oDocument">windream-file as Object</param>
    ''' <param name="vktIndexName">Name of the index </param>
    ''' <returns>Returns value as Datatable</returns>
    ''' <remarks></remarks>
    Public Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, arrIndexwerte As Object, vType As Object)
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            Dim missing As Boolean = False
            Dim valueCount As Integer = 0
            Dim ValueArray() = Nothing
            'Jeden Wert des Vektorfeldes durchlaufen
            Dim DT_RESULT = GetValueforIndex(oDocument.aPath, vktIndexName)
            If DT_RESULT.Rows.Count > 0 Then
                'Erst die aktuellen Werte speichern und schreiben
                For Each row As DataRow In DT_RESULT.Rows

                    ReDim Preserve ValueArray(valueCount)
                    'Den Wert im Array speichern
                    ValueArray(valueCount) = Helpers.ConvertVectorType(vType, row.Item(0))
                    valueCount += 1
                Next
                'Jetzt die Neuen Werte auf Duplikate überprüfen
                For Each NewValue As Object In arrIndexwerte
                    If NewValue Is Nothing = False Then
                        If ValueArray.Contains(NewValue) = False Then
                            'Das Array anpassen
                            ReDim Preserve ValueArray(valueCount)
                            'Den Wert im Array speichern
                            ValueArray(valueCount) = Helpers.ConvertVectorType(vType, NewValue)
                            valueCount += 1
                        Else
                            Logger.Info("Value '" & NewValue.ToString & "' already existing in vectorfield(1)")

                        End If
                    End If
                Next
            Else
                Logger.Info(" vectorfield is empty....")

                'Den/die Neuen Wert(e) anfügen
                For Each NewValue As Object In arrIndexwerte
                    If NewValue Is Nothing = False Then
                        If ValueArray Is Nothing = False Then
                            If ValueArray.Contains(NewValue) = False Then
                                'Das Array anpassen
                                ReDim Preserve ValueArray(valueCount)
                                'Den Wert im Array speichern
                                ValueArray(valueCount) = Helpers.ConvertVectorType(vType, NewValue)
                                valueCount += 1
                            Else
                                Logger.Info("Value '" & NewValue.ToString & "' already existing in vectorfield(2)")

                            End If
                        Else 'Dererste Wert, also hinzufügen
                            'Das Array anpassen
                            ReDim Preserve ValueArray(valueCount)
                            'Den Wert im Array speichern
                            ValueArray(valueCount) = Helpers.ConvertVectorType(vType, NewValue)
                            valueCount += 1

                        End If


                    End If
                Next
            End If

            Return ValueArray
        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Function
    ''' <summary>
    ''' Returns a WMObject if file exists
    ''' </summary>
    ''' <param name="WMPath">full path to the file</param>
    ''' <returns>Returns WMObject</returns>
    ''' <remarks></remarks>
    Public Function GetWMObjectForFile(ByVal WMPath As String) As WMObject
        Try
            If TestLoggedInSession() = False Then
                Return Nothing
            End If
            WMPath = NormalizePath(WMPath)
            Dim oWMObject As WINDREAMLib.WMObject
            Try
                oWMObject = CurrentSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WMPath)
            Catch ex As Exception
                Logger.Warn("Could not create WMObject for file '" & WMPath & "': " & ex.Message)
                Return Nothing
            End Try
            Return oWMObject
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try
    End Function
#End Region
#Region "+++++ Test +++++"
    ''' <summary>
    ''' Checks if the folder exists
    ''' </summary>
    ''' <param name="folderpath">The path of the folder</param>
    ''' <returns>True if exists or false if not or error occured</returns>
    ''' <remarks></remarks>
    Public Function TestFolderExists(folderpath As String)
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            folderpath = NormalizePath(folderpath)
            Try
                Dim exists = CurrentSession.WMObjectExists(WMEntityFolder, folderpath, 0, 0)
                Return exists
            Catch ex As Exception
                Logger.Error(ex)
                Return False
            End Try
        Catch ex As Exception
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Checks wether file exists in windream
    ''' </summary>
    ''' <param name="WMPath">full path to the file</param>
    ''' <returns>Returns true when file was deleted, false if not</returns>
    ''' <remarks></remarks>
    Public Function TestWMFileExists(ByVal WMPath As String)
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            WMPath = NormalizePath(WMPath)
            If IsNothing(GetWMObjectForFile(WMPath)) Then
                Return False
            Else
                Return True
            End If
        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function


    Private Function TestLoggedInSession() As Boolean
        Try
            If CurrentSession.aLoggedin Then
                Return True
            Else
                Logger.Warn("There is no active WM-SSession!")
                Return False
            End If
        Catch ex As Exception
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Checks if user exists in windream.
    ''' </summary>
    ''' <param name="username">test username</param>
    ''' <returns>Returns true if exists, false if not</returns>
    ''' <remarks></remarks>
    Public Function TestWMUSerExists(username As String) As Boolean
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            Return CurrentSession.WMObjectExists(WMEntityUser, username, 0, 0)
        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Checks if group exists in windream.
    ''' </summary>
    ''' <param name="groupname">test username</param>
    ''' <returns>Returns true if exists, false if not</returns>
    ''' <remarks></remarks>
    Public Function TestWMGroupExists(groupname As String)
        Try
            If TestLoggedInSession() = False Then
                Return False
            End If
            Return CurrentSession.WMObjectExists(WMEntityGroups, groupname, 0, 0)
        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
#End Region
#Region "+++++ Remove +++++"
    ''' <summary>
    ''' Deletes a file in windream including all preversions
    ''' </summary>
    ''' <param name="WMPath">full path to the file</param>
    ''' <returns>Returns true when file was deleted, false if not</returns>
    ''' <remarks></remarks>
    Public Function RemFile(ByVal WMPath As String)
        Try
            Const COL_Document_VersionID = "dwVersionID"
            Const WMObjectPartVersion = 128
            Dim oUnexpected_Error As Boolean = False
            WMPath = NormalizePath(WMPath)
            Dim oWMObject = GetWMObjectForFile(WMPath)
            If IsNothing(oWMObject) = False Then
                Try
                    If (oWMObject.aPart And WMObjectPartVersion) Then
                        Dim oWMObjects As WMObjects
                        Dim oWMVersion As WMObject
                        Dim iCount As Integer
                        oWMObjects = oWMObject.aVersions
                        iCount = oWMObjects.Count
                        If iCount > 0 Then
                            For Each oWMVersion In oWMObjects
                                oWMVersion.Delete()
                                Logger.Info($">> Deleted version '{oWMVersion.GetVariableValue(COL_Document_VersionID)}' of file '{oWMVersion.aName}'!")
                            Next
                        End If
                    End If
                Catch ex As Exception
                    Logger.Warn($"Unexpected Error in CheckingDeleting Prevesions: {ex.Message}")
                    oUnexpected_Error = True
                End Try
                If oUnexpected_Error = False Then
                    oWMObject.Delete()
                    Logger.Info($">> File '{oWMObject.aName}' has been deleted!")
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
    ''' <summary>
    ''' Removes the vektorlink from windream
    ''' </summary>
    ''' <param name="WMPath">full path to the file</param>
    ''' <param name="vktIndexName">Indexname of Vektor-Index</param>
    ''' <param name="deleteValue">Value which is to be deleted</param>
    ''' <returns>Returns true when indexing was successfull, false if not</returns>
    ''' <remarks></remarks>
    Public Function REMOVE_VEKTOR_LINK(ByVal WMPath As String, vktIndexName As String, deleteValue As String)
        Try
            Logger.Info("Removing Value '" & deleteValue & "' of Index '" & vktIndexName & "' " & WMPath)
            Dim oWMFile As WMObject = GetWMObjectForFile(WMPath)
            If IsNothing(oWMFile) Then
                Logger.Warn("Exit from REMOVE_VEKTOR_LINK...")
                Return False
            End If
            Dim containsvalue As Boolean = False
            Dim ValueArray() = Nothing
            'Jeden Wert des Vektorfeldes durchlaufen
            Dim WMValue = oWMFile.GetVariableValue(vktIndexName)
            If WMValue Is Nothing = False Then
                'Nochmals prüfen ob wirklich Array
                If WMValue.GetType.ToString.Contains("System.Object") Then
                    ' das entsprechende Attribut aus windream auslesen
                    Dim oAttribute = CurrentSession.GetWMObjectByName(WMEntityAttribute, vktIndexName)
                    ' den Variablentyp (String, Integer, ...) auslesen 
                    Dim vType = oAttribute.getVariableValue("dwAttrType")
                    Dim Anzahl As Integer = 0
                    For Each WDValue As Object In WMValue
                        If WDValue Is Nothing = False Then
                            If WDValue = deleteValue Then
                                containsvalue = True
                                Logger.Info("The Index contains the value to be deleted!")
                            End If
                            If WDValue <> deleteValue Then
                                'Erst die ALten Werte schreiben
                                ReDim Preserve ValueArray(Anzahl)
                                'Den Wert im Array speichern
                                ValueArray(Anzahl) = Helpers.ConvertVectorType(vType, WDValue)
                                Anzahl += 1
                            End If
                        End If
                    Next
                Else
                    Logger.Warn("Index is not a vector")
                    Return False
                End If
            Else
                Logger.Warn("oWMObject is nothing")
                Return True
            End If

            If containsvalue = True Then 'And Not IsNothing(ValueArray)
                If NewLockWMFile(oWMFile) = False Then
                    Return False
                End If
                'Indexiern des Vektorfeldes
                oWMFile.SetVariableValue(vktIndexName, ValueArray)
                ' die Indexinformationen des Dokuments speichern
                oWMFile.Save()
                Logger.Info("The new vectorvalues were saved!")
                ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, 
                Try
                    ' die Sperrung des Dokuments aufheben
                    oWMFile.unlock()

                Catch ex As Exception
                    ' nichts tun (Datei war nicht gesperrt)
                End Try
                'Zurückgeben
                Return True
            Else
                Logger.Info("containsvalue is not true")
                Return True
            End If

        Catch ex As Exception
            Logger.Error(ex)
            Return False
        End Try
    End Function
#End Region
End Class
