From bad26b316a9d59b0748b488ce1fd5f0d488e6dfc Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 8 Oct 2018 16:43:45 +0200 Subject: [PATCH] jj: Windream Version 0.0.0.2 --- Modules.Windream/ConnectionBuilder.vb | 9 +- Modules.Windream/Constants.vb | 8 + Modules.Windream/Windream.vbproj | 6 + Modules.Windream/Windream2.vb | 301 +++++++++++++++----------- 4 files changed, 199 insertions(+), 125 deletions(-) diff --git a/Modules.Windream/ConnectionBuilder.vb b/Modules.Windream/ConnectionBuilder.vb index f709fdfc..7cefc255 100644 --- a/Modules.Windream/ConnectionBuilder.vb +++ b/Modules.Windream/ConnectionBuilder.vb @@ -1,9 +1,10 @@ Imports NLog +Imports DigitalData.Modules.Logging Public Class ConnectionBuilder Implements IConnectionBuilder - Private ReadOnly LogFactory As LogFactory + Private ReadOnly LogConfig As LogConfig Private SessionReconnect As Boolean = False Private DriveLetter As String = "W" Private Support64Bit As Boolean = False @@ -12,8 +13,8 @@ Public Class ConnectionBuilder Private Password As String = Nothing Private Domain As String = Nothing - Public Sub New(LogFactory As LogFactory) - Me.LogFactory = LogFactory + Public Sub New(LogConfig As LogConfig) + Me.LogConfig = LogConfig End Sub Public Function WithSessionReconnect() As IConnectionBuilder Implements IConnectionBuilder.WithSessionReconnect @@ -44,7 +45,7 @@ Public Class ConnectionBuilder End Function Public Function Connect() As Windream2 Implements IConnectionBuilder.Connect - Return New Windream2(LogFactory, SessionReconnect, DriveLetter, Support64Bit, ServerName, UserName, Password, Domain) + Return New Windream2(LogConfig, SessionReconnect, DriveLetter, Support64Bit, ServerName, UserName, Password, Domain) End Function End Class diff --git a/Modules.Windream/Constants.vb b/Modules.Windream/Constants.vb index b269e742..35b27f1d 100644 --- a/Modules.Windream/Constants.vb +++ b/Modules.Windream/Constants.vb @@ -48,4 +48,12 @@ ' Misc Public Const OBJECT_TYPE_DEFAULT = "Standard" + ' File Stream + Public Const STREAM_BINARY_OBJECT = "BinaryObject" + Public Const STREAM_OPEN_MODE_READ_WRITE = 2 + + ' COM Events + Public Const COM_EVENT_SESSION_NEED_INDEX = 1 + + End Class diff --git a/Modules.Windream/Windream.vbproj b/Modules.Windream/Windream.vbproj index 9169b8e7..a7893d17 100644 --- a/Modules.Windream/Windream.vbproj +++ b/Modules.Windream/Windream.vbproj @@ -136,5 +136,11 @@ + + + {903b2d7d-3b80-4be9-8713-7447b704e1b0} + Logging + + \ No newline at end of file diff --git a/Modules.Windream/Windream2.vb b/Modules.Windream/Windream2.vb index f7374a10..34f8a875 100644 --- a/Modules.Windream/Windream2.vb +++ b/Modules.Windream/Windream2.vb @@ -2,28 +2,25 @@ Imports WINDREAMLib.WMCOMEvent Imports WINDREAMLib.WMEntity Imports WINDREAMLib.WMObjectEditMode - -Imports WINDREAMLib.WMSearchOperator -Imports WINDREAMLib.WMSearchRelation Imports WMOBRWSLib Imports WMOSRCHLib Imports WMCNNCTDLLLib Imports WMOTOOLLib -Imports NLog Imports System.IO +Imports DigitalData.Modules.Logging ''' ''' MODULE: Windream ''' -''' VERSION: 0.0.0.1 +''' VERSION: 0.0.0.2 ''' -''' DATE: 27.08.2018 +''' DATE: 08.10.2018 ''' ''' DESCRIPTION: ''' ''' DEPENDENCIES: NLog, >= 4.5.8 ''' -''' PARAMETERS: LogFactory, NLog.LogFactory +''' PARAMETERS: LogConfig, DigitalData.Modules.Logging.LogConfig ''' The LogFactory containing the current log config. Used to instanciate the class logger for this and any dependent class ''' ''' ClientDriveLetter, String @@ -60,10 +57,9 @@ Imports System.IO ''' REMARKS: This class should not be instanciated directly. Instead, ConnectionBuilder should be used. ''' Public Class Windream2 - Const WMObjectStreamOpenModeReadWrite = 2 #Region "Private Properties" Private ReadOnly _logger As Logger - Private ReadOnly _loggerFactory As LogFactory + Private ReadOnly _logConfig As LogConfig Private ReadOnly Property _sessionDomain As String Private ReadOnly Property _sessionPassword As String @@ -97,7 +93,7 @@ Public Class Windream2 ''' ''' Creates a new Windream object and connects to a server with the provided options and credentials ''' - ''' + ''' ''' ''' ''' @@ -106,10 +102,10 @@ Public Class Windream2 ''' ''' ''' - Public Sub New(LogFactory As LogFactory, SessionReconnect As Boolean, ClientDriveLetter As String, ClientSupport64Bit As Boolean, SessionServerName As String, SessionUserName As String, SessionPassword As String, SessionDomain As String) + Public Sub New(LogConfig As LogConfig, SessionReconnect As Boolean, ClientDriveLetter As String, ClientSupport64Bit As Boolean, SessionServerName As String, SessionUserName As String, SessionPassword As String, SessionDomain As String) ' Create logger and save LogFactory for dependent classes - _logger = LogFactory.GetCurrentClassLogger() - _loggerFactory = LogFactory + _logger = LogConfig.GetLogger() + _logConfig = LogConfig ' Create a session Dim oSession As IWMSession2 = NewSession(SessionServerName, SessionUserName, SessionPassword, SessionDomain) @@ -268,107 +264,170 @@ Public Class Windream2 End Try End Function - Public Function NewStream_File(ByVal FilenameSource As String, ByVal filenameTarget As String) + Public Function NewFileStream(ByVal FilenameSource As String, ByVal FilenameTarget As String) As Boolean + 'Try + Dim oExtension As String = Path.GetExtension(FilenameSource) + _logger.Debug("Stream_File was started...") + If Not TestSessionLoggedIn() Then + Return False + End If + + Dim oTargetDrive As String = Path.GetDirectoryName(FilenameTarget) + FilenameTarget = GetNormalizedPath(FilenameTarget) + + _logger.Debug($"Streaming file from {FilenameSource} to {FilenameTarget}") + + Dim oWMObject As IWMObject6 = Nothing + Dim oFileIO As WMFileIO + Dim oWMStream As WMStream + + '_logger.Debug("Try to access file and lock it...") + 'Err.Clear() + + 'Indexierungsdialog der Session unterdrücken + Session.SwitchEvents(Constants.COM_EVENT_SESSION_NEED_INDEX, False) + + '================================================================== + ' create an object + '================================================================== + Try - Dim oExtension As String = Path.GetExtension(FilenameSource) - _logger.Debug("Stream_File was started...") - If Not TestSessionLoggedIn() Then - Return False - End If + _logger.Debug("Creating WMObject for file {0}", FilenameTarget) + oWMObject = Session.GetNewWMObjectFS(WMEntityDocument, FilenameTarget, WMObjectEditModeObject) + Catch ex As Exception + _logger.Error(ex, "WMObject could not be created") + Return False + End Try - Dim oTargetDrive As String = Path.GetDirectoryName(filenameTarget) - filenameTarget = GetNormalizedPath(filenameTarget) - Const STREAM_BinaryObject = "BinaryObject" - - _logger.Debug($"Import file from {FilenameSource } to {filenameTarget}") - - Dim WMObject - Dim aFileIO - Dim aWMStream - - aFileIO = New WMOTOOLLib.WMFileIO - _logger.Debug("Try to access file and lock it...") - Err.Clear() - Const WMCOMEventWMSessionNeedIndex = 1 - - 'Indexierungsdialog der Session unterdrücken - Session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False) - 'clsWindream.MY_WDSESSION.switchEvents(WMCOMEventWMSessionNeedIndex, False) - '================================================================== - ' create an object - '================================================================== - WMObject = Session.GetNewWMObjectFS(WMEntity.WMEntityDocument, filenameTarget, WMObjectEditModeObject) - If Err.Number > 0 Then - _logger.Warn($"WMObject could not be created - Error: ' {Err.Description}'") - End If - If WMObject IsNot Nothing Then - ' lock object for file system access (to change the file itself) - LockObject(WMObject) - ' set fileIO the local source file - aFileIO.bstrOriginalFileName = FilenameSource - If Err.Number > 0 Then - 'MsgBox(Err.Number.ToString) - _logger.Warn($"fileIO could not be set - Error: '{Err.Description}'") - If UnlockObject(WMObject) Then RemoveFile(filenameTarget) - Return False - End If - ' open the windream object's file stream for writing - aWMStream = WMObject.OpenStream(STREAM_BinaryObject, WMObjectStreamOpenModeReadWrite) - If Err.Number > 0 Then - _logger.Warn($"Error whhile creating stream - Error: '{Err.Description}'") - If UnlockObject(WMObject) Then RemoveFile(filenameTarget) - Return False - End If - _logger.Debug("oWMStream created!") - ' give fileIO helper object the windream stream - aFileIO.aWMStream = aWMStream - If Err.Number > 0 Then - _logger.Warn($"Error while adding aWMStream to aFileIO - Error: '{Err.Description}'") - If UnlockObject(WMObject) Then RemoveFile(filenameTarget) - Return False - End If - ' let fileIO object import the original file into windream - aFileIO.ImportOriginal(True) - If Err.Number > 0 Then - _logger.Warn($"Error while FileIO.ImportOriginal(True) Error: '{Err.Description}'") - If UnlockObject(WMObject) Then RemoveFile(filenameTarget) + If oWMObject Is Nothing Then + _logger.Warn("Document {0} could not be found", FilenameTarget) + Return False + End If - Return False - End If - _logger.Debug("Content of file was transferred!") - ' close the windream file stream - aWMStream.Close() - If Err.Number > 0 Then - _logger.Warn($"Error in aWMStream.Close() - Error: '{Err.Description}'") - If UnlockObject(WMObject) Then RemoveFile(filenameTarget) - Return False - 'MsgBox(Err.Description) - End If - ' save new windream object - WMObject.save() - If Err.Number > 0 Then - _logger.Warn($"Error while WMObject.save() - Error: '{Err.Description}'") - If UnlockObject(WMObject) Then RemoveFile(filenameTarget) - Return False - 'MsgBox(Err.Description) - End If - _logger.Debug("File was saved correctly.") - ' unlock the windream object - If WMObject.unlock() = False Then - RemoveFile(filenameTarget) - Return False - End If - _logger.Info($"File '{filenameTarget}' was imported.") - Return True - Else - _logger.Warn($"WMObject could not be created!") - Return False - End If + _logger.Debug("Locking object for {0}", FilenameTarget) + If LockObject(oWMObject) = False Then + _logger.Warn("Document {0} could not be locked", FilenameTarget) + Return False + End If + + Try + _logger.Debug("Opening stream for {0}", FilenameTarget) + oWMStream = oWMObject.OpenStream(Constants.STREAM_BINARY_OBJECT, Constants.STREAM_OPEN_MODE_READ_WRITE) Catch ex As Exception - _logger.Warn("Unexpected Error in NewStream_File:") _logger.Error(ex) + If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + Return False + End Try + + Try + _logger.Debug("Creating FileIO", FilenameTarget) + + oFileIO = New WMFileIO With { + .bstrOriginalFileName = FilenameSource, + .aWMStream = oWMStream + } + Catch ex As Exception + If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + _logger.Error(ex, "Error while creating FileIO object") + Return False + End Try + + Try + _logger.Debug("Streaming file...") + oFileIO.ImportOriginal(True) + _logger.Debug("Content of file was transferred!") + Catch ex As Exception + If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + _logger.Error(ex, "Error while streaming file") Return False End Try + + Try + _logger.Debug("Closing Stream") + oWMStream.Close() + _logger.Debug("Saving new object") + oWMObject.Save() + _logger.Debug("Unlocking new object") + oWMObject.unlock() + Catch ex As Exception + RemoveFile(FilenameTarget) + Return False + End Try + + _logger.Info($"File '{FilenameTarget}' was imported.") + Return True + + 'If Err.Number > 0 Then + ' _logger.Warn($"WMObject could not be created - Error: ' {Err.Description}'") + 'End If + ' If oWMObject IsNot Nothing Then + ' ' lock object for file system access (to change the file itself) + ' LockObject(oWMObject) + ' ' set fileIO the local source file + ' oFileIO.bstrOriginalFileName = FilenameSource + ' If Err.Number > 0 Then + ' 'MsgBox(Err.Number.ToString) + ' _logger.Warn($"fileIO could not be set - Error: '{Err.Description}'") + ' If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + ' Return False + ' End If + ' ' open the windream object's file stream for writing + ' oWMStream = oWMObject.OpenStream(Constants.STREAM_BINARY_OBJECT, Constants.STREAM_OPEN_MODE_READ_WRITE) + ' If Err.Number > 0 Then + ' _logger.Warn($"Error whhile creating stream - Error: '{Err.Description}'") + ' If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + ' Return False + ' End If + ' _logger.Debug("oWMStream created!") + ' ' give fileIO helper object the windream stream + ' oFileIO.aWMStream = oWMStream + ' If Err.Number > 0 Then + ' _logger.Warn($"Error while adding aWMStream to aFileIO - Error: '{Err.Description}'") + ' If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + ' Return False + ' End If + ' ' let fileIO object import the original file into windream + ' oFileIO.ImportOriginal(True) + ' If Err.Number > 0 Then + ' _logger.Warn($"Error while FileIO.ImportOriginal(True) Error: '{Err.Description}'") + ' If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + + ' Return False + ' End If + ' _logger.Debug("Content of file was transferred!") + ' ' close the windream file stream + ' oWMStream.Close() + ' If Err.Number > 0 Then + ' _logger.Warn($"Error in aWMStream.Close() - Error: '{Err.Description}'") + ' If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + ' Return False + ' 'MsgBox(Err.Description) + ' End If + ' ' save new windream object + ' oWMObject.Save() + ' If Err.Number > 0 Then + ' _logger.Warn($"Error while WMObject.save() - Error: '{Err.Description}'") + ' If UnlockObject(oWMObject) Then RemoveFile(FilenameTarget) + ' Return False + ' 'MsgBox(Err.Description) + ' End If + ' _logger.Debug("File was saved correctly.") + ' ' unlock the windream object + ' If oWMObject.unlock() = False Then + ' RemoveFile(FilenameTarget) + ' Return False + ' End If + ' _logger.Info($"File '{FilenameTarget}' was imported.") + ' Return True + ' Else + ' _logger.Warn($"WMObject could not be created!") + ' Return False + ' End If + 'Catch ex As Exception + ' _logger.Warn("Unexpected Error in NewStream_File:") + ' _logger.Error(ex) + ' Return False + 'End Try End Function Public Function LockObject(WMObject As WMObject, Optional EditMode As WMObjectEditMode = WMObjectEditModeNoEdit) As Boolean @@ -391,15 +450,17 @@ Public Class Windream2 End Try End Function - Public Function GetSearchDocuments(SearchFilePath As String, DocIdIndexName As String) As Dictionary(Of Integer, String) - Dim oResult As New Dictionary(Of Integer, String) + Public Function GetSearchDocuments(SearchFilePath As String, DocIdIndexName As String) As DataTable + Dim oDatatable As New DataTable + oDatatable.Columns.Add("PATH", GetType(String)) + oDatatable.Columns.Add("DOCID", GetType(Integer)) If TestSessionLoggedIn() = False Then - Return oResult + Return oDatatable End If If TestFileExists(SearchFilePath) = False Then - Return oResult + Return oDatatable End If Try @@ -450,27 +511,27 @@ Public Class Windream2 oSearch = oObjecttypeSearch.GetSearch() Case Else _logger.Warn("{0} is not a valid search type", oSearchType) - Return oResult + Return oDatatable End Select Dim oSearchResults As WMObjects = oSearch.Execute() If oSearchResults.Count = 0 Then - Return oResult + Return oDatatable End If For Each oSearchResult As WMObject In oSearchResults Dim path As String = oSearchResult.aPath Dim docId As Integer = oSearchResult.GetVariableValue(DocIdIndexName) - oResult.Add(docId, path) + oDatatable.Rows.Add(path, docId) Next + oDatatable.AcceptChanges() - Return oResult - + Return oDatatable Catch ex As Exception _logger.Error(ex) - Return oResult + Return oDatatable End Try End Function @@ -507,8 +568,7 @@ Public Class Windream2 End If Try - Dim oTempSession As IWMSession2 = DirectCast(Session, IWMSession2) - oChoicelist = oTempSession.GetWMObjectByName(WMEntityChoiceList, ChoiceListName) + oChoicelist = Session.GetWMObjectByName(WMEntityChoiceList, ChoiceListName) Catch ex As Exception _logger.Error(ex, "Could not get choice list") Return oItems @@ -586,8 +646,7 @@ Public Class Windream2 End If Try - Dim oTempSession As IWMSession2 = DirectCast(Session, IWMSession2) - Dim oAttribute = oTempSession.GetWMObjectByName(WMEntityAttribute, IndexName) + Dim oAttribute = Session.GetWMObjectByName(WMEntityAttribute, IndexName) Dim oType = oAttribute.GetVariableValue("dwAttrType") Return oType Catch ex As Exception