private static string GetClassificationString(StatusCodeClassification classes) { var flags = Enum.GetValues(typeof(StatusCodeClassification)).Cast<StatusCodeClassification>(); List<StatusCodeClassification> flagsSet = new List<StatusCodeClassification>(3); foreach (var flag in flags) { if ((classes & flag) == flag) flagsSet.Add(flag); } return string.Join("/", flagsSet.Select(t => t.ToString()).ToArray()); }
/// <summary> /// <para>Creates an instance based on action, status and diagnostic code of a report.</para> /// </summary> /// <param name="action">Example: "failed".</param> /// <param name="statusCode">Example: "5.1.1"</param> /// <param name="diagnosticCode">Optional. Represents response from the final MTA.</param> public Status(string action, string statusCode, string diagnosticCode) { if (string.IsNullOrEmpty(action)) throw new ArgumentNullException("action"); if (string.IsNullOrEmpty(statusCode)) throw new ArgumentNullException("statusCode"); if (!Char.IsDigit(statusCode[0])) throw new UnknownStatusException(statusCode); WillRetryUntil = null; #pragma warning disable 0618 StatusCode = statusCode; Classes = ParseStatusCode(statusCode); #pragma warning restore 0618 Action = (ActionStatus)Enum.Parse(typeof(ActionStatus), action, true); DiagnosticCode = diagnosticCode; _innerCode = new KeyValuePair<string, StatusCodeClassification>(); if (!string.IsNullOrEmpty(diagnosticCode)) { bool firstMatch; var match = _reDiagCodeClass.Match(diagnosticCode); firstMatch = match.Success; while (match.Success) { var innerClasses = ParseStatusCode(match.Value); #pragma warning disable 0618 if (innerClasses > Classes && (_innerCode.Key == null || _innerCode.Value < innerClasses)) { // Categorization more accurante found in diagnosticCode: _innerCode = new KeyValuePair<string, StatusCodeClassification>(match.Value, innerClasses); } #pragma warning restore 0618 match = match.NextMatch(); } if (!firstMatch) { match = _reDiagCodeClass_Secondary.Match(diagnosticCode); try { while (match.Success) { var value = match.Value; var c = string.Format("{0}.{1}.{2}", value[0], value[1], value.Substring(2)); var innerClasses = ParseStatusCode(c); #pragma warning disable 0618 if (innerClasses > Classes && (_innerCode.Key == null || _innerCode.Value < innerClasses)) { // Categorization more accurante found in diagnosticCode: _innerCode = new KeyValuePair<string, StatusCodeClassification>(c, innerClasses); } #pragma warning restore 0618 match = match.NextMatch(); } } catch(Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } } } }