/// <summary> /// Processes the work item. pushes give document files for conversion /// </summary> /// <param name="message">The message.</param> protected override void ProcessMessage(PipeMessageEnvelope message) { base.ProcessMessage(message); try { DocumentExtractionMessageEntity documentExtractionMessageEntity = message.Body as DocumentExtractionMessageEntity; Debug.Assert(documentExtractionMessageEntity != null, "documentExtractionMessageEntity != null"); IEnumerable <string> listOfFiles = documentExtractionMessageEntity.FileCollection; if (listOfFiles == null || !listOfFiles.Any()) { throw new EVException().AddErrorCode(ErrorCodes.EDLoaderExtractionWorker_NoFilesToProcess); } List <FileInfo> files = new List <FileInfo>(); listOfFiles.SafeForEach(p => files.Add(new FileInfo(p))); if (files.Count <= 0) { throw new EVException().AddResMsg(ErrorCodes.EDLoaderExtractionWorker_NoFilesToProcess); } Debug.Assert(m_FileProcessor != null); //?? 1. need to make it configurable item //?? 2. Need to ensure output.xmls are deleted. // ED Loader job should not delete native files ever, hence if delete temporary files is set to true - delete NON native files else delete none // Delete none is mostly used for debugging so that EDRM files extracted can be examined. //?? need to fix before end of sprint 3 m_FileProcessor.IsDeleteTemporaryFiles = (false) ? DeleteExtractedFilesOptions.DeleteNonNativeFiles : DeleteExtractedFilesOptions.DeleteNone; // if password list (used for password protected archive files extraction) is set, assign it to File Processor after decryption if (m_Parameters != null && m_Parameters.PasswordList != null && m_Parameters.PasswordList.Count > 0) { List <string> decryptedPasswordList = new List <string>(); m_Parameters.PasswordList.SafeForEach( x => decryptedPasswordList.Add(ApplicationConfigurationManager.Decrypt(x, m_DecryptionKey))); m_FileProcessor.Passwords = decryptedPasswordList; } Debug.Assert(m_Parameters != null, "m_Parameters != null"); m_FileProcessor.DatasetBeo = m_Parameters.DatasetDetails; m_FileProcessor.FilterByMappedFields = m_Parameters.FieldMapping; long jobRunId; long.TryParse(PipelineId, out jobRunId); List <EmailThreadingEntity> rawDocumentRelationships = new List <EmailThreadingEntity>(); // this call performs document extraction and calls ImportEvDocumentDataEntity as and when extraction is done for each file. m_FileProcessor.ProcessDocumentWithCallBack <double>(files, new DirectoryInfo(m_Parameters.DatasetDetails.CompressedFileExtractionLocation), m_OutputBatchSize, jobRunId, ProcessDocumentEntities, OnHandleException, m_PercenatgeCompletion, rawDocumentRelationships); if (rawDocumentRelationships.Any()) { SendRelationshipsInfo(rawDocumentRelationships); } // if it's the last message send remaining documents if ((documentExtractionMessageEntity.IsLastMessageInBatch && m_Documents != null && m_Documents.Any()) || (m_OutlookMailStoreDataEntities != null && m_OutlookMailStoreDataEntities.Any())) { Send(m_Documents, true); m_Documents.Clear(); } } catch (Exception ex) { ReportToDirector(ex); ex.Trace(); if (ex.GetErrorCode() == ErrorCodes.ImportDiskFullErrorMessage) { // if the disk is full then we throw the exception to stop the job and log the message LogMessage(false, Constants.DiskFullErrorMessage, false); throw; } LogMessage(false, ex.ToUserString(), false); ex.Swallow(); } }