Esempio n. 1
0
        /// <summary>
        /// Processes the <paramref name="input"/> (either of type <see cref="string"/> or <see cref="byte"/>[])
        /// data and returns the filtered data in one of the formats above or <c>null</c>.
        /// </summary>
        public TextElement Filter(IEncodingProvider enc, TextElement input, bool closing)
        {
            var text = input.AsText(enc.StringEncoding);

            // return new TextElement(text.Replace("\n", "\r\n"));

            StringBuilder sb  = null;   // lazily constructed string builder
            int           idx = 0;
            int           pos;

            while (idx < text.Length && (pos = IndexOfStandaloneLF(text, idx)) >= 0)
            {
                sb ??= StringBuilderUtilities.Pool.Get();

                sb.Append(text, idx, pos - idx);
                sb.Append("\r\n");

                //
                idx = pos + 1;
            }

            if (sb != null)
            {
                sb.Append(text, idx, text.Length - idx);
                text = StringBuilderUtilities.GetStringAndReturn(sb);
            }

            return(new TextElement(text));
        }
Esempio n. 2
0
 public static void WriteCsvLine(this TextWriter writer, string value, params string[] othersValues)
 {
     if (writer == null)
     {
         throw new ArgumentNullException("writer");
     }
     string[] values;
     if (othersValues.IsNullOrEmpty())
     {
         values = new string[] { value }
     }
     ;
     else
     {
         values    = new string[1 + othersValues.Length];
         values[0] = value;
         Array.Copy(othersValues, 0, values, 1, othersValues.Length);
     }
     using (var acquiredBuffer = StringBuilderUtilities.AcquireBuffer()) {
         var sb = acquiredBuffer.StringBuilder;
         AppendTo(sb, values);
         writer.Write(Environment.NewLine);
         writer.Write(sb);
     }
 }
Esempio n. 3
0
 public static string FormatLine(params string[] values)
 {
     using (var acquiredBuffer = StringBuilderUtilities.AcquireBuffer()) {
         var stringBuilder = acquiredBuffer.StringBuilder;
         AppendLineTo(stringBuilder, values);
         return(stringBuilder.ToString());
     }
 }
Esempio n. 4
0
        static Type P_GenerateRowType(Dictionary <string, int> columnNamesOrder, IComparer <string> columnNameComparer)
        {
            columnNamesOrder.EnsureNotNull(nameof(columnNamesOrder));
            columnNameComparer.EnsureNotNull(nameof(columnNameComparer));
            var columnNamesSorted =
                columnNamesOrder
                .OrderBy(i => i.Key, columnNameComparer)
                .Select(i => i.Key)
                .ToArray();

            if (columnNamesSorted.Length < 1)
            {
                throw new ArgumentException(rt.Format(typeof(Array), "CanNotEmpty"), nameof(columnNamesOrder));
            }
            //
            string typeName;
            Guid   typeSgnatureGuid;

            using (var acquiredBuffer = StringBuilderUtilities.AcquireBuffer()) {
                var sb = acquiredBuffer.StringBuilder;
                for (var i = 0; i < columnNamesSorted.Length; i++)
                {
                    sb.Append('[');
                    sb.Append(columnNamesSorted[i]);
                    sb.Append(']');
                    if (i != columnNamesSorted.Length - 1)
                    {
                        sb.Append(',');
                    }
                }
                var sha1 = default(SHA1);
                try {
#if TRG_NETFRAMEWORK || TRG_SL5
                    sha1 = new SHA1Managed();
#else
                    sha1 = SHA1.Create();
#endif
                    var guidBytes = new byte[16];
                    sha1.Initialize();
                    Array.Copy(sha1.ComputeHash(Encoding.Unicode.GetBytes(sb.ToString())), 0, guidBytes, 0, guidBytes.Length);
                    typeName = "CsvRow_" + (typeSgnatureGuid = new Guid(guidBytes)).ToString("n");
                } finally {
                    (sha1 as IDisposable)?.Dispose();
                }
            }
            Type result;
            if (!__RowTypeRepository.TryGetValue(typeSgnatureGuid, out result))
            {
                Array.Sort(columnNamesSorted, (x, y) => columnNamesOrder[x].CompareTo(columnNamesOrder[y]));
                lock (__RowTypeRepository) {
                    if (!__RowTypeRepository.TryGetValue(typeSgnatureGuid, out result))
                    {
                        __RowTypeRepository.Add(typeSgnatureGuid, result = __RowTypeGenerator.EmitType(typeName, columnNamesSorted));
                    }
                }
            }
            return(result);
        }
Esempio n. 5
0
        /// <summary>
        /// Escapes characters &quot;, &lt;, &gt;, &amp;.
        /// </summary>
        /// <returns>Replaced source with the replacement.</returns>
        public static string Escape(this string source)
        {
            if (String.IsNullOrEmpty(source))
            {
                return("");
            }

            StringBuilder builder = null;

            // Gets a new builder from the pool and appends substring of source, if necessary and appends charReplacement
            void Replace(int index, string charReplacement)
            {
                if (builder == null)
                {
                    builder = StringBuilderUtilities.Pool.Get();
                    builder.Append(source.Substring(0, index));
                }

                builder.Append(charReplacement);
            }

            for (int i = 0; i < source.Length; i++)
            {
                switch (source[i])
                {
                case '"':
                    Replace(i, _quoteReplacement);
                    break;

                case '>':
                    Replace(i, _greaterReplacement);
                    break;

                case '<':
                    Replace(i, _lessReplacement);
                    break;

                case '&':
                    Replace(i, _ampresandReplacement);
                    break;

                default:
                    if (builder == null)
                    {
                        continue;
                    }
                    else
                    {
                        builder.Append(source[i]);
                    }
                    break;
                }
            }

            return((builder != null) ? StringBuilderUtilities.GetStringAndReturn(builder) : source);
        }
Esempio n. 6
0
        /// <summary>
        /// Return source with stripped comments and whitespace.
        /// </summary>
        /// <returns>The stripped source code will be returned on success, or an empty string on failure.</returns>
        public static string php_strip_whitespace(Context ctx, string filename)
        {
            var stream = PhpStream.Open(ctx, filename, "rt", StreamOpenOptions.Empty, StreamContext.Default)?.RawStream;

            if (stream == null)
            {
                return(string.Empty);
            }

            Tokens t;
            var    result = StringBuilderUtilities.Pool.Get();

            void Append(StringBuilder sb, CharSpan span)
            {
                sb.Append(span.Buffer, span.Start, span.Length);
            }

            using (var tokenizer = new Lexer(new StreamReader(stream, Encoding.UTF8), Encoding.UTF8))
            {
                while ((t = tokenizer.GetNextToken()) != Tokens.EOF)
                {
                    switch (t)
                    {
                    case Tokens.T_COMMENT:
                        // ignore
                        break;

                    case Tokens.T_WHITESPACE:
                        result.Append(' ');
                        break;

                    default:
                        //result.Append(tokenizer.TokenText);
                        // avoid copying and allocating string
                        Append(result, tokenizer.GetTokenSpan());
                        break;
                    }
                }
            }

            stream.Dispose();

            return(StringBuilderUtilities.GetStringAndReturn(result));
        }
Esempio n. 7
0
        /// <summary>
        /// Builds a connection string in form of <c>server=;user id=;password=</c>.
        /// </summary>
        public static string BuildConnectionString(string server, string user, string password, string additionalSettings)
        {
            var result = StringBuilderUtilities.Pool.Get();

            result.Append("server=");
            result.Append(server);
            result.Append(";user id=");
            result.Append(user);
            result.Append(";password=");
            result.Append(password);

            if (!string.IsNullOrEmpty(additionalSettings))
            {
                result.Append(';');
                result.AppendFormat(additionalSettings);
            }

            return(StringBuilderUtilities.GetStringAndReturn(result));
        }
Esempio n. 8
0
        /// <summary>
        /// Gets the string to place in front of current element.
        /// </summary>
        public virtual string getPrefix()
        {
            var result = StringBuilderUtilities.Pool.Get();

            result.Append(_prefix[PREFIX_LEFT]);

            int  depth = getDepth();
            bool hasNext;

            for (int i = 0; i < depth; ++i)
            {
                hasNext = ((CachingIterator)getSubIterator(i)).hasNext();
                result.Append(_prefix[hasNext ? PREFIX_MID_HAS_NEXT : PREFIX_MID_LAST]);
            }

            hasNext = ((CachingIterator)getSubIterator(depth)).hasNext();
            result.Append(_prefix[hasNext ? PREFIX_END_HAS_NEXT : PREFIX_END_LAST]);

            result.Append(_prefix[PREFIX_RIGHT]);

            return(StringBuilderUtilities.GetStringAndReturn(result));
        }
Esempio n. 9
0
 public static void WriteCsvHeader(this TextWriter writer, string columnHeader, params string[] othersColumnsHeaders)
 {
     if (writer == null)
     {
         throw new ArgumentNullException("writer");
     }
     string[] columnsHeaders;
     if (othersColumnsHeaders.IsNullOrEmpty())
     {
         columnsHeaders = new string[] { columnHeader }
     }
     ;
     else
     {
         columnsHeaders    = new string[1 + othersColumnsHeaders.Length];
         columnsHeaders[0] = columnHeader;
         Array.Copy(othersColumnsHeaders, 0, columnsHeaders, 1, othersColumnsHeaders.Length);
     }
     using (var acquiredBuffer = StringBuilderUtilities.AcquireBuffer()) {
         var sb = acquiredBuffer.StringBuilder;
         AppendTo(sb, columnsHeaders);
         writer.Write(sb);
     }
 }
Esempio n. 10
0
        // TODO: Put exception messages into the resources.
        // TODO: Заменить тип параметра buffer на string[].
        //
        public static int SplitLine(string textLine, int textLineNumber, List <string> buffer)
        {
            if (string.IsNullOrWhiteSpace(textLine))
            {
                throw new ArgumentException(rt.Format(typeof(string), "CanNotNullOrWhiteSpace"), "textLine");
            }
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }
            var splitCount = 0;

            using (var acquiredStringBuilder = StringBuilderUtilities.AcquireBuffer()) {
                char currentChar, nextChar;
                var  valueBuffer   = acquiredStringBuilder.StringBuilder;
                var  isQuoteOpened = false;
                var  csvTextLine   = new P_CsvTextLine(textLine);
                var  newLine       = Environment.NewLine ?? string.Empty;
                for (var charIndex = 0; charIndex < csvTextLine.Length; charIndex++)
                {
                    currentChar = csvTextLine[charIndex];
                    if (newLine.IndexOf(currentChar) > -1)
                    {
                        throw new DigitalFlareApplicationException(string.Format("Формат строки данных (номер '{0}') не соответствует формату CSV. В строке данных обнаружены символы переноса строки текста. Данные строки: '{1}'.", textLineNumber.TextViewInvariant("d"), textLine.TextView()));
                    }
                    if (currentChar == CsvDefaultQuotationChar)
                    {
                        if (isQuoteOpened)
                        {
                            if (!csvTextLine.NextAfter(charIndex, out nextChar))
                            {
                                throw new DigitalFlareApplicationException(string.Format("Формат строки данных (номер '{0}') не соответствует формату CSV. Данные строки: '{1}'.", textLineNumber.TextViewInvariant("d"), textLine.TextView()));
                            }
                            else if (nextChar == CsvFieldDefaultSeparator)
                            {
                                isQuoteOpened = false;
                            }
                            else if (nextChar == CsvDefaultQuotationChar)
                            {
                                valueBuffer.Append(CsvDefaultQuotationChar);
                                charIndex++;
                            }
                            else
                            {
                                throw new DigitalFlareApplicationException(string.Format("Формат строки данных (номер '{0}') не соответствует формату CSV. Данные строки: '{1}'.", textLineNumber.TextViewInvariant("d"), textLine.TextView()));
                            }
                        }
                        else if (valueBuffer.Length > 0)
                        {
                            throw new DigitalFlareApplicationException(string.Format("Формат строки данных (номер '{0}') не соответствует формату CSV. Данные строки: '{1}'.", textLineNumber.TextViewInvariant("d"), textLine.TextView()));
                        }
                        else
                        {
                            isQuoteOpened = true;
                        }
                    }
                    else if (currentChar == CsvFieldDefaultSeparator)
                    {
                        if (isQuoteOpened)
                        {
                            valueBuffer.Append(CsvFieldDefaultSeparator);
                        }
                        else
                        {
                            buffer.Add(valueBuffer.ToString());
                            valueBuffer.Length = 0;
                            splitCount++;
                        }
                    }
                    else
                    {
                        valueBuffer.Append(currentChar);
                    }
                }
                if (isQuoteOpened || valueBuffer.Length > 0)
                {
                    throw new DigitalFlareApplicationException(string.Format("Формат строки данных (номер '{0}') не соответствует формату CSV. Данные строки: '{1}'.", textLineNumber.TextViewInvariant("d"), textLine.TextView()));
                }
            }
            return(splitCount);
        }
Esempio n. 11
0
        // TODO: Put strings into the resources.
        //
        public virtual bool ResolveDependency <TDependency>(IDependencyResolutionContext ctx, out TDependency dependency)
            where TDependency : class
        {
            //
            ctx.EnsureNotNull(nameof(ctx));
            if (!ReferenceEquals(ctx.Scope, this))
            {
                throw
                    new ArgumentOutOfRangeException(
                        paramName: nameof(ctx),
                        message: $"Указанный контекст не принадлежит данной области функциональной зависимости.{Environment.NewLine}\tКонтекст:{ctx.FmtStr().GNLI2()}{Environment.NewLine}\tОбласть:{this.FmtStr().GNLI2()}");
            }
            else if (!typeof(TDependency).IsAssignableFrom(ctx.Specs.DependencyType))
            {
                throw
                    new ArgumentOutOfRangeException(
                        paramName: nameof(ctx),
                        message: $"Тип функциональной зависимости '{ctx.Specs.DependencyType}', определенный параметрами указанного контекста '{ctx}', не совместим с типом функциональной зависимости '{typeof(TDependency)}', указанным для данного вызова разрешения функциональной зависимости.");
            }
            //
            if (ctx.Specs.IsNewInstanceRequired && _prohibitNewInstanceRequest)
            {
                throw new EonException(message: $"Для данной области функциональной зависимости запрещены запросы на разрешение зависимости в новый экземпляр.{Environment.NewLine}\tОбласть:{this.FmtStr().GNLI2()}");
            }
#if DO_NOT_USE_EON_LOGGING_API
            if (ctx.IsAdvancedLoggingEnabled)
            {
                throw new NotSupportedException(message: $"В тек. версии расширенное логирование разрешения функциональной зависимости (см. {nameof(ctx)}.{nameof(ctx.IsAdvancedLoggingEnabled)}) не поддерживается.").SetErrorCode(code: GeneralErrorCodes.Operation.NotSupported);
            }
#else
            var isContextAdvancedLoggingEnabled = ctx.IsAdvancedLoggingEnabled;
#endif
            //
            var ensureResolution      = ctx.Specs.EnsureResolution;
            var isNewInstanceRequired = ctx.Specs.IsNewInstanceRequired;
            var selectCriterion       = ctx.Specs.SelectCriterion;
            var errorMessagePrologue  = $"Было затребовано разрешение функциональной зависимости.{Environment.NewLine}Функциональная зависимость:{Environment.NewLine}{typeof(TDependency).FmtStr().G().IndentLines()}{Environment.NewLine}Параметры разрешения:{Environment.NewLine}{ctx.Specs.ToString().IndentLines()}.";
            //
            List <IDependencyHandler2> currentScopeHandlersTraversal;
            IDependencyHandler2        currentHandler;
            object      resultDependencyInstanceAsObject;
            IDisposable resultInstanceAsDisposable;
            var         resultInstance = default(TDependency);
            var         handlerResult  = DependencyResult.None;
            //
            var newDependencyInstancesDisposeRegistry = ctx.Specs.DisposeRegistry ?? ReadDA(ref _newDependencyInstancesDisposeRegistry);
            //
            var runningResolutionsSpinLock   = ReadDA(ref _runningResolutionsSpinLock);
            var runningResolutionsUniqueness = ReadDA(ref _runningResolutionsUniqueness);
            var runningResolutionsSequence   = ReadDA(ref _runningResolutionsSequence);
            //
            var involvedScopes = new HashSet <IDependencyScope>(comparer: ReferenceEqualityComparer <IDependencyScope> .Instance);
            try {
                // Регистрация выполнения запроса ф. зависимости.
                //
                runningResolutionsSpinLock
                .Invoke(
                    () => {
                    EnsureNotDisposeState();
                    //
                    if (runningResolutionsSequence.Count >= MaxCountOfRunningResolutions)
                    {
                        throw
                        new EonException(
                            message: $"{errorMessagePrologue}{Environment.NewLine}Для области функциональной зависимости достигнут предел '{MaxCountOfRunningResolutions}' максимального количества одновременно выполняющихся вызовов разрешения функциональной зависимости.{Environment.NewLine}\tОбласть функциональной зависимости:{this.FmtStr().GNLI2()}")
                        .SetErrorCode(DependencyErrorCodes.Fault);
                    }
                    else if (runningResolutionsUniqueness.Add(item: ctx))
                    {
                        runningResolutionsSequence.Add(item: ctx);
                    }
                    else
                    {
                        throw
                        new EonException(
                            message: $"{errorMessagePrologue}{Environment.NewLine}Указанный контекст уже используется другим вызовом разрешения функциональной зависимости в данной области функциональной зависимости.{Environment.NewLine}\tКонтекст:{ctx.FmtStr().GNLI2()}{Environment.NewLine}\tОбласть функциональной зависимости:{this.FmtStr().GNLI2()}")
                        .SetErrorCode(DependencyErrorCodes.Fault);
                    }
                });
                //
                var thisScope     = (IDependencyScope)this;
                var previousScope = default(IDependencyScope);
                foreach (var currentScope in thisScope.TreeNode().SelfAndAncestors(parentSelector: locItem => locItem.GetOuterScope()))
                {
                    if (!involvedScopes.Add(currentScope))
                    {
                        throw
                            new EonException(
                                message: $"{errorMessagePrologue}{Environment.NewLine}Указанная область функциональной зависимости в составе окружающих (внешних) областей для данной области повторяется, что недопустимо.{Environment.NewLine}\tДанная область:{this.FmtStr().GNLI2()}{Environment.NewLine}\tУказанная область:{this.FmtStr().GNLI2()}{Environment.NewLine}\tОбласть, предшествующая указанной:{previousScope.FmtStr().GNLI2()}")
                            .SetErrorCode(DependencyErrorCodes.Fault);
                    }
                    // Составить упорядоченный список обхода обработчиков запроса ф. зависимости.
                    //
                    currentScopeHandlersTraversal = new List <IDependencyHandler2>(collection: currentScope.GetResolutionModel());
                    if (involvedScopes.Count == 1)
                    {
                        // Сначала должны быть использованы обработчики запроса ф. зависимости первичной модели (если она задана), поэтому они добавляются в начало списка обхода.
                        //
                        var primaryModel = ctx.Specs.PrimaryResolutionModel.EmptyIfNull();
                        if (currentScopeHandlersTraversal.Count == 0)
                        {
                            currentScopeHandlersTraversal.AddRange(collection: primaryModel);
                        }
                        else
                        {
                            currentScopeHandlersTraversal.InsertRange(index: 0, collection: primaryModel);
                        }
                        //
                        previousScope = currentScope;
                    }
                    // Обход списка обработчиков запроса ф. зависимости.
                    //
                    var currentHandlerIndex    = 0;
                    var handlerRedirectCounter = 0;
                    for (; resultInstance is null && currentHandlerIndex < currentScopeHandlersTraversal.Count;)
                    {
                        currentHandler = currentScopeHandlersTraversal[currentHandlerIndex];
                        //
                        if (currentHandler != null && ctx.TryInvolveHandler(handler: currentHandler))
                        {
                            resultInstanceAsDisposable = (resultDependencyInstanceAsObject = (handlerResult = currentHandler.ExecuteResolution(resolutionCtx: ctx)).Instance) as IDisposable;
                            if (resultDependencyInstanceAsObject is null)
                            {
                                if (!(handlerResult.RedirectHandler is null))
                                {
                                    if (handlerRedirectCounter++ < DefaultOfMaxCountOfResolutionRedirect)
                                    {
                                        var redirectHandlerIndex = currentHandlerIndex + 1;
                                        if (redirectHandlerIndex < currentScopeHandlersTraversal.Count)
                                        {
                                            currentScopeHandlersTraversal.Insert(index: redirectHandlerIndex, item: handlerResult.RedirectHandler);
                                        }
                                        else
                                        {
                                            currentScopeHandlersTraversal.Add(item: handlerResult.RedirectHandler);
                                        }
                                    }
                                    else
                                    {
                                        throw
                                            new EonException(
                                                message: $"Dependency resolution was broken due to the count of dependency handlers redirects reached the limit — {DefaultOfMaxCountOfResolutionRedirect:d} (see {nameof(DependencyScope)}.{nameof(DefaultOfMaxCountOfResolutionRedirect)}).{Environment.NewLine}Redirect from handler:{currentHandler.FmtStr().GNLI2()}{Environment.NewLine}Redirect to handler:{handlerResult.RedirectHandler.FmtStr().GNLI2()}{Environment.NewLine}Scope:{currentScope.FmtStr().GNLI2()}")
                                            .SetErrorCode(code: DependencyErrorCodes.Fault);
                                    }
                                }
                            }
                            else if ((resultInstance = resultDependencyInstanceAsObject as TDependency) is null)
                            {
                                throw
                                    new EonException(
                                        $"{errorMessagePrologue}{Environment.NewLine}Компонент, исполняющий разрешение функциональной зависимости, возвратил недопустимый результат. Тип '{resultDependencyInstanceAsObject.GetType()}' экземпляра, полученного от компонента, не совместим с требуемым типом '{typeof(TDependency)}'.{Environment.NewLine}\tКомпонент:{currentHandler.FmtStr().GNLI2()}")
                                    .SetErrorCode(DependencyErrorCodes.Fault);
                            }
                            else if (ctx.Specs.IsNewInstanceRequired && !handlerResult.IsNewInstance)
                            {
                                throw
                                    new EonException(
                                        $"{errorMessagePrologue}{Environment.NewLine}Компонент, исполняющий разрешение функциональной зависимости, возвратил недопустимый результат. От компонента было затребовано создание нового экземпляра, но компонент возвратил результат, указывающий, что экземпляр не является новым.{Environment.NewLine}\tКомпонент:{currentHandler.FmtStr().GNLI2()}")
                                    .SetErrorCode(DependencyErrorCodes.Fault);
                            }
                            else if (!ctx.IsMatchSelectCriterion(resultInstance))
                            {
                                if (handlerResult.IsNewInstance)
                                {
                                    resultInstanceAsDisposable?.Dispose();
                                }
                                resultInstanceAsDisposable       = null;
                                resultDependencyInstanceAsObject = null;
                                resultInstance = null;
                            }
                            else if (handlerResult.IsNewInstance && resultInstanceAsDisposable != null)
                            {
                                newDependencyInstancesDisposeRegistry.Register(resultInstanceAsDisposable);
                            }
                        }
                        //
#if !DO_NOT_USE_EON_LOGGING_API
                        if (isContextAdvancedLoggingEnabled && !(resultDependencyInstance is null))
                        {
                            string loggingInformationMessage;
                            using (var acquiredBuffer = StringBuilderUtilities.AcquireBuffer()) {
                                var sb = acquiredBuffer.StringBuilder;
                                sb.AppendLine($"Функциональная зависимость разрешена.");
                                sb.AppendLine($"\tПараметры разрешения:");
                                sb.AppendLine(ctx.Specs.ToString().IndentLines(indentSize: 2));
                                sb.AppendLine($"\tЭкземпляр зависимости:");
                                sb.Append(resultDependencyInstance.ToString().IndentLines(indentSize: 2));
                                loggingInformationMessage = sb.ToString();
                            }
                            context.IssueInformation($"Разрешение функциональной зависимости (ИД контекста '{contextSequentialId:d}').", loggingInformationMessage);
                        }
#endif
                        //
                        currentHandlerIndex++;
                    }
                    //
                    if (resultInstance != null)
                    {
                        break;
                    }
                }
            }
            catch (Exception exception) {
                if (handlerResult.IsNewInstance)
                {
                    DisposableUtilities.DisposeMany(exception, handlerResult.Instance as IDisposable);
                }
                throw;
            }
            finally {
                runningResolutionsSpinLock
                .Invoke(
                    () => {
                    if (!(Disposing || IsDisposed))
                    {
                        runningResolutionsSequence.RemoveAll(match: locItem => ReferenceEquals(objA: locItem, objB: ctx));
                        runningResolutionsUniqueness.Remove(item: ctx);
                    }
                });
            }
            //
            if (resultInstance is null)
            {
                if (ensureResolution)
                {
                    // Формирование текста сообщения ошибки.
                    //
                    // TODO: involvedExecutorsChainShowReportMaxCount сделать конфигурируемым.
                    //
                    var    involvedExecutorsChainShowReportMaxCount = FormatStringUtilities.DefaultMaxCountOfCollectionOutputItems;
                    string involvedExecutorsChainReport;
                    IDependencyHandler2[] involvedHandlerChain;
                    string involvedHandlerText(IDependencyHandler2 locHandler)
                    => $"Объект:{locHandler.FmtStr().GNLI()}";

                    using (var buffer = EonStringBuilderUtilities.AcquireBuffer()) {
                        var sb = buffer.StringBuilder;
                        involvedHandlerChain = ctx.GetInvolvedHandlerChain();
                        var involvedExecutorsChainLimit = Math.Min(involvedExecutorsChainShowReportMaxCount, involvedHandlerChain.Length);
                        for (var k = 0; k < involvedExecutorsChainLimit; k++)
                        {
                            if (k > 0)
                            {
                                sb.AppendLine();
                            }
                            sb.Append($"{(k + 1):d}) {involvedHandlerText(involvedHandlerChain[ k ])}");
                        }
                        if (involvedHandlerChain.Length > involvedExecutorsChainShowReportMaxCount)
                        {
                            if (involvedHandlerChain.Length - involvedExecutorsChainShowReportMaxCount < 3)
                            {
                                sb.Append($"{Environment.NewLine}{(involvedExecutorsChainShowReportMaxCount + 1):d}) {involvedHandlerText(involvedHandlerChain[ involvedExecutorsChainShowReportMaxCount ])}");
                            }
                            else
                            {
                                sb.Append($"{Environment.NewLine}…");
                            }
                            //
                            if (involvedHandlerChain.Length > (involvedExecutorsChainShowReportMaxCount + 1))
                            {
                                sb.Append($"{Environment.NewLine}{(involvedHandlerChain.Length):d}) {involvedHandlerText(involvedHandlerChain[ involvedHandlerChain.Length - 1 ])}");
                            }
                        }
                        involvedExecutorsChainReport = sb.ToString();
                    }
                    throw
                        new EonException(
                            $"{errorMessagePrologue}{Environment.NewLine}Указанная зависимость не была разрешена.{Environment.NewLine}Детали:{Environment.NewLine}\tОбласть функциональной зависимости:{Environment.NewLine}{this.FmtStr().GI2()}{Environment.NewLine}\tПоследовательность задействованных обработчиков (длина {involvedHandlerChain.Length:d}):{Environment.NewLine}{involvedExecutorsChainReport.IndentLines2()}")
                        .SetErrorCode(DependencyErrorCodes.Resolution_NotResolved);
                }
                else
                {
                    dependency = null;
                    return(false);
                }
            }
            else
            {
                dependency = resultInstance;
                return(true);
            }
        }