/// <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)); }
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); } }
public static string FormatLine(params string[] values) { using (var acquiredBuffer = StringBuilderUtilities.AcquireBuffer()) { var stringBuilder = acquiredBuffer.StringBuilder; AppendLineTo(stringBuilder, values); return(stringBuilder.ToString()); } }
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); }
/// <summary> /// Escapes characters ", <, >, &. /// </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); }
/// <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)); }
/// <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)); }
/// <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)); }
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); } }
// 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); }
// 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); } }