Imports WINDREAMLib Imports WINDREAMLib.WMCOMEvent Imports WINDREAMLib.WMEntity Imports WINDREAMLib.WMObjectEditMode Imports WINDREAMLib.WMSearchOperator Imports WINDREAMLib.WMSearchRelation Imports WMOBRWSLib Imports WMOSRCHLib Public Class Windream Inherits Constants #Region "+++++ Variables +++++" Private Shared Logger As NLog.Logger = NLog.LogManager.GetCurrentClassLogger Public CurrentSession = Nothing Public CurrentSessionIsLoggedIn As Boolean = False Private CurrentObjecttypes As WINDREAMLib.WMObjects Private CurrentController As WMOSearchController Private Shared CurrentWMConnect ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht) Public CurrentWMServer As String Private WMDriveLetter As String = "W" Private _Session_Reconnect As Boolean = False #End Region #Region "+++++ Init +++++" ''' ''' Initializes windream and creates a windream session with the actual user ''' ''' Public Sub New(WMDRIVE As String, SessionReconnect As Boolean) Try WMDriveLetter = WMDRIVE NewSession() Catch ex As Exception Logger.Error(ex) End Try End Sub ''' ''' Creates a windream session with the actual user ''' ''' Returns true when created, false if not ''' Public Function NewSession() Try Dim wmbrwsr wmbrwsr = CreateObject("WMOBrws.ServerBrowser") '================================================================== ' get the current DMS-server to log in '================================================================== CurrentWMServer = wmbrwsr.GetCurrentServer Logger.Info("ECMServer: " & CurrentWMServer) Dim Connect Try Connect = CreateObject("Windream.WMConnect") Logger.Info("...connected to windream!") Catch ex As Exception CurrentSession = Nothing CurrentSessionIsLoggedIn = False Logger.Error(ex) Return False End Try '================================================================== ' create a session '================================================================== 'Prüfen ob sich personifiziert angemeldet werden muss? Try CurrentSession = CreateObject("Windream.WMSession", CurrentWMServer) Catch ex As Exception CurrentSession = Nothing CurrentSessionIsLoggedIn = False Logger.Error(ex) Return False End Try '================================================================== ' login session '================================================================== Try Connect.LoginSession(CurrentSession) If CurrentSession.aLoggedin Then CurrentWMConnect = Connect CurrentSessionIsLoggedIn = True Logger.Info("UserSession has been created!") Try 'Standardmässig hinterlegen dass abgelegte Dateien keine Indexmaske öffnet CurrentSession.SwitchEvents(WMCOMEventWMSessionNeedIndex, False) ' der Parameter WMEntityDocument definiert, dass nur Dokumenttypen und keine ' Ordnertypen ausgelesen werden CurrentObjecttypes = CurrentSession.GetWMObjectTypes(WINDREAMLib.WMEntity.WMEntityDocument) Catch ex As Exception Logger.Error(ex) 'clsLogger.Add("Could not get Objecttypes: " & ex.Message, True) End Try Return True Else CurrentSessionIsLoggedIn = False Logger.Warn("Session could be built but user cannot be logged in!") Return False End If Catch ex As Exception If Not IsNothing(CurrentSession) Then If CurrentSession.aLoggedin Then Logger.Info("User is already logged in!....") CurrentSessionIsLoggedIn = True Else CurrentSessionIsLoggedIn = False End If Return True Else Logger.Error(ex) CurrentSession = Nothing CurrentSessionIsLoggedIn = False Return False End If End Try Catch ex As Exception CurrentSession = Nothing CurrentSessionIsLoggedIn = False Logger.Error(ex) 'clsLogger.Add("Unexpected Error in Create Session: " & ex.Message, True) Return False End Try End Function #End Region #Region "+++++ New +++++" Public Function NewFile() End Function ''' ''' Creates a folder in windream. All folder-parts will be checked ''' ''' full path of new folder ''' Returns true when folder was created, false if not ''' Public Function NewFolder(ByVal folderpath As String) Try If folderpath.StartsWith("\") = False And folderpath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then folderpath = folderpath.Substring(2) End If 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 ''' ''' Indexes the file with the given values ''' ''' full filepath ''' Name of the index ''' values as array ''' Returns true when folder was created, false if not ''' Public Function NewIndexFile(WMFile As String, ByVal indexname As String, ByVal aValues() As String) As Boolean If TestSession() = 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 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.Convert_VectorType(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 ''' ''' Sets the folder-objecttype. ''' ''' full path of folder ''' Obcjectype Name ''' Returns true when Otype was set, false if not ''' Public Function NewObjecttypeForFolder(folderpath As String, folderObjecttype As String) Try Dim result As Boolean = False Dim WMFolder As WINDREAMLib.WMObject If folderpath.StartsWith("\") = False And folderpath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then folderpath = folderpath.Substring(2) End If 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 Return result End If Catch ex As Exception Logger.Error(ex) Return False End Try End Function ''' ''' Creates a new version of the file ''' ''' full path to the file ''' Comment ''' Returns true when version was created, false if not ''' Public Function NewVersion(ByVal WMPath As String, ByVal Comment As String) Try If WMPath.StartsWith("\") = False And WMPath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then WMPath = WMPath.Substring(2) End If Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject Try WMObject = CurrentSession.GetWMObjectByPath(WINDREAMLib.WMEntity.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 +++++" ''' ''' Returns all choicelists ''' ''' choicelists as String-Array ''' Public Function GetChoiceLists() As DataTable Dim dtresult As New DataTable dtresult.Columns.Add("RESULT", GetType(String)) Try Dim oChoiceLists As WMObjects Dim oChoiceList As IWMObject2 ' den Objekttyp laden oChoiceLists = CurrentSession.GetAllObjects(WMEntityChoiceList) 'Array für Indizes vorbereiten For j As Integer = 0 To oChoiceLists.Count() - 1 ' aktuellee Liste ausleseb auslesen oChoiceList = oChoiceLists.Item(j) dtresult.Rows.Add(oChoiceList.aName) Next dtresult.AcceptChanges() Return dtresult Catch ex As Exception Logger.Error(ex) Return dtresult End Try End Function ''' ''' Returns all indices for an objecttype ''' ''' Name of objecttype ''' Name of containing indices as String-Array ''' Public Function GetIndicesByObjecttype(ByVal ObjecttypeName As String) As String() Try 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 ' 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 Next ' Indexarray zurückgeben Return aIndexNames Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function ''' ''' Returns all items of a choicelist ''' ''' name of choicelist ''' items as String-Array ''' Public Function GetChoicelistItems(ByVal NameChoicelist As String) As DataTable Dim dtresult As New DataTable dtresult.Columns.Add("RESULT", GetType(String)) Try 'Dim oAttribute = Me.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname) 'Dim vType = oAttribute.getVariableValue("vItems") 'Return vType Dim oChoiceList = CurrentSession.GetWMObjectByName(WMEntityChoiceList, NameChoicelist) If Err.Number = 0 And TypeName(oChoiceList) <> "Nothing" Then Dim Values = oChoiceList Values = oChoiceList.GetVariableValue("vItems") Dim anz As Integer = 0 For Each CLItem In Values If oChoiceList.aName IsNot Nothing Then anz += 1 End If Next Dim strListe(anz - 1) Dim zahl As Integer = 0 For Each CLItem In Values If oChoiceList.aName IsNot Nothing Then dtresult.Rows.Add(CLItem) strListe(zahl) = CLItem zahl += 1 End If dtresult.AcceptChanges() Next Return dtresult Else Logger.Warn("WMchoicelist: " & NameChoicelist & " not found!") Return dtresult End If Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function ''' ''' Returns all Objecttypes of current server as array of strings ''' ''' array(String) of all objecttypes ''' Public Function GetObjecttypesAsStrings() As DataTable Dim dtresult As New DataTable dtresult.Columns.Add("RESULT", GetType(String)) Try For i As Integer = 0 To CurrentObjecttypes.Count dtresult.Rows.Add(CurrentObjecttypes.Item(i).aName) Next dtresult.AcceptChanges() Return dtresult Catch ex As Exception Logger.Error(ex) Return dtresult End Try End Function ''' ''' Returns the result of windream-search ''' ''' filepath of windreamSearch-file ''' Name of the Docid Index ''' Returns datatable ''' Public Function GetSearchDocuments(ByVal wdfLocation As String, NameIndexDocID As String) Dim dt As New DataTable dt.Columns.Add("DOC_ID", GetType(Integer)) dt.Columns.Add("PATH", GetType(String)) 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", CurrentWMServer) CurrentWMConnect.LoginSession(srchQuick.WMSession) srchQuick.ClearSearch() srchQuick.SearchProfilePath = ProfilePath srchQuick.LoadSearchProfile(ProfileName) oSearch = srchQuick.GetSearch() Case "WMOSRCH.WMINDEXSEARCH" srchIndex.WMSession = CreateObject("Windream.WMSession", CurrentWMServer) CurrentWMConnect.LoginSession(srchIndex.WMSession) srchIndex.ClearSearch() srchIndex.SearchProfilePath = ProfilePath srchIndex.LoadSearchProfile(ProfileName) oSearch = srchIndex.GetSearch() Case "WMOSRCH.WMOBJECTTYPESEARCH" srchObjectType.WMSession = CreateObject("Windream.WMSession", CurrentWMServer) CurrentWMConnect.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 '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) dt.Rows.Add(DOC_ID, path) Next dt.AcceptChanges() End If Return dt Catch ex As Exception Logger.Error(ex) Return dt End Try End Function ''' ''' Returns a windream-type as Integer. ''' ''' Name of indexfield ''' Returns integer, which describes the type ''' Public Function GetTypeOfIndexAsInt(ByVal indexname As String) As Integer Try Dim oAttribute = CurrentSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname) Dim vType = oAttribute.getVariableValue("dwAttrType") Return vType Catch ex As Exception Return Nothing End Try End Function ''' ''' Returns the value(s) for an index as a datatable ''' ''' filepath of windream-file ''' Name of the index ''' Datatable ''' 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 TestSession() = False Then Return dt End If Try If Not WMFile.StartsWith("\") And WMFile.ToUpper.StartsWith(WMDriveLetter.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 ''' ''' Returns the values for a vektorfield plus the new ones ''' ''' windream-file as Object ''' Name of the index ''' Returns value as Datatable ''' Public Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, arrIndexwerte As Object, vType As Object) Try Dim missing As Boolean = False Dim valueCount As Integer = 0 Dim ValueArray() '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.Convert_VectorType(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.Convert_VectorType(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.Convert_VectorType(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.Convert_VectorType(vType, NewValue) valueCount += 1 End If End If Next End If Return ValueArray Catch ex As Exception Logger.Error(ex) End Try End Function ''' ''' Returns a WMObject if file exists ''' ''' full path to the file ''' Returns WMObject ''' Public Function GetWMObjectForFile(ByVal WMPath As String) As WMObject Try If WMPath.StartsWith("\") = False And WMPath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then WMPath = WMPath.Substring(2) End If 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 +++++" ''' ''' Checks if the folder exists ''' ''' The path of the folder ''' True if exists or false if not or error occured ''' Public Function TestFolderExists(folderpath As String) Try If folderpath.StartsWith("\") = False And folderpath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then folderpath = folderpath.Substring(2) End If 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 ''' ''' Checks wether file exists in windream ''' ''' full path to the file ''' Returns true when file was deleted, false if not ''' Public Function TestFileExists(ByVal WMPath As String) Try If WMPath.StartsWith("\") = False And WMPath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then WMPath = WMPath.Substring(2) End If Try Dim WMObject As WINDREAMLib.WMObject = CurrentSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WMPath) Catch ex As Exception Logger.Warn("Could not create WMObject for file '" & WMPath & "' - so it is not existing") Return False End Try Return True Catch ex As Exception Logger.Error(ex) Return False End Try End Function Private Function TestSession() 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 #End Region #Region "+++++ Remove +++++" ''' ''' Deletes a file in windream ''' ''' full path to the file ''' Returns true when file was deleted, false if not ''' Public Function RemFile(ByVal WMPath As String) Try If WMPath.StartsWith("\") = False And WMPath.ToUpper.StartsWith(WMDriveLetter.ToUpper) Then WMPath = WMPath.Substring(2) End If Dim oWMObject = GetWMObjectForFile(WMPath) If IsNothing(oWMObject) = False Then oWMObject.Delete() Return True Else Return False End If Catch ex As Exception Logger.Error(ex) Return False End Try End Function ''' ''' Removes the vektorlink from windream ''' ''' full path to the file ''' Indexname of Vektor-Index ''' Value which is to be deleted ''' Returns true when indexing was successfull, false if not ''' 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 WINDREAMLib.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() '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(WINDREAMLib.WMEntity.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.Convert_VectorType(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