From d2427b191b5a0d59fd406eb232d55f38a65268f4 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 3 Sep 2018 16:35:20 +0200 Subject: [PATCH] WIP: Windream2 --- Modules.Windream/ConnectionBuilder.vb | 2 +- Modules.Windream/Helpers.vb | 37 ++++++-- Modules.Windream/Windream2.vb | 132 +++++++++++++++----------- 3 files changed, 103 insertions(+), 68 deletions(-) diff --git a/Modules.Windream/ConnectionBuilder.vb b/Modules.Windream/ConnectionBuilder.vb index 53f102c1..f709fdfc 100644 --- a/Modules.Windream/ConnectionBuilder.vb +++ b/Modules.Windream/ConnectionBuilder.vb @@ -3,7 +3,7 @@ Public Class ConnectionBuilder Implements IConnectionBuilder - Private LogFactory As LogFactory + Private ReadOnly LogFactory As LogFactory Private SessionReconnect As Boolean = False Private DriveLetter As String = "W" Private Support64Bit As Boolean = False diff --git a/Modules.Windream/Helpers.vb b/Modules.Windream/Helpers.vb index a410b39b..ff0c6d9d 100644 --- a/Modules.Windream/Helpers.vb +++ b/Modules.Windream/Helpers.vb @@ -1,22 +1,37 @@ -Public Class Helpers - Inherits Constants +Imports DigitalData.Modules.Windream.Constants + +Public Class Helpers + Private Shared ReadOnly VectorIndicies As List(Of Integer) = New List(Of Integer) From { + INDEX_TYPE_VECTOR_BOOLEAN, + INDEX_TYPE_VECTOR_CURRENCY, + INDEX_TYPE_VECTOR_DATE, + INDEX_TYPE_VECTOR_DATE_TIME, + INDEX_TYPE_VECTOR_FIXED_POINT, + INDEX_TYPE_VECTOR_FLOAT, + INDEX_TYPE_VECTOR_INTEGER, + INDEX_TYPE_VECTOR_INTEGER_64BIT, + INDEX_TYPE_VECTOR_STRING, + INDEX_TYPE_VECTOR_TIME + } + Friend Shared Function ConvertVectorType(vType As Object, value As String) Select Case vType Case INDEX_TYPE_HASH ' 36865 'Umwandeln in String - Return CStr(value) + Return value Case INDEX_TYPE_VECTOR_STRING '4097 'Umwandeln in String - Return CStr(value) + Return value Case INDEX_TYPE_VECTOR_INTEGER '4098 'Umwandeln in Integer - value = value.ToString.Replace(" ", "") + value = value.Replace(" ", "") Return CInt(value) Case INDEX_TYPE_VECTOR_FLOAT '4099 - Dim Str As String = value - Str = Str.ToString.Replace(" ", "") + value = value. + Replace(" ", ""). + Replace(".", ",") 'Umwandeln in Double - Return CDbl(Str.Replace(".", ",")) + Return CDbl(value) Case INDEX_TYPE_VECTOR_BOOLEAN '4100 'Umwandeln in Boolean Return CBool(value) @@ -30,7 +45,11 @@ Return value Case Else 'Umwandeln in String - Return CStr(value) + Return value End Select End Function + + Friend Shared Function IsVectorIndex(indexType As Integer) + Return VectorIndicies.Contains(indexType) + End Function End Class diff --git a/Modules.Windream/Windream2.vb b/Modules.Windream/Windream2.vb index 8363c524..1a4b1ee2 100644 --- a/Modules.Windream/Windream2.vb +++ b/Modules.Windream/Windream2.vb @@ -56,16 +56,17 @@ Imports System.IO ''' ''' EXAMPLES: ''' -''' REMARKS: +''' REMARKS: This class should not be instanciated directly. Instead, ConnectionBuilder should be used. ''' Public Class Windream2 #Region "Private Properties" - Private _logger As Logger - Private _loggerFactory As LogFactory + Private ReadOnly _logger As Logger + Private ReadOnly _loggerFactory As LogFactory + + Private ReadOnly Property _sessionDomain As String + Private ReadOnly Property _sessionPassword As String + Private ReadOnly Property _sessionUsername As String - Private ReadOnly _sessionDomain As String - Private ReadOnly _sessionPassword As String - Private ReadOnly _sessionUsername As String #End Region #Region "Public Properties" Public ReadOnly Property ClientDriveLetter As String @@ -116,8 +117,6 @@ Public Class Windream2 Throw New Exceptions.SessionException() End If - - ' Set properties of currently established session Session = oSession SessionLoggedin = True @@ -141,6 +140,7 @@ Public Class Windream2 Dim oImpersonation As Boolean Dim oServerNameFromClient As Boolean + ' Create initial windream objects Try oBrowser = New ServerBrowser() oConnect = New WMConnect() @@ -166,7 +166,17 @@ Public Class Windream2 _logger.Info("Servername: {0}", ServerName) _logger.Info("Servername aquired from client: {0}", oServerNameFromClient) - 'TODO: Test connection to windream server + 'Test connection to windream server + Try + Dim response = My.Computer.Network.Ping(ServerName) + If response = False Then + _logger.Warn("Windream Server {0} refused connection", ServerName) + Return Nothing + End If + Catch ex As Exception + _logger.Error(ex) + Return Nothing + End Try ' If username, password and domain are set, login with impersonation ' Else, login with current credentials @@ -211,6 +221,7 @@ Public Class Windream2 Return Nothing End If + _logger.Info("Connection to {0} established!", ServerName) Return oSession End Function @@ -223,12 +234,11 @@ Public Class Windream2 Try Path = GetNormalizedPath(Path) Dim oFolders As List(Of String) = Path.Split().ToList() - Dim oTempSession As IWMSession2 = DirectCast(Session, IWMSession2) Dim oFolderObject As WMObject For Each oFolder In oFolders If TestFolderExists(Path) = False Then - oFolderObject = oTempSession.GetNewWMObjectFS(WMEntityFolder, oFolder, WMObjectEditModeNoEdit) + oFolderObject = Session.GetNewWMObjectFS(WMEntityFolder, oFolder, WMObjectEditModeNoEdit) End If Next @@ -247,7 +257,7 @@ Public Class Windream2 Try Path = GetNormalizedPath(Path) Dim oFileObject As IWMObject6 - oFileObject = Session.GetWMObjectByPath(WMEntityDocument, Path) + oFileObject = GetObjectByPath(Path, WMEntityDocument) oFileObject.CreateVersion2(False, Constants.HISTORY_NEW_FROM_VERSION, Comment) Return True Catch ex As Exception @@ -256,9 +266,9 @@ Public Class Windream2 End Try End Function - Public Function LockObject(WMObject As WMObject) As Boolean + Public Function LockObject(WMObject As WMObject, Optional EditMode As WMObjectEditMode = WMObjectEditModeNoEdit) As Boolean Try - WMObject.lock() + WMObject.LockFor(EditMode) Return True Catch ex As Exception _logger.Error(ex) @@ -307,26 +317,29 @@ Public Class Windream2 Select Case oSearchType.ToUpper() Case Constants.SEARCH_TYPE_QUICK_SEARCH - Dim oQuickSearch As New WMQuickSearch() - oQuickSearch.WMSession = Session + Dim oQuickSearch As New WMQuickSearch With { + .WMSession = Session, + .SearchProfilePath = SearchFilePath + } oQuickSearch.ClearSearch() - oQuickSearch.SearchProfilePath = SearchFilePath oQuickSearch.LoadSearchProfile(oProfileName) oSearch = oQuickSearch.GetSearch() Case Constants.SEARCH_TYPE_INDEX_SEARCH - Dim oIndexSearch As New WMIndexSearch() - oIndexSearch.WMSession = Session + Dim oIndexSearch As New WMIndexSearch With { + .WMSession = Session, + .SearchProfilePath = SearchFilePath + } oIndexSearch.ClearSearch() - oIndexSearch.SearchProfilePath = SearchFilePath oIndexSearch.LoadSearchProfile(oProfileName) oSearch = oIndexSearch.GetSearch() Case Constants.SEARCH_TYPE_OBJECTTYPE_SEARCH - Dim oObjecttypeSearch As New WMObjectTypeSearch() - oObjecttypeSearch.WMSession = Session + Dim oObjecttypeSearch As New WMObjectTypeSearch With { + .WMSession = Session, + .SearchProfilePath = SearchFilePath + } oObjecttypeSearch.ClearSearch() - oObjecttypeSearch.SearchProfilePath = SearchFilePath oObjecttypeSearch.LoadSearchProfile(oProfileName) oSearch = oObjecttypeSearch.GetSearch() @@ -579,50 +592,53 @@ Public Class Windream2 End Try End Function - 'Public Function RemoveVectorIndexValue(Path As String, IndexName As String, ValueToDelete As String) As Boolean - ' If TestSessionLoggedIn() = False Then - ' Return False - ' End If - - ' Try - ' Dim oTempSession As IWMSession2 = DirectCast(Session, IWMSession2) - ' Dim oWMObject As WMObject = oTempSession.GetWMObjectByName(WMEntityAttribute, Path) + Public Function RemoveVectorIndexValue(Path As String, IndexName As String, ValueToDelete As String) As Boolean + If TestSessionLoggedIn() = False Then + Return False + End If - ' If oWMObject Is Nothing Then - ' _logger.Warn("Could not find document {0}", Path) - ' Return False - ' End If + Try + Dim oWMObject As WMObject = Session.GetWMObjectByName(WMEntityAttribute, Path) - ' Dim oVectorValues = oWMObject.GetVariableValue(IndexName) - ' Dim oType As Integer = GetIndexType(IndexName) + If oWMObject Is Nothing Then + _logger.Warn("Could not find document {0}", Path) + Return False + End If - ' If oVectorValues Is Nothing Then - ' _logger.Warn("Could not values of index {0}", IndexName) - ' Return False - ' End If + Dim oVectorValues = oWMObject.GetVariableValue(IndexName) + Dim oType As Integer = GetIndexType(IndexName) + If Helpers.IsVectorIndex(oType) = False Then + _logger.Warn("Index {0} is not a vector index", IndexName) + Return False + End If - ' Dim oValueFound As Boolean = False + If oVectorValues Is Nothing Then + _logger.Warn("Could not values of index {0}", IndexName) + Return False + End If - ' For Each oVectorValue In oVectorValues - ' If oVectorValue = ValueToDelete Then - ' oValueFound = True - ' End If - ' Next + Dim oNewValues As New List(Of Object) + oNewValues = oVectorValues.Except(New List(Of Object) From {ValueToDelete}).ToList() - ' Dim oNewValues As New List(Of Object) + ''' BEGIN WRITE INDEX + If LockObject(oWMObject, WMObjectEditModeIndexEdit) = False Then + _logger.Warn("File {0} could not be locked") + Return False + End If - ' If oValueFound Then - ' oNewValues = oVectorValues - ' oNewValues = oNewValues.Except(New List(Of Object) From {ValueToDelete}).ToList() - ' End If + oWMObject.SetVariableValue(IndexName, oNewValues.ToArray()) + oWMObject.Save() + UnlockObject(oWMObject) - ' Catch ex As Exception - ' _logger.Error(ex) - ' Return Nothing - ' End Try - 'End Function + Return True + ''' END WRITE INDEX + Catch ex As Exception + _logger.Error(ex) + Return False + End Try + End Function Public Function TestFolderExists(Path As String) As Boolean Return TestObjectExists(GetNormalizedPath(Path), WMEntityFolder) @@ -705,7 +721,7 @@ Public Class Windream2 If Session.aLoggedin Then Return True Else - _logger.Warn("There is no active WM-Session!") + _logger.Warn("There is no active WM-Session for user {0}", _sessionUsername) Return False End If Catch ex As Exception