/// <summary> /// Transforms Outlook specific EDRM file to Document Business Entity /// </summary> /// <param name="edrmFileName">EDRM file to be transformed</param> /// <param name="currentDocumentIndex"> Index of current document in list of documents being extracted /// Null able column - can be null when percent complete need not be calculated. /// </param> /// <returns> /// EvDocumentDataEntity that abstracts documents and relationships /// </returns> private EvDocumentDataEntity TransformOutlookEDRMToDocumentBusinessEntity(string edrmFileName, string mailStorePath, int?currentDocumentIndex) { try { OutlookEdrmManager outlookEdrmManager = new OutlookEdrmManager(edrmFileName); List <RelationshipBEO> relationships = new List <RelationshipBEO>(); outlookEdrmManager.GetDocumentIdFromConversationIndex += GetUniqueEmailDocumentIDFromConversationIndex; List <RVWDocumentBEO> documents = outlookEdrmManager.GetDocuments(FilterByMappedFields, DatasetBeo.Matter.FolderID, DatasetBeo.CollectionId.ToString(), ref relationships); //Replace EVCorlib Mail Message file extension with CNEV file extension documents.ForEach (doc => doc.FileExtension = doc.FileExtension.Replace(Constants.EVCorlibEMailMessageExtension, Constants.CNEvEmailMessageExtension)); UpdateNativeDocumentFileNameForEMailMessages(documents); // Adding created By property for each documents documents.ForEach(x => x.CreatedBy = DatasetBeo.CreatedBy); #region Create Ev Document Data Entity and raise event for processing/importing available documents EvDocumentDataEntity evDocumentDataEntity = new EvDocumentDataEntity() { Documents = documents, OutlookMailStoreDataEntity = new OutlookMailStoreEntity { EntryIdAndEmailMessagePairs = GetEMailAndEntryIdPairs(outlookEdrmManager, edrmFileName), PSTFile = new FileInfo(mailStorePath) }, PercentComplete = currentDocumentIndex ?? (100.00 / FileProcessorInstance.EntryIdsCount) * currentDocumentIndex.Value }; #endregion Create Ev Document Data Entity and raise event for processing/importing available documents // raise event as the document processing completes if (EvDocumentDataEntityAvailable != null) { EvDocumentDataEntityAvailable(evDocumentDataEntity); } #region insert temporary records for thread calculation List <EmailThreadingEntity> lstEmailThreadEntities = new List <EmailThreadingEntity>(); if (relationships != null && relationships.Count > 0) { foreach (var relation in relationships) { EmailThreadingEntity ete = relation.ToDataAccesEntity(batchIdentifier, ThreadingConstraint, ThreadRelationshipEntity.RelationshipType.OutlookAttachment); lstEmailThreadEntities.Add(ete); } } IEnumerable <OutlookEMailDocumentEntity> outlookEmails = outlookEdrmManager.OutlookEmailDocumentEntities; // store temporary record for calculating email relationship if (outlookEmails != null && outlookEmails.Any()) { List <OutlookEMailDocumentEntity> lstOutLookEmails = new List <OutlookEMailDocumentEntity>(); foreach (OutlookEMailDocumentEntity outLookEmail in outlookEmails) { if ((!string.IsNullOrEmpty(outLookEmail.ConversationIndex)) && outLookEmail.ConversationIndex.Length >= 44) { lstOutLookEmails.Add(outLookEmail); } } lstOutLookEmails.ForEach(outLookEmail => lstEmailThreadEntities.Add( ToEmailThreadEntity( outLookEmail, batchIdentifier, ThreadingConstraint, ThreadRelationshipEntity.RelationshipType.OutlookEmailThread))); } //Used Bulk Add Temp Relationships in EmailThreadingHelper if (lstEmailThreadEntities.Any()) { //EmailThreadingHelper.BulkAddRelationshipTemporaryRecord(lstEmailThreadEntities); _documentRelationships.AddRange(lstEmailThreadEntities); } #endregion // Cleanup if delete non native files is set if (IsDeleteTemporaryFiles == DeleteExtractedFilesOptions.DeleteNonNativeFiles) { outlookEdrmManager.DeleteNonNativeFiles(); } return(evDocumentDataEntity); } catch (EVException evException) { ((Exception)evException).Trace().Swallow(); } catch (Exception exception) { string errorCode = ErrorCodes.OutlookEDRMToDocumentTransformFailure; exception.AddErrorCode(errorCode).Trace().Swallow(); } return(null); }
/// <summary> /// Transforms Outlook specific EDRM file to Document Business Entity /// </summary> /// <param name="edrmFileName">EDRM file to be transformed</param> /// <param name="currentDocumentIndex"> Index of current document in list of documents being extracted /// Null able column - can be null when percent complete need not be calculated. /// </param> /// <returns> /// EvDocumentDataEntity that abstracts documents and relationships /// </returns> private EvDocumentDataEntity TransformOutlookEDRMToDocumentBusinessEntity(string edrmFileName, string mailStorePath, int? currentDocumentIndex) { try { OutlookEdrmManager outlookEdrmManager = new OutlookEdrmManager(edrmFileName); List<RelationshipBEO> relationships = new List<RelationshipBEO>(); outlookEdrmManager.GetDocumentIdFromConversationIndex += GetUniqueEmailDocumentIDFromConversationIndex; List<RVWDocumentBEO> documents = outlookEdrmManager.GetDocuments(FilterByMappedFields, DatasetBeo.Matter.FolderID, DatasetBeo.CollectionId.ToString(), ref relationships); //Replace EVCorlib Mail Message file extension with CNEV file extension documents.ForEach (doc => doc.FileExtension = doc.FileExtension.Replace(Constants.EVCorlibEMailMessageExtension, Constants.CNEvEmailMessageExtension)); UpdateNativeDocumentFileNameForEMailMessages(documents); // Adding created By property for each documents documents.ForEach(x => x.CreatedBy = DatasetBeo.CreatedBy); #region Create Ev Document Data Entity and raise event for processing/importing available documents EvDocumentDataEntity evDocumentDataEntity = new EvDocumentDataEntity() { Documents = documents, OutlookMailStoreDataEntity = new OutlookMailStoreEntity { EntryIdAndEmailMessagePairs = GetEMailAndEntryIdPairs(outlookEdrmManager, edrmFileName), PSTFile = new FileInfo(mailStorePath) }, PercentComplete = currentDocumentIndex ?? (100.00 / FileProcessorInstance.EntryIdsCount) * currentDocumentIndex.Value }; #endregion Create Ev Document Data Entity and raise event for processing/importing available documents // raise event as the document processing completes if (EvDocumentDataEntityAvailable != null) EvDocumentDataEntityAvailable(evDocumentDataEntity); #region insert temporary records for thread calculation List<EmailThreadingEntity> lstEmailThreadEntities = new List<EmailThreadingEntity>(); if (relationships != null && relationships.Count > 0) { foreach (var relation in relationships) { EmailThreadingEntity ete = relation.ToDataAccesEntity(batchIdentifier, ThreadingConstraint, ThreadRelationshipEntity.RelationshipType.OutlookAttachment); lstEmailThreadEntities.Add(ete); } } IEnumerable<OutlookEMailDocumentEntity> outlookEmails = outlookEdrmManager.OutlookEmailDocumentEntities; // store temporary record for calculating email relationship if (outlookEmails != null && outlookEmails.Any()) { List<OutlookEMailDocumentEntity> lstOutLookEmails = new List<OutlookEMailDocumentEntity>(); foreach (OutlookEMailDocumentEntity outLookEmail in outlookEmails) { if ((!string.IsNullOrEmpty(outLookEmail.ConversationIndex)) && outLookEmail.ConversationIndex.Length >= 44) { lstOutLookEmails.Add(outLookEmail); } } lstOutLookEmails.ForEach(outLookEmail => lstEmailThreadEntities.Add( ToEmailThreadEntity( outLookEmail, batchIdentifier, ThreadingConstraint, ThreadRelationshipEntity.RelationshipType.OutlookEmailThread))); } //Used Bulk Add Temp Relationships in EmailThreadingHelper if (lstEmailThreadEntities.Any()) { //EmailThreadingHelper.BulkAddRelationshipTemporaryRecord(lstEmailThreadEntities); _documentRelationships.AddRange(lstEmailThreadEntities); } #endregion // Cleanup if delete non native files is set if (IsDeleteTemporaryFiles == DeleteExtractedFilesOptions.DeleteNonNativeFiles) { outlookEdrmManager.DeleteNonNativeFiles(); } return evDocumentDataEntity; } catch (EVException evException) { ((Exception)evException).Trace().Swallow(); } catch (Exception exception) { string errorCode = ErrorCodes.OutlookEDRMToDocumentTransformFailure; exception.AddErrorCode(errorCode).Trace().Swallow(); } return null; }
private void ProcessDocumentEntities(EvDocumentDataEntity documentData, double taskPercentage) { try { foreach (var rvwDocumentBEO in documentData.Documents) { CreateAndUpdateExternalFileEntityForNativeSet(rvwDocumentBEO); if (File.Exists(rvwDocumentBEO.NativeFilePath)) { rvwDocumentBEO.MD5HashValue = DocumentHashHelper.GetMD5HashValue(rvwDocumentBEO.NativeFilePath); rvwDocumentBEO.SHAHashValue = DocumentHashHelper.GetSHAHashValue(rvwDocumentBEO.NativeFilePath); } } m_Documents.AddRange(documentData.Documents); #region Accumilate Outlook MailStoreData Entities - they are flushed and put on queue along with documents being sent. // Check if outlook mail stores exist if (documentData.OutlookMailStoreDataEntity != null && documentData.OutlookMailStoreDataEntity.PSTFile != null && documentData.OutlookMailStoreDataEntity.EntryIdAndEmailMessagePairs.Count() > 0) { if (m_OutlookMailStoreDataEntities == null) m_OutlookMailStoreDataEntities = new List<OutlookMailStoreEntity>(); m_OutlookMailStoreDataEntities.Add(documentData.OutlookMailStoreDataEntity); } #endregion Accumilate Outlook MailStoreData Entities - they are flushed and put on queue along with documents being sent. if (m_Documents.Count >= m_PipelineBatchSize) { IEnumerable<RVWDocumentBEO> documentBatch = m_Documents.Take(Convert.ToInt16(m_PipelineBatchSize)); Send(documentBatch, false); m_Documents.RemoveRange(0, Convert.ToInt16(m_PipelineBatchSize)); } } catch (Exception ex) { ex.Trace().Swallow(); } }