FailureProcessingResult FixFailures(FailuresAccessor failuresAccessor, IEnumerable <FailureDefinitionId> failureIds) { foreach (var failureId in failureIds) { int solvedErrors = 0; foreach (var error in failuresAccessor.GetFailureMessages().Where(x => x.GetFailureDefinitionId() == failureId)) { if (!failuresAccessor.IsFailureResolutionPermitted(error)) { continue; } // Don't try to fix two times same issue if (failuresAccessor.GetAttemptedResolutionTypes(error).Any()) { continue; } AddRuntimeMessage(error, true); failuresAccessor.ResolveFailure(error); solvedErrors++; } if (solvedErrors > 0) { return(FailureProcessingResult.ProceedWithCommit); } } return(FailureProcessingResult.Continue); }
private void OnFailuresProcessing(object sender, FailuresProcessingEventArgs e) { FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); //string transactionName = failuresAccessor.GetTransactionName(); IList <FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages(); if (fmas.Count > 0) { List <FailureMessageInfo> failureMessageInfoList = new List <FailureMessageInfo>(); foreach (FailureMessageAccessor fma in fmas) { FailureMessageInfo messageInfo = new FailureMessageInfo(); try { messageInfo.ErrorMessage = fma.GetDescriptionText(); messageInfo.ErrorSeverity = fma.GetSeverity().ToString(); messageInfo.FailingElementIds = fma.GetFailingElementIds().ToList(); } catch { messageInfo.ErrorMessage = "Unknown Error"; } failureMessageInfoList.Add(messageInfo); //add log message FailureDefinitionId definitionId = fma.GetFailureDefinitionId(); Guid defGuid = definitionId.Guid; if (!FailureDefinitionIds.Contains(defGuid)) { LogFileManager.AppendLog(messageInfo); FailureDefinitionIds.Add(defGuid); } if (FailureSeverity.Warning == fma.GetSeverity()) { failuresAccessor.DeleteWarning(fma); } else if (FailureSeverity.Error == fma.GetSeverity()) { e.SetProcessingResult(FailureProcessingResult.ProceedWithRollBack); return; } } if (failuresAccessor.IsFailureResolutionPermitted()) { failuresAccessor.ResolveFailures(fmas); } e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit); return; } e.SetProcessingResult(FailureProcessingResult.Continue); }