From d30d681f0c5c7cfbeb5a817a1501c4993b424f98 Mon Sep 17 00:00:00 2001 From: Ogoun Date: Wed, 3 Apr 2019 16:37:05 +0300 Subject: [PATCH] Refactoring and localization --- ZeroExample/Program.cs | 27 ++- ZeroExample/Properties/AssemblyInfo.cs | 3 +- ZeroLevel.Discovery/App.config | 10 +- .../Controllers/BaseController.cs | 6 +- .../HttpRequestMessagesExtensions.cs | 2 +- .../Controllers/RoutesController.cs | 3 +- ZeroLevel.Discovery/DiscoveryService.cs | 4 +- .../ExchangeTransportFactory.cs | 2 +- ZeroLevel.Discovery/Program.cs | 6 +- .../Properties/AssemblyInfo.cs | 3 +- ZeroLevel.Discovery/RouteTable.cs | 7 +- ZeroLevel.Discovery/Startup.cs | 5 +- ZeroLevel.Microservices/BaseProxy.cs | 2 +- .../Contracts/IDiscoveryClient.cs | 5 +- .../Contracts/IExchangeService.cs | 2 +- ZeroLevel.Microservices/ExServiceHost.cs | 23 ++- ZeroLevel.Microservices/Exchange.cs | 44 ++++- .../ExchangeTransportFactory.cs | 2 +- ZeroLevel.Microservices/Model/Checkpoint.cs | 24 ++- .../Model/CheckpointArc.cs | 2 +- .../Model/CheckpointType.cs | 2 +- .../Properties/AssemblyInfo.cs | 3 +- .../WebApiDiscoveryClient.cs | 8 +- ZeroLevel/Models/BaseModel.cs | 8 +- ZeroLevel/Models/BinaryDocument.cs | 20 +- ZeroLevel/Models/IEntity.cs | 6 +- ZeroLevel/Models/InvokeResult.cs | 42 +++- ZeroLevel/Properties/AssemblyInfo.cs | 3 +- .../Application/BaseWindowsService.cs | 14 +- .../Application/BasicServiceInstaller.cs | 2 +- .../Application/BusinessApplication.cs | 3 +- .../Services/Application/IZeroService.cs | 5 +- .../Services/Application/ZeroServiceState.cs | 2 +- .../Services/Async/AsyncConditionVariable.cs | 3 +- ZeroLevel/Services/Async/AsyncHelper.cs | 2 +- ZeroLevel/Services/Async/AsyncLock.cs | 3 +- .../Services/Async/AsyncManualResetEvent.cs | 3 +- ZeroLevel/Services/Async/AsyncMonitor.cs | 2 +- .../Async/AsyncProducerConsumerQueue.cs | 2 +- .../Services/Async/AsyncReaderWriterLock.cs | 4 +- ZeroLevel/Services/Async/AsyncSemaphore.cs | 3 +- ZeroLevel/Services/Async/AsyncWaitQueue.cs | 4 +- .../Async/CancellationTokenHelpers.cs | 2 +- .../Async/CancellationTokenTaskSource.cs | 4 +- ZeroLevel/Services/Async/Deque.cs | 10 +- ZeroLevel/Services/Async/ExceptionHelpers.cs | 4 +- ZeroLevel/Services/Async/IdManager.cs | 3 +- .../Async/NormalizedCancellationToken.cs | 2 +- .../Services/Async/TaskCompletionSource.cs | 2 +- .../Async/TaskCompletionSourceExtensions.cs | 8 +- ZeroLevel/Services/Async/TaskConstants.cs | 2 +- ZeroLevel/Services/Async/TaskExtensions.cs | 3 +- ZeroLevel/Services/Async/TaskShim.cs | 2 +- .../Services/Collections/EverythingStorage.cs | 3 +- .../Services/Collections/FixSizeQueue.cs | 3 +- .../Collections/IEverythingStorage.cs | 8 +- .../Services/Collections/IFixSizeQueue.cs | 7 +- .../Collections/RoundRobinCollection.cs | 4 +- .../Services/Config/BaseConfiguration.cs | 42 +++- .../Services/Config/BaseConfigurationSet.cs | 25 ++- ZeroLevel/Services/Config/Configuration.cs | 34 +++- ZeroLevel/Services/Config/IConfiguration.cs | 33 +++- .../Services/Config/IConfigurationReader.cs | 3 +- .../Services/Config/IConfigurationSet.cs | 21 +- .../Services/Config/IConfigurationWriter.cs | 3 +- .../Implementation/AppWebConfigReader.cs | 2 +- .../Implementation/ApplicationConfigReader.cs | 15 +- .../Implementation/CommandLineReader.cs | 4 +- .../Config/Implementation/IniFileReader.cs | 4 +- .../Config/Implementation/IniFileWriter.cs | 6 +- .../Services/DOM/Contracts/IContentReader.cs | 23 ++- .../Services/DOM/Contracts/IMetadataReader.cs | 39 +++- .../DOM/DSL/Contexts/TBlockContext.cs | 2 +- .../Services/DOM/DSL/Contexts/TContext.cs | 3 +- .../DOM/DSL/Contexts/TElementContext.cs | 4 +- .../DOM/DSL/Contexts/TFunctionContext.cs | 22 ++- .../DOM/DSL/Contexts/TPropertyContext.cs | 12 +- .../Services/DOM/DSL/Contexts/TRootContext.cs | 13 +- .../DOM/DSL/Contracts/ISpecialTableBuilder.cs | 9 +- .../Services/DOM/DSL/Contracts/TCloneable.cs | 2 +- .../DOM/DSL/Model/DOMRenderElementCounter.cs | 109 ++++++++-- ZeroLevel/Services/DOM/DSL/Model/TChar.cs | 2 +- .../Services/DOM/DSL/Model/TContentElement.cs | 25 ++- .../Services/DOM/DSL/Model/TEnvironment.cs | 2 +- .../Services/DOM/DSL/Model/TFlowRules.cs | 78 +++++++- .../Services/DOM/DSL/Model/TRenderOptions.cs | 6 +- .../DOM/DSL/Services/PlainTextTableBuilder.cs | 4 +- .../Services/SpecialTableBuilderFactory.cs | 2 +- .../Services/DOM/DSL/Services/TContainer.cs | 186 +++++++++++++++++- .../DOM/DSL/Services/TContainerFactory.cs | 7 +- .../DSL/Services/TContentToStringConverter.cs | 40 +++- .../Services/DOM/DSL/Services/TRender.cs | 7 +- .../DOM/DSL/Services/TStringReader.cs | 2 +- ZeroLevel/Services/DOM/DSL/TEngine.cs | 2 +- .../Services/DOM/DSL/Tokens/TBlockToken.cs | 2 +- .../Services/DOM/DSL/Tokens/TElementToken.cs | 3 +- .../Services/DOM/DSL/Tokens/TFunctionToken.cs | 2 +- .../Services/DOM/DSL/Tokens/TPropertyToken.cs | 2 +- .../Services/DOM/DSL/Tokens/TSystemToken.cs | 2 +- .../Services/DOM/DSL/Tokens/TTextToken.cs | 2 +- ZeroLevel/Services/DOM/DSL/Tokens/TToken.cs | 11 +- ZeroLevel/Services/DOM/Model/Agency.cs | 36 +++- ZeroLevel/Services/DOM/Model/Assotiation.cs | 15 +- .../Services/DOM/Model/AssotiationRelation.cs | 6 +- ZeroLevel/Services/DOM/Model/AttachContent.cs | 23 ++- ZeroLevel/Services/DOM/Model/Category.cs | 12 +- ZeroLevel/Services/DOM/Model/ContentType.cs | 4 +- .../Services/DOM/Model/DescriptiveMetadata.cs | 31 ++- ZeroLevel/Services/DOM/Model/Document.cs | 37 +++- ZeroLevel/Services/DOM/Model/Flow/Audio.cs | 8 +- .../Services/DOM/Model/Flow/Audioplayer.cs | 8 +- ZeroLevel/Services/DOM/Model/Flow/Column.cs | 5 +- .../Services/DOM/Model/Flow/ContentElement.cs | 6 +- .../DOM/Model/Flow/ContentElementType.cs | 9 +- .../Services/DOM/Model/Flow/FlowAlign.cs | 5 +- .../Services/DOM/Model/Flow/FormContent.cs | 2 +- ZeroLevel/Services/DOM/Model/Flow/Gallery.cs | 2 +- .../DOM/Model/Flow/IContentElement.cs | 4 +- ZeroLevel/Services/DOM/Model/Flow/Image.cs | 7 +- ZeroLevel/Services/DOM/Model/Flow/Link.cs | 10 +- ZeroLevel/Services/DOM/Model/Flow/List.cs | 8 +- .../Services/DOM/Model/Flow/Paragraph.cs | 10 +- ZeroLevel/Services/DOM/Model/Flow/Quote.cs | 4 +- ZeroLevel/Services/DOM/Model/Flow/Row.cs | 6 +- ZeroLevel/Services/DOM/Model/Flow/Section.cs | 10 +- .../Services/DOM/Model/Flow/SourceType.cs | 2 +- ZeroLevel/Services/DOM/Model/Flow/Table.cs | 6 +- ZeroLevel/Services/DOM/Model/Flow/Text.cs | 10 +- .../Services/DOM/Model/Flow/TextFormatting.cs | 2 +- ZeroLevel/Services/DOM/Model/Flow/TextSize.cs | 2 +- .../Services/DOM/Model/Flow/TextStyle.cs | 2 +- ZeroLevel/Services/DOM/Model/Flow/Video.cs | 9 +- .../Services/DOM/Model/Flow/Videoplayer.cs | 9 +- ZeroLevel/Services/DOM/Model/FlowContent.cs | 11 +- ZeroLevel/Services/DOM/Model/Header.cs | 55 ++++-- ZeroLevel/Services/DOM/Model/Identifier.cs | 28 ++- ZeroLevel/Services/DOM/Model/Priority.cs | 6 +- ZeroLevel/Services/DOM/Model/Tag.cs | 12 +- ZeroLevel/Services/DOM/Model/TagMetadata.cs | 26 ++- .../Services/DOM/Services/ContentBuilder.cs | 54 ++++- .../DOM/Services/ContentElementSerializer.cs | 14 +- .../DOM/Services/DocumentContentReader.cs | 17 +- .../Services/DOM/Services/LanguageParser.cs | 2 +- .../Services/DependencyInjection/Container.cs | 76 +++++-- .../DependencyInjection/ContainerFactory.cs | 14 +- .../Contracts/ICompositionProvider.cs | 7 +- .../Contracts/IContainer.cs | 5 +- .../Contracts/IContainerFactory.cs | 13 +- .../Contracts/IContainerInstanceRegister.cs | 10 +- .../Contracts/IContainerRegister.cs | 45 ++++- .../Contracts/IParameterStorage.cs | 15 +- .../Contracts/IResolver.cs | 31 ++- .../Services/DependencyInjection/Injector.cs | 2 +- .../Internal/ConstructorMetadata.cs | 5 +- .../Internal/ConstructorParameter.cs | 8 +- .../Internal/ResolveTypeInfo.cs | 9 +- .../DependencyInjection/ParameterAttribute.cs | 2 +- .../DependencyInjection/ResolveAttribute.cs | 25 ++- .../Services/Diagnostics/StackTraceReader.cs | 2 +- ZeroLevel/Services/Drawing/TextPainter.cs | 7 +- .../Services/Encryption/FastObfuscator.cs | 4 +- .../Services/Encryption/RijndaelEncryptor.cs | 10 +- .../Services/Extensions/ArrayExtensions.cs | 6 +- .../Extensions/BitConverterExtensions.cs | 2 +- .../CollectionComparsionExtensions.cs | 15 +- .../Services/Extensions/DateTimeExtensions.cs | 2 +- .../Services/Extensions/EndpointExtensions.cs | 2 +- .../Services/Extensions/EnumExtensions.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 2 +- ZeroLevel/Services/Extensions/FPCommon.cs | 14 +- .../Services/Extensions/LinqExtension.cs | 2 +- ZeroLevel/Services/Extensions/Monades.cs | 23 ++- .../Services/Extensions/StringExtensions.cs | 2 +- .../Services/Extensions/TypeExtensions.cs | 8 +- ZeroLevel/Services/FileSystem/FSUtils.cs | 8 +- ZeroLevel/Services/FileSystem/FileArchive.cs | 23 ++- ZeroLevel/Services/FileSystem/FileMeta.cs | 2 +- .../FileSystem/PeriodicFileSystemWatcher.cs | 6 +- ZeroLevel/Services/IdGenerator.cs | 8 +- .../Impersonation/IImpersonationExecutor.cs | 3 +- .../Services/Impersonation/Impersonation.cs | 16 +- .../ImpersonationNativeMethods.cs | 80 +++++--- .../Impersonation/MySafeTokenHandle.cs | 4 +- .../ProcessImpersonationExecutor.cs | 6 +- .../UserImpersonationExecutor.cs | 5 +- .../Services/Invokation/IInvokeWrapper.cs | 20 +- .../Services/Invokation/InvokeWrapper.cs | 18 +- ZeroLevel/Services/Invokation/Invoker.cs | 2 +- .../Logging/FixSizeLogMessageBuffer.cs | 4 +- ZeroLevel/Services/Logging/ILog.cs | 10 +- ZeroLevel/Services/Logging/ILogComposer.cs | 3 +- .../Services/Logging/ILogMessageBuffer.cs | 3 +- ZeroLevel/Services/Logging/ILogger.cs | 2 +- .../Logging/Implementation/ConsoleLogger.cs | 4 +- .../Logging/Implementation/DelegateLogger.cs | 6 +- .../Implementation/EncryptedFileLog.cs | 24 ++- .../Logging/Implementation/TextFileLogger.cs | 53 +++-- ZeroLevel/Services/Logging/Log.cs | 56 ++++-- ZeroLevel/Services/Logging/LogLevel.cs | 13 +- .../Services/Logging/LogLevelNameMapping.cs | 14 +- ZeroLevel/Services/Logging/LogRouterr.cs | 29 ++- .../Logging/NoLimitedLogMessageBuffer.cs | 3 +- .../Services/Network/Contract/IExClient.cs | 13 +- .../Services/Network/Contract/IExService.cs | 5 +- .../Services/Network/Contract/IZBackward.cs | 3 +- .../Network/Contract/IZObservableServer.cs | 6 +- .../Services/Network/Contract/IZTransport.cs | 8 +- .../Network/Models/ExchangeAttributes.cs | 12 +- ZeroLevel/Services/Network/Models/Frame.cs | 15 +- .../Network/Models/MicroserviceInfo.cs | 7 +- .../Services/Network/Models/RequestInfo.cs | 4 +- .../Network/Models/ServiceEndpointInfo.cs | 2 +- .../Network/Models/ServiceEndpointsInfo.cs | 2 +- .../Network/Models/ZTransportStatus.cs | 2 +- ZeroLevel/Services/Network/NetworkStats.cs | 19 +- .../Network/NetworkStreamDataObfuscator.cs | 2 +- .../Services/Network/Services/ExClient.cs | 4 +- .../Services/Network/Services/ExRouter.cs | 17 +- .../Services/Network/Services/ExService.cs | 8 +- .../Services/Network/Services/FrameBuilder.cs | 13 +- .../Network/Services/FrameExchange.cs | 2 +- .../Services/Network/Services/FrameParser.cs | 12 +- .../Services/Network/Services/IPFinder.cs | 2 +- .../Services/ZExSocketObservableServer.cs | 5 +- .../Services/Network/SocketExtensions.cs | 2 +- ZeroLevel/Services/Network/ZBaseNetwork.cs | 10 +- ZeroLevel/Services/Network/ZSocketClient.cs | 20 +- ZeroLevel/Services/Network/ZSocketServer.cs | 14 +- .../Services/Network/ZSocketServerClient.cs | 5 +- ZeroLevel/Services/ObjectMapping/IMapper.cs | 10 +- .../Services/ObjectMapping/IMemberInfo.cs | 3 +- .../Services/ObjectMapping/MapFieldInfo.cs | 21 +- .../Services/ObjectMapping/TypeMapper.cs | 23 ++- ZeroLevel/Services/Pools/ObjectPool.cs | 19 +- ZeroLevel/Services/Queries/AndQuery.cs | 2 +- ZeroLevel/Services/Queries/BaseQuery.cs | 2 +- .../Services/Queries/Builder/IQueryBuilder.cs | 2 +- .../Builder/MemoryStorageQueryBuilder.cs | 8 +- ZeroLevel/Services/Queries/IQuery.cs | 4 +- ZeroLevel/Services/Queries/NotQuery.cs | 2 +- ZeroLevel/Services/Queries/OrQuery.cs | 2 +- ZeroLevel/Services/Queries/Query.cs | 2 +- ZeroLevel/Services/Queries/QueryOp.cs | 2 +- ZeroLevel/Services/Queries/QueryOperation.cs | 4 +- .../Services/Queries/Storage/IRealQuery.cs | 2 +- .../Services/Queries/Storage/IStorage.cs | 8 +- .../Services/Queries/Storage/MemoryStorage.cs | 3 +- .../Services/Queries/Storage/QueryResult.cs | 2 +- .../ITypeFastAccessMethodBuilder.cs | 5 +- .../Services/Reflection/ReferenceHelper.cs | 2 +- .../Reflection/StringToTypeConverter.cs | 4 +- .../Services/Reflection/TypeActivator.cs | 3 +- .../Reflection/TypeFastAccessMethodBuilder.cs | 3 +- .../TypeFastAccessMethodBuilderImpl.cs | 4 +- ZeroLevel/Services/Reflection/TypeHelpers.cs | 14 +- .../Semantic/Contracts/ILexProvider.cs | 6 +- .../Services/Semantic/Contracts/ILexer.cs | 2 +- .../Services/Semantic/Contracts/Languages.cs | 2 +- .../Services/Semantic/Contracts/LexToken.cs | 4 +- .../Services/Semantic/Contracts/WordToken.cs | 3 +- .../Services/Semantic/Helpers/NGramms.cs | 6 +- .../Services/Semantic/Helpers/StopWords.cs | 3 +- ZeroLevel/Services/Semantic/LexProvider.cs | 2 +- .../Services/Semantic/LexProviderFactory.cs | 16 +- ZeroLevel/Services/Semantic/Snowball/Among.cs | 4 +- .../Semantic/Snowball/CzechStemmer.cs | 5 +- .../Semantic/Snowball/DanishStemmer.cs | 18 +- .../Semantic/Snowball/DutchStemmer.cs | 42 ++-- .../Semantic/Snowball/EnglishStemmer.cs | 79 ++++++-- .../Semantic/Snowball/FinnishStemmer.cs | 27 ++- .../Semantic/Snowball/FrenchStemmer.cs | 73 +++++-- .../Semantic/Snowball/GermanStemmer.cs | Bin 23280 -> 23312 bytes .../Semantic/Snowball/HungarianStemmer.cs | 106 ++++++++-- .../Semantic/Snowball/ItalianStemmer.cs | 56 ++++-- .../Semantic/Snowball/NorwegianStemmer.cs | 9 +- .../Semantic/Snowball/PortugalStemmer.cs | 47 +++-- .../Semantic/Snowball/RomanianStemmer.cs | 28 ++- .../Semantic/Snowball/RussianStemmer.cs | 34 ++-- .../Semantic/Snowball/SpanishStemmer.cs | 62 ++++-- .../Semantic/Snowball/StemmerOperations.cs | Bin 86906 -> 86684 bytes ZeroLevel/Services/Semantic/WordLexer.cs | 2 +- .../Services/Serialization/IBinaryReader.cs | 32 ++- .../Serialization/IBinarySerializable.cs | 3 +- .../Services/Serialization/IBinaryWriter.cs | 32 ++- .../Services/Serialization/JsonEscaper.cs | 3 +- .../Serialization/MemoryStreamReader.cs | 21 +- .../Serialization/MemoryStreamWriter.cs | 21 +- .../Serialization/MessageSerializer.cs | 3 +- .../Serialization/SerializedObjectWrapper.cs | 11 +- .../SerializedObjectWrapperExtension.cs | 24 ++- .../Services/Shedulling/AsyncShedullerImpl.cs | 73 ++++--- .../Shedulling/DateTimeAsyncSheduller.cs | 25 +-- .../Services/Shedulling/DateTimeSheduller.cs | 24 +-- .../Services/Shedulling/ExpiredAsyncObject.cs | 13 +- .../Services/Shedulling/ExpiredObject.cs | 18 +- .../Services/Shedulling/IAsyncSheduller.cs | 79 +++++--- .../Shedulling/IExpirationAsyncSheduller.cs | 21 +- .../Shedulling/IExpirationSheduller.cs | 23 ++- ZeroLevel/Services/Shedulling/ISheduller.cs | 77 +++++--- ZeroLevel/Services/Shedulling/Sheduller.cs | 134 ++++++++----- .../Services/Shedulling/ShedullerImpl.cs | 54 +++-- .../Specification/AndSpecification.cs | 7 +- .../Specification/BaseNamedSpecification.cs | 3 +- .../Specification/BaseSpecification.cs | 2 +- .../Building/ISpecificationBuilder.cs | 7 +- .../Building/ISpecificationConstructor.cs | 3 +- .../SpecificationConstructorParameterKind.cs | 2 +- ...cificationConstructorParametersResolver.cs | 6 +- .../Building/SpecificationParameter.cs | 5 +- .../Specification/CurrySpecification.cs | 2 +- .../Specification/ExpressionSpecification.cs | 4 +- .../Services/Specification/ISpecification.cs | 5 +- .../Specification/ISpecificationFinder.cs | 4 +- .../Specification/NotSpecification.cs | 4 +- .../Services/Specification/OrSpecification.cs | 7 +- .../Specification/PredicateBuilder.cs | 38 +++- .../Services/AssemblySpecificationFactory.cs | 3 +- .../Services/SpecificationBuilder.cs | 13 +- .../Services/SpecificationConstructor.cs | 4 +- .../Services/Specification/Specification.cs | 2 +- .../Specification/SpecificationReader.cs | 2 +- .../Specification/TrueSpecification.cs | 2 +- .../Text/PlainTextTables/TextTableData.cs | 25 ++- .../Text/PlainTextTables/TextTableRender.cs | 10 +- .../PlainTextTables/TextTableRenderOptions.cs | 18 +- .../Text/PlainTextTables/TextTableStyle.cs | 11 +- ZeroLevel/Services/Text/TStringReader.cs | 2 +- ZeroLevel/Services/Trees/Contracts/ITree.cs | 3 +- .../Services/Trees/Contracts/ITreeNode.cs | 3 +- ZeroLevel/Services/Trees/Generic.cs | 6 +- ZeroLevel/Services/Trees/Tree.cs | 6 +- ZeroLevel/Services/Trees/TreeNode.cs | 2 +- ZeroLevel/Services/Trees/TreesVisitor.cs | 4 +- ZeroLevel/Services/Web/HtmlUtility.cs | 13 +- ZeroLevel/Services/Web/UrlUtility.cs | 42 ++-- .../ZeroLevel.csproj.CoreCompileInputs.cache | 2 +- 336 files changed, 3345 insertions(+), 1164 deletions(-) diff --git a/ZeroExample/Program.cs b/ZeroExample/Program.cs index a846279..cd11890 100644 --- a/ZeroExample/Program.cs +++ b/ZeroExample/Program.cs @@ -6,21 +6,34 @@ namespace ZeroExample public sealed class MyFirstApp : BaseWindowsService, IZeroService { - public MyFirstApp() : base("MyApp") { Log.AddConsoleLogger(); } - public override void PauseAction() { } - public override void ResumeAction() { } + public MyFirstApp() : base("MyApp") + { + Log.AddConsoleLogger(); + } + + public override void PauseAction() + { + } + + public override void ResumeAction() + { + } + public override void StartAction() { Log.Info("Started"); } - public override void StopAction() { } + + public override void StopAction() + { + } } - class Program + internal class Program { - static void Main(string[] args) + private static void Main(string[] args) { Bootstrap.Startup(args); } } -} +} \ No newline at end of file diff --git a/ZeroExample/Properties/AssemblyInfo.cs b/ZeroExample/Properties/AssemblyInfo.cs index a825422..c6ca6bc 100644 --- a/ZeroExample/Properties/AssemblyInfo.cs +++ b/ZeroExample/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -33,4 +32,4 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ZeroLevel.Discovery/App.config b/ZeroLevel.Discovery/App.config index 430fe22..f91f31e 100644 --- a/ZeroLevel.Discovery/App.config +++ b/ZeroLevel.Discovery/App.config @@ -1,11 +1,11 @@  - - - + + + - - + + diff --git a/ZeroLevel.Discovery/Controllers/BaseController.cs b/ZeroLevel.Discovery/Controllers/BaseController.cs index 03c8d5e..f10d247 100644 --- a/ZeroLevel.Discovery/Controllers/BaseController.cs +++ b/ZeroLevel.Discovery/Controllers/BaseController.cs @@ -11,6 +11,7 @@ namespace ZeroLevel.Discovery public abstract class BaseController : ApiController { #region Responce create helpers + public static HttpResponseMessage BadRequestAnswer(HttpRequestMessage request, string message) { return request.CreateSelfDestroyingResponse(HttpStatusCode.BadRequest, @@ -90,6 +91,7 @@ namespace ZeroLevel.Discovery } return null; } - #endregion + + #endregion Responce create helpers } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/Controllers/HttpRequestMessagesExtensions.cs b/ZeroLevel.Discovery/Controllers/HttpRequestMessagesExtensions.cs index 36353f8..01a65e2 100644 --- a/ZeroLevel.Discovery/Controllers/HttpRequestMessagesExtensions.cs +++ b/ZeroLevel.Discovery/Controllers/HttpRequestMessagesExtensions.cs @@ -69,4 +69,4 @@ namespace ZeroLevel.Discovery return response; } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/Controllers/RoutesController.cs b/ZeroLevel.Discovery/Controllers/RoutesController.cs index af65ac5..86d0f8c 100644 --- a/ZeroLevel.Discovery/Controllers/RoutesController.cs +++ b/ZeroLevel.Discovery/Controllers/RoutesController.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Net.Http; -using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Description; using ZeroLevel.Models; @@ -52,4 +51,4 @@ namespace ZeroLevel.Discovery } } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/DiscoveryService.cs b/ZeroLevel.Discovery/DiscoveryService.cs index 7ad6ff1..f48cf3c 100644 --- a/ZeroLevel.Discovery/DiscoveryService.cs +++ b/ZeroLevel.Discovery/DiscoveryService.cs @@ -5,7 +5,7 @@ namespace ZeroLevel.Discovery public sealed class DiscoveryService : BaseWindowsService, IZeroService { - public DiscoveryService() + public DiscoveryService() : base("Discovery") { } @@ -29,4 +29,4 @@ namespace ZeroLevel.Discovery { } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/ExchangeTransportFactory.cs b/ZeroLevel.Discovery/ExchangeTransportFactory.cs index 76864fe..568a17c 100644 --- a/ZeroLevel.Discovery/ExchangeTransportFactory.cs +++ b/ZeroLevel.Discovery/ExchangeTransportFactory.cs @@ -107,4 +107,4 @@ namespace ZeroLevel.Microservices throw new NotSupportedException($"Protocol {protocol} not supported"); } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/Program.cs b/ZeroLevel.Discovery/Program.cs index bd8b524..900d860 100644 --- a/ZeroLevel.Discovery/Program.cs +++ b/ZeroLevel.Discovery/Program.cs @@ -1,10 +1,10 @@ namespace ZeroLevel.Discovery { - class Program + internal class Program { - static void Main(string[] args) + private static void Main(string[] args) { Bootstrap.Startup(args); } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/Properties/AssemblyInfo.cs b/ZeroLevel.Discovery/Properties/AssemblyInfo.cs index 53517ec..72ecdc1 100644 --- a/ZeroLevel.Discovery/Properties/AssemblyInfo.cs +++ b/ZeroLevel.Discovery/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -33,4 +32,4 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ZeroLevel.Discovery/RouteTable.cs b/ZeroLevel.Discovery/RouteTable.cs index 535ae63..699dfbe 100644 --- a/ZeroLevel.Discovery/RouteTable.cs +++ b/ZeroLevel.Discovery/RouteTable.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Reflection; using System.Threading; using ZeroLevel.Microservices; using ZeroLevel.Models; @@ -24,6 +23,7 @@ namespace ZeroLevel.Discovery } #region Snapshot + private static readonly object _snapshot_lock = new object(); private void Save() @@ -89,7 +89,8 @@ namespace ZeroLevel.Discovery Log.Error(ex, "Fault load snapshot"); } } - #endregion + + #endregion Snapshot private bool Ping(string protocol, string endpoint, string msg) { @@ -243,4 +244,4 @@ namespace ZeroLevel.Discovery _lock.Dispose(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Discovery/Startup.cs b/ZeroLevel.Discovery/Startup.cs index 71915fc..a2df70b 100644 --- a/ZeroLevel.Discovery/Startup.cs +++ b/ZeroLevel.Discovery/Startup.cs @@ -48,7 +48,7 @@ namespace ZeroLevel.Discovery // parameter in the WebApp.Start method. public void Configuration(IAppBuilder appBuilder) { - // Configure Web API for self-host. + // Configure Web API for self-host. HttpConfiguration config = new HttpConfiguration(); config.MapHttpAttributeRoutes(new EnableInheritRoutingDirectRouteProvider()); config.Routes.MapHttpRoute( @@ -67,6 +67,7 @@ namespace ZeroLevel.Discovery } private static bool _log_request_response; + public static void StartWebPanel(int port, bool log_request_response) { @@ -76,4 +77,4 @@ namespace ZeroLevel.Discovery Log.Info(string.Format("Web panel url: {0}", baseAddress)); } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/BaseProxy.cs b/ZeroLevel.Microservices/BaseProxy.cs index 9315394..42065e4 100644 --- a/ZeroLevel.Microservices/BaseProxy.cs +++ b/ZeroLevel.Microservices/BaseProxy.cs @@ -155,4 +155,4 @@ namespace ZeroLevel.ProxyREST _baseUrl = baseUri; } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs b/ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs index 5470b3b..6bd1b3f 100644 --- a/ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs +++ b/ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs @@ -6,10 +6,13 @@ namespace ZeroLevel.Microservices.Contracts public interface IDiscoveryClient { void Register(MicroserviceInfo info); + IEnumerable GetServiceEndpoints(string serviceKey); + IEnumerable GetServiceEndpointsByGroup(string serviceGroup); + IEnumerable GetServiceEndpointsByType(string serviceType); ServiceEndpointInfo GetService(string serviceKey, string endpoint); } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Contracts/IExchangeService.cs b/ZeroLevel.Microservices/Contracts/IExchangeService.cs index 0f60134..67c4823 100644 --- a/ZeroLevel.Microservices/Contracts/IExchangeService.cs +++ b/ZeroLevel.Microservices/Contracts/IExchangeService.cs @@ -10,4 +10,4 @@ string Group { get; } string Type { get; } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/ExServiceHost.cs b/ZeroLevel.Microservices/ExServiceHost.cs index 635b517..5500dee 100644 --- a/ZeroLevel.Microservices/ExServiceHost.cs +++ b/ZeroLevel.Microservices/ExServiceHost.cs @@ -18,9 +18,11 @@ namespace ZeroLevel.Microservices public MicroserviceInfo ServiceInfo { get; set; } public ExService Server { get; set; } } + private bool _disposed = false; private readonly long _registerTaskKey = -1; private readonly IDiscoveryClient _discoveryClient; + private readonly ConcurrentDictionary _services = new ConcurrentDictionary(); @@ -116,6 +118,7 @@ namespace ZeroLevel.Microservices } #region Private methods + private void ValidateService(IExchangeService service) { if (string.IsNullOrWhiteSpace(service.Protocol)) @@ -127,6 +130,7 @@ namespace ZeroLevel.Microservices throw new ArgumentNullException("Service.Key"); } } + private void ValidateService(MicroserviceInfo service) { if (string.IsNullOrWhiteSpace(service.Protocol)) @@ -218,9 +222,11 @@ namespace ZeroLevel.Microservices _discoveryClient.Register(service); } } - #endregion + + #endregion Private methods #region Utils + private static Delegate CreateDelegate(MethodInfo methodInfo, object target) { Func getType; @@ -241,9 +247,11 @@ namespace ZeroLevel.Microservices } return Delegate.CreateDelegate(getType(types.ToArray()), target, methodInfo.Name); } - #endregion + + #endregion Utils #region Inboxes + /// /// Регистрация обработчика входящих сообщений /// @@ -263,6 +271,7 @@ namespace ZeroLevel.Microservices Log.SystemError(ex, $"[Exchange] Register inbox handler error. Protocol '{meta.ServiceInfo.Protocol}'. Inbox '{inbox}'. Service '{meta.ServiceInfo.ServiceKey}'"); } } + /// /// Регистрация метода отдающего ответ на входящий запрос /// @@ -283,6 +292,7 @@ namespace ZeroLevel.Microservices Log.SystemError(ex, $"[Exchange] Register inbox replier error. Protocol '{meta.ServiceInfo.Protocol}'. Inbox '{inbox}'. Service '{meta.ServiceInfo.ServiceKey}'"); } } + /// /// Регистрация метода отдающего ответ на входящий запрос, не принимающего входящих данных /// @@ -302,9 +312,11 @@ namespace ZeroLevel.Microservices Log.SystemError(ex, $"[Exchange] Register inbox replier error. Protocol '{meta.ServiceInfo.Protocol}'. Inbox '{inbox}'. Service '{meta.ServiceInfo.ServiceKey}'"); } } - #endregion + + #endregion Inboxes #region Transport helpers + /// /// Call service with round-robin balancing /// @@ -503,7 +515,8 @@ namespace ZeroLevel.Microservices } } } - #endregion + + #endregion Transport helpers public void Dispose() { @@ -516,4 +529,4 @@ namespace ZeroLevel.Microservices } } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Exchange.cs b/ZeroLevel.Microservices/Exchange.cs index 4a90eca..c64b330 100644 --- a/ZeroLevel.Microservices/Exchange.cs +++ b/ZeroLevel.Microservices/Exchange.cs @@ -4,10 +4,8 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using ZeroLevel.Microservices.Contracts; -using ZeroLevel.Microservices.Model; using ZeroLevel.Network.Microservices; using ZeroLevel.Services.Network; -using ZeroLevel.Services.Serialization; namespace ZeroLevel.Microservices { @@ -21,12 +19,14 @@ namespace ZeroLevel.Microservices private readonly ExServiceHost _host; #region Ctor + public Exchange(IDiscoveryClient discoveryClient) { this._discoveryClient = discoveryClient ?? throw new ArgumentNullException(nameof(discoveryClient)); this._host = new ExServiceHost(this._discoveryClient); } - #endregion + + #endregion Ctor /// /// Регистрация сервиса @@ -42,6 +42,7 @@ namespace ZeroLevel.Microservices } #region Balanced send + /// /// Отправка сообщения сервису /// @@ -63,9 +64,11 @@ namespace ZeroLevel.Microservices } public bool Send(string serviceKey, T data) => Send(serviceKey, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data); - #endregion + + #endregion Balanced send #region Balanced request + public Tresp Request(string serviceKey, string inbox, Treq data) { Tresp response = default(Tresp); @@ -157,9 +160,11 @@ namespace ZeroLevel.Microservices public Tresp Request(string serviceKey) => Request(serviceKey, ZBaseNetwork.DEFAULT_REQUEST_INBOX); - #endregion + + #endregion Balanced request #region Direct request + public Tresp RequestDirect(string endpoint, string serviceKey, string inbox, Treq data) { Tresp response = default(Tresp); @@ -251,9 +256,11 @@ namespace ZeroLevel.Microservices public Tresp RequestDirect(string endpoint, string serviceKey) => RequestDirect(endpoint, serviceKey, ZBaseNetwork.DEFAULT_REQUEST_INBOX); - #endregion + + #endregion Direct request #region Broadcast + /// /// Отправка сообщения всем сервисам с указанным ключом в указанный обработчик /// @@ -287,6 +294,7 @@ namespace ZeroLevel.Microservices } return false; } + /// /// Отправка сообщения всем сервисам с указанным ключом, в обработчик по умолчанию /// @@ -295,6 +303,7 @@ namespace ZeroLevel.Microservices /// Сообщение /// true - при успешной отправке public bool SendBroadcast(string serviceKey, T data) => SendBroadcast(serviceKey, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data); + /// /// Отправка сообщения всем сервисам конкретного типа в указанный обработчик /// @@ -328,6 +337,7 @@ namespace ZeroLevel.Microservices } return false; } + /// /// Отправка сообщения всем сервисам конкретного типа, в обработчик по умолчанию /// @@ -337,6 +347,7 @@ namespace ZeroLevel.Microservices /// true - при успешной отправке public bool SendBroadcastByType(string serviceType, T data) => SendBroadcastByType(serviceType, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data); + /// /// Отправка сообщения всем сервисам конкретной группы в указанный обработчик /// @@ -370,6 +381,7 @@ namespace ZeroLevel.Microservices } return false; } + /// /// Отправка сообщения всем сервисам конкретной группы, в обработчик по умолчанию /// @@ -379,6 +391,7 @@ namespace ZeroLevel.Microservices /// true - при успешной отправке public bool SendBroadcastByGroup(string serviceGroup, T data) => SendBroadcastByGroup(serviceGroup, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data); + /// /// Широковещательный опрос сервисов по ключу /// @@ -402,6 +415,7 @@ namespace ZeroLevel.Microservices } return Enumerable.Empty(); } + /// /// Широковещательный опрос сервисов по ключу, без сообщеня запроса /// @@ -423,6 +437,7 @@ namespace ZeroLevel.Microservices } return Enumerable.Empty(); } + /// /// Широковещательный опрос сервисов по ключу, в обработчик по умолчанию /// @@ -434,6 +449,7 @@ namespace ZeroLevel.Microservices /// true - в случае успешной рассылки public IEnumerable RequestBroadcast(string serviceKey, Treq data) => RequestBroadcast(serviceKey, ZBaseNetwork.DEFAULT_REQUEST_INBOX, data); + /// /// Широковещательный опрос сервисов по ключу, без сообщеня запроса, в обработчик по умолчанию /// @@ -443,6 +459,7 @@ namespace ZeroLevel.Microservices /// true - в случае успешной рассылки public IEnumerable RequestBroadcast(string serviceKey) => RequestBroadcast(serviceKey, ZBaseNetwork.DEFAULT_REQUEST_INBOX); + /// /// Широковещательный опрос сервисов по типу сервису /// @@ -466,6 +483,7 @@ namespace ZeroLevel.Microservices } return Enumerable.Empty(); } + /// /// Широковещательный опрос сервисов по типу сервису, без сообщеня запроса /// @@ -487,6 +505,7 @@ namespace ZeroLevel.Microservices } return Enumerable.Empty(); } + /// /// Широковещательный опрос сервисов по типу сервису, в обработчик по умолчанию /// @@ -498,6 +517,7 @@ namespace ZeroLevel.Microservices /// true - в случае успешной рассылки public IEnumerable RequestBroadcastByType(string serviceType, Treq data) => RequestBroadcastByType(serviceType, ZBaseNetwork.DEFAULT_REQUEST_INBOX, data); + /// /// Широковещательный опрос сервисов по типу, без сообщеня запроса, в обработчик по умолчанию /// @@ -507,6 +527,7 @@ namespace ZeroLevel.Microservices /// true - в случае успешной рассылки public IEnumerable RequestBroadcastByType(string serviceType) => RequestBroadcastByType(serviceType, ZBaseNetwork.DEFAULT_REQUEST_INBOX); + /// /// Широковещательный опрос сервисов по группе сервисов /// @@ -530,6 +551,7 @@ namespace ZeroLevel.Microservices } return Enumerable.Empty(); } + /// /// Широковещательный опрос сервисов по группе сервисов, без сообщения запроса /// @@ -551,6 +573,7 @@ namespace ZeroLevel.Microservices } return Enumerable.Empty(); } + /// /// Широковещательный опрос сервисов по группе сервисов в обработчик по умолчанию /// @@ -562,6 +585,7 @@ namespace ZeroLevel.Microservices /// true - в случае успешной рассылки public IEnumerable RequestBroadcastByGroup(string serviceGroup, Treq data) => RequestBroadcastByGroup(serviceGroup, ZBaseNetwork.DEFAULT_REQUEST_INBOX, data); + /// /// Широковещательный опрос сервисов по группе сервисов, без сообщения запроса, в обработчик по умолчанию /// @@ -573,6 +597,7 @@ namespace ZeroLevel.Microservices RequestBroadcastByGroup(serviceGroup, ZBaseNetwork.DEFAULT_REQUEST_INBOX); #region Private + private IEnumerable _RequestBroadcast(List clients, string inbox, Treq data) { var response = new List(); @@ -628,13 +653,14 @@ namespace ZeroLevel.Microservices } return response; } - #endregion - #endregion + #endregion Private + + #endregion Broadcast public void Dispose() { this._host.Dispose(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/ExchangeTransportFactory.cs b/ZeroLevel.Microservices/ExchangeTransportFactory.cs index 4015c70..4ecdbb7 100644 --- a/ZeroLevel.Microservices/ExchangeTransportFactory.cs +++ b/ZeroLevel.Microservices/ExchangeTransportFactory.cs @@ -107,4 +107,4 @@ namespace ZeroLevel.Microservices throw new NotSupportedException($"Protocol {protocol} not supported"); } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Model/Checkpoint.cs b/ZeroLevel.Microservices/Model/Checkpoint.cs index 57f40f8..05d7401 100644 --- a/ZeroLevel.Microservices/Model/Checkpoint.cs +++ b/ZeroLevel.Microservices/Model/Checkpoint.cs @@ -19,6 +19,7 @@ namespace ZeroLevel.Microservices.Model public byte[] Payload { get; set; } #region IBinarySerializable + public void Deserialize(IBinaryReader reader) { this.Id = reader.ReadGuid(); @@ -40,19 +41,23 @@ namespace ZeroLevel.Microservices.Model writer.WriteInt32((int)this.CheckpointType); writer.WriteBytes(this.Payload); } - #endregion + + #endregion IBinarySerializable #region Ctors + public Checkpoint() { this.Id = Guid.NewGuid(); this.Timestamp = DateTime.Now.Ticks; } + public Checkpoint(Guid id) { this.Timestamp = DateTime.Now.Ticks; this.Id = id; } + public Checkpoint(Checkpoint other) { this.Id = other.Id; @@ -63,9 +68,11 @@ namespace ZeroLevel.Microservices.Model this.Payload = other.Payload; this.ReasonPhrase = other.ReasonPhrase; } - #endregion + + #endregion Ctors #region Equals & Hash + public override int GetHashCode() { return base.GetHashCode(); @@ -75,16 +82,20 @@ namespace ZeroLevel.Microservices.Model { return this.Equals(obj as Checkpoint); } - #endregion + + #endregion Equals & Hash #region ICloneable + public object Clone() { return new Checkpoint(this); } - #endregion + + #endregion ICloneable #region IEquatable + public bool Equals(Checkpoint other) { if (this.Id != other.Id) return false; @@ -96,6 +107,7 @@ namespace ZeroLevel.Microservices.Model if (false == ArrayExtensions.Equals(this.Payload, other.Payload)) return false; return true; } - #endregion + + #endregion IEquatable } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Model/CheckpointArc.cs b/ZeroLevel.Microservices/Model/CheckpointArc.cs index 21f9d43..fad92bc 100644 --- a/ZeroLevel.Microservices/Model/CheckpointArc.cs +++ b/ZeroLevel.Microservices/Model/CheckpointArc.cs @@ -18,4 +18,4 @@ namespace ZeroLevel.Microservices.Model this.ReasonPhrase = other.ReasonPhrase; } } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Model/CheckpointType.cs b/ZeroLevel.Microservices/Model/CheckpointType.cs index 7dac225..1f360f4 100644 --- a/ZeroLevel.Microservices/Model/CheckpointType.cs +++ b/ZeroLevel.Microservices/Model/CheckpointType.cs @@ -7,4 +7,4 @@ Finish = 2, Transfer = 3 } -} +} \ No newline at end of file diff --git a/ZeroLevel.Microservices/Properties/AssemblyInfo.cs b/ZeroLevel.Microservices/Properties/AssemblyInfo.cs index da29277..916d4b4 100644 --- a/ZeroLevel.Microservices/Properties/AssemblyInfo.cs +++ b/ZeroLevel.Microservices/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -33,4 +32,4 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ZeroLevel.Microservices/WebApiDiscoveryClient.cs b/ZeroLevel.Microservices/WebApiDiscoveryClient.cs index cbbdb8b..e8e08c7 100644 --- a/ZeroLevel.Microservices/WebApiDiscoveryClient.cs +++ b/ZeroLevel.Microservices/WebApiDiscoveryClient.cs @@ -15,6 +15,7 @@ namespace ZeroLevel.Microservices BaseProxy, IDiscoveryClient { #region WebAPI + private IEnumerable GetRecords() { return GET>("api/v0/routes"); @@ -24,13 +25,16 @@ namespace ZeroLevel.Microservices { return POST("api/v0/routes", info); } - #endregion + + #endregion WebAPI // Таблица по ключам private readonly ConcurrentDictionary> _tableByKey = new ConcurrentDictionary>(); + private readonly ConcurrentDictionary> _tableByGroups = new ConcurrentDictionary>(); + private readonly ConcurrentDictionary> _tableByTypes = new ConcurrentDictionary>(); @@ -176,4 +180,4 @@ namespace ZeroLevel.Microservices return Enumerable.Empty(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Models/BaseModel.cs b/ZeroLevel/Models/BaseModel.cs index 41591e7..8696d64 100644 --- a/ZeroLevel/Models/BaseModel.cs +++ b/ZeroLevel/Models/BaseModel.cs @@ -8,6 +8,7 @@ namespace ZeroLevel.Models public abstract class BaseModel { #region Equal + public bool Equals(BaseModel other) { if (this == null) @@ -30,10 +31,13 @@ namespace ZeroLevel.Models } public static bool operator ==(BaseModel first, BaseModel second) => Equals(first, second); + public static bool operator !=(BaseModel first, BaseModel second) => !Equals(first, second); - #endregion + + #endregion Equal public abstract override int GetHashCode(); + public abstract object Clone(); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Models/BinaryDocument.cs b/ZeroLevel/Models/BinaryDocument.cs index e4687b7..39916c7 100644 --- a/ZeroLevel/Models/BinaryDocument.cs +++ b/ZeroLevel/Models/BinaryDocument.cs @@ -17,32 +17,39 @@ namespace ZeroLevel.Models /// Id /// public Guid Id { get; set; } + /// /// File name /// public string FileName { get; set; } + /// /// Content type (pdf, doc, etc.) /// public string ContentType { get; set; } + /// /// Content /// public byte[] Document { get; set; } + /// /// Creation date /// public DateTime Created { get; set; } + /// /// Optional headers /// public List
Headers { get; set; } + /// /// Categories /// public List Categories { get; set; } #region Ctors + public BinaryDocument() { Created = DateTime.Now; @@ -58,9 +65,11 @@ namespace ZeroLevel.Models Deserialize(reader); } } - #endregion + + #endregion Ctors #region IBinarySerializable + public void Serialize(IBinaryWriter writer) { writer.WriteGuid(this.Id); @@ -82,9 +91,11 @@ namespace ZeroLevel.Models this.Headers = reader.ReadCollection
(); this.Categories = reader.ReadCollection(); } - #endregion + + #endregion IBinarySerializable #region Equals & Hash + public override bool Equals(object obj) { return this.Equals(obj as BinaryDocument); @@ -111,11 +122,12 @@ namespace ZeroLevel.Models { return Id.GetHashCode(); } - #endregion + + #endregion Equals & Hash public object Clone() { return new BinaryDocument(this); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Models/IEntity.cs b/ZeroLevel/Models/IEntity.cs index 2c00619..c6ee879 100644 --- a/ZeroLevel/Models/IEntity.cs +++ b/ZeroLevel/Models/IEntity.cs @@ -2,15 +2,15 @@ namespace ZeroLevel.Models { - public interface IEntity + public interface IEntity : ICloneable { Guid Id { get; } } - public interface IEntity + public interface IEntity : ICloneable { TKey Id { get; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Models/InvokeResult.cs b/ZeroLevel/Models/InvokeResult.cs index f0cdac0..819f23f 100644 --- a/ZeroLevel/Models/InvokeResult.cs +++ b/ZeroLevel/Models/InvokeResult.cs @@ -12,10 +12,13 @@ namespace ZeroLevel.Models IBinarySerializable { #region Static + private static readonly InvokeResult _successResultWitoutComment = new InvokeResult(true, String.Empty); - #endregion + + #endregion Static #region Ctor + public InvokeResult() { } @@ -25,35 +28,43 @@ namespace ZeroLevel.Models Success = success; Comment = comment; } - #endregion + + #endregion Ctor #region Properties + /// /// true when action successfully invoked /// [DataMember] public bool Success; + /// /// Comment /// [DataMember] public string Comment; - #endregion + + #endregion Properties #region Fabric methods + /// /// Error when action invoking /// public static InvokeResult Fault(string comment) { return new InvokeResult(false, comment); } + /// /// Successfully - /// + /// public static InvokeResult Succeeding(string comment = "") { return new InvokeResult(true, comment); } + /// /// Successfully /// public static InvokeResult Succeeding() { return _successResultWitoutComment; } - #endregion + + #endregion Fabric methods public virtual void Serialize(IBinaryWriter writer) { @@ -75,6 +86,7 @@ namespace ZeroLevel.Models public T Value { get { return _value; } } #region Ctor + public InvokeResult(bool success, string comment) { Success = success; @@ -87,12 +99,22 @@ namespace ZeroLevel.Models Success = success; Comment = comment; } - #endregion + + #endregion Ctor #region Fabric methods - public static InvokeResult Succeeding(T value, string comment = "") { return new InvokeResult(value, true, comment); } - public static InvokeResult Fault(string comment) { return new InvokeResult(false, comment); } - #endregion + + public static InvokeResult Succeeding(T value, string comment = "") + { + return new InvokeResult(value, true, comment); + } + + public static InvokeResult Fault(string comment) + { + return new InvokeResult(false, comment); + } + + #endregion Fabric methods public override void Serialize(IBinaryWriter writer) { @@ -108,4 +130,4 @@ namespace ZeroLevel.Models this._value = reader.ReadCompatible(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Properties/AssemblyInfo.cs b/ZeroLevel/Properties/AssemblyInfo.cs index 27509dc..5aa011f 100644 --- a/ZeroLevel/Properties/AssemblyInfo.cs +++ b/ZeroLevel/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -33,4 +32,4 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ZeroLevel/Services/Application/BaseWindowsService.cs b/ZeroLevel/Services/Application/BaseWindowsService.cs index 27859c5..5419274 100644 --- a/ZeroLevel/Services/Application/BaseWindowsService.cs +++ b/ZeroLevel/Services/Application/BaseWindowsService.cs @@ -22,7 +22,6 @@ namespace ZeroLevel.Services.Applications public ZeroServiceState State => _state; private ZeroServiceState _state; - private ManualResetEvent InteraciveModeWorkingFlag = new ManualResetEvent(false); public void InteractiveStart(string[] args) @@ -35,13 +34,19 @@ namespace ZeroLevel.Services.Applications } #region IZeroService + public abstract void StartAction(); + public abstract void StopAction(); + public abstract void PauseAction(); + public abstract void ResumeAction(); - #endregion + + #endregion IZeroService #region Windows service + protected override void OnStart(string[] args) { if (_state == ZeroServiceState.Initialized) @@ -116,6 +121,7 @@ namespace ZeroLevel.Services.Applications } } } - #endregion + + #endregion Windows service } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Application/BasicServiceInstaller.cs b/ZeroLevel/Services/Application/BasicServiceInstaller.cs index c98a18b..a7ae072 100644 --- a/ZeroLevel/Services/Application/BasicServiceInstaller.cs +++ b/ZeroLevel/Services/Application/BasicServiceInstaller.cs @@ -111,4 +111,4 @@ namespace ZeroLevel.Services.Applications return installer; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Application/BusinessApplication.cs b/ZeroLevel/Services/Application/BusinessApplication.cs index 55cea17..b9e4203 100644 --- a/ZeroLevel/Services/Application/BusinessApplication.cs +++ b/ZeroLevel/Services/Application/BusinessApplication.cs @@ -57,6 +57,7 @@ namespace ZeroLevel Log.Fatal(ex, "[Bootstrap] Fault service install"); } } + /// /// Uninstall from windows services /// @@ -163,4 +164,4 @@ namespace ZeroLevel try { Injector.Default.Dispose(); Injector.Dispose(); } catch { } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Application/IZeroService.cs b/ZeroLevel/Services/Application/IZeroService.cs index 9440799..33208c1 100644 --- a/ZeroLevel/Services/Application/IZeroService.cs +++ b/ZeroLevel/Services/Application/IZeroService.cs @@ -5,10 +5,13 @@ ZeroServiceState State { get; } void StartAction(); + void StopAction(); + void PauseAction(); + void ResumeAction(); void InteractiveStart(string[] args); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Application/ZeroServiceState.cs b/ZeroLevel/Services/Application/ZeroServiceState.cs index 7281199..0be51a6 100644 --- a/ZeroLevel/Services/Application/ZeroServiceState.cs +++ b/ZeroLevel/Services/Application/ZeroServiceState.cs @@ -10,4 +10,4 @@ namespace ZeroLevel.Services.Applications Paused = 2, Stopped = 3 } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncConditionVariable.cs b/ZeroLevel/Services/Async/AsyncConditionVariable.cs index 074e595..c227fff 100644 --- a/ZeroLevel/Services/Async/AsyncConditionVariable.cs +++ b/ZeroLevel/Services/Async/AsyncConditionVariable.cs @@ -179,6 +179,7 @@ namespace ZeroLevel.Services.Async public IAsyncWaitQueue WaitQueue { get { return _cv._queue; } } } + // ReSharper restore UnusedMember.Local } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncHelper.cs b/ZeroLevel/Services/Async/AsyncHelper.cs index 90e25ee..a983fdb 100644 --- a/ZeroLevel/Services/Async/AsyncHelper.cs +++ b/ZeroLevel/Services/Async/AsyncHelper.cs @@ -35,4 +35,4 @@ namespace ZeroLevel.Services.Async return default(T); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncLock.cs b/ZeroLevel/Services/Async/AsyncLock.cs index f2cb7ae..a4fa06f 100644 --- a/ZeroLevel/Services/Async/AsyncLock.cs +++ b/ZeroLevel/Services/Async/AsyncLock.cs @@ -186,6 +186,7 @@ namespace ZeroLevel.Services.Async public IAsyncWaitQueue WaitQueue { get { return _mutex._queue; } } } + // ReSharper restore UnusedMember.Local } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncManualResetEvent.cs b/ZeroLevel/Services/Async/AsyncManualResetEvent.cs index b7a488d..13aa39e 100644 --- a/ZeroLevel/Services/Async/AsyncManualResetEvent.cs +++ b/ZeroLevel/Services/Async/AsyncManualResetEvent.cs @@ -154,6 +154,7 @@ namespace ZeroLevel.Services.Async public Task CurrentTask { get { return _mre._tcs.Task; } } } + // ReSharper restore UnusedMember.Local } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncMonitor.cs b/ZeroLevel/Services/Async/AsyncMonitor.cs index 84e0216..5beb86f 100644 --- a/ZeroLevel/Services/Async/AsyncMonitor.cs +++ b/ZeroLevel/Services/Async/AsyncMonitor.cs @@ -132,4 +132,4 @@ namespace ZeroLevel.Services.Async _conditionVariable.NotifyAll(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncProducerConsumerQueue.cs b/ZeroLevel/Services/Async/AsyncProducerConsumerQueue.cs index 8d42231..30e6382 100644 --- a/ZeroLevel/Services/Async/AsyncProducerConsumerQueue.cs +++ b/ZeroLevel/Services/Async/AsyncProducerConsumerQueue.cs @@ -734,4 +734,4 @@ namespace ZeroLevel.Services.Async return DequeueFromAny(queues, CancellationToken.None); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncReaderWriterLock.cs b/ZeroLevel/Services/Async/AsyncReaderWriterLock.cs index d22cc1f..3a5ce3d 100644 --- a/ZeroLevel/Services/Async/AsyncReaderWriterLock.cs +++ b/ZeroLevel/Services/Async/AsyncReaderWriterLock.cs @@ -82,6 +82,7 @@ namespace ZeroLevel.Services.Async [DebuggerNonUserCode] internal int GetReaderCountForDebugger { get { return (_locksHeld > 0 ? _locksHeld : 0); } } + [DebuggerNonUserCode] internal bool GetUpgradeInProgressForDebugger { get { return !_upgradeReaderQueue.IsEmpty; } } @@ -764,6 +765,7 @@ namespace ZeroLevel.Services.Async public IAsyncWaitQueue UpgradeReaderWaitQueue { get { return _rwl._upgradeReaderQueue; } } } + // ReSharper restore UnusedMember.Local } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncSemaphore.cs b/ZeroLevel/Services/Async/AsyncSemaphore.cs index 4581e41..478641c 100644 --- a/ZeroLevel/Services/Async/AsyncSemaphore.cs +++ b/ZeroLevel/Services/Async/AsyncSemaphore.cs @@ -172,6 +172,7 @@ namespace ZeroLevel.Services.Async public IAsyncWaitQueue WaitQueue { get { return _semaphore._queue; } } } + // ReSharper restore UnusedMember.Local } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/AsyncWaitQueue.cs b/ZeroLevel/Services/Async/AsyncWaitQueue.cs index 4382a3c..be76375 100644 --- a/ZeroLevel/Services/Async/AsyncWaitQueue.cs +++ b/ZeroLevel/Services/Async/AsyncWaitQueue.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -205,4 +203,4 @@ namespace ZeroLevel.Services.Async } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/CancellationTokenHelpers.cs b/ZeroLevel/Services/Async/CancellationTokenHelpers.cs index 48edbf5..62a157d 100644 --- a/ZeroLevel/Services/Async/CancellationTokenHelpers.cs +++ b/ZeroLevel/Services/Async/CancellationTokenHelpers.cs @@ -100,4 +100,4 @@ namespace ZeroLevel.Services.Async return FromTask(source, TaskContinuationOptions.None); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/CancellationTokenTaskSource.cs b/ZeroLevel/Services/Async/CancellationTokenTaskSource.cs index 879f182..a9e9054 100644 --- a/ZeroLevel/Services/Async/CancellationTokenTaskSource.cs +++ b/ZeroLevel/Services/Async/CancellationTokenTaskSource.cs @@ -7,7 +7,7 @@ namespace ZeroLevel.Services.Async /// /// Holds the task for a cancellation token, as well as the token registration. The registration is disposed when this instance is disposed. /// - public sealed class CancellationTokenTaskSource + public sealed class CancellationTokenTaskSource : IDisposable { /// @@ -44,4 +44,4 @@ namespace ZeroLevel.Services.Async _registration?.Dispose(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/Deque.cs b/ZeroLevel/Services/Async/Deque.cs index e93239c..963b46f 100644 --- a/ZeroLevel/Services/Async/Deque.cs +++ b/ZeroLevel/Services/Async/Deque.cs @@ -248,7 +248,8 @@ namespace ZeroLevel.Services.Async return this.GetEnumerator(); } - #endregion + #endregion GenericListImplementations + #region ObjectListImplementations int System.Collections.IList.Add(object value) @@ -329,7 +330,8 @@ namespace ZeroLevel.Services.Async get { return this; } } - #endregion + #endregion ObjectListImplementations + #region GenericListHelpers /// @@ -386,7 +388,7 @@ namespace ZeroLevel.Services.Async } } - #endregion + #endregion GenericListHelpers /// /// Gets a value indicating whether this instance is empty. @@ -833,4 +835,4 @@ namespace ZeroLevel.Services.Async } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/ExceptionHelpers.cs b/ZeroLevel/Services/Async/ExceptionHelpers.cs index 553608b..73f87bd 100644 --- a/ZeroLevel/Services/Async/ExceptionHelpers.cs +++ b/ZeroLevel/Services/Async/ExceptionHelpers.cs @@ -9,7 +9,7 @@ namespace ZeroLevel.Services.Async public static class ExceptionHelpers { /// - /// Attempts to prepare the exception for re-throwing by preserving the stack trace. + /// Attempts to prepare the exception for re-throwing by preserving the stack trace. /// The returned exception should be immediately thrown. /// /// The exception. May not be null. @@ -20,4 +20,4 @@ namespace ZeroLevel.Services.Async return exception; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/IdManager.cs b/ZeroLevel/Services/Async/IdManager.cs index 80600d8..bd51e03 100644 --- a/ZeroLevel/Services/Async/IdManager.cs +++ b/ZeroLevel/Services/Async/IdManager.cs @@ -15,6 +15,7 @@ namespace ZeroLevel.Services.Async /// // ReSharper disable StaticFieldInGenericType private static int _lastId; + // ReSharper restore StaticFieldInGenericType /// @@ -45,4 +46,4 @@ namespace ZeroLevel.Services.Async return id; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/NormalizedCancellationToken.cs b/ZeroLevel/Services/Async/NormalizedCancellationToken.cs index 1c6cea4..0ed90fc 100644 --- a/ZeroLevel/Services/Async/NormalizedCancellationToken.cs +++ b/ZeroLevel/Services/Async/NormalizedCancellationToken.cs @@ -58,4 +58,4 @@ namespace ZeroLevel.Services.Async /// public CancellationToken Token { get { return _token; } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/TaskCompletionSource.cs b/ZeroLevel/Services/Async/TaskCompletionSource.cs index 03978a0..16c632c 100644 --- a/ZeroLevel/Services/Async/TaskCompletionSource.cs +++ b/ZeroLevel/Services/Async/TaskCompletionSource.cs @@ -134,4 +134,4 @@ namespace ZeroLevel.Services.Async return _tcs.TrySetResult(null); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/TaskCompletionSourceExtensions.cs b/ZeroLevel/Services/Async/TaskCompletionSourceExtensions.cs index 2133c86..6733953 100644 --- a/ZeroLevel/Services/Async/TaskCompletionSourceExtensions.cs +++ b/ZeroLevel/Services/Async/TaskCompletionSourceExtensions.cs @@ -75,6 +75,7 @@ namespace ZeroLevel.Services.Async } return @this.TrySetResult(resultFunc()); } + /// /// Attempts to complete a , propagating the completion of . /// @@ -91,6 +92,7 @@ namespace ZeroLevel.Services.Async return @this.TrySetException(eventArgs.Error); return @this.TrySetResult(getResult()); } + /// /// Attempts to complete a , propagating the completion of . /// @@ -105,6 +107,7 @@ namespace ZeroLevel.Services.Async return @this.TrySetCanceled(); return @this.TrySetResult(); } + /// /// Attempts to complete a , propagating the completion of . /// @@ -119,6 +122,7 @@ namespace ZeroLevel.Services.Async return @this.TrySetException(eventArgs.Error); return @this.TrySetResult(); } + /// /// Attempts to complete a with the specified value, forcing all continuations onto a threadpool thread even if they specified ExecuteSynchronously. /// @@ -166,6 +170,7 @@ namespace ZeroLevel.Services.Async { } } + /// /// Creates a new TCS for use with async code, and which forces its continuations to execute asynchronously. /// @@ -174,6 +179,7 @@ namespace ZeroLevel.Services.Async { return new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); } + /// /// Attempts to complete a as canceled, forcing all continuations onto a threadpool thread even if they specified ExecuteSynchronously. /// @@ -275,4 +281,4 @@ namespace ZeroLevel.Services.Async } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/TaskConstants.cs b/ZeroLevel/Services/Async/TaskConstants.cs index 4078d45..d260c85 100644 --- a/ZeroLevel/Services/Async/TaskConstants.cs +++ b/ZeroLevel/Services/Async/TaskConstants.cs @@ -140,4 +140,4 @@ namespace ZeroLevel.Services.Async } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/TaskExtensions.cs b/ZeroLevel/Services/Async/TaskExtensions.cs index 2f45d6a..3eae573 100644 --- a/ZeroLevel/Services/Async/TaskExtensions.cs +++ b/ZeroLevel/Services/Async/TaskExtensions.cs @@ -54,6 +54,7 @@ namespace ZeroLevel.Services.Async using (var cancelTaskSource = new CancellationTokenTaskSource(cancellationToken)) return await await Task.WhenAny(task, cancelTaskSource.Task).ConfigureAwait(false); } + /// /// Waits for the task to complete, unwrapping any exceptions. /// @@ -152,4 +153,4 @@ namespace ZeroLevel.Services.Async } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Async/TaskShim.cs b/ZeroLevel/Services/Async/TaskShim.cs index 762804b..c2ad730 100644 --- a/ZeroLevel/Services/Async/TaskShim.cs +++ b/ZeroLevel/Services/Async/TaskShim.cs @@ -51,4 +51,4 @@ namespace ZeroLevel.Services.Async return Task.WhenAll(tasks); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Collections/EverythingStorage.cs b/ZeroLevel/Services/Collections/EverythingStorage.cs index 60d82de..4fdf58e 100644 --- a/ZeroLevel/Services/Collections/EverythingStorage.cs +++ b/ZeroLevel/Services/Collections/EverythingStorage.cs @@ -68,6 +68,7 @@ namespace ZeroLevel.Services.Collections return (T)_getter.Invoke(_instance, key); } } + private readonly ConcurrentDictionary _shardedRepositories = new ConcurrentDictionary(); @@ -138,4 +139,4 @@ namespace ZeroLevel.Services.Collections this[typeof(T)].InsertOrUpdate(key, value); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Collections/FixSizeQueue.cs b/ZeroLevel/Services/Collections/FixSizeQueue.cs index 013814e..43e3ba4 100644 --- a/ZeroLevel/Services/Collections/FixSizeQueue.cs +++ b/ZeroLevel/Services/Collections/FixSizeQueue.cs @@ -22,6 +22,7 @@ namespace ZeroLevel.Services.Collections _nextIndex = 0; _count = 0; } + /// /// If count is limited when intem adding, oldest item replace with new item /// @@ -138,4 +139,4 @@ namespace ZeroLevel.Services.Collections return dump; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Collections/IEverythingStorage.cs b/ZeroLevel/Services/Collections/IEverythingStorage.cs index c5343b7..e9789b5 100644 --- a/ZeroLevel/Services/Collections/IEverythingStorage.cs +++ b/ZeroLevel/Services/Collections/IEverythingStorage.cs @@ -3,11 +3,17 @@ public interface IEverythingStorage { bool TryAdd(string key, T value); + bool ContainsKey(string key); + bool TryRemove(string key); + void Add(string key, T value); + void AddOrUpdate(string key, T value); + void Remove(string key); + T Get(string key); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Collections/IFixSizeQueue.cs b/ZeroLevel/Services/Collections/IFixSizeQueue.cs index 0fb1aee..6d84335 100644 --- a/ZeroLevel/Services/Collections/IFixSizeQueue.cs +++ b/ZeroLevel/Services/Collections/IFixSizeQueue.cs @@ -5,10 +5,15 @@ namespace ZeroLevel.Services.Collections public interface IFixSizeQueue { void Push(T item); + long Count { get; } + bool TryTake(out T t); + T Take(); + IEnumerable Dump(); + bool Contains(T item, IComparer comparer = null); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Collections/RoundRobinCollection.cs b/ZeroLevel/Services/Collections/RoundRobinCollection.cs index 457236e..a86fa44 100644 --- a/ZeroLevel/Services/Collections/RoundRobinCollection.cs +++ b/ZeroLevel/Services/Collections/RoundRobinCollection.cs @@ -15,7 +15,9 @@ namespace ZeroLevel.Services.Collections { private readonly List _collection = new List(); + private int _index = -1; + private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); @@ -134,4 +136,4 @@ namespace ZeroLevel.Services.Collections _lock.Dispose(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/BaseConfiguration.cs b/ZeroLevel/Services/Config/BaseConfiguration.cs index 1c976c1..8e3c1a5 100644 --- a/ZeroLevel/Services/Config/BaseConfiguration.cs +++ b/ZeroLevel/Services/Config/BaseConfiguration.cs @@ -14,19 +14,24 @@ namespace ZeroLevel.Services.Config IConfiguration { #region Private members + /// /// When true, any changes disallow /// private bool _freezed = false; + /// /// When true, freeze permanent, can't be canceled /// private bool _permanentFreezed = false; + private readonly object _freezeLock = new object(); + /// /// Key-values dictionary /// private readonly ConcurrentDictionary> _keyValues = new ConcurrentDictionary>(); + /// /// Empty list /// @@ -40,9 +45,11 @@ namespace ZeroLevel.Services.Config } return key.Trim().ToLower(CultureInfo.InvariantCulture); } - #endregion + + #endregion Private members #region Properties + /// /// Get values by key /// @@ -61,6 +68,7 @@ namespace ZeroLevel.Services.Config return EmptyValuesList; } } + /// /// Keys list /// @@ -76,11 +84,13 @@ namespace ZeroLevel.Services.Config return _freezed; } } - #endregion + + #endregion Properties #region Public methods #region Get + /// /// Получение списка значение соотвествующих указанному ключу /// @@ -90,6 +100,7 @@ namespace ZeroLevel.Services.Config { return this[key]; } + /// /// Получение первого значения для указанного ключа /// @@ -140,6 +151,7 @@ namespace ZeroLevel.Services.Config } throw new KeyNotFoundException("Parameter not found: " + key); } + /// /// Получение первого значения для указанного ключа, или значения по умолчанию /// @@ -156,6 +168,7 @@ namespace ZeroLevel.Services.Config } return defaultValue; } + /// /// Получение первого значения для указанного ключа, или значения по умолчанию, с попыткой преобразования в указанный тип /// @@ -172,6 +185,7 @@ namespace ZeroLevel.Services.Config } return default(T); } + /// /// Получение первого значения для указанного ключа, или значения по умолчанию, с попыткой преобразования в указанный тип /// @@ -189,6 +203,7 @@ namespace ZeroLevel.Services.Config } return defaultValue; } + /// /// Проверка наличия ключа и непустого списка связанных с ним значений /// @@ -199,6 +214,7 @@ namespace ZeroLevel.Services.Config key = GetKey(key); return _keyValues.ContainsKey(key) && _keyValues[key].Count > 0; } + /// /// Проверка наличия одного из ключей /// @@ -208,6 +224,7 @@ namespace ZeroLevel.Services.Config if (Contains(key)) return true; return false; } + /// /// Проверка наличия ключа и связанного с ним значения /// @@ -223,6 +240,7 @@ namespace ZeroLevel.Services.Config } return false; } + /// /// Количество значений связанных с указанным ключом /// @@ -237,7 +255,8 @@ namespace ZeroLevel.Services.Config } return 0; } - #endregion + + #endregion Get /// /// Add key-value @@ -257,6 +276,7 @@ namespace ZeroLevel.Services.Config } return this; } + /// /// Set unique value for key /// @@ -277,6 +297,7 @@ namespace ZeroLevel.Services.Config } return this; } + /// /// Clean values binded with key /// @@ -293,6 +314,7 @@ namespace ZeroLevel.Services.Config } return this; } + /// /// Configuration drop /// @@ -304,6 +326,7 @@ namespace ZeroLevel.Services.Config } return this; } + /// /// Remove key and binded values /// @@ -349,9 +372,11 @@ namespace ZeroLevel.Services.Config return false; } } - #endregion + + #endregion Public methods #region IEquatable + public bool Equals(IConfiguration other) { if (other == null) @@ -371,9 +396,11 @@ namespace ZeroLevel.Services.Config } return true; } - #endregion + + #endregion IEquatable #region Binary Serializable + public void Serialize(IBinaryWriter writer) { writer.WriteBoolean(this._freezed); @@ -408,6 +435,7 @@ namespace ZeroLevel.Services.Config _keyValues.TryAdd(key, list_values); } } - #endregion + + #endregion Binary Serializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/BaseConfigurationSet.cs b/ZeroLevel/Services/Config/BaseConfigurationSet.cs index ea22943..e6de3e1 100644 --- a/ZeroLevel/Services/Config/BaseConfigurationSet.cs +++ b/ZeroLevel/Services/Config/BaseConfigurationSet.cs @@ -13,6 +13,7 @@ namespace ZeroLevel.Services.Config IConfigurationSet { #region Private members + /// /// Sections /// @@ -26,9 +27,11 @@ namespace ZeroLevel.Services.Config } return key.Trim().ToLower(CultureInfo.InvariantCulture); } - #endregion + + #endregion Private members #region Properties + public IConfiguration Default { get { return _sections[Configuration.DEFAULT_SECTION_NAME]; } @@ -60,9 +63,10 @@ namespace ZeroLevel.Services.Config } } - #endregion + #endregion Properties #region Methods + public BaseConfigurationSet() { CreateSection(Configuration.DEFAULT_SECTION_NAME); @@ -119,18 +123,22 @@ namespace ZeroLevel.Services.Config } return false; } - #endregion + + #endregion Methods #region IEquatable + public bool Equals(IConfigurationSet other) { if (other == null) return false; return this.SectionNames.NoOrderingEquals(other.SectionNames) && this.Sections.NoOrderingEquals(other.Sections); } - #endregion + + #endregion IEquatable #region Freezing + private readonly object _freezeLock = new object(); public bool FreezeConfiguration(bool permanent = false) @@ -193,9 +201,11 @@ namespace ZeroLevel.Services.Config return false; } } - #endregion + + #endregion Freezing #region Binary Serializable + public void Serialize(IBinaryWriter writer) { writer.WriteBoolean(this._sectionsFreezed); @@ -220,6 +230,7 @@ namespace ZeroLevel.Services.Config _sections.TryAdd(key, reader.Read()); } } - #endregion + + #endregion Binary Serializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/Configuration.cs b/ZeroLevel/Services/Config/Configuration.cs index 53aeaa8..024f343 100644 --- a/ZeroLevel/Services/Config/Configuration.cs +++ b/ZeroLevel/Services/Config/Configuration.cs @@ -23,6 +23,7 @@ namespace ZeroLevel public const string DEFAULT_SECTION_NAME = "_defaultsection"; #region Ctor + static Configuration() { _empty = new BaseConfiguration(); @@ -30,9 +31,11 @@ namespace ZeroLevel _empty.Freeze(true); _emptySet.FreezeConfiguration(true); } - #endregion + + #endregion Ctor #region Cachee + private static readonly IConfiguration _empty; private static readonly IConfigurationSet _emptySet; private static readonly ConcurrentDictionary _cachee = new ConcurrentDictionary(); @@ -97,9 +100,11 @@ namespace ZeroLevel } return result; } - #endregion + + #endregion Cachee #region Factory + public static IConfiguration Create() { return new BaseConfiguration(); @@ -114,41 +119,49 @@ namespace ZeroLevel { return new BaseConfigurationSet(defaultConfiguration); } - #endregion + + #endregion Factory #region Read configuration + /// /// Создание конфигурации из секции AppSettings файла app.config или web.config /// /// Конфигурация public static IConfiguration ReadFromApplicationConfig() { return new ApplicationConfigReader().ReadConfiguration(); } + /// /// Создание конфигурации из секции AppSettings файла app.config или web.config, дополняется секцией 'ConnectionStrings' /// /// Конфигурация public static IConfigurationSet ReadSetFromApplicationConfig() { return new ApplicationConfigReader().ReadConfigurationSet(); } + /// /// Создание конфигурации из секции AppSettings файла app.config или web.config /// /// Конфигурация public static IConfiguration ReadFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfiguration(); } + /// /// Создание конфигурации из секции AppSettings файла app.config или web.config, дополняется секцией 'ConnectionStrings' /// /// Конфигурация public static IConfigurationSet ReadSetFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfigurationSet(); } + /// /// Создание конфигурации из ini файла /// /// Путь к ini-файлу /// Конфигурация public static IConfiguration ReadFromIniFile(string path) { return new IniFileReader(path).ReadConfiguration(); } + /// /// Создание конфигурации из ini файла, с учетом секций /// /// Путь к ini-файлу /// Конфигурация public static IConfigurationSet ReadSetFromIniFile(string path) { return new IniFileReader(path).ReadConfigurationSet(); } + /// /// Создание конфигурации из параметров командной строки /// @@ -156,22 +169,29 @@ namespace ZeroLevel /// Конфигурация public static IConfiguration ReadFromCommandLine(string[] args) { return new CommandLineReader(args).ReadConfiguration(); } - public static IConfigurationSet ReadBinary(IBinaryReader reader) { return reader.Read(); } - #endregion + public static IConfigurationSet ReadBinary(IBinaryReader reader) + { + return reader.Read(); + } + + #endregion Read configuration #region Write configuration + /// /// Запись простой конфигурации в ini-файл /// /// Конфигурация /// Путь к ini-файлу public static void WriteToIniFile(IConfiguration configuration, string path) { new IniFileWriter(path).WriteConfiguration(configuration); } + /// /// Запись полной конфигурации в ini-файл /// /// Конфигурация /// Путь к ini-файлу public static void WriteSetToIniFile(IConfigurationSet configuration, string path) { new IniFileWriter(path).WriteConfigurationSet(configuration); } - #endregion + + #endregion Write configuration } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/IConfiguration.cs b/ZeroLevel/Services/Config/IConfiguration.cs index 60b7e49..8f0dbbd 100644 --- a/ZeroLevel/Services/Config/IConfiguration.cs +++ b/ZeroLevel/Services/Config/IConfiguration.cs @@ -12,103 +12,128 @@ namespace ZeroLevel IBinarySerializable { #region Properties + /// /// Get values by key /// IEnumerable this[string key] { get; } + /// /// Keys /// IEnumerable Keys { get; } + /// /// Configuration is locked for change when true /// bool Freezed { get; } - #endregion + + #endregion Properties #region Methods + /// /// Get values by key /// /// Key /// Values list IEnumerable Items(string key); + /// /// Get first value by key /// string First(string key); + /// /// Get first value by key with cast to /// T First(string key); + /// /// Get first or default value by key /// string FirstOrDefault(string name, string defaultValue); + /// /// Get first or default value by key with cast to /// T FirstOrDefault(string name); + /// /// Get first or default value by key with cast to /// T FirstOrDefault(string name, T defaultValue); + /// /// Check key exists /// bool Contains(string key); + /// /// Check one of key exists /// bool Contains(params string[] keys); + /// /// true if exists one or more values by key /// bool ContainsValue(string key, string value); + /// /// Count values by key /// int Count(string key); + /// /// Do action if key exists, action takes first value /// void DoWithFirst(string key, Action action); + /// /// Do action if key exists, action takes first value with cast to /// void DoWithFirst(string key, Action action); - #endregion + + #endregion Methods #region Create, Clean, Delete + /// /// Clean /// IConfiguration Clear(); + /// /// Clean values by key /// IConfiguration Clear(string key); + /// /// Remove key and binded values /// IConfiguration Remove(string key); + /// /// Append key and value /// IConfiguration Append(string key, string value); + /// /// Set key with one value, if any values by key exists, they will be dropped /// IConfiguration SetUnique(string key, string value); + /// /// Sets a prohibition on changing /// /// false - prohibition was set already bool Freeze(bool permanent = false); + /// /// Remove a prohibition on changing /// bool Unfreeze(); - #endregion + + #endregion Create, Clean, Delete } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/IConfigurationReader.cs b/ZeroLevel/Services/Config/IConfigurationReader.cs index 58a2885..b7be953 100644 --- a/ZeroLevel/Services/Config/IConfigurationReader.cs +++ b/ZeroLevel/Services/Config/IConfigurationReader.cs @@ -3,6 +3,7 @@ public interface IConfigurationReader { IConfiguration ReadConfiguration(); + IConfigurationSet ReadConfigurationSet(); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/IConfigurationSet.cs b/ZeroLevel/Services/Config/IConfigurationSet.cs index 4fae6d6..a197f58 100644 --- a/ZeroLevel/Services/Config/IConfigurationSet.cs +++ b/ZeroLevel/Services/Config/IConfigurationSet.cs @@ -12,66 +12,81 @@ namespace ZeroLevel IBinarySerializable { #region Properties + /// /// Default section, always exists /// IConfiguration Default { get; } + /// /// Get configuration section by name /// IConfiguration this[string sectionName] { get; } + /// /// Get configuration section names /// IEnumerable SectionNames { get; } + /// /// Get all sections /// IEnumerable Sections { get; } + /// /// true if changing disallow /// bool SectionsFreezed { get; } - #endregion + + #endregion Properties #region Methods + /// /// Create section /// /// Section name IConfiguration CreateSection(string sectionName); + /// /// Get configuration section by name /// /// Название секции /// Секция с данными IConfiguration GetSection(string sectionName); + /// /// Check for a section by name /// /// Section name bool ContainsSection(string sectionName); + /// Remove section by name /// /// Section name bool RemoveSection(string sectionName); + /// /// Sets a prohibition on changing configurations /// bool FreezeConfiguration(bool permanent = false); + /// /// Sets a prohibition on changing sections /// bool FreezeSections(bool permanent = false); + /// /// Remove a prohibition on changing configurations /// /// false - если запрет снят bool UnfreezeConfiguration(); + /// /// Sets a prohibition on changing sections /// bool UnfreezeSections(); - #endregion + + #endregion Methods } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/IConfigurationWriter.cs b/ZeroLevel/Services/Config/IConfigurationWriter.cs index 18ff3ed..bb9e884 100644 --- a/ZeroLevel/Services/Config/IConfigurationWriter.cs +++ b/ZeroLevel/Services/Config/IConfigurationWriter.cs @@ -3,6 +3,7 @@ public interface IConfigurationWriter { void WriteConfiguration(IConfiguration configuration); + void WriteConfigurationSet(IConfigurationSet configuration); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs b/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs index 981a0ba..b4bb3ff 100644 --- a/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs +++ b/ZeroLevel/Services/Config/Implementation/AppWebConfigReader.cs @@ -102,4 +102,4 @@ namespace ZeroLevel.Services.Config.Implementation return ReadSection("appSettings"); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/Implementation/ApplicationConfigReader.cs b/ZeroLevel/Services/Config/Implementation/ApplicationConfigReader.cs index 9279ae0..27229f7 100644 --- a/ZeroLevel/Services/Config/Implementation/ApplicationConfigReader.cs +++ b/ZeroLevel/Services/Config/Implementation/ApplicationConfigReader.cs @@ -1,12 +1,19 @@ namespace ZeroLevel.Services.Config.Implementation { - internal sealed class ApplicationConfigReader + internal sealed class ApplicationConfigReader : IConfigurationReader { private readonly AppWebConfigReader _reader; - internal ApplicationConfigReader() { _reader = new AppWebConfigReader(); } - internal ApplicationConfigReader(string configFilePath) { _reader = new AppWebConfigReader(configFilePath); } + internal ApplicationConfigReader() + { + _reader = new AppWebConfigReader(); + } + + internal ApplicationConfigReader(string configFilePath) + { + _reader = new AppWebConfigReader(configFilePath); + } public IConfiguration ReadConfiguration() { @@ -36,4 +43,4 @@ return result; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/Implementation/CommandLineReader.cs b/ZeroLevel/Services/Config/Implementation/CommandLineReader.cs index 87ead47..83db33e 100644 --- a/ZeroLevel/Services/Config/Implementation/CommandLineReader.cs +++ b/ZeroLevel/Services/Config/Implementation/CommandLineReader.cs @@ -3,7 +3,7 @@ using System.Globalization; namespace ZeroLevel.Services.Config.Implementation { - internal sealed class CommandLineReader + internal sealed class CommandLineReader : IConfigurationReader { private readonly string[] _args; @@ -51,4 +51,4 @@ namespace ZeroLevel.Services.Config.Implementation return Configuration.CreateSet(ReadConfiguration()); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/Implementation/IniFileReader.cs b/ZeroLevel/Services/Config/Implementation/IniFileReader.cs index 5f2f889..0b7fc9d 100644 --- a/ZeroLevel/Services/Config/Implementation/IniFileReader.cs +++ b/ZeroLevel/Services/Config/Implementation/IniFileReader.cs @@ -7,7 +7,7 @@ namespace ZeroLevel.Services.Config.Implementation /// /// Чтение конфигурации из ini файла /// - internal sealed class IniFileReader + internal sealed class IniFileReader : IConfigurationReader { private readonly string _iniPath; @@ -122,4 +122,4 @@ namespace ZeroLevel.Services.Config.Implementation return result; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/Config/Implementation/IniFileWriter.cs b/ZeroLevel/Services/Config/Implementation/IniFileWriter.cs index 9aa32c3..925df1c 100644 --- a/ZeroLevel/Services/Config/Implementation/IniFileWriter.cs +++ b/ZeroLevel/Services/Config/Implementation/IniFileWriter.cs @@ -5,7 +5,7 @@ namespace ZeroLevel.Services.Config.Implementation /// /// Write config to ini-file /// - public class IniFileWriter + public class IniFileWriter : IConfigurationWriter { /// @@ -17,6 +17,7 @@ namespace ZeroLevel.Services.Config.Implementation { _iniPath = iniPath; } + /// /// Write config to file /// @@ -41,6 +42,7 @@ namespace ZeroLevel.Services.Config.Implementation writer.Flush(); } } + /// /// Write configuration set to file /// @@ -71,4 +73,4 @@ namespace ZeroLevel.Services.Config.Implementation } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Contracts/IContentReader.cs b/ZeroLevel/Services/DOM/Contracts/IContentReader.cs index 6dffcc4..2a11c04 100644 --- a/ZeroLevel/Services/DOM/Contracts/IContentReader.cs +++ b/ZeroLevel/Services/DOM/Contracts/IContentReader.cs @@ -6,41 +6,62 @@ namespace ZeroLevel.DocumentObjectModel { // Primitives void ReadText(Text text); + void ReadQuote(Quote quote); + void ReadLink(Link link, int order); + void ReadImage(Image image, int order); + void ReadAudio(Audio audio, int order); + void ReadVideo(Video video, int order); // Containers void EnterSection(Section section); + void LeaveSection(Section section); void EnterParagraph(Paragraph paragraph); + void LeaveParagraph(Paragraph paragraph); void EnterList(List list); + void EnterListItem(List list, IContentElement item, int order); + void LeaveListItem(List list, IContentElement item, int order); + void LeaveList(List list); void EnterTable(Table table); + void EnterColumns(Table table); + void ReadColumn(Table table, Column column, int order); + void LeaveColumns(Table table); + void EnterRow(Table table, Row row, int order); + void EnterRowCell(Table table, Row row, IContentElement cell, int order); + void LeaveRowCell(Table table, Row row, IContentElement cell, int order); + void LeaveRow(Table table, Row row, int order); + void LeaveTable(Table table); void EnterGallery(Gallery gallery); + void LeaveGallery(Gallery gallery); void EnterAudioplayer(Audioplayer player); + void LeaveAudioplayer(Audioplayer player); void EnterVideoplayer(Videoplayer player); + void LeaveVideoplayer(Videoplayer player); // Feature @@ -48,4 +69,4 @@ namespace ZeroLevel.DocumentObjectModel T Complete(); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Contracts/IMetadataReader.cs b/ZeroLevel/Services/DOM/Contracts/IMetadataReader.cs index b296247..6016a65 100644 --- a/ZeroLevel/Services/DOM/Contracts/IMetadataReader.cs +++ b/ZeroLevel/Services/DOM/Contracts/IMetadataReader.cs @@ -6,56 +6,93 @@ namespace ZeroLevel.DocumentObjectModel public interface IMetadataReader { void ReadId(Guid Id); + void ReadSummary(string summary); + void ReadHeader(string header); void EnterIdentifier(Identifier identifier); + void ReadVersion(int version); + void ReadTimestamp(long timestamp); + void ReadDateLabel(string datelabel); + void LeaveIdentifier(Identifier identifier); void EnterTagsBlock(TagMetadata tagBlock); + void EnterKeywords(IEnumerable keywords); + void ReadKeyword(string keyword, int order); + void LeaveKeywords(IEnumerable keywords); + void EnterPlaces(IEnumerable places); + void ReadPlace(Tag place, int order); + void LeavePlaces(IEnumerable places); + void EnterCompanies(IEnumerable companies); + void ReadCompany(Tag company, int order); + void LeaveCompanies(IEnumerable companies); + void EnterPersons(IEnumerable persons); + void ReadPerson(Tag person, int order); + void LeavePersons(IEnumerable persons); + void LeaveTagsBlock(TagMetadata tagBlock); void EnterDescriptioveBlock(DescriptiveMetadata metadata); + void ReadAuthors(string byline); + void ReadCopiright(string copyright); + void ReadCreated(DateTime created); + void ReadLanguage(string language); + void ReadPriority(Priority priority); + void ReadSource(Agency source); + void ReadPublisher(Agency publisher); + void ReadOriginal(Tag original); + void EnterHeaders(IEnumerable
headers); + void ReadHeader(Header header, int order); + void LeaveHeaders(IEnumerable
headers); + void LeaveDescriptioveBlock(DescriptiveMetadata metadata); void EnterAsides(IEnumerable asides); + void ReadAside(AttachContent aside, int order); + void LeaveAsides(IEnumerable asides); void EnterAssotiations(IEnumerable assotiations); + void ReadAssotiation(Assotiation assotiation, int order); + void LeaveAssotiations(IEnumerable assotiations); void EnterCategories(IEnumerable categories); + void ReadCategory(Category category, int order); + void LeaveCategories(IEnumerable categories); T Complete(); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs index a05d59d..790affa 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TBlockContext.cs @@ -126,4 +126,4 @@ namespace DOM.DSL.Contexts return new TBlockToken(_name, _blockToken, _tokens); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TContext.cs index b54e058..175d1f9 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TContext.cs @@ -22,6 +22,7 @@ namespace DOM.DSL.Contexts }; public TContext ParentContext { get; protected set; } + public abstract void Read(TStringReader reader); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TElementContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TElementContext.cs index d56e4ca..0727e96 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TElementContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TElementContext.cs @@ -19,7 +19,7 @@ namespace DOM.DSL.Contexts public override void Read(TStringReader reader) { if (reader.EOF == false && reader.Current == TChar.PropertyOrFuncStart) - { + { if (reader.Move()) { reader.SkipBreaks(); @@ -75,4 +75,4 @@ namespace DOM.DSL.Contexts return new TElementToken { ElementName = _name, NextToken = _next?.Clone() }; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TFunctionContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TFunctionContext.cs index 001785d..7bb49ae 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TFunctionContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TFunctionContext.cs @@ -1,10 +1,10 @@ -using System; -using System.Linq; +using DOM.DSL.Model; +using DOM.DSL.Services; +using DOM.DSL.Tokens; +using System; using System.Collections.Generic; +using System.Linq; using System.Text; -using DOM.DSL.Tokens; -using DOM.DSL.Services; -using DOM.DSL.Model; namespace DOM.DSL.Contexts { @@ -47,6 +47,7 @@ namespace DOM.DSL.Contexts switch (reader.Current) { #region Ecsaping + case TChar.Escape: { switch (reader.Next) @@ -55,18 +56,22 @@ namespace DOM.DSL.Contexts text.Append(' '); reader.Move(2); break; + case 'r': text.Append(TChar.CaretReturn); reader.Move(2); break; + case 'n': text.Append(TChar.Newline); reader.Move(2); break; + case 't': text.Append(TChar.Tab); reader.Move(2); break; + case '@': case '(': case ')': @@ -76,6 +81,7 @@ namespace DOM.DSL.Contexts text.Append(reader.Next); reader.Move(2); break; + default: text.Append(reader.Current); reader.Move(); @@ -83,7 +89,8 @@ namespace DOM.DSL.Contexts } } break; - #endregion + + #endregion Ecsaping case TChar.FuncArgsEnd: { @@ -162,6 +169,7 @@ namespace DOM.DSL.Contexts } } break; + default: { text.Append(reader.Current); @@ -184,4 +192,4 @@ namespace DOM.DSL.Contexts }; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TPropertyContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TPropertyContext.cs index aef059a..1aaff79 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TPropertyContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TPropertyContext.cs @@ -69,6 +69,7 @@ namespace DOM.DSL.Contexts switch (reader.Current) { #region Ecsaping + case TChar.Escape: { switch (reader.Next) @@ -77,18 +78,22 @@ namespace DOM.DSL.Contexts text.Append(' '); reader.Move(2); break; + case 'r': text.Append(TChar.CaretReturn); reader.Move(2); break; + case 'n': text.Append(TChar.Newline); reader.Move(2); break; + case 't': text.Append(TChar.Tab); reader.Move(2); break; + case '@': case '(': case ')': @@ -98,6 +103,7 @@ namespace DOM.DSL.Contexts text.Append(reader.Next); reader.Move(2); break; + default: text.Append(reader.Current); reader.Move(); @@ -105,7 +111,8 @@ namespace DOM.DSL.Contexts } } break; - #endregion + + #endregion Ecsaping case TChar.PropertyIndexEnd: { @@ -160,6 +167,7 @@ namespace DOM.DSL.Contexts } } break; + default: { text.Append(reader.Current); @@ -182,4 +190,4 @@ namespace DOM.DSL.Contexts }; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contexts/TRootContext.cs b/ZeroLevel/Services/DOM/DSL/Contexts/TRootContext.cs index 6ee28d8..5bb0e87 100644 --- a/ZeroLevel/Services/DOM/DSL/Contexts/TRootContext.cs +++ b/ZeroLevel/Services/DOM/DSL/Contexts/TRootContext.cs @@ -40,6 +40,7 @@ namespace DOM.DSL.Contexts switch (reader.Current) { #region Ecsaping + case TChar.Escape: { switch (reader.Next) @@ -48,18 +49,22 @@ namespace DOM.DSL.Contexts text.Append(' '); reader.Move(2); break; + case 'r': text.Append(TChar.CaretReturn); reader.Move(2); break; + case 'n': text.Append(TChar.Newline); reader.Move(2); break; + case 't': text.Append(TChar.Tab); reader.Move(2); break; + case '@': case '(': case ')': @@ -69,6 +74,7 @@ namespace DOM.DSL.Contexts text.Append(reader.Next); reader.Move(2); break; + default: text.Append(reader.Current); reader.Move(); @@ -76,7 +82,8 @@ namespace DOM.DSL.Contexts } } break; - #endregion + + #endregion Ecsaping case TChar.TokenStart: { @@ -122,11 +129,13 @@ namespace DOM.DSL.Contexts } } break; + case TChar.CaretReturn: case TChar.Newline: case TChar.Tab: reader.Move(); break; + default: { text.Append(reader.Current); @@ -143,4 +152,4 @@ namespace DOM.DSL.Contexts return _tokens; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contracts/ISpecialTableBuilder.cs b/ZeroLevel/Services/DOM/DSL/Contracts/ISpecialTableBuilder.cs index 11d8306..c322439 100644 --- a/ZeroLevel/Services/DOM/DSL/Contracts/ISpecialTableBuilder.cs +++ b/ZeroLevel/Services/DOM/DSL/Contracts/ISpecialTableBuilder.cs @@ -9,12 +9,19 @@ namespace DOM.DSL.Contracts /// Indicates that a table cell body entry is expected. ///
bool WaitCellBody { get; } + void WriteToCell(string part); + void EnterTable(Column[] colunmns); + void EnterRow(int count_columns); + void EnterCell(int order); + void LeaveCell(); + void LeaveRow(); + void FlushTable(StringBuilder builder); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Contracts/TCloneable.cs b/ZeroLevel/Services/DOM/DSL/Contracts/TCloneable.cs index cd5a6d3..881379d 100644 --- a/ZeroLevel/Services/DOM/DSL/Contracts/TCloneable.cs +++ b/ZeroLevel/Services/DOM/DSL/Contracts/TCloneable.cs @@ -6,4 +6,4 @@ namespace DOM.DSL.Contracts { TToken Clone(); } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Model/DOMRenderElementCounter.cs b/ZeroLevel/Services/DOM/DSL/Model/DOMRenderElementCounter.cs index 152c8bc..c845101 100644 --- a/ZeroLevel/Services/DOM/DSL/Model/DOMRenderElementCounter.cs +++ b/ZeroLevel/Services/DOM/DSL/Model/DOMRenderElementCounter.cs @@ -25,23 +25,94 @@ public int GalleryId { get; private set; } = -1; public int ImageId { get; private set; } = -1; - public void IncSectionId() { SectionId++; } - public void IncParagraphId() { ParagraphId++; } - public void IncListId() { ListId++; } - public void IncListItemId() { ListItemId++; } - public void IncTableId() { TableId++; } - public void IncColumnId() { ColumnId++; } - public void IncRowId() { RowId++; } - public void IncCellId() { CellId++; } - public void IncFormId() { FormId++; } - public void IncLinkId() { LinkId++; } - public void IncQuoteId() { QuoteId++; } - public void IncTextId() { TextId++; } - public void IncAudioplayerId() { AudioplayerId++; } - public void IncAudioId() { AudioId++; } - public void IncVideoplayerId() { VideoplayerId++; } - public void IncVideoId() { VideoId++; } - public void IncGalleryId() { GalleryId++; } - public void IncImageId() { ImageId++; } + public void IncSectionId() + { + SectionId++; + } + + public void IncParagraphId() + { + ParagraphId++; + } + + public void IncListId() + { + ListId++; + } + + public void IncListItemId() + { + ListItemId++; + } + + public void IncTableId() + { + TableId++; + } + + public void IncColumnId() + { + ColumnId++; + } + + public void IncRowId() + { + RowId++; + } + + public void IncCellId() + { + CellId++; + } + + public void IncFormId() + { + FormId++; + } + + public void IncLinkId() + { + LinkId++; + } + + public void IncQuoteId() + { + QuoteId++; + } + + public void IncTextId() + { + TextId++; + } + + public void IncAudioplayerId() + { + AudioplayerId++; + } + + public void IncAudioId() + { + AudioId++; + } + + public void IncVideoplayerId() + { + VideoplayerId++; + } + + public void IncVideoId() + { + VideoId++; + } + + public void IncGalleryId() + { + GalleryId++; + } + + public void IncImageId() + { + ImageId++; + } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Model/TChar.cs b/ZeroLevel/Services/DOM/DSL/Model/TChar.cs index 4e054ce..8c22f2f 100644 --- a/ZeroLevel/Services/DOM/DSL/Model/TChar.cs +++ b/ZeroLevel/Services/DOM/DSL/Model/TChar.cs @@ -14,4 +14,4 @@ public const char Newline = '\n'; public const char Tab = '\t'; } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Model/TContentElement.cs b/ZeroLevel/Services/DOM/DSL/Model/TContentElement.cs index 428083a..382d846 100644 --- a/ZeroLevel/Services/DOM/DSL/Model/TContentElement.cs +++ b/ZeroLevel/Services/DOM/DSL/Model/TContentElement.cs @@ -31,6 +31,7 @@ namespace DOM.DSL.Model TraversElement(item, type, handler); } break; + case ContentElementType.Paragraph: var paragraph = (element as Paragraph); foreach (var item in paragraph.Parts) @@ -38,6 +39,7 @@ namespace DOM.DSL.Model TraversElement(item, type, handler); } break; + case ContentElementType.List: var list = (element as List); foreach (var item in list.Items) @@ -45,6 +47,7 @@ namespace DOM.DSL.Model TraversElement(item, type, handler); } break; + case ContentElementType.Gallery: var gallery = (element as Gallery); foreach (var item in gallery.Images) @@ -52,6 +55,7 @@ namespace DOM.DSL.Model TraversElement(item, type, handler); } break; + case ContentElementType.Audioplayer: var audioplayer = (element as Audioplayer); foreach (var item in audioplayer.Tracks) @@ -59,6 +63,7 @@ namespace DOM.DSL.Model TraversElement(item, type, handler); } break; + case ContentElementType.Videoplayer: var videoplayer = (element as Videoplayer); foreach (var item in videoplayer.Playlist) @@ -66,6 +71,7 @@ namespace DOM.DSL.Model TraversElement(item, type, handler); } break; + case ContentElementType.Table: var table = (element as Table); foreach (var column in table.Columns) @@ -90,34 +96,49 @@ namespace DOM.DSL.Model { case "section": return ContentElementType.Section; + case "paragraph": return ContentElementType.Paragraph; + case "link": return ContentElementType.Link; + case "list": return ContentElementType.List; + case "table": return ContentElementType.Table; + case "audio": return ContentElementType.Audio; + case "audioplayer": return ContentElementType.Audioplayer; + case "form": return ContentElementType.Form; + case "gallery": return ContentElementType.Gallery; + case "image": return ContentElementType.Image; + case "video": return ContentElementType.Video; + case "videoplayer": return ContentElementType.Videoplayer; + case "quote": return ContentElementType.Quote; + case "text": return ContentElementType.Text; + case "column": return ContentElementType.Column; + case "row": return ContentElementType.Row; } @@ -131,7 +152,7 @@ namespace DOM.DSL.Model var list = new List(); foreach (var section in _document.Content.Sections) { - TraversElement(section, type, e=>list.Add(e)); + TraversElement(section, type, e => list.Add(e)); } return list; } @@ -141,4 +162,4 @@ namespace DOM.DSL.Model return "Content"; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Model/TEnvironment.cs b/ZeroLevel/Services/DOM/DSL/Model/TEnvironment.cs index 88307d3..1b41ca1 100644 --- a/ZeroLevel/Services/DOM/DSL/Model/TEnvironment.cs +++ b/ZeroLevel/Services/DOM/DSL/Model/TEnvironment.cs @@ -24,4 +24,4 @@ namespace DOM.DSL.Model CustomVariables.Add(name.ToLowerInvariant().Trim(), value); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Model/TFlowRules.cs b/ZeroLevel/Services/DOM/DSL/Model/TFlowRules.cs index ba33fdd..30d81c4 100644 --- a/ZeroLevel/Services/DOM/DSL/Model/TFlowRules.cs +++ b/ZeroLevel/Services/DOM/DSL/Model/TFlowRules.cs @@ -7,6 +7,7 @@ namespace DOM.DSL.Model internal sealed class TFlowRules { #region Rules + public TBlockToken ListPrefix; public TBlockToken ListPostfix; public TBlockToken ListItemPrefix; @@ -55,12 +56,15 @@ namespace DOM.DSL.Model public TBlockToken VideoplayerPostfix; public TBlockToken GalleryPrefix; public TBlockToken GalleryPostfix; - #endregion + + #endregion Rules #region Special table builder + public bool UseSpecialTableBuilder = false; public ISpecialTableBuilder SpecialTableBuilder; - #endregion + + #endregion Special table builder public void Bootstrap() { @@ -124,297 +128,361 @@ namespace DOM.DSL.Model case "prefix": ListPrefix = rule_token; break; + case "postfix": ListPostfix = rule_token; break; + case "ignore": ListPostfix = ListPrefix = null; break; } break; + case "listitem": switch (functionName) { case "prefix": ListItemPrefix = rule_token; break; + case "postfix": ListItemPostfix = rule_token; break; + case "ignore": ListItemPrefix = ListItemPostfix = null; break; } break; + case "text": switch (functionName) { case "prefix": TextPrefix = rule_token; break; + case "template": TextTemplate = rule_token; break; + case "postfix": TextPostfix = rule_token; break; + case "ignore": TextPrefix = TextTemplate = TextPostfix = null; break; } break; + case "link": switch (functionName) { case "prefix": LinkPrefix = rule_token; break; + case "template": LinkTemplate = rule_token; break; + case "postfix": LinkPostfix = rule_token; break; + case "ignore": LinkPrefix = LinkTemplate = LinkPostfix = null; break; } break; + case "image": switch (functionName) { case "prefix": ImagePrefix = rule_token; break; + case "template": ImageTemplate = rule_token; break; + case "postfix": ImagePostfix = rule_token; break; + case "ignore": ImagePrefix = ImageTemplate = ImagePostfix = null; break; } break; + case "quote": switch (functionName) { case "prefix": QuotePrefix = rule_token; break; + case "template": QuoteTemplate = rule_token; break; + case "postfix": QuotePostfix = rule_token; break; + case "ignore": QuotePrefix = QuoteTemplate = QuotePostfix = null; break; } break; + case "form": switch (functionName) { case "prefix": FormPrefix = rule_token; break; + case "template": FormTemplate = rule_token; break; + case "postfix": FormPostfix = rule_token; break; + case "ignore": FormPrefix = FormTemplate = FormPostfix = null; break; } break; + case "video": switch (functionName) { case "prefix": VideoPrefix = rule_token; break; + case "template": VideoTemplate = rule_token; break; + case "postfix": VideoPostfix = rule_token; break; + case "ignore": VideoPrefix = VideoTemplate = VideoPostfix = null; break; } break; + case "audio": switch (functionName) { case "prefix": AudioPrefix = rule_token; break; + case "template": AudioTemplate = rule_token; break; + case "postfix": AudioPostfix = rule_token; break; + case "ignore": AudioPrefix = AudioTemplate = AudioPostfix = null; break; } break; + case "section": switch (functionName) { case "prefix": SectionPrefix = rule_token; break; + case "postfix": SectionPostfix = rule_token; break; + case "ignore": SectionPrefix = SectionPostfix = null; break; } break; + case "paragraph": switch (functionName) { case "prefix": ParagraphPrefix = rule_token; break; + case "postfix": ParagraphPostfix = rule_token; break; + case "ignore": ParagraphPrefix = ParagraphPostfix = null; break; } break; + case "table": switch (functionName) { case "prefix": TablePrefix = rule_token; break; + case "postfix": TablePostfix = rule_token; break; + case "ignore": TablePrefix = TablePostfix = null; break; + case "special": // Using a hardcoded table conversion //TablePrefix = TablePostfix = null; ColumnsPrefix = ColumnsPostfix = null; ColumnPrefix = ColumnTemplate = ColumnPostfix = null; RowPrefix = RowPostfix = null; CellPrefix = CellPostfix = null; - // Args: (style, paddings l-t-r-b, maxcellwidth, maxtablewidth) + // Args: (style, paddings l-t-r-b, maxcellwidth, maxtablewidth) UseSpecialTableBuilder = true; SpecialTableBuilder = SpecialTableBuilderFactory.CreateSpecialTableBuilder(special); if (SpecialTableBuilder == null) UseSpecialTableBuilder = false; break; } break; + case "columns": switch (functionName) { case "prefix": ColumnsPrefix = rule_token; break; + case "postfix": ColumnsPostfix = rule_token; break; + case "ignore": ColumnsPrefix = ColumnsPostfix = null; break; } break; + case "column": switch (functionName) { case "prefix": ColumnPrefix = rule_token; break; + case "template": ColumnTemplate = rule_token; break; + case "postfix": ColumnPostfix = rule_token; break; + case "ignore": ColumnPrefix = ColumnTemplate = ColumnPostfix = null; break; - } break; + case "tablerow": switch (functionName) { case "prefix": RowPrefix = rule_token; break; + case "postfix": RowPostfix = rule_token; break; + case "ignore": RowPrefix = RowPostfix = null; break; } break; + case "tablecell": switch (functionName) { case "prefix": CellPrefix = rule_token; break; + case "postfix": CellPostfix = rule_token; break; + case "ignore": CellPrefix = CellPostfix = null; break; } break; + case "videoplayer": switch (functionName) { case "prefix": VideoplayerPrefix = rule_token; break; + case "postfix": VideoplayerPostfix = rule_token; break; + case "ignore": VideoplayerPrefix = VideoplayerPostfix = null; break; } break; + case "audioplayer": switch (functionName) { case "prefix": AudioplayerPrefix = rule_token; break; + case "postfix": AudioplayerPostfix = rule_token; break; + case "ignore": AudioplayerPrefix = AudioplayerPostfix = null; break; } break; + case "gallery": switch (functionName) { case "prefix": GalleryPrefix = rule_token; break; + case "postfix": GalleryPostfix = rule_token; break; + case "ignore": GalleryPrefix = GalleryPostfix = null; break; @@ -423,4 +491,4 @@ namespace DOM.DSL.Model } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Model/TRenderOptions.cs b/ZeroLevel/Services/DOM/DSL/Model/TRenderOptions.cs index 1fa29ed..83ad572 100644 --- a/ZeroLevel/Services/DOM/DSL/Model/TRenderOptions.cs +++ b/ZeroLevel/Services/DOM/DSL/Model/TRenderOptions.cs @@ -38,7 +38,7 @@ namespace DOM.DSL.Model .Select(i => word.Substring(i * max, max)). ToArray(); int k = 0; - if(current_max > 0) text.Append("\r\n"); + if (current_max > 0) text.Append("\r\n"); for (; k < lines.Length - 1; k++) { text.Append(lines[k]); @@ -70,7 +70,7 @@ namespace DOM.DSL.Model { if (reader.Next == '\r' && reader.FindOffsetTo('\n') == 2) - { + { text.Append("\r\n"); reader.Move(2); } @@ -86,4 +86,4 @@ namespace DOM.DSL.Model return text.ToString(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Services/PlainTextTableBuilder.cs b/ZeroLevel/Services/DOM/DSL/Services/PlainTextTableBuilder.cs index a9e839c..09a4bfe 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/PlainTextTableBuilder.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/PlainTextTableBuilder.cs @@ -31,6 +31,7 @@ namespace DOM.DSL.Services public int RowCellIndex = -1; private StringBuilder _cellBody = new StringBuilder(); + public void FlushCell() { if (RowCellIndex >= 0) @@ -51,6 +52,7 @@ namespace DOM.DSL.Services return TextTableRender.Render(Data, options); } } + private readonly TextTableRenderOptions _options; private Stack _textTables = new Stack(); @@ -107,4 +109,4 @@ namespace DOM.DSL.Services _textTables.Peek().WriteCell(part); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Services/SpecialTableBuilderFactory.cs b/ZeroLevel/Services/DOM/DSL/Services/SpecialTableBuilderFactory.cs index e61b44a..161ce40 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/SpecialTableBuilderFactory.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/SpecialTableBuilderFactory.cs @@ -61,4 +61,4 @@ namespace DOM.DSL.Services return result; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Services/TContainer.cs b/ZeroLevel/Services/DOM/DSL/Services/TContainer.cs index f5e6feb..ae6adf5 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/TContainer.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/TContainer.cs @@ -20,6 +20,7 @@ namespace DOM.DSL.Services internal class TContainer { #region Private classes + private class TDList { private IList _list; @@ -79,7 +80,8 @@ namespace DOM.DSL.Services return _list; } } - #endregion + + #endregion Private classes private readonly TContainerFactory _factory; private readonly TRender _render; @@ -216,16 +218,19 @@ namespace DOM.DSL.Services args = args_getter(this); ApplyStringFunction(functionName, args); break; + case FunctionType.Condition: args = args_getter(this); ApplyConditionFunction(functionName, args); break; + case FunctionType.Extract: unchecked { ApplyExtractionFunction(functionName, args_getter, out args); } break; + case FunctionType.Unknown: break; } @@ -243,6 +248,7 @@ namespace DOM.DSL.Services } #region As + public T As() { if (_current == null) return default(T); @@ -275,15 +281,17 @@ namespace DOM.DSL.Services { return Convert.ChangeType(_current, type); } - catch(Exception ex) + catch (Exception ex) { Log.SystemWarning($"[DOM.TContainer] Fault cast current value from type '{_current?.GetType()?.FullName ?? string.Empty}' to type '{type.FullName}'. {ex.ToString()}"); return TypeHelpers.CreateDefaultState(type); } } - #endregion + + #endregion As #region Detect function type + private enum FunctionType { Extract, @@ -291,6 +299,7 @@ namespace DOM.DSL.Services Condition, Unknown } + private static FunctionType GetFunctionType(string function) { switch (function) @@ -319,6 +328,7 @@ namespace DOM.DSL.Services case "tofilename": case "topath": return FunctionType.String; + case "contains": case "nocontains": case "any": @@ -347,11 +357,13 @@ namespace DOM.DSL.Services } return FunctionType.Extract; } - #endregion + + #endregion Detect function type #region Properties #region Flow + private void SelectProperty(TextStyle style, string property, string propertyIndex) { switch (property.Trim().ToLowerInvariant()) @@ -360,13 +372,16 @@ namespace DOM.DSL.Services case "formatting": Reset(style.Formatting); break; + case "size": Reset(style.Size); break; + case "color": case "foreground": Reset(style.HexColor); break; + case "background": Reset(style.HexMarkerColor); break; @@ -382,9 +397,11 @@ namespace DOM.DSL.Services case "caption": Reset(column.Caption); break; + case "type": Reset(column.Type); break; + default: Reset(column.Caption); break; @@ -400,13 +417,16 @@ namespace DOM.DSL.Services case "identifier": Reset(audio.Identifier); break; + case "title": case "name": Reset(audio.Title); break; + case "type": Reset(audio.Type); break; + case "source": Reset(audio.Source); break; @@ -422,16 +442,20 @@ namespace DOM.DSL.Services case "lead": Reset(table.Abstract); break; + case "columns": Reset(table.Columns); break; + case "name": case "title": Reset(table.Name); break; + case "rows": Reset(table.Rows); break; + case "type": Reset(table.Type); break; @@ -447,13 +471,16 @@ namespace DOM.DSL.Services case "identifier": Reset(form.Identifier); break; + case "title": case "name": Reset(form.Title); break; + case "type": Reset(form.Type); break; + case "source": Reset(form.Source); break; @@ -469,13 +496,16 @@ namespace DOM.DSL.Services case "identifier": Reset(video.Identifier); break; + case "title": case "name": Reset(video.Title); break; + case "type": Reset(video.Type); break; + case "source": Reset(video.Source); break; @@ -491,13 +521,16 @@ namespace DOM.DSL.Services case "identifier": Reset(image.Identifier); break; + case "title": case "name": Reset(image.Title); break; + case "type": Reset(image.Type); break; + case "source": Reset(image.Source); break; @@ -511,10 +544,12 @@ namespace DOM.DSL.Services case "style": Reset(quote.Style); break; + case "value": case "text": Reset(quote.Value); break; + case "type": Reset(quote.Type); break; @@ -528,10 +563,12 @@ namespace DOM.DSL.Services case "style": Reset(text.Style); break; + case "value": case "text": Reset(text.Value); break; + case "type": Reset(text.Type); break; @@ -547,10 +584,12 @@ namespace DOM.DSL.Services case "url": Reset(link.Href); break; + case "value": case "text": Reset(link.Value); break; + case "type": Reset(link.Type); break; @@ -565,6 +604,7 @@ namespace DOM.DSL.Services case "items": Reset(paragraph.Parts); break; + case "type": Reset(paragraph.Type); break; @@ -579,6 +619,7 @@ namespace DOM.DSL.Services case "items": Reset(section.Parts); break; + case "type": Reset(section.Type); break; @@ -593,6 +634,7 @@ namespace DOM.DSL.Services case "items": Reset(row.Cells); break; + case "type": Reset(row.Type); break; @@ -606,6 +648,7 @@ namespace DOM.DSL.Services case "items": Reset(list.Items); break; + case "type": Reset(list.Type); break; @@ -620,10 +663,12 @@ namespace DOM.DSL.Services case "title": Reset(audioplayer.Title); break; + case "items": case "tracks": Reset(audioplayer.Tracks); break; + case "type": Reset(audioplayer.Type); break; @@ -638,10 +683,12 @@ namespace DOM.DSL.Services case "title": Reset(gallery.Title); break; + case "items": case "images": Reset(gallery.Images); break; + case "type": Reset(gallery.Type); break; @@ -656,16 +703,19 @@ namespace DOM.DSL.Services case "title": Reset(videoplayer.Title); break; + case "items": case "playlist": Reset(videoplayer.Playlist); break; + case "type": Reset(videoplayer.Type); break; } } - #endregion + + #endregion Flow private void SelectProperty(TimeSpan time, string property, string propertyIndex) { @@ -681,6 +731,7 @@ namespace DOM.DSL.Services Reset(time.TotalDays.ToString(propertyIndex)); } break; + case "hours": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -691,6 +742,7 @@ namespace DOM.DSL.Services Reset(time.TotalHours.ToString(propertyIndex)); } break; + case "minutes": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -701,6 +753,7 @@ namespace DOM.DSL.Services Reset(time.TotalMinutes.ToString(propertyIndex)); } break; + case "seconds": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -711,6 +764,7 @@ namespace DOM.DSL.Services Reset(time.TotalSeconds.ToString(propertyIndex)); } break; + case "milliseconds": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -721,6 +775,7 @@ namespace DOM.DSL.Services Reset(time.TotalMilliseconds.ToString(propertyIndex)); } break; + case "ticks": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -772,16 +827,19 @@ namespace DOM.DSL.Services case "username": Reset(Environment.UserName); break; + case "domain": case "domainname": Reset(Environment.UserDomainName); break; + case "host": case "hostname": case "machine": case "machinename": Reset(Environment.MachineName); break; + case "tick": case "tickcount": Reset(Environment.TickCount); @@ -790,17 +848,21 @@ namespace DOM.DSL.Services case "subs": Reset(env.SubscriptionName); break; + case "subsid": case "subscriptionid": Reset(env.SubscriptionId); break; + case "file": case "filename": Reset(env.FileName); break; + case "delay": Reset(env.Delay); break; + case "contract": Reset(env.ContractName); break; @@ -808,9 +870,11 @@ namespace DOM.DSL.Services case "encoding": Reset(env.Encoding.HeaderName); break; + case "encodingfullname": Reset(env.Encoding.EncodingName); break; + case "encodingpage": case "encodingcode": case "encodingcodepage": @@ -826,10 +890,12 @@ namespace DOM.DSL.Services case "version": Reset(identifier.Version); break; + case "time": case "timestamp": Reset(identifier.Timestamp); break; + case "date": case "datelabel": Reset(identifier.DateLabel); @@ -845,12 +911,15 @@ namespace DOM.DSL.Services case "places": enumerable = tags.Places; break; + case "companies": enumerable = tags.Companies; break; + case "persons": enumerable = tags.Persons; break; + case "keywords": enumerable = tags.Keywords; break; @@ -880,31 +949,39 @@ namespace DOM.DSL.Services case "author": Reset(descriptive.Byline); break; + case "copyright": Reset(descriptive.CopyrightNotice); break; + case "created": case "date": case "time": case "datetime": Reset(descriptive.Created); break; + case "lang": case "language": Reset(descriptive.Language); break; + case "original": Reset(descriptive.Original); break; + case "priority": Reset(descriptive.Priority); break; + case "publisher": Reset(descriptive.Publisher); break; + case "source": Reset(descriptive.Source); break; + case "headers": { int index; @@ -948,6 +1025,7 @@ namespace DOM.DSL.Services Reset(dt.Day.ToString(propertyIndex)); } break; + case "year": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -958,6 +1036,7 @@ namespace DOM.DSL.Services Reset(dt.Year.ToString(propertyIndex)); } break; + case "month": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -968,6 +1047,7 @@ namespace DOM.DSL.Services Reset(dt.Month.ToString(propertyIndex)); } break; + case "date": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -978,6 +1058,7 @@ namespace DOM.DSL.Services Reset(dt.Date.ToString(propertyIndex)); } break; + case "hour": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -988,6 +1069,7 @@ namespace DOM.DSL.Services Reset(dt.Hour.ToString(propertyIndex)); } break; + case "minute": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -998,6 +1080,7 @@ namespace DOM.DSL.Services Reset(dt.Minute.ToString(propertyIndex)); } break; + case "second": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -1008,6 +1091,7 @@ namespace DOM.DSL.Services Reset(dt.Second.ToString(propertyIndex)); } break; + case "millisecond": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -1018,6 +1102,7 @@ namespace DOM.DSL.Services Reset(dt.Millisecond.ToString(propertyIndex)); } break; + case "ticks": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -1028,6 +1113,7 @@ namespace DOM.DSL.Services Reset(dt.Ticks.ToString(propertyIndex)); } break; + case "time": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -1038,6 +1124,7 @@ namespace DOM.DSL.Services Reset(dt.TimeOfDay.ToString(propertyIndex)); } break; + case "dayofweek": if (string.IsNullOrWhiteSpace(propertyIndex) == false) { @@ -1052,6 +1139,7 @@ namespace DOM.DSL.Services Reset(dt.DayOfWeek.ToString()); } break; + case "dayofyear": if (string.IsNullOrWhiteSpace(propertyIndex)) { @@ -1072,12 +1160,15 @@ namespace DOM.DSL.Services case "title": Reset(agency.Title); break; + case "url": Reset(agency.Url); break; + case "description": Reset(agency.Description); break; + default: Reset(agency.Title); break; @@ -1091,18 +1182,23 @@ namespace DOM.DSL.Services case "title": Reset(category.Title); break; + case "code": Reset(category.Code); break; + case "description": Reset(category.Description); break; + case "direction": Reset(category.DirectionCode); break; + case "system": Reset(category.IsSystem); break; + default: Reset(category.Title); break; @@ -1116,15 +1212,19 @@ namespace DOM.DSL.Services case "name": Reset(header.Name); break; + case "value": Reset(header.Value); break; + case "type": Reset(header.Type); break; + case "tag": Reset(header.Tag); break; + default: Reset(header.Value); break; @@ -1138,9 +1238,11 @@ namespace DOM.DSL.Services case "name": Reset(tag.Name); break; + case "value": Reset(tag.Value); break; + default: Reset(tag.Value); break; @@ -1154,15 +1256,19 @@ namespace DOM.DSL.Services case "caption": Reset(aside.Caption); break; + case "contenttype": Reset(aside.ContentType); break; + case "identity": Reset(aside.Identity); break; + case "summary": Reset(aside.Summary); break; + default: Reset(aside.Caption); break; @@ -1176,15 +1282,19 @@ namespace DOM.DSL.Services case "title": Reset(assotiation.Title); break; + case "documentid": Reset(assotiation.DocumentId); break; + case "relation": Reset(assotiation.Relation); break; + case "description": Reset(assotiation.Description); break; + default: Reset(assotiation.Title); break; @@ -1234,9 +1344,11 @@ namespace DOM.DSL.Services Type keyType = typing[0]; Reset(dictionary[ConvertTo(property, keyType)]); } - #endregion + + #endregion Properties #region Functions + private static string HtmlEncode(string text) { return HtmlUtility.EncodeHtmlEntities(text); @@ -1319,6 +1431,7 @@ namespace DOM.DSL.Services Reset(text); } break; + case "format": if (_current is DateTime) { @@ -1327,6 +1440,7 @@ namespace DOM.DSL.Services Reset(FormattedDateTime((DateTime)_current, format, culture)); } break; + case "tolower": Reset(this.ToString().ToLowerInvariant()); break; case "toupper": Reset(this.ToString().ToUpperInvariant()); break; case "xmlescape": Reset(XmlEscape(this.ToString())); break; @@ -1346,12 +1460,14 @@ namespace DOM.DSL.Services Reset(string.Concat(this.ToString(), string.Join(string.Empty, args.Select(a => a.ToString())))); } break; + case "joinleft": if (args.Length > 0) { Reset(string.Concat(string.Join(string.Empty, args.Select(a => a.ToString())), this.ToString())); } break; + case "insert": { int position; @@ -1385,6 +1501,7 @@ namespace DOM.DSL.Services } } break; + case "replace": { if (args.Length == 2) @@ -1393,6 +1510,7 @@ namespace DOM.DSL.Services } } break; + case "remove": { int start; @@ -1420,6 +1538,7 @@ namespace DOM.DSL.Services } } break; + case "index": if (args.Length == 1) { @@ -1434,6 +1553,7 @@ namespace DOM.DSL.Services Reset(-1); } break; + case "lastindex": if (args.Length == 1) { @@ -1448,6 +1568,7 @@ namespace DOM.DSL.Services Reset(-1); } break; + case "map_mc": if (args != null && args.Any()) { @@ -1455,6 +1576,7 @@ namespace DOM.DSL.Services Reset(MakeMapFunc(_args, false)(this.ToString())); } break; + case "map": if (args != null && args.Any()) { @@ -1462,6 +1584,7 @@ namespace DOM.DSL.Services Reset(MakeMapFunc(_args, true)(this.ToString())); } break; + case "padleft": { if (args.Length > 0) @@ -1487,6 +1610,7 @@ namespace DOM.DSL.Services } } break; + case "padright": { if (args.Length > 0) @@ -1512,6 +1636,7 @@ namespace DOM.DSL.Services } } break; + case "substr": { if (args.Length == 1) @@ -1565,18 +1690,21 @@ namespace DOM.DSL.Services Reset(Is(args[0], true)); } break; + case "is_mc": if (args?.Length > 0) { Reset(Is(args[0], false)); } break; + case "isnt": if (args?.Length > 0) { Reset(IsNot(args[0], true)); } break; + case "isnt_mc": if (args?.Length > 0) { @@ -1590,42 +1718,49 @@ namespace DOM.DSL.Services Reset(LessThan(args[0], true)); } break; + case "gt": if (args?.Length > 0) { Reset(MoreThan(args[0], true)); } break; + case "lte": if (args?.Length > 0) { Reset(LessOrEq(args[0], true)); } break; + case "gte": if (args?.Length > 0) { Reset(MoreOrEq(args[0], true)); } break; + case "lt_mc": if (args?.Length > 0) { Reset(LessThan(args[0], false)); } break; + case "gt_mc": if (args?.Length > 0) { Reset(MoreThan(args[0], false)); } break; + case "lte_mc": if (args?.Length > 0) { Reset(LessOrEq(args[0], false)); } break; + case "gte_mc": if (args?.Length > 0) { @@ -1771,6 +1906,7 @@ namespace DOM.DSL.Services } } break; + case "get": { if (args != null && args.Any()) @@ -1817,6 +1953,7 @@ namespace DOM.DSL.Services } } break; + case "select": { if (args?.Length > 0) @@ -1846,6 +1983,7 @@ namespace DOM.DSL.Services } } break; + case "apply": { if (args?.Length > 0) @@ -1865,6 +2003,7 @@ namespace DOM.DSL.Services case FunctionType.String: container.ApplyStringFunction(functionName, functionArgs.ToArray()); break; + case FunctionType.Condition: container.ApplyConditionFunction(functionName, functionArgs.ToArray()); break; @@ -1882,6 +2021,7 @@ namespace DOM.DSL.Services case FunctionType.String: container.ApplyStringFunction(functionName, functionArgs.ToArray()); break; + case FunctionType.Condition: container.ApplyConditionFunction(functionName, functionArgs.ToArray()); break; @@ -1892,6 +2032,7 @@ namespace DOM.DSL.Services } } break; + case "distinct": { if (_current is IEnumerable) @@ -1909,6 +2050,7 @@ namespace DOM.DSL.Services } } break; + case "utc": if (_current != null && (_current is DateTime)) { @@ -1932,6 +2074,7 @@ namespace DOM.DSL.Services } } break; + case "append": if (_current is List) { @@ -1945,9 +2088,11 @@ namespace DOM.DSL.Services } } } - #endregion + + #endregion Functions #region Math + private void Multiply(TContainer value) { if (_current is byte) Reset(((byte)_current) * value.As()); @@ -1961,6 +2106,7 @@ namespace DOM.DSL.Services else if (_current is double) Reset(((double)_current) * value.As()); else if (_current is decimal) Reset(((decimal)_current) * value.As()); } + private void Divide(TContainer value) { if (_current is byte) Reset(((byte)_current) / value.As()); @@ -1974,6 +2120,7 @@ namespace DOM.DSL.Services else if (_current is double) Reset(((double)_current) / value.As()); else if (_current is decimal) Reset(((decimal)_current) / value.As()); } + private void Increment(TContainer value) { if (_current is byte) Reset(((byte)_current) + value.As()); @@ -1989,6 +2136,7 @@ namespace DOM.DSL.Services else if (_current is decimal) Reset(((decimal)_current) + value.As()); else if (_current is DateTime) Reset(new DateTime(((DateTime)_current).Ticks + value.As())); } + private void Decrement(TContainer value) { if (_current is byte) Reset(((byte)_current) - value.As()); @@ -2003,6 +2151,7 @@ namespace DOM.DSL.Services else if (_current is decimal) Reset(((decimal)_current) - value.As()); else if (_current is DateTime) Reset(new DateTime(((DateTime)_current).Ticks - value.As())); } + private void Mod(TContainer value) { if (_current is byte) Reset(((byte)_current) % value.As()); @@ -2016,6 +2165,7 @@ namespace DOM.DSL.Services else if (_current is double) Reset(((double)_current) % value.As()); else if (_current is decimal) Reset(((decimal)_current) % value.As()); } + private void Max() { if (IsEnumerable) @@ -2071,6 +2221,7 @@ namespace DOM.DSL.Services } } } + private void Min() { if (IsEnumerable) @@ -2294,6 +2445,7 @@ namespace DOM.DSL.Services Months, Years } + private void ChangeDateTime(TContainer value, ChangeDateTimeType type) { if (_current == null) return; @@ -2305,12 +2457,15 @@ namespace DOM.DSL.Services case ChangeDateTimeType.Days: Reset(dt.AddDays(value.As())); break; + case ChangeDateTimeType.Hours: Reset(dt.AddHours(value.As())); break; + case ChangeDateTimeType.Minutes: Reset(dt.AddMinutes(value.As())); break; + case ChangeDateTimeType.Seconds: Reset(dt.AddSeconds(value.As())); break; @@ -2318,18 +2473,22 @@ namespace DOM.DSL.Services case ChangeDateTimeType.Milliseconds: Reset(dt.AddMilliseconds(value.As())); break; + case ChangeDateTimeType.Months: Reset(dt.AddMonths(value.As())); break; + case ChangeDateTimeType.Years: Reset(dt.AddYears(value.As())); break; } } } - #endregion + + #endregion Math #region Conditions + public bool Any(TContainer[] set = null, bool ignoreCase = true) { if (_current == null) return false; @@ -2485,6 +2644,7 @@ namespace DOM.DSL.Services case true: if (t) return 0; return 1; + case false: if (!t) return 0; return -1; @@ -2541,13 +2701,16 @@ namespace DOM.DSL.Services { return (T)StringToTypeConverter.TryConvert(line, typeof(T)); } + private static object ConvertTo(string line, Type type) { return StringToTypeConverter.TryConvert(line, type); } - #endregion + + #endregion Conditions #region Helpers + private static string XmlEscape(string unescaped) { return SecurityElement.Escape(unescaped); @@ -2557,7 +2720,9 @@ namespace DOM.DSL.Services { return JsonEscaper.EscapeString(s); } + private const string DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static string FormattedDateTime(DateTime dt, string format = null, string culture = null) { CultureInfo ci; @@ -2586,7 +2751,8 @@ namespace DOM.DSL.Services } return dt.ToString(DEFAULT_DATETIME_FORMAT, ci); } - #endregion + + #endregion Helpers public override string ToString() { diff --git a/ZeroLevel/Services/DOM/DSL/Services/TContainerFactory.cs b/ZeroLevel/Services/DOM/DSL/Services/TContainerFactory.cs index 20a4a2c..49414be 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/TContainerFactory.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/TContainerFactory.cs @@ -5,7 +5,7 @@ namespace DOM.DSL.Services { public class TContainerFactory { - private readonly ObjectPool _pool; + private readonly ObjectPool _pool; private static int _get_count = 0; private static int _release_count = 0; @@ -22,6 +22,7 @@ namespace DOM.DSL.Services c.Reset(value); return c; } + internal TContainer Get(object value, int index) { Interlocked.Increment(ref _get_count); @@ -30,6 +31,7 @@ namespace DOM.DSL.Services c.Index = index; return c; } + internal void Release(TContainer container) { if (container != null) @@ -40,6 +42,7 @@ namespace DOM.DSL.Services } public static int GetsCount() => _get_count; + public static int ReleasesCount() => _release_count; } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Services/TContentToStringConverter.cs b/ZeroLevel/Services/DOM/DSL/Services/TContentToStringConverter.cs index 1317cf1..7ea6f3d 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/TContentToStringConverter.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/TContentToStringConverter.cs @@ -54,6 +54,7 @@ namespace DOM.DSL.Services } #region Primitives + public void ReadAudio(Audio audio, int order) { _render.Counter.IncAudioId(); @@ -189,9 +190,11 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.VideoPostfix, video, order)); } } - #endregion + + #endregion Primitives #region Containers + public void EnterParagraph(Paragraph paragraph) { _render.Counter.IncParagraphId(); @@ -200,6 +203,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.ParagraphPrefix, paragraph, _render.Counter.ParagraphId)); } } + public void LeaveParagraph(Paragraph paragraph) { if (_transformRules.ParagraphPostfix != null) @@ -207,6 +211,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.ParagraphPostfix, paragraph, _render.Counter.ParagraphId)); } } + public void EnterSection(Section section) { _render.Counter.IncSectionId(); @@ -215,6 +220,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.SectionPrefix, section, _render.Counter.SectionId)); } } + public void LeaveSection(Section section) { if (_transformRules.SectionPostfix != null) @@ -222,9 +228,11 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.SectionPostfix, section, _render.Counter.SectionId)); } } - #endregion + + #endregion Containers #region Table + public void EnterTable(Table table) { _render.Counter.IncTableId(); @@ -238,6 +246,7 @@ namespace DOM.DSL.Services _specialTableBuilder.EnterTable(table.Columns.ToArray()); } } + public void EnterColumns(Table table) { if (_useSpecialTableBuilder == false && _transformRules.ColumnsPrefix != null) @@ -245,6 +254,7 @@ namespace DOM.DSL.Services _builder.Append(Resolve(_transformRules.ColumnsPrefix, table.Columns, 0)); } } + public void EnterRow(Table table, Row row, int order) { _render.Counter.IncRowId(); @@ -257,6 +267,7 @@ namespace DOM.DSL.Services _builder.Append(Resolve(_transformRules.RowPrefix, row, order)); } } + public void EnterRowCell(Table table, Row row, IContentElement cell, int order) { _render.Counter.IncCellId(); @@ -276,6 +287,7 @@ namespace DOM.DSL.Services } } } + public void LeaveColumns(Table table) { if (_useSpecialTableBuilder == false && _transformRules.ColumnsPostfix != null) @@ -283,6 +295,7 @@ namespace DOM.DSL.Services _builder.Append(Resolve(_transformRules.ColumnsPostfix, table.Columns, 0)); } } + public void LeaveRow(Table table, Row row, int order) { if (_useSpecialTableBuilder) @@ -294,6 +307,7 @@ namespace DOM.DSL.Services _builder.Append(Resolve(_transformRules.RowPostfix, row, order)); } } + public void LeaveRowCell(Table table, Row row, IContentElement cell, int order) { if (_useSpecialTableBuilder) @@ -312,6 +326,7 @@ namespace DOM.DSL.Services } } } + public void LeaveTable(Table table) { if (_useSpecialTableBuilder) @@ -323,9 +338,11 @@ namespace DOM.DSL.Services _builder.Append(Resolve(_transformRules.TablePostfix, table, _render.Counter.TableId)); } } - #endregion + + #endregion Table #region List + public void EnterList(List list) { _render.Counter.IncListId(); @@ -334,6 +351,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.ListPrefix, list, 0)); } } + public void EnterListItem(List list, IContentElement item, int order) { _render.Counter.IncListItemId(); @@ -342,6 +360,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.ListItemPrefix, item, order)); } } + public void LeaveList(List list) { if (_transformRules.ListPostfix != null) @@ -349,6 +368,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.ListPostfix, list, 0)); } } + public void LeaveListItem(List list, IContentElement item, int order) { if (_transformRules.ListItemPostfix != null) @@ -356,9 +376,11 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.ListItemPostfix, item, order)); } } - #endregion + + #endregion List #region Media + public void EnterAudioplayer(Audioplayer player) { _render.Counter.IncAudioplayerId(); @@ -367,6 +389,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.AudioplayerPrefix, player, 0)); } } + public void EnterGallery(Gallery gallery) { _render.Counter.IncGalleryId(); @@ -375,6 +398,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.GalleryPrefix, gallery, 0)); } } + public void EnterVideoplayer(Videoplayer player) { _render.Counter.IncVideoplayerId(); @@ -383,6 +407,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.VideoplayerPrefix, player, 0)); } } + public void LeaveAudioplayer(Audioplayer player) { if (_transformRules.AudioplayerPostfix != null) @@ -390,6 +415,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.AudioplayerPostfix, player, 0)); } } + public void LeaveGallery(Gallery gallery) { if (_transformRules.GalleryPostfix != null) @@ -397,6 +423,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.GalleryPostfix, gallery, 0)); } } + public void LeaveVideoplayer(Videoplayer player) { if (_transformRules.VideoplayerPostfix != null) @@ -404,6 +431,7 @@ namespace DOM.DSL.Services WriteText(Resolve(_transformRules.VideoplayerPostfix, player, 0)); } } - #endregion + + #endregion Media } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Services/TRender.cs b/ZeroLevel/Services/DOM/DSL/Services/TRender.cs index 642da42..ca34f2c 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/TRender.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/TRender.cs @@ -238,6 +238,7 @@ namespace DOM.DSL.Services } } break; + case "flow": { return new List @@ -356,6 +357,7 @@ namespace DOM.DSL.Services Log.Debug(args[0].ToString(), args.Skip(1).ToArray()); } break; + case "validate": if (args?.Length == 1) { @@ -364,15 +366,18 @@ namespace DOM.DSL.Services case "xml": Options.ValidateAsXml = true; break; + case "html": Options.ValidateAsHtml = true; break; + case "json": Options.ValidateAsJson = true; break; } } break; + case "fixwidth": { if (args?.Length == 1) @@ -400,4 +405,4 @@ namespace DOM.DSL.Services } } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Services/TStringReader.cs b/ZeroLevel/Services/DOM/DSL/Services/TStringReader.cs index e1ea38f..93351a6 100644 --- a/ZeroLevel/Services/DOM/DSL/Services/TStringReader.cs +++ b/ZeroLevel/Services/DOM/DSL/Services/TStringReader.cs @@ -101,4 +101,4 @@ return identity; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/TEngine.cs b/ZeroLevel/Services/DOM/DSL/TEngine.cs index 1b3c249..4a304ed 100644 --- a/ZeroLevel/Services/DOM/DSL/TEngine.cs +++ b/ZeroLevel/Services/DOM/DSL/TEngine.cs @@ -78,4 +78,4 @@ namespace DOM.DSL return text.ToString(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TBlockToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TBlockToken.cs index 539bd6c..29350c7 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TBlockToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TBlockToken.cs @@ -36,4 +36,4 @@ namespace DOM.DSL.Tokens return Clone(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TElementToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TElementToken.cs index d538a67..cceabab 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TElementToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TElementToken.cs @@ -10,6 +10,7 @@ /// Имя элемента ///
public string ElementName; + /// /// Optionally, next token /// @@ -33,4 +34,4 @@ }; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TFunctionToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TFunctionToken.cs index c968f0b..bee991c 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TFunctionToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TFunctionToken.cs @@ -30,4 +30,4 @@ namespace DOM.DSL.Tokens }; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TPropertyToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TPropertyToken.cs index ef84922..6913661 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TPropertyToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TPropertyToken.cs @@ -27,4 +27,4 @@ }; } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TSystemToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TSystemToken.cs index a28d2ac..b45b377 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TSystemToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TSystemToken.cs @@ -20,4 +20,4 @@ return Clone(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TTextToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TTextToken.cs index 889bfa9..86ab596 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TTextToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TTextToken.cs @@ -21,4 +21,4 @@ return Clone(); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/DSL/Tokens/TToken.cs b/ZeroLevel/Services/DOM/DSL/Tokens/TToken.cs index b9bf4ef..37ec4ea 100644 --- a/ZeroLevel/Services/DOM/DSL/Tokens/TToken.cs +++ b/ZeroLevel/Services/DOM/DSL/Tokens/TToken.cs @@ -8,16 +8,23 @@ namespace DOM.DSL.Tokens public abstract class TToken : TCloneable { public abstract TToken Clone(); + /// /// Copying token with set NextToken to null, to break cycle /// /// - public abstract TToken CloneLocal(); + public abstract TToken CloneLocal(); + public TElementToken AsElementToken() => this as TElementToken; + public TFunctionToken AsFunctionToken() => this as TFunctionToken; + public TTextToken AsTextToken() => this as TTextToken; + public TBlockToken AsBlockToken() => this as TBlockToken; + public TPropertyToken AsPropertyToken() => this as TPropertyToken; + public TSystemToken AsSystemToken() => this as TSystemToken; } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/Agency.cs b/ZeroLevel/Services/DOM/Model/Agency.cs index 5f8d379..7f8a4c1 100644 --- a/ZeroLevel/Services/DOM/Model/Agency.cs +++ b/ZeroLevel/Services/DOM/Model/Agency.cs @@ -8,22 +8,43 @@ namespace ZeroLevel.DocumentObjectModel /// Agency name ///
public string Title; + /// /// Agency website /// public string Url; + /// /// Description /// public string Description; - public Agency() { } - public Agency(IBinaryReader reader) { Deserialize(reader); } - public Agency(string title) { this.Title = title; } - public Agency(string title, string url) { this.Title = title; this.Url = url; } - public Agency(string title, string url, string description) { this.Title = title; this.Url = url; this.Description = description; } + public Agency() + { + } + + public Agency(IBinaryReader reader) + { + Deserialize(reader); + } + + public Agency(string title) + { + this.Title = title; + } + + public Agency(string title, string url) + { + this.Title = title; this.Url = url; + } + + public Agency(string title, string url, string description) + { + this.Title = title; this.Url = url; this.Description = description; + } #region IBinarySerializable + public void Serialize(IBinaryWriter writer) { writer.WriteString(this.Title); @@ -37,6 +58,7 @@ namespace ZeroLevel.DocumentObjectModel this.Url = reader.ReadString(); this.Description = reader.ReadString(); } - #endregion + + #endregion IBinarySerializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/Assotiation.cs b/ZeroLevel/Services/DOM/Model/Assotiation.cs index 9dace00..aeb9ffe 100644 --- a/ZeroLevel/Services/DOM/Model/Assotiation.cs +++ b/ZeroLevel/Services/DOM/Model/Assotiation.cs @@ -3,29 +3,35 @@ using ZeroLevel.Services.Serialization; namespace ZeroLevel.DocumentObjectModel { - public sealed class Assotiation : + public sealed class Assotiation : IBinarySerializable { #region Fields + /// /// Title /// public string Title; + /// /// Description /// public string Description; + /// /// Binded document reference /// public Guid DocumentId; + /// /// Relation type /// public AssotiationRelation Relation; - #endregion + + #endregion Fields #region IBinarySerializable + public void Serialize(IBinaryWriter writer) { writer.WriteString(this.Title); @@ -41,6 +47,7 @@ namespace ZeroLevel.DocumentObjectModel this.DocumentId = reader.ReadGuid(); this.Relation = (AssotiationRelation)reader.ReadInt32(); } - #endregion + + #endregion IBinarySerializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/AssotiationRelation.cs b/ZeroLevel/Services/DOM/Model/AssotiationRelation.cs index c05d06a..2d43421 100644 --- a/ZeroLevel/Services/DOM/Model/AssotiationRelation.cs +++ b/ZeroLevel/Services/DOM/Model/AssotiationRelation.cs @@ -8,21 +8,25 @@ namespace ZeroLevel.DocumentObjectModel /// Relation type not defined ///
Uncknown = 0, + /// /// Mentioned /// Mentions = 1, + /// /// It tells about /// About = 2, + /// /// Previous version update /// UpdateOf = 3, + /// /// Based on /// BasedOn = 4 } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/AttachContent.cs b/ZeroLevel/Services/DOM/Model/AttachContent.cs index e31caf2..3fe83fa 100644 --- a/ZeroLevel/Services/DOM/Model/AttachContent.cs +++ b/ZeroLevel/Services/DOM/Model/AttachContent.cs @@ -3,36 +3,48 @@ using ZeroLevel.Services.Serialization; namespace ZeroLevel.DocumentObjectModel { - public sealed class AttachContent + public sealed class AttachContent : IBinarySerializable { /// /// ID /// public string Identity; + /// /// Title /// public string Caption; + /// /// Description (optional) /// public string Summary; + /// /// Content type /// public ContentType ContentType; + /// /// Binary content /// public byte[] Payload; - public AttachContent() { } - public AttachContent(IBinaryReader reader) { Deserialize(reader); } + public AttachContent() + { + } + + public AttachContent(IBinaryReader reader) + { + Deserialize(reader); + } + public AttachContent(string identity, string caption, string description) { Identity = identity; Summary = description; Caption = caption; } #region IBinarySerializable + public void Serialize(IBinaryWriter writer) { writer.WriteString(this.Identity); @@ -50,6 +62,7 @@ namespace ZeroLevel.DocumentObjectModel this.ContentType = (ContentType)reader.ReadInt32(); this.Payload = reader.ReadBytes(); } - #endregion + + #endregion IBinarySerializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/Category.cs b/ZeroLevel/Services/DOM/Model/Category.cs index 4eb9b0d..843553c 100644 --- a/ZeroLevel/Services/DOM/Model/Category.cs +++ b/ZeroLevel/Services/DOM/Model/Category.cs @@ -38,7 +38,7 @@ namespace ZeroLevel.DocumentObjectModel Deserialize(reader); } - #endregion + #endregion Ctors #region Fields @@ -67,7 +67,7 @@ namespace ZeroLevel.DocumentObjectModel /// public bool IsSystem { get; set; } - #endregion + #endregion Fields #region IBinarySerializable @@ -89,7 +89,7 @@ namespace ZeroLevel.DocumentObjectModel this.IsSystem = reader.ReadBoolean(); } - #endregion + #endregion IBinarySerializable #region ICloneable @@ -98,7 +98,7 @@ namespace ZeroLevel.DocumentObjectModel return new Category(this); } - #endregion + #endregion ICloneable #region IEquatable @@ -113,7 +113,7 @@ namespace ZeroLevel.DocumentObjectModel return true; } - #endregion + #endregion IEquatable #region Equals & Hash @@ -131,6 +131,6 @@ namespace ZeroLevel.DocumentObjectModel IsSystem.GetHashCode(); } - #endregion + #endregion Equals & Hash } } \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/ContentType.cs b/ZeroLevel/Services/DOM/Model/ContentType.cs index b998b6a..dbeef0f 100644 --- a/ZeroLevel/Services/DOM/Model/ContentType.cs +++ b/ZeroLevel/Services/DOM/Model/ContentType.cs @@ -2,7 +2,7 @@ namespace ZeroLevel.DocumentObjectModel { - public enum ContentType: Int32 + public enum ContentType : Int32 { Raw = 0, Text = 1, @@ -14,4 +14,4 @@ namespace ZeroLevel.DocumentObjectModel Zip = 7, Pdf = 8 } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/DescriptiveMetadata.cs b/ZeroLevel/Services/DOM/Model/DescriptiveMetadata.cs index 9b453e7..5ca4f57 100644 --- a/ZeroLevel/Services/DOM/Model/DescriptiveMetadata.cs +++ b/ZeroLevel/Services/DOM/Model/DescriptiveMetadata.cs @@ -4,11 +4,18 @@ using ZeroLevel.Services.Serialization; namespace ZeroLevel.DocumentObjectModel { - public sealed class DescriptiveMetadata : + public sealed class DescriptiveMetadata : IBinarySerializable { - public DescriptiveMetadata() { Initialize(); } - public DescriptiveMetadata(IBinaryReader reader) { Deserialize(reader); } + public DescriptiveMetadata() + { + Initialize(); + } + + public DescriptiveMetadata(IBinaryReader reader) + { + Deserialize(reader); + } private void Initialize() { @@ -22,45 +29,56 @@ namespace ZeroLevel.DocumentObjectModel } #region Fields + /// /// Authors /// public string Byline; + /// /// Copyright /// public string CopyrightNotice; + /// /// Creation date /// public DateTime Created; + /// /// Main language /// public string Language; + /// /// Priority /// public Priority Priority; + /// /// Document source /// public Agency Source; + /// /// Document publisher /// public Agency Publisher; + /// /// Reference to original document /// public Tag Original; + /// /// Headers (optional) /// public List
Headers; - #endregion + + #endregion Fields #region IBinarySerializable + public void Serialize(IBinaryWriter writer) { writer.WriteString(this.Byline); @@ -89,6 +107,7 @@ namespace ZeroLevel.DocumentObjectModel this.Source = new Agency(); this.Source.Deserialize(reader); } - #endregion + + #endregion IBinarySerializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/Document.cs b/ZeroLevel/Services/DOM/Model/Document.cs index 0deb6e3..4c23eb3 100644 --- a/ZeroLevel/Services/DOM/Model/Document.cs +++ b/ZeroLevel/Services/DOM/Model/Document.cs @@ -4,10 +4,11 @@ using ZeroLevel.Services.Serialization; namespace ZeroLevel.DocumentObjectModel { - public class Document + public class Document : IBinarySerializable { private static readonly Document _empty = new Document(); + public static Document Empty { get @@ -17,9 +18,21 @@ namespace ZeroLevel.DocumentObjectModel } } - public Document() { Id = Guid.NewGuid(); Initialize(); } - public Document(Guid id) { Id = id; Initialize(); } - public Document(IBinaryReader reader) { Deserialize(reader); } + public Document() + { + Id = Guid.NewGuid(); Initialize(); + } + + public Document(Guid id) + { + Id = id; Initialize(); + } + + public Document(IBinaryReader reader) + { + Deserialize(reader); + } + public Document(Document other) { var data = MessageSerializer.Serialize(other); @@ -44,45 +57,54 @@ namespace ZeroLevel.DocumentObjectModel /// ID /// public Guid Id; + /// /// Short description /// public string Summary; + /// /// Title /// public string Header; + /// /// Identification block /// public Identifier Identifier; + /// /// Content /// public FlowContent Content; + /// /// Tags /// public TagMetadata TagMetadata; + /// /// Metadata /// public DescriptiveMetadata DescriptiveMetadata; + /// /// Attachments /// public List Attachments; + /// /// Binded documents /// public List Assotiations; + /// /// Categories /// public List Categories; - #region IBinarySerializable + public void Serialize(IBinaryWriter writer) { writer.WriteGuid(this.Id); @@ -114,6 +136,7 @@ namespace ZeroLevel.DocumentObjectModel this.Assotiations = reader.ReadCollection(); this.Categories = reader.ReadCollection(); } - #endregion + + #endregion IBinarySerializable } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/Flow/Audio.cs b/ZeroLevel/Services/DOM/Model/Flow/Audio.cs index f23c7a1..0184ae1 100644 --- a/ZeroLevel/Services/DOM/Model/Flow/Audio.cs +++ b/ZeroLevel/Services/DOM/Model/Flow/Audio.cs @@ -3,14 +3,16 @@ using ZeroLevel.Services.Serialization; namespace ZeroLevel.DocumentObjectModel.Flow { - public sealed class Audio : + public sealed class Audio : ContentElement { public SourceType Source { get; set; } + /// /// Title /// public string Title; + /// /// Link or Attachment ID /// @@ -20,7 +22,7 @@ namespace ZeroLevel.DocumentObjectModel.Flow { } - public Audio(IBinaryReader reader) : + public Audio(IBinaryReader reader) : base(ContentElementType.Audio) { Deserialize(reader); @@ -40,4 +42,4 @@ namespace ZeroLevel.DocumentObjectModel.Flow writer.WriteString(Identifier); } } -} +} \ No newline at end of file diff --git a/ZeroLevel/Services/DOM/Model/Flow/Audioplayer.cs b/ZeroLevel/Services/DOM/Model/Flow/Audioplayer.cs index e994763..831bea9 100644 --- a/ZeroLevel/Services/DOM/Model/Flow/Audioplayer.cs +++ b/ZeroLevel/Services/DOM/Model/Flow/Audioplayer.cs @@ -3,18 +3,18 @@ using ZeroLevel.Services.Serialization; namespace ZeroLevel.DocumentObjectModel.Flow { - public sealed class Audioplayer : + public sealed class Audioplayer : ContentElement { public Text Title; public List