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);
        }
示例#2
0
        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);
        }