From 618d1de5ff729810d4ab1128c4cf20ae724dc05a Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 3 Apr 2019 05:40:06 +0300 Subject: [PATCH] Localization --- ...l.Discovery.csproj.CoreCompileInputs.cache | 2 +- ...el.Discovery.csprojAssemblyReference.cache | Bin 168237 -> 165127 bytes ...croservices.csproj.CoreCompileInputs.cache | 2 +- ...icroservices.csprojAssemblyReference.cache | Bin 78215 -> 78873 bytes ZeroLevel/Models/InvokeResult.cs | 2 +- ZeroLevel/Services/Config/Configuration.cs | 4 +- .../Implementation/AppWebConfigReader.cs | 2 +- .../Config/Implementation/IniFileReader.cs | 2 +- .../DOM/DSL/Contexts/TBlockContext.cs | 6 +- .../DOM/Services/ContentElementSerializer.cs | 2 +- ZeroLevel/Services/IdGenerator.cs | 16 ++-- .../Exceptions/NoConnectionException.cs | 9 --- .../Network/Models/ExchangeAttributes.cs | 12 +-- .../Network/Models/MicroserviceInfo.cs | 16 ++-- .../Network/Models/ServiceEndpointInfo.cs | 2 +- .../Network/Models/ServiceEndpointsInfo.cs | 2 +- .../Services/Network/Services/ExRouter.cs | 13 +-- .../Services/Network/Services/ExService.cs | 30 +++---- .../Services/Network/Services/FrameParser.cs | 4 +- ZeroLevel/Services/Network/ZBaseNetwork.cs | 14 ++-- ZeroLevel/Services/Network/ZSocketClient.cs | 1 - .../Services/ObjectMapping/TypeMapper.cs | 17 ++-- .../Services/Queries/Builder/IQueryBuilder.cs | 6 +- .../Reflection/StringToTypeConverter.cs | 11 +-- .../TypeFastAccessMethodBuilderImpl.cs | 4 +- ZeroLevel/Services/Reflection/TypeHelpers.cs | 75 +++++------------- .../Semantic/Contracts/ILexProvider.cs | 28 +++---- .../Services/Semantic/Contracts/ILexer.cs | 2 +- .../Services/Semantic/Contracts/LexToken.cs | 2 +- .../Services/Semantic/Contracts/README.txt | 24 +++--- .../Services/Semantic/Helpers/TextAnalizer.cs | 36 ++++----- ZeroLevel/Services/Semantic/WordLexer.cs | 4 +- .../Serialization/MemoryStreamReader.cs | 32 +++----- .../Serialization/MemoryStreamWriter.cs | 18 ++--- .../Services/Shedulling/AsyncShedullerImpl.cs | 3 +- .../Services/Shedulling/ShedullerImpl.cs | 27 +++---- ...cificationConstructorParametersResolver.cs | 8 +- .../Building/SpecificationParameter.cs | 10 +-- .../Services/AssemblySpecificationFactory.cs | 4 +- .../Services/SpecificationBuilder.cs | 12 +-- .../Services/SpecificationConstructor.cs | 4 +- .../Text/PlainTextTables/TextTableData.cs | 4 +- .../Text/PlainTextTables/TextTableRender.cs | 32 ++++---- .../Text/PlainTextTables/TextTableStyle.cs | 14 ++-- ZeroLevel/Services/Trees/TreesVisitor.cs | 20 ++--- ZeroLevel/ZeroLevel.csproj | 1 - .../ZeroLevel.csproj.CoreCompileInputs.cache | 2 +- 47 files changed, 230 insertions(+), 311 deletions(-) delete mode 100644 ZeroLevel/Services/Network/Exceptions/NoConnectionException.cs diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache index ffd6fd9..7a6e9ee 100644 --- a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache +++ b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -4f0bbfe8ac44b56784f7eeaa3cdef96609d6b97e +02ab5562f7a9f633d41e073aff759527ff59696c diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache index 9b98d2082451f5fef5531a34b6133ee8242d1db2..117c2632543f6bee8c222cf2d54480991e3da0fa 100644 GIT binary patch literal 165127 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 literal 168237 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 diff --git a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache b/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache index 104314d..d40012b 100644 --- a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache +++ b/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -48781ba1f58e845d50aedda0cbff5881dfe0563f +1a68033c72e3e719a45c8165f48f4effb88b5e68 diff --git a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csprojAssemblyReference.cache b/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csprojAssemblyReference.cache index 3d9d0c1ca00f998b60723e2318781221214172a4..63d7bd72f26a82ac81d139a4820915ac79a7d7d6 100644 GIT binary patch literal 78873 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 Succeeding(T value, string comment = "") { return new InvokeResult(value, true, comment); } - public static InvokeResult Fault(string comment) { return new InvokeResult(false, comment); } + public static InvokeResult Fault(string comment) { return new InvokeResult(false, comment); } #endregion public override void Serialize(IBinaryWriter writer) diff --git a/ZeroLevel/Services/Config/Configuration.cs b/ZeroLevel/Services/Config/Configuration.cs index afa421e..53aeaa8 100644 --- a/ZeroLevel/Services/Config/Configuration.cs +++ b/ZeroLevel/Services/Config/Configuration.cs @@ -83,7 +83,7 @@ namespace ZeroLevel IConfiguration result; if (false == _cachee.TryGetValue(name, out result)) { - throw new KeyNotFoundException(string.Format("Not found configuration '{0}'", name)); + throw new KeyNotFoundException("Not found configuration '{name}'"); } return result; } @@ -93,7 +93,7 @@ namespace ZeroLevel IConfigurationSet result; if (false == _setCachee.TryGetValue(name, out result)) { - throw new KeyNotFoundException(string.Format("Not found configuration set '{0}'", name)); + throw new KeyNotFoundException("Not found configuration set '{name}'"); } return result; } diff --git a/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs b/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs index 04bc4bd..981a0ba 100644 --- a/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs +++ b/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs @@ -14,7 +14,7 @@ namespace ZeroLevel.Services.Config.Implementation { if (configFilePath == null) { - var appConfig = Path.Combine(Configuration.BaseDirectory, string.Format("{0}.config", System.AppDomain.CurrentDomain.FriendlyName)); + var appConfig = Path.Combine(Configuration.BaseDirectory, $"{System.AppDomain.CurrentDomain.FriendlyName}.config"); if (File.Exists(appConfig)) { _configFilePath = appConfig; diff --git a/ZeroLevel/Services/Config/Implementation/IniFileReader.cs b/ZeroLevel/Services/Config/Implementation/IniFileReader.cs index e8386ff..5f2f889 100644 --- a/ZeroLevel/Services/Config/Implementation/IniFileReader.cs +++ b/ZeroLevel/Services/Config/Implementation/IniFileReader.cs @@ -63,7 +63,7 @@ namespace ZeroLevel.Services.Config.Implementation { if (!string.IsNullOrEmpty(sectionName)) { - result.Append(string.Format("{0}.{1}", sectionName, key), value); + result.Append($"{sectionName}.{key}", value); } else { diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs index a23d7f0..a05d59d 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs @@ -32,7 +32,7 @@ namespace DOM.DSL.Contexts { reader.Move(); var name = reader.ReadIdentity(); - if (name.Equals(string.Format("end{0}", _name))) + if (name.Equals($"end{_name}")) { reader.Move(name.Length); return; @@ -64,7 +64,7 @@ namespace DOM.DSL.Contexts { reader.Move(); var name = reader.ReadIdentity(); - if (name.Equals(string.Format("end{0}", _name))) + if (name.Equals($"end{_name}")) { reader.Move(name.Length); return; @@ -106,7 +106,7 @@ namespace DOM.DSL.Contexts if (offset == -1) return; reader.Move(offset + 1); var name = reader.ReadIdentity(); - if (name.Equals(string.Format("end{0}", _name))) + if (name.Equals($"end{_name}")) { reader.Move(name.Length); return; diff --git a/ZeroLevel/Services/DOM/Services/ContentElementSerializer.cs b/ZeroLevel/Services/DOM/Services/ContentElementSerializer.cs index 1cc26b5..2cf68ae 100644 --- a/ZeroLevel/Services/DOM/Services/ContentElementSerializer.cs +++ b/ZeroLevel/Services/DOM/Services/ContentElementSerializer.cs @@ -50,7 +50,7 @@ namespace DOM.Services case ContentElementType.Form: return new FormContent(reader); } - throw new InvalidCastException(string.Format("Uncknown element type: {0}", type)); + throw new InvalidCastException($"Uncknown element type: {type}"); } public static List ReadCollection(IBinaryReader reader) diff --git a/ZeroLevel/Services/IdGenerator.cs b/ZeroLevel/Services/IdGenerator.cs index 060ae7f..b17abcb 100644 --- a/ZeroLevel/Services/IdGenerator.cs +++ b/ZeroLevel/Services/IdGenerator.cs @@ -5,12 +5,12 @@ using System.Threading; namespace ZeroLevel.Services { /// - /// Предоставляет различные варианты генерации идентификаторов + /// Provides various options for generating identifiers /// public static class IdGenerator { /// - /// Возвращает функцию для получения последовательных значений int64 + /// Returns a function to get consecutive int64 values. /// public static Func IncreasingSequenceIdGenerator() { @@ -18,7 +18,7 @@ namespace ZeroLevel.Services return new Func(() => Interlocked.Increment(ref id)); } /// - /// Создает Base64 хэш от указанного даты/времени + /// Creates a base64 hash from the specified datetime /// public static string HashFromDateTime(DateTime date) { @@ -29,35 +29,35 @@ namespace ZeroLevel.Services .TrimEnd('='); } /// - /// Создает Base64 хэш от текущего даты/времени + /// Creates a base64 hash from the current datetime /// public static string HashFromCurrentDateTime() { return HashFromDateTime(DateTime.Now); } /// - /// Возвращает хэш в виде строки от 32-хбитного значения хэша указанного даты/времени + /// Returns a hash as a string from the 32-bit hash value of the specified datetime /// public static string ShortHashFromDateTime(DateTime date) { return date.ToString(CultureInfo.InvariantCulture).GetHashCode().ToString("x"); } /// - /// Возвращает хэш в виде строки от 32-хбитного значения хэша текущего даты/времени + /// Returns a hash as a string from the 32-bit hash value of the current datetime /// public static string ShortHashFromCurrentDateTime() { return DateTime.Now.ToString(CultureInfo.InvariantCulture).GetHashCode().ToString("x"); } /// - /// Создает временную отметку из текущей даты/времени + /// Creates a timestamp from current datetime /// public static string CreateTimestamp() { return DateTime.Now.ToString("yyyyMMddHHmmssFFF"); } /// - /// Создает временную отметку из указанной даты/времени + /// Creates a timestamp from a specified datetime /// public static string CreateTimestamp(DateTime date) { diff --git a/ZeroLevel/Services/Network/Exceptions/NoConnectionException.cs b/ZeroLevel/Services/Network/Exceptions/NoConnectionException.cs deleted file mode 100644 index 46540b9..0000000 --- a/ZeroLevel/Services/Network/Exceptions/NoConnectionException.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace ZeroLevel.Services.Network.Exceptions -{ - public class NoConnectionException - : Exception - { - } -} diff --git a/ZeroLevel/Services/Network/Models/ExchangeAttributes.cs b/ZeroLevel/Services/Network/Models/ExchangeAttributes.cs index 5bdc5f0..182506c 100644 --- a/ZeroLevel/Services/Network/Models/ExchangeAttributes.cs +++ b/ZeroLevel/Services/Network/Models/ExchangeAttributes.cs @@ -4,15 +4,15 @@ namespace ZeroLevel.Network.Microservices { public abstract class ExchangeAttribute : Attribute { } /// - /// Отмечает метод который является обработчиком сообщений по умолчанию + /// Marks the method that is the default message handler /// public sealed class ExchangeMainHandlerAttribute : ExchangeAttribute { } /// - /// Отмечает метод который является обработчиком запросов по умолчанию + /// Marks the method that is the default message handler /// public sealed class ExchangeMainReplierAttribute : ExchangeAttribute { } /// - /// Отмечает метод-обработчик сообщений для inbox'а с указанным именем + /// Marks a message handler method for an inbox with the specified name. /// public sealed class ExchangeHandlerAttribute : ExchangeAttribute { @@ -24,7 +24,7 @@ namespace ZeroLevel.Network.Microservices } } /// - /// Отмечает метод-обработчик запросов для inbox'а с указанным именем + /// Marks a message handler method for an inbox with the specified name. /// public sealed class ExchangeReplierAttribute : ExchangeAttribute { @@ -36,11 +36,11 @@ namespace ZeroLevel.Network.Microservices } } /// - /// Отмечает метод-обработчик сообщений для inbox'а с указанным именем + /// Marks a message handler method for an inbox with the specified name. /// public sealed class ExchangeMainReplierWithoutArgAttribute : ExchangeAttribute { } /// - /// Отмечает метод-обработчик запросов для inbox'а с указанным именем + /// Marks a message handler method for an inbox with the specified name. /// public sealed class ExchangeReplierWithoutArgAttribute : ExchangeAttribute { diff --git a/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs b/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs index 54a8ad3..0ed6118 100644 --- a/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs +++ b/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs @@ -12,35 +12,33 @@ namespace ZeroLevel.Network.Microservices public const string DEFAULT_TYPE_NAME = "__service_default_type__"; /// - /// Ключ сервиса, должен быть уникален в рамках бизнес функционала - /// т.е. с одинаковым ключом могут работать только копии сервиса, для горизонтальной балансировки + /// Service key, must be unique within the business functionality. + /// two services with same key will be horizontally balanced /// [DataMember] public string ServiceKey { get; set; } /// - /// Группа, для фильтрации, в качетсве группы можно определять сервисы работающие в одном домене, - /// например сервисы обрабатывющие новости в одной группе, сервисы по котировкам в другой + /// The group can determine the services working in the same domain /// [DataMember] public string ServiceGroup { get; set; } = DEFAULT_GROUP_NAME; /// - /// Тип сервиса, для фильтрации, определяет принадлежность к подгруппе, например сервисы для доставки информации, - /// или сервисы-адаптеры и т.д. + /// The type of service, for filtering, determines membership in a subgroup. /// [DataMember] public string ServiceType { get; set; } = DEFAULT_TYPE_NAME; /// - /// Протокол по которому разрешен доступ к API сервиса + /// Protocol on which access to the service API is allowed /// [DataMember] public string Protocol { get; set; } /// - /// Точка подключения, адрес + /// Connection point, address /// [DataMember] public string Endpoint { get; set; } /// - /// Версия сервиса + /// Service version /// [DataMember] public string Version { get; set; } diff --git a/ZeroLevel/Services/Network/Models/ServiceEndpointInfo.cs b/ZeroLevel/Services/Network/Models/ServiceEndpointInfo.cs index ddde80f..0d71fda 100644 --- a/ZeroLevel/Services/Network/Models/ServiceEndpointInfo.cs +++ b/ZeroLevel/Services/Network/Models/ServiceEndpointInfo.cs @@ -3,7 +3,7 @@ namespace ZeroLevel.Network.Microservices { /// - /// Точка подключения + /// Endpoint /// public class ServiceEndpointInfo : IEquatable diff --git a/ZeroLevel/Services/Network/Models/ServiceEndpointsInfo.cs b/ZeroLevel/Services/Network/Models/ServiceEndpointsInfo.cs index 558b551..25a0d31 100644 --- a/ZeroLevel/Services/Network/Models/ServiceEndpointsInfo.cs +++ b/ZeroLevel/Services/Network/Models/ServiceEndpointsInfo.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace ZeroLevel.Network.Microservices { /// - /// Информация о точках подключения для сервиса + /// Information about service connection points /// public class ServiceEndpointsInfo : IEquatable diff --git a/ZeroLevel/Services/Network/Services/ExRouter.cs b/ZeroLevel/Services/Network/Services/ExRouter.cs index d1c8617..9cd148d 100644 --- a/ZeroLevel/Services/Network/Services/ExRouter.cs +++ b/ZeroLevel/Services/Network/Services/ExRouter.cs @@ -14,10 +14,8 @@ namespace ZeroLevel.Services.Network.Services private sealed class MRInvoker { /// - /// Создает скомпилированное выражение для быстрого вызова метода, возвращает идентификатор выражения и делегат для вызова + /// Creates a compiled expression for a quick method call, returns the identifier of the expression and a delegate for the call. /// - /// Оборачиваемый метод - /// Кортеж с идентификатором выражения и делегатом private static Invoker CreateCompiledExpression(MethodInfo method) { var targetArg = Expression.Parameter(typeof(object)); // Цель на которой происходит вызов @@ -36,11 +34,6 @@ namespace ZeroLevel.Services.Network.Services body = Expression.Convert(body, typeof(object)); return Expression.Lambda(body, targetArg, argsArg).Compile(); } - /// - /// Оборачивает вызов делегата - /// - /// Оборачиваемый делегат - /// Кортеж с идентификатором выражения и делегатом private static Invoker CreateCompiledExpression(Delegate handler) { return CreateCompiledExpression(handler.GetMethodInfo()); @@ -127,7 +120,7 @@ namespace ZeroLevel.Services.Network.Services } else { - throw new Exception(string.Format("[SocketExchangeServer] Inbox {0} already exists", inbox)); + throw new Exception($"[SocketExchangeServer] Inbox {inbox} already exists"); } } @@ -139,7 +132,7 @@ namespace ZeroLevel.Services.Network.Services } else { - throw new Exception(string.Format("[SocketExchangeServer] Inbox {0} already exists", inbox)); + throw new Exception($"[SocketExchangeServer] Inbox {inbox} already exists"); } } #endregion diff --git a/ZeroLevel/Services/Network/Services/ExService.cs b/ZeroLevel/Services/Network/Services/ExService.cs index 32a7230..f581d01 100644 --- a/ZeroLevel/Services/Network/Services/ExService.cs +++ b/ZeroLevel/Services/Network/Services/ExService.cs @@ -47,11 +47,11 @@ namespace ZeroLevel.Services.Network public IPEndPoint Endpoint => _server.Endpoint; /// - /// Регистрация обработчика входящих сообщений + /// Registering an Inbox Handler /// - /// Тип сообщения - /// Имя точки приема - /// Обработчик + /// Message type + /// Inbox name + /// Handler public void RegisterInbox(string inbox, Action handler) { _router.RegisterInbox(inbox, handler); @@ -61,13 +61,13 @@ namespace ZeroLevel.Services.Network _router.RegisterInbox(DEFAULT_MESSAGE_INBOX, handler); } /// - /// Регистрация метода отдающего ответ на входящий запрос + /// Registration method responding to an incoming request /// - /// Тип входного сообщения - /// Тип ответа - /// Транспортный протокол - /// Имя точки приема - /// Обработчик + /// Type of input message + /// Type of response + /// Protocol + /// Inbox name + /// Handler public void RegisterInbox(string inbox, Func handler) { _router.RegisterInbox(inbox, handler); @@ -77,12 +77,12 @@ namespace ZeroLevel.Services.Network _router.RegisterInbox(DEFAULT_REQUEST_INBOX, handler); } /// - /// Регистрация метода отдающего ответ на входящий запрос, не принимающего входящих данных + /// Registration of the method of responding to the incoming request, not receiving incoming data /// - /// Тип ответа - /// Транспортный протокол - /// Имя точки приема - /// Обработчик + /// Type of response + /// Protocol + /// Inbox name + /// Handler public void RegisterInbox(string inbox, Func handler) { _router.RegisterInbox(inbox, handler); diff --git a/ZeroLevel/Services/Network/Services/FrameParser.cs b/ZeroLevel/Services/Network/Services/FrameParser.cs index eef1297..9cd4b0c 100644 --- a/ZeroLevel/Services/Network/Services/FrameParser.cs +++ b/ZeroLevel/Services/Network/Services/FrameParser.cs @@ -48,7 +48,7 @@ namespace ZeroLevel.Services.Network offset = 0; if (Size == 0) { - // Как минимум 1 байт с контрольной суммой должен быть + // At least 1 byte with checksum must be Corrupted = true; } } @@ -135,7 +135,7 @@ namespace ZeroLevel.Services.Network { for (; start < length; start++) { - // Поиск начала заголовка пакета + // Search for the beginning of the package header if ((part[start] & ZBaseNetwork.PACKET_HEADER_START_BYTE) == ZBaseNetwork.PACKET_HEADER_START_BYTE) { _accum.Reset(); diff --git a/ZeroLevel/Services/Network/ZBaseNetwork.cs b/ZeroLevel/Services/Network/ZBaseNetwork.cs index bd49928..26a1dd9 100644 --- a/ZeroLevel/Services/Network/ZBaseNetwork.cs +++ b/ZeroLevel/Services/Network/ZBaseNetwork.cs @@ -11,32 +11,32 @@ namespace ZeroLevel.Services.Network protected const string DEFAULT_PING_INBOX = "__ping__"; protected const string DEFAULT_REQUEST_ERROR_INBOX = "__request_error__"; /// - /// Размер буфера для приема данных + /// Buffer size for receiving data /// protected const int DEFAULT_RECEIVE_BUFFER_SIZE = 4096; /// - /// Если в течение указанного периода не было сетевой активности, выслать пинг-реквест + /// If during the specified period there was no network activity, send a ping-request /// protected const long HEARTBEAT_PING_PERIOD_TICKS = 1500 * TimeSpan.TicksPerMillisecond; /// - /// Период проверки наличия соединения + /// Connection check period /// protected const int HEARTBEAT_UPDATE_PERIOD_MS = 7500; /// - /// Период выполнения запроса, после которого считать его неудачным + /// The period of the request, after which it is considered unsuccessful /// protected const long MAX_REQUEST_TIME_TICKS = 30000 * TimeSpan.TicksPerMillisecond; public const int MAX_REQUEST_TIME_MS = 30000; /// - /// Максимальный размер пакета данных для передачи (сериализованный размер фрейма) + /// Maximum size of data packet to transmit (serialized frame size) /// public const int MAX_FRAME_PAYLOAD_SIZE = 1024 * 1024 * 32; /// - /// Начальный байт заголовка пакета данных + /// Starting byte of the data packet header /// public const byte PACKET_HEADER_START_BYTE = 181; /// - /// Размер очереди сообщения для отправки + /// The size of the message queue to send /// public const int MAX_SEND_QUEUE_SIZE = 1024; diff --git a/ZeroLevel/Services/Network/ZSocketClient.cs b/ZeroLevel/Services/Network/ZSocketClient.cs index 6e6f379..7163661 100644 --- a/ZeroLevel/Services/Network/ZSocketClient.cs +++ b/ZeroLevel/Services/Network/ZSocketClient.cs @@ -5,7 +5,6 @@ using System.Net; using System.Net.Sockets; using System.Threading; using ZeroLevel.Services.Network.Contract; -using ZeroLevel.Services.Network.Exceptions; using ZeroLevel.Services.Network.Models; using ZeroLevel.Services.Pools; using ZeroLevel.Services.Serialization; diff --git a/ZeroLevel/Services/ObjectMapping/TypeMapper.cs b/ZeroLevel/Services/ObjectMapping/TypeMapper.cs index fb7e138..9277ea2 100644 --- a/ZeroLevel/Services/ObjectMapping/TypeMapper.cs +++ b/ZeroLevel/Services/ObjectMapping/TypeMapper.cs @@ -91,8 +91,7 @@ namespace ZeroLevel.Services.ObjectMapping var setter = this._fields[name].Setter; if (setter == null) { - throw new Exception(string.Format("{0} '{1}' has not setter", - this._fields[name].IsField ? "Field" : "Property", name)); + throw new Exception($"{(this._fields[name].IsField ? "Field" : "Property")} '{name}' has not setter"); } if (value == null) { @@ -116,12 +115,11 @@ namespace ZeroLevel.Services.ObjectMapping var getter = this._fields[name]?.Getter; if (getter == null) { - throw new Exception(string.Format("{0} '{1}' has not getter", - this._fields[name].IsField ? "Field" : "Property", name)); + throw new Exception($"{(this._fields[name].IsField ? "Field" : "Property")} '{name}' has not getter"); } return getter(instance); } - throw new KeyNotFoundException(string.Format("Not found field {0}", name)); + throw new KeyNotFoundException($"Not found field {name}"); } public T Get(object instance, string name) @@ -131,12 +129,11 @@ namespace ZeroLevel.Services.ObjectMapping var getter = this._fields[name]?.Getter; if (getter == null) { - throw new Exception(string.Format("{0} '{1}' has not getter", - this._fields[name].IsField ? "Field" : "Property", name)); + throw new Exception($"{(this._fields[name].IsField ? "Field" : "Property")} '{name}' has not getter"); } return (T)getter(instance); } - throw new KeyNotFoundException(string.Format("Not found field {0}", name)); + throw new KeyNotFoundException($"Not found field {name}"); } public object GetOrDefault(object instance, string name, object defaultValue) @@ -150,7 +147,7 @@ namespace ZeroLevel.Services.ObjectMapping } return getter(instance); } - throw new KeyNotFoundException(string.Format("Not found field {0}", name)); + throw new KeyNotFoundException($"Not found field {name}"); } public T GetOrDefault(object instance, string name, T defaultValue) @@ -164,7 +161,7 @@ namespace ZeroLevel.Services.ObjectMapping } return (T)getter(instance); } - throw new KeyNotFoundException(string.Format("Not found field {0}", name)); + throw new KeyNotFoundException($"Not found field {name}"); } #endregion diff --git a/ZeroLevel/Services/Queries/Builder/IQueryBuilder.cs b/ZeroLevel/Services/Queries/Builder/IQueryBuilder.cs index 4e59b41..c1b46dc 100644 --- a/ZeroLevel/Services/Queries/Builder/IQueryBuilder.cs +++ b/ZeroLevel/Services/Queries/Builder/IQueryBuilder.cs @@ -3,10 +3,10 @@ public interface IQueryBuilder { /// - /// Превращение абстрактного запроса в реальный, под конкретное хранилище + /// Turning an abstract query into a real one, for a specific repository /// - /// Абстрактный запрос - /// Запрос к хранилищу конкретного типа + /// Abstract query + /// Request to store a specific type IRealQuery Build(IQuery query); } } diff --git a/ZeroLevel/Services/Reflection/StringToTypeConverter.cs b/ZeroLevel/Services/Reflection/StringToTypeConverter.cs index ea10c8a..e49a28f 100644 --- a/ZeroLevel/Services/Reflection/StringToTypeConverter.cs +++ b/ZeroLevel/Services/Reflection/StringToTypeConverter.cs @@ -8,12 +8,8 @@ namespace ZeroLevel.Services.Reflection #region TypeHelpers /// - /// Преобразование строки в тип, если для типа есть соответствующий конвертер, при отсутствии конвертера возвращается - /// состояние по умолчанию для указанного типа + /// Сonverting a string to a type, if there is a corresponding converter for the type, in the absence of a converter, the default state for the specified type is returned /// - /// Строка - /// Тип к которому требуется привести значение в строке - /// Результат преобразования public static object TryConvert(string input, Type to) { try @@ -28,17 +24,14 @@ namespace ZeroLevel.Services.Reflection } /// - /// Создание значения по умолчанию для указанного типа + /// Creating default values for specified type /// - /// Тип - /// Значение по умолчанию private static object CreateDefaultState(Type type) { if (type.IsValueType) { return Activator.CreateInstance(type); } - return null; } diff --git a/ZeroLevel/Services/Reflection/TypeFastAccessMethodBuilderImpl.cs b/ZeroLevel/Services/Reflection/TypeFastAccessMethodBuilderImpl.cs index 4e8755d..b11977a 100644 --- a/ZeroLevel/Services/Reflection/TypeFastAccessMethodBuilderImpl.cs +++ b/ZeroLevel/Services/Reflection/TypeFastAccessMethodBuilderImpl.cs @@ -34,7 +34,7 @@ namespace ZeroLevel.Services.Reflection return (Func)lambda.Compile(); } /// - /// Создает быстрый сеттер для свойства + /// Creates a quick setter for a property /// public Action BuildSetter(PropertyInfo property) { @@ -53,7 +53,7 @@ namespace ZeroLevel.Services.Reflection return expr.Compile(); } /// - /// Создает быстрый сеттер для поля + /// Creates a quick setter for a field. /// public Action BuildSetter(FieldInfo field) { diff --git a/ZeroLevel/Services/Reflection/TypeHelpers.cs b/ZeroLevel/Services/Reflection/TypeHelpers.cs index d281af9..a47873d 100644 --- a/ZeroLevel/Services/Reflection/TypeHelpers.cs +++ b/ZeroLevel/Services/Reflection/TypeHelpers.cs @@ -9,113 +9,78 @@ using System.Runtime.Serialization; namespace ZeroLevel.Services.Reflection { /// - /// Набор методов для работы с типами объектов + /// A set of methods for working with object types /// public static class TypeHelpers { - /// - /// True если массив - /// public static bool IsArray(Type type) { return type.Return(t => t.IsArray, false); } - /// - /// True если структура - /// public static bool IsStruct(Type type) { return type.Return(t => t.IsValueType && !IsSimpleType(t), false); } - /// - /// True если класс - /// public static bool IsClass(Type type) { return type.Return(t => t.IsClass, false); } - /// - /// True если URI - /// public static bool IsUri(Type type) { return type.Return(t => (typeof(Uri).IsAssignableFrom(t)), false); } - /// - /// True если хэшсет - /// public static bool IsHashSet(Type type) { return type.Return(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(HashSet<>), false); } - - /// - /// True если строка - /// public static bool IsString(Type type) { return type.Return(t => t == typeof(string)); } - /// - /// True если базовый тип - date, decimal, string, или GUID - /// - public static bool IsSimpleType(Type type) - { - return type.Return(t => - { - if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - t = Nullable.GetUnderlyingType(t); - } - return t.IsPrimitive - || t == typeof(DateTime) - || t == typeof(decimal) - || t == typeof(string) - || t == typeof(Guid) - || t == typeof(TimeSpan); - }, false); - } - /// - /// True если тип данных - /// public static bool IsRuntimeType(Type type) { return type.Return(t => (typeof(Type).IsAssignableFrom(t)), false); } - /// - /// True если IPEndPoint - /// public static bool IsIpEndPoint(Type type) { return type.Return(t => t == typeof(IPEndPoint), false); } - /// - /// True если DataSet - /// public static bool IsDataset(Type type) { return type.Return(t => t == typeof(DataSet), false); } - /// - /// True если DataTable - /// public static bool IsDataTable(Type type) { return type.Return(t => t == typeof(DataTable), false); } - /// - /// True если DataRow - /// public static bool IsDataRow(Type type) { return type.Return(t => t == typeof(DataRow), false); } - public static bool IsList(Type type) { return type.Return(t => t.GetInterfaces().Contains(typeof(IList)), false); } + /// + /// True if the base type is datetime, decimal, string, or GUID + /// + public static bool IsSimpleType(Type type) + { + return type.Return(t => + { + if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + t = Nullable.GetUnderlyingType(t); + } + return t.IsPrimitive + || t == typeof(DateTime) + || t == typeof(decimal) + || t == typeof(string) + || t == typeof(Guid) + || t == typeof(TimeSpan); + }, false); + } public static bool IsDictionary(Type type) { diff --git a/ZeroLevel/Services/Semantic/Contracts/ILexProvider.cs b/ZeroLevel/Services/Semantic/Contracts/ILexProvider.cs index 35c74ec..cfd9084 100644 --- a/ZeroLevel/Services/Semantic/Contracts/ILexProvider.cs +++ b/ZeroLevel/Services/Semantic/Contracts/ILexProvider.cs @@ -5,33 +5,33 @@ namespace ZeroLevel.Services.Semantic public interface ILexProvider { /// - /// Выделение токенов из текста как есть + /// Extract tokens from text as is /// - /// Список токенов + /// Spisok tokenov IEnumerable ExtractLexTokens(string text); /// - /// Выделение уникальных токенов из текста + /// Selecting unique tokens from text /// - /// Список токенов + /// Tokens IEnumerable ExtractUniqueLexTokens(string text); /// - /// Выделение уникальных токенов из текста с отбрасыванием стоп-слов + /// Allocation of unique tokens from text with drop of stop words /// - /// Список токенов + /// Tokens IEnumerable ExtractUniqueLexTokensWithoutStopWords(string text); /// - /// Поиск токенов в тексте соответствующих указанным словам (полнотекстовый поиск) + /// Search for tokens in the text corresponding to the specified words (full-text search) /// - /// Текст по которому выполняется поиск - /// Слова для поиска - /// Словарь, где ключ - слово, значение - список соответствующих ему найденных токенов + /// Search text + /// Search words + /// Dictionary, where key is a word, value is a list of matching tokens found for it IDictionary> SearchLexTokensByWords(string text, string[] words); /// - /// Поиск токенов в тексте соответствующих указанным фразам (полнотекстовый поиск) + /// Search for tokens in the text corresponding to the specified phrases (full-text search) /// - /// Текст по которому выполняется поиск - /// Фразы для поиска - /// Словарь, где ключ - фраза, значение - список соответствующих ему найденных массивов токенов + /// Search text + /// Search phrases + /// The dictionary, where the key is a phrase, a value is a list of token arrays corresponding to it IDictionary> SearchLexTokensByPhrases(string text, string[] phrases); } } diff --git a/ZeroLevel/Services/Semantic/Contracts/ILexer.cs b/ZeroLevel/Services/Semantic/Contracts/ILexer.cs index 99768e0..c7e874f 100644 --- a/ZeroLevel/Services/Semantic/Contracts/ILexer.cs +++ b/ZeroLevel/Services/Semantic/Contracts/ILexer.cs @@ -1,7 +1,7 @@ namespace ZeroLevel.Services.Semantic { /// - /// Выполняет преобразование слова к абстрактной основе слова(корень, стем, лемма и т.п.) + /// Performs word conversion to abstract word basis (root, stem, lemma, etc.) /// public interface ILexer { diff --git a/ZeroLevel/Services/Semantic/Contracts/LexToken.cs b/ZeroLevel/Services/Semantic/Contracts/LexToken.cs index ffc1750..e1b7bc9 100644 --- a/ZeroLevel/Services/Semantic/Contracts/LexToken.cs +++ b/ZeroLevel/Services/Semantic/Contracts/LexToken.cs @@ -32,7 +32,7 @@ namespace ZeroLevel.Services.Semantic { if ((object)this == (object)other) return true; - if (this == null) // и так бывает + if (this == null) throw new NullReferenceException(); if (other == null) return false; diff --git a/ZeroLevel/Services/Semantic/Contracts/README.txt b/ZeroLevel/Services/Semantic/Contracts/README.txt index 26f1b54..838377f 100644 --- a/ZeroLevel/Services/Semantic/Contracts/README.txt +++ b/ZeroLevel/Services/Semantic/Contracts/README.txt @@ -1,22 +1,22 @@ -Реализация основы для семантической работы с текстом. +The implementation of the basis for semantic work with the text. -LexProvider - реализует выделение токенов из текста, где под токеном понимается какое-либо приведение слова. -Например, токеном может являться непосредственно само слово, стем, лемма. +LexProvider - implements the selection of tokens from the text, where a token is any coercion of a word. +For example, a token can be directly the word itself, a system, a lemma. -В качестве реализации созданы две фабрики: +Two factories were created as an implementation: -SnowbolLexProviderFactory - возвращает провайдеры на основе стемминга 'Snowball' -JustWordLexProviderFactory - возвращает провайдер который принимает за токен непосредственно слово, без изменений (lower case) +SnowbolLexProviderFactory - returns providers based on stemming 'Snowball' +JustWordLexProviderFactory - returns a provider that takes the word itself for the token, no change (lower case) -Для реализации собственного провайдера потребуется создать класс на основе интерфейса ILexer и реализовать метод Lex, -в котором будет проведена необходимая нормализация слова в нужном семантическом контексте. +To implement your own provider, you need to create a class based on the ILexer interface and implement the Lex method, +in which the necessary normalization of the word in the necessary semantic context will be carried out. -Например: +For example: public class LemmaLexer: ILexer { - public string Lex(string word) { return Lemmatizer.Lemma(word); } +public string Lex (string word) {return Lemmatizer.Lemma (word); } } -После чего можно создать на его основе провайдер: +Then you can create a provider based on it: -var provider = new LexProvider(new LemmaLexer()); \ No newline at end of file +var provider = new LexProvider (new LemmaLexer ()); \ No newline at end of file diff --git a/ZeroLevel/Services/Semantic/Helpers/TextAnalizer.cs b/ZeroLevel/Services/Semantic/Helpers/TextAnalizer.cs index 9ab249b..1dc9aeb 100644 --- a/ZeroLevel/Services/Semantic/Helpers/TextAnalizer.cs +++ b/ZeroLevel/Services/Semantic/Helpers/TextAnalizer.cs @@ -11,10 +11,10 @@ namespace ZeroLevel.Implementation.Semantic.Helpers RegexOptions.Compiled | RegexOptions.IgnoreCase); /// - /// Выделение слов из текста + /// Highlighting words from text /// - /// Текст - /// Список слов + /// Text + /// Words public static IEnumerable ExtractWords(string text) { var result = new List(); @@ -27,30 +27,30 @@ namespace ZeroLevel.Implementation.Semantic.Helpers } /// - /// Выделение уникальных слов из текста + /// Highlighting unique words from text /// - /// Текст - /// Список уникальных слов + /// Text + /// List of unique words public static IEnumerable ExtractUniqueWords(string text) { return new HashSet(ExtractWords(text)); } /// - /// Выделение уникальных слов из текста без стоп слов + /// Highlighting unique words from text without stop words /// - /// Текст - /// Список уникальных слов без стоп слов + /// Text + /// List of unique words without stop words public static IEnumerable ExtractUniqueWordsWithoutStopWords(string text) { return new HashSet(ExtractUniqueWords(text).Where(w => StopWords.IsStopWord(w) == false)); } /// - /// Выделение токенов из текста + /// Extract tokens from text /// - /// Текст - /// Список токенов + /// Text + /// Tokens public static IEnumerable ExtractWordTokens(string text) { var result = new List(); @@ -63,20 +63,20 @@ namespace ZeroLevel.Implementation.Semantic.Helpers } /// - /// Выделение уникальных токенов из текста (первое вхождение) + /// Selection of unique tokens from the text (first entry) /// - /// Текст - /// Список уникальных токенов + /// Text + /// List of unique tokens public static IEnumerable ExtractUniqueWordTokens(string text) { return ExtractWordTokens(text).DistinctBy(t => t.Word); } /// - /// Выделение уникальных токенов из текста с отбрасыванием стоп-слов + /// Allocation of unique tokens from text with drop of stop words /// - /// Текст - /// Список уникальных токенов без стоп слов + /// Text + /// List of unique tokens without stop words public static IEnumerable ExtractUniqueWordTokensWithoutStopWords(string text) { return ExtractWordTokens(text).DistinctBy(t => t.Word).Where(t => StopWords.IsStopWord(t.Word) == false); diff --git a/ZeroLevel/Services/Semantic/WordLexer.cs b/ZeroLevel/Services/Semantic/WordLexer.cs index 4a8f7ef..394e6f3 100644 --- a/ZeroLevel/Services/Semantic/WordLexer.cs +++ b/ZeroLevel/Services/Semantic/WordLexer.cs @@ -1,6 +1,4 @@ -using ZeroLevel.Services.Semantic; - -namespace ZeroLevel.Services.Semantic +namespace ZeroLevel.Services.Semantic { public class WordLexer : ILexer { diff --git a/ZeroLevel/Services/Serialization/MemoryStreamReader.cs b/ZeroLevel/Services/Serialization/MemoryStreamReader.cs index 6efa0c3..1599603 100644 --- a/ZeroLevel/Services/Serialization/MemoryStreamReader.cs +++ b/ZeroLevel/Services/Serialization/MemoryStreamReader.cs @@ -7,16 +7,13 @@ using System.Text; namespace ZeroLevel.Services.Serialization { /// - /// Обертка над MemoryStream для чтения, с проверкой выхода за пределы потока + /// A wrapper over a MemoryStream for reading, with a check for overflow /// public sealed class MemoryStreamReader : IBinaryReader { private readonly MemoryStream _stream; - /// - /// Конструктор - /// - /// Данные для чтения + public MemoryStreamReader(byte[] data) { if (data == null) @@ -25,7 +22,7 @@ namespace ZeroLevel.Services.Serialization } /// - /// Чтение флага + /// Flag reading /// public bool ReadBoolean() { @@ -34,7 +31,7 @@ namespace ZeroLevel.Services.Serialization return BitConverter.ToBoolean(new byte[1] { ReadByte() }, 0); } /// - /// Чтение байта + /// Reading byte /// public byte ReadByte() { @@ -43,7 +40,7 @@ namespace ZeroLevel.Services.Serialization return (byte)_stream.ReadByte(); } /// - /// Чтение байт-массива + /// Reading bytes /// /// public byte[] ReadBytes() @@ -53,7 +50,7 @@ namespace ZeroLevel.Services.Serialization return ReadBuffer(length); } /// - /// Чтение целого 32-хбитного числа (4 байта) + /// Read 32-bit integer (4 bytes) /// public Int32 ReadInt32() { @@ -67,7 +64,7 @@ namespace ZeroLevel.Services.Serialization return BitConverter.ToInt32(buffer, 0); } /// - /// Чтение целого 64-хбитного числа (8 байт) + /// Read integer 64-bit number (8 bytes) /// public Int64 ReadLong() { @@ -87,7 +84,7 @@ namespace ZeroLevel.Services.Serialization } /// - /// Чтение строки (4 байта на длину + Length байт) + /// Read string (4 bytes per length + Length bytes) /// public string ReadString() { @@ -97,7 +94,7 @@ namespace ZeroLevel.Services.Serialization return Encoding.UTF8.GetString(buffer); } /// - /// Чтение GUID (16 байт) + /// Read GUID (16 bytes) /// public Guid ReadGuid() { @@ -105,7 +102,7 @@ namespace ZeroLevel.Services.Serialization return new Guid(buffer); } /// - /// Чтение байт-пакета (читается размер из указанного количества байт и затем сам пакет прочитанного размера) + /// Reading byte-package (read the size of the specified number of bytes, and then the packet itself read size) /// public byte[] ReadBuffer(int count) { @@ -115,11 +112,11 @@ namespace ZeroLevel.Services.Serialization var buffer = new byte[count]; var readedCount = _stream.Read(buffer, 0, count); if (count != readedCount) - throw new InvalidOperationException(string.Format("The stream returned less data ({0} bytes) than expected ({1} bytes)", count, readedCount)); + throw new InvalidOperationException($"The stream returned less data ({count} bytes) than expected ({readedCount} bytes)"); return buffer; } /// - /// Чтение даты времени + /// Reading the datetime /// /// public DateTime? ReadDateTime() @@ -145,7 +142,7 @@ namespace ZeroLevel.Services.Serialization } /// - /// Проверка не выходит ли чтение данных за пределы потока + /// Check if data reading is outside the stream /// bool CheckOutOfRange(Stream stream, int offset) { @@ -333,9 +330,6 @@ namespace ZeroLevel.Services.Serialization } #endregion - /// - /// Очистка - /// public void Dispose() { _stream.Dispose(); diff --git a/ZeroLevel/Services/Serialization/MemoryStreamWriter.cs b/ZeroLevel/Services/Serialization/MemoryStreamWriter.cs index d0530ff..4daadb0 100644 --- a/ZeroLevel/Services/Serialization/MemoryStreamWriter.cs +++ b/ZeroLevel/Services/Serialization/MemoryStreamWriter.cs @@ -9,7 +9,7 @@ using ZeroLevel.Services.Extensions; namespace ZeroLevel.Services.Serialization { /// - /// Обертка над MemoryStream для записи + /// Wrapper over memorystream for writing /// public sealed class MemoryStreamWriter : IBinaryWriter @@ -29,21 +29,21 @@ namespace ZeroLevel.Services.Serialization _stream = new MemoryStream(); } /// - /// Запись булевого значения (1 байт) + /// Record a boolean value (1 byte) /// public void WriteBoolean(bool val) { _stream.WriteByte(BitConverter.GetBytes(val)[0]); } /// - /// Запись байта (1 байт) + /// Write byte (1 byte) /// public void WriteByte(byte val) { _stream.WriteByte(val); } /// - /// Запись байт массива + /// Write array bytes /// /// public void WriteBytes(byte[] val) @@ -60,14 +60,14 @@ namespace ZeroLevel.Services.Serialization } /// - /// Запись целого 32-хбитного числа (4 байта) + /// Record a 32-bit integer (4 bytes) /// public void WriteInt32(Int32 number) { _stream.Write(BitConverter.GetBytes(number), 0, 4); } /// - /// Запись целого 64-хбитного числа (8 байт) + /// Record an integer 64-bit number (8 bytes) /// public void WriteLong(Int64 number) { @@ -90,7 +90,7 @@ namespace ZeroLevel.Services.Serialization } /// - /// Запись строки (4 байта на длину + Length байт) + /// Write string (4 bytes long + Length bytes) /// public void WriteString(string line) { @@ -106,14 +106,14 @@ namespace ZeroLevel.Services.Serialization } } /// - /// Запись GUID (16 байт) + /// GUID record (16 bytes) /// public void WriteGuid(Guid guid) { _stream.Write(guid.ToByteArray(), 0, 16); } /// - /// Запись даты времени + /// Record the datetime /// /// public void WriteDateTime(DateTime? datetime) diff --git a/ZeroLevel/Services/Shedulling/AsyncShedullerImpl.cs b/ZeroLevel/Services/Shedulling/AsyncShedullerImpl.cs index 95f7be4..f6095be 100644 --- a/ZeroLevel/Services/Shedulling/AsyncShedullerImpl.cs +++ b/ZeroLevel/Services/Shedulling/AsyncShedullerImpl.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Concurrent; using System.Threading.Tasks; -using ZeroLevel.Services.Logging; namespace ZeroLevel.Services.Shedulling { @@ -31,7 +30,7 @@ namespace ZeroLevel.Services.Shedulling private readonly ConcurrentDictionary _repitableAsyncActions = new ConcurrentDictionary(); /// - /// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи + /// Performs an action once a period, while the period is recalculated according to the transferred function at each re-creation of the task. /// /// Функция для расчета следующего периода /// Действие diff --git a/ZeroLevel/Services/Shedulling/ShedullerImpl.cs b/ZeroLevel/Services/Shedulling/ShedullerImpl.cs index 74bc50f..373b87f 100644 --- a/ZeroLevel/Services/Shedulling/ShedullerImpl.cs +++ b/ZeroLevel/Services/Shedulling/ShedullerImpl.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Concurrent; -using ZeroLevel.Services.Logging; namespace ZeroLevel.Services.Shedulling { /// - /// Простой планировщик для периодических и разовых задач выполняемых по расписанию + /// Simple scheduler for periodic and one-time scheduled tasks /// internal class ShedullerImpl : ISheduller @@ -32,11 +31,10 @@ namespace ZeroLevel.Services.Shedulling #region Repitable behaviour private readonly ConcurrentDictionary _repitableActions = new ConcurrentDictionary(); /// - /// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи + /// Performs an action once a period, while the period is recalculated according to the transferred function at each re-creation of the task. /// - /// Функция для расчета следующего периода - /// Действие - /// Идентификатор задания + /// Function to calculate the next period + /// Task ID public long RemindEveryNonlinearPeriod(Func nextEventPeriodCalcFunction, Action callback, bool breakWherError = false) @@ -44,12 +42,11 @@ namespace ZeroLevel.Services.Shedulling return RemindEveryNonlinearPeriod(nextEventPeriodCalcFunction, nextEventPeriodCalcFunction, callback, breakWherError); } /// - /// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи + /// Performs an action once a period, while the period is recalculated according to the transferred function at each re-creation of the task. /// - /// Функция для расчета периода до первого исполнения - /// Функция для расчета периода до последующих исполнений - /// Действие - /// Идентификатор задания + /// The function to calculate the period to the first execution + /// The function for calculating the period until subsequent performances + /// Task ID public long RemindEveryNonlinearPeriod(Func firstEventPeriodCalcFunction, Func nextEventPeriodCalcFunction, Action callback, @@ -82,7 +79,7 @@ namespace ZeroLevel.Services.Shedulling /// /// Функция для расчета следующей даты /// Действие - /// Идентификатор задания + /// Task ID public long RemindEveryNonlinearDate(Func nextEventDateCalcFunction, Action callback, bool breakWherError = false) @@ -130,7 +127,7 @@ namespace ZeroLevel.Services.Shedulling /// Функция для расчет даты первого запуска /// Функция для расчета следующей даты /// Действие - /// Идентификатор задания + /// Task ID public long RemindEveryNonlinearDate(Func firstEventDateCalcFunction, Func nextEventDateCalcFunction, Action callback, @@ -171,7 +168,7 @@ namespace ZeroLevel.Services.Shedulling /// /// Период /// Действие - /// Идентификатор задания + /// Task ID public long RemindEvery(TimeSpan timespan, Action callback, bool breakWherError = false) @@ -184,7 +181,7 @@ namespace ZeroLevel.Services.Shedulling /// Период до первого выполнения /// Период /// Действие - /// Идентификатор задания + /// Task ID public long RemindEvery(TimeSpan first, TimeSpan next, Action callback, diff --git a/ZeroLevel/Services/Specification/Building/SpecificationConstructorParametersResolver.cs b/ZeroLevel/Services/Specification/Building/SpecificationConstructorParametersResolver.cs index 3c33ce6..c5d9aca 100644 --- a/ZeroLevel/Services/Specification/Building/SpecificationConstructorParametersResolver.cs +++ b/ZeroLevel/Services/Specification/Building/SpecificationConstructorParametersResolver.cs @@ -24,12 +24,12 @@ namespace ZeroLevel.Contracts.Specification.Building } } /// - /// Для выбора одного значения из списка + /// To select a single value from the list /// private static readonly Dictionary> _enums = new Dictionary>(); /// - /// Для выбора нескольких значений из списка + /// To select multiple values from the list /// private static readonly Dictionary> _trees = new Dictionary>(); @@ -37,7 +37,7 @@ namespace ZeroLevel.Contracts.Specification.Building private static readonly object _locker = new object(); /// - /// Регистрация перечисления + /// Registration of enumerable /// public static void Register(string paramName, Dictionary map) { @@ -57,7 +57,7 @@ namespace ZeroLevel.Contracts.Specification.Building } } /// - /// Регистрация дерева + /// Tree Registration /// public static void RegisterTree(string paramName, ITree tree) { diff --git a/ZeroLevel/Services/Specification/Building/SpecificationParameter.cs b/ZeroLevel/Services/Specification/Building/SpecificationParameter.cs index 4ddbf19..7c7aa1d 100644 --- a/ZeroLevel/Services/Specification/Building/SpecificationParameter.cs +++ b/ZeroLevel/Services/Specification/Building/SpecificationParameter.cs @@ -3,24 +3,24 @@ namespace ZeroLevel.Contracts.Specification.Building { /// - /// Параметр конструктора спецификации + /// Specification constructor parameter /// public class SpecificationParameter { /// - /// Отображаемое имя + /// Display Name /// public string DisplayName; /// - /// Имя параметра + /// Parameter name /// public string ParameterName; /// - /// Тип параметра + /// Parameter type /// public Type ParameterType; /// - /// Значение параметра + /// Parameter value /// public object Value; } diff --git a/ZeroLevel/Services/Specification/Services/AssemblySpecificationFactory.cs b/ZeroLevel/Services/Specification/Services/AssemblySpecificationFactory.cs index 3949f4d..7c12d6d 100644 --- a/ZeroLevel/Services/Specification/Services/AssemblySpecificationFactory.cs +++ b/ZeroLevel/Services/Specification/Services/AssemblySpecificationFactory.cs @@ -37,7 +37,7 @@ namespace ZeroLevel.Specification { if (false == _filterTypes.ContainsKey(filterName)) { - throw new KeyNotFoundException(string.Format("Not found specification '{0}'", filterName)); + throw new KeyNotFoundException($"Not found specification '{filterName}'"); } return (ISpecification)Activator.CreateInstance(_filterTypes[filterName], args); @@ -47,7 +47,7 @@ namespace ZeroLevel.Specification { if (false == _filterTypes.ContainsKey(filterName)) { - throw new KeyNotFoundException(string.Format("Not found specification '{0}'", filterName)); + throw new KeyNotFoundException($"Not found specification '{filterName}'"); } return _filterTypes[filterName]; } diff --git a/ZeroLevel/Services/Specification/Services/SpecificationBuilder.cs b/ZeroLevel/Services/Specification/Services/SpecificationBuilder.cs index a15b402..f0cb598 100644 --- a/ZeroLevel/Services/Specification/Services/SpecificationBuilder.cs +++ b/ZeroLevel/Services/Specification/Services/SpecificationBuilder.cs @@ -7,23 +7,23 @@ using ZeroLevel.Services.Trees; namespace ZeroLevel.Specification { /// - /// Создает спецификацию используя конкретный конструктор + /// Creates a specification using a specific constructor. /// public class SpecificationBuilder : ISpecificationBuilder, IEquatable { /// - /// Тип спецификации + /// Type of specification /// private readonly Type _instanceType; /// - /// Список параметров конструктора + /// List of Constructor Parameters /// private readonly List _values = new List(); /// - /// Обозначение конструктора + /// Constructor name /// public string Name { get; } public Type FilterType { get { return _instanceType; } } @@ -38,7 +38,7 @@ namespace ZeroLevel.Specification _values = parameters; } /// - /// Обход параметров + /// Parameter traversal /// public void ParametersTraversal(Action parameterHandler) { @@ -48,7 +48,7 @@ namespace ZeroLevel.Specification } } /// - /// Построение спецификации + /// Build specification /// public ISpecification Build() { diff --git a/ZeroLevel/Services/Specification/Services/SpecificationConstructor.cs b/ZeroLevel/Services/Specification/Services/SpecificationConstructor.cs index c687fdb..f288e50 100644 --- a/ZeroLevel/Services/Specification/Services/SpecificationConstructor.cs +++ b/ZeroLevel/Services/Specification/Services/SpecificationConstructor.cs @@ -39,7 +39,7 @@ namespace ZeroLevel.Specification public ISpecificationBuilder GetVariant(string variantName) { if (false == _specificationActivateVariants.ContainsKey(variantName)) - throw new InvalidOperationException(string.Format("Not found variant name {0}", variantName)); + throw new InvalidOperationException($"Not found variant name {variantName}"); return new SpecificationBuilder(variantName, _specificationActivateVariants[variantName], _specificationType); } @@ -48,7 +48,7 @@ namespace ZeroLevel.Specification int index = 0; foreach (var ctor in _specificationType.GetConstructors()) { - var vName = string.Format("{0} #{1:D2}", _specificationType.Name, index); + var vName = $"{_specificationType.Name} #{index:D2}"; var ca = ctor.GetCustomAttribute(); if (null != ca) { diff --git a/ZeroLevel/Services/Text/PlainTextTables/TextTableData.cs b/ZeroLevel/Services/Text/PlainTextTables/TextTableData.cs index 8fe7d7f..1b506f4 100644 --- a/ZeroLevel/Services/Text/PlainTextTables/TextTableData.cs +++ b/ZeroLevel/Services/Text/PlainTextTables/TextTableData.cs @@ -79,7 +79,7 @@ namespace ZeroLevel.Services.PlainTextTables #region API /// - /// Установка заголовков столбцов + /// Setting column headers /// public void SetColumnsHeaders(string[] headers) { @@ -99,7 +99,7 @@ namespace ZeroLevel.Services.PlainTextTables } /// - /// Добавление строки значений + /// Adding a value row /// public void AppendRow(string[] cells) { diff --git a/ZeroLevel/Services/Text/PlainTextTables/TextTableRender.cs b/ZeroLevel/Services/Text/PlainTextTables/TextTableRender.cs index 0c0b3ed..6dc279c 100644 --- a/ZeroLevel/Services/Text/PlainTextTables/TextTableRender.cs +++ b/ZeroLevel/Services/Text/PlainTextTables/TextTableRender.cs @@ -21,7 +21,7 @@ namespace ZeroLevel.Services.PlainTextTables { columns_width[i] += ow; } - // Обновление ширины столбцов при необходимости + // Update column widths as needed if (options.MaxCellWidth > 0) { for (int i = 0; i < columns_width.Length; i++) @@ -47,7 +47,7 @@ namespace ZeroLevel.Services.PlainTextTables var table_width = GetTableWidth(options, columns_width); var table = new StringBuilder(); - // Отрисовка таблицы + // Table drawing var rows = data.Rows.ToArray(); for (int i = 0; i < rows.Length; i++) { @@ -70,20 +70,20 @@ namespace ZeroLevel.Services.PlainTextTables } catch (Exception ex) { - Log.SystemError(ex, "Сбой при преобразовании таблицы"); + Log.SystemError(ex, "Failed to convert table"); return string.Empty; } } /// - /// Рендеринг отображения строки + /// Render row view /// private static List RenderRow(TextTableData.TextTableRow row, TextTableRenderOptions options, int[] columns_width) { var result = new List(); - // Добавление пустых строк если есть padding сверху + // Adding blank lines if there is padding on top if (options.PaddingTop > 0) { for (int i = 0; i < options.PaddingTop; i++) @@ -96,13 +96,13 @@ namespace ZeroLevel.Services.PlainTextTables result.Add(empty); } } - // Разделение значений ячеек на части в зависимости от ширины столбца + // Separation of cell values into parts depending on the width of the column var cells = new List(); for (int i = 0; i < columns_width.Length; i++) { cells.Add(Split(row.Cells[i].Text, columns_width[i], options.PaddingLeft, options.PaddingRight).ToArray()); } - // Определение максимального количества строк по ячейкам (высота строки таблицы) + // Determining the maximum number of rows per cell (row height of the table) var max = cells.Max(c => c.Length); for (int i = 0; i < max; i++) { @@ -118,7 +118,7 @@ namespace ZeroLevel.Services.PlainTextTables } result.Add(line); } - // Добавление пустых строк если есть padding снизу + // Adding blank lines if there is padding below if (options.PaddingBottom > 0) { for (int i = 0; i < options.PaddingBottom; i++) @@ -134,7 +134,7 @@ namespace ZeroLevel.Services.PlainTextTables return result; } /// - /// Разделение текстовой строки на подстроки указанной длины + /// Splitting a text string into substrings of the specified length /// private static IEnumerable Split(string str, int chunkSize, int leftPad, int rightPad) { @@ -169,26 +169,26 @@ namespace ZeroLevel.Services.PlainTextTables return result; } /// - /// Подсчет реальной ширины таблицы, для указанного стиля + /// Calculate the actual width of the table for the specified style /// private static int GetTableWidth(TextTableRenderOptions options, int[] columns_width) { int width = - columns_width.Sum() + // ширина областей текста - columns_width.Length - 1; // границы между ячейками + columns_width.Sum() + // width of text areas + columns_width.Length - 1; // cell boundaries switch (options.Style) { case TextTableStyle.Columns: case TextTableStyle.Simple: case TextTableStyle.Borders: case TextTableStyle.DoubleBorders: - width += 2; // внешние границы + width += 2; // outer borders break; } return width; } /// - /// Отрисовка разделителя столбцов + /// Rendering column separator /// private static void DrawColumnSeparator(StringBuilder sb, TextTableRenderOptions options, int column_index) { @@ -219,10 +219,10 @@ namespace ZeroLevel.Services.PlainTextTables } } /// - /// Отрисовка разделителя строк + /// Row separator rendering /// /// - /// Индекс строки, имеется в виду индекс следующей строки, т.е. 0 - до отрисовки первой строки + /// Line index, meaning the index of the next line, those 0 - before the first line is drawn private static void DrawRowSeparator(StringBuilder sb, TextTableRenderOptions options, int width, int row_index, bool isFirst, bool isLast, int[] columns_width) { diff --git a/ZeroLevel/Services/Text/PlainTextTables/TextTableStyle.cs b/ZeroLevel/Services/Text/PlainTextTables/TextTableStyle.cs index b65f21c..378565b 100644 --- a/ZeroLevel/Services/Text/PlainTextTables/TextTableStyle.cs +++ b/ZeroLevel/Services/Text/PlainTextTables/TextTableStyle.cs @@ -3,31 +3,31 @@ public enum TextTableStyle { /// - /// Без рамок + /// No borders /// NoBorders, /// - /// Рамки из символов !+- + /// Borders of characters! + - /// Simple, /// - /// Рамки из символов +|, только для первой и последней строки и колонок + /// Borders of characters +|, only for the first and last row and columns /// Columns, /// - /// Полные рамки + /// Full borders /// Borders, /// - /// Линия для отделения названий колонок + /// Line to separate column names /// HeaderLine, /// - /// Линии для отделения названий колонок и первого стоблца (названий строк) + /// Lines for separating column names and first column (row names) /// HeaderAndFirstColumn, /// - /// Полные двойные рамки + /// Full double borders /// DoubleBorders, DoubleHeaderLine, diff --git a/ZeroLevel/Services/Trees/TreesVisitor.cs b/ZeroLevel/Services/Trees/TreesVisitor.cs index 1bae29b..f10d8e5 100644 --- a/ZeroLevel/Services/Trees/TreesVisitor.cs +++ b/ZeroLevel/Services/Trees/TreesVisitor.cs @@ -27,14 +27,14 @@ namespace ZeroLevel.Services.Trees return result; } /// - /// Выделяет все ветви дерева, возвращая массив ветвей состоящий из специфицированных значений узлов + /// Selects all branches of the tree, returning an array of branches consisting of the specified node values. /// - /// Тип узлов дерева - /// Тип значений для возвращаемых элементов ветвей - /// Корень - /// Выделяет дочерние узлы для текущего узла - /// Выделяет значение узла - /// Список ветвей дерева + /// Type of tree nodes + /// Value type for returned branch elements + /// Root + /// Selects child nodes for the current node. + /// Select the value of the node + /// List of tree branches public static List SpecifyExtractBranches(T root, Func> childrenExtractor, Func codeExtractor) @@ -53,12 +53,8 @@ namespace ZeroLevel.Services.Trees return result; } /// - /// Выполняет обход ветвей дерева + /// Performs tree branch traversal. /// - /// Тип узлов дерева - /// Корень - /// Выделяет дочерние узлы для текущего узла - /// Обработчик ветви public static void TraversTreeBrunches(T root, Func> childrenExtractor, Action> handler) diff --git a/ZeroLevel/ZeroLevel.csproj b/ZeroLevel/ZeroLevel.csproj index d392b22..f3ab9bd 100644 --- a/ZeroLevel/ZeroLevel.csproj +++ b/ZeroLevel/ZeroLevel.csproj @@ -237,7 +237,6 @@ - diff --git a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache index 463c314..4f4c026 100644 --- a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache +++ b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -3af5ac7a6b742028005a8a0757e8f6fbb4fd20fa +1f24b3553bbdd4eeac0eb648e295a8fad68b0131