From 2e0598af6501082bc27784dce5ae3dd3a8004b06 Mon Sep 17 00:00:00 2001 From: Sinan Date: Wed, 26 Sep 2018 16:20:59 +0200 Subject: [PATCH 3/7] Add a default repository --- rsb-cil-test/Program.cs | 39 ++-------- .../Rsb/Converter/DefaultConverterRepository.cs | 85 ++++++++++++++++++++++ rsb-cil/rsb-cil.csproj | 1 + 3 files changed, 92 insertions(+), 33 deletions(-) create mode 100644 rsb-cil/Rsb/Converter/DefaultConverterRepository.cs diff --git a/rsb-cil-test/Program.cs b/rsb-cil-test/Program.cs index 6547f9b..851952b 100644 --- a/rsb-cil-test/Program.cs +++ b/rsb-cil-test/Program.cs @@ -79,39 +79,12 @@ namespace rsbciltest listener.Deactivate(); - Console.WriteLine("\nConverter test:"); - - var defaultInConverters = buildConverterSelection(new List> { - new Tuple("ascii-string", new StringConverter(false) ), - new Tuple("utf-8-string", new StringConverter(true) ), - new Tuple("int32", new Int32Converter() ), - new Tuple("int64", new Int64Converter() ), - new Tuple("uint32", new UInt32Converter() ), - new Tuple("uint64", new UInt64Converter() ), - new Tuple("float", new FloatConverter() ), - new Tuple("double", new DoubleConverter() ), - new Tuple("bool", new BoolConverter() ), - new Tuple("bytes", new ByteConverter() ), - new Tuple("void", new NullConverter() ), - new Tuple("." + JointAngles.Descriptor.FullName, new ProtocolBufferConverter(JointAngles.Descriptor)) - }); - - var defaultOutConverters = buildConverterSelection(new List> { - new Tuple(typeof(string), new StringConverter(true) ), - new Tuple(typeof(int), new Int32Converter() ), - new Tuple(typeof(long), new Int64Converter() ), - new Tuple(typeof(uint), new UInt32Converter() ), - new Tuple(typeof(ulong), new UInt64Converter() ), - new Tuple(typeof(float), new FloatConverter() ), - new Tuple(typeof(double), new DoubleConverter() ), - new Tuple(typeof(bool), new BoolConverter() ), - new Tuple(typeof(byte[]), new ByteConverter() ), - new Tuple(typeof(Null), new NullConverter() ), - new Tuple(typeof(JointAngles), new ProtocolBufferConverter(JointAngles.Descriptor)) - }); - - Informer repoInformer = new Informer("/test/repo", new OutConnector(new BusClientConnection(host, port), defaultOutConverters)); - Listener repoListener = new Listener(new InPushConnector(new BusClientConnection(host, port), new Scope("/"), defaultInConverters)); + Console.WriteLine("\nRepository test:"); + + DefaultConverterRepository.Instance.addConverter(new ProtocolBufferConverter(JointAngles.Descriptor)); + + Informer repoInformer = new Informer("/test/repo", new OutConnector(new BusClientConnection(host, port), DefaultConverterRepository.Instance.SerializationConverterSelector)); + Listener repoListener = new Listener(new InPushConnector(new BusClientConnection(host, port), new Scope("/"), DefaultConverterRepository.Instance.DeserializationConverterSelector)); repoListener.EventReceived += (e) => { Console.WriteLine("Event: {0}\nData: {1}", e, e.Data); }; diff --git a/rsb-cil/Rsb/Converter/DefaultConverterRepository.cs b/rsb-cil/Rsb/Converter/DefaultConverterRepository.cs new file mode 100644 index 0000000..9cf1b8e --- /dev/null +++ b/rsb-cil/Rsb/Converter/DefaultConverterRepository.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; + +namespace Rsb.Converter +{ + public class DefaultConverterRepository + { + private static readonly DefaultConverterRepository instance = new DefaultConverterRepository(); + + private List.Predicate, IConverter>> deserializationConverterList = new List.Predicate, IConverter>>(); + public PredicateConverterSelection DeserializationConverterSelector { get; private set; } + + private List.Predicate, IConverter>> serializationConverterList = new List.Predicate, IConverter>>(); + public PredicateConverterSelection SerializationConverterSelector { get; private set; } + + private readonly IConverter[] defaultConverter = { + new NullConverter(), + new DoubleConverter(), + new FloatConverter(), + new Int32Converter(), + new Int64Converter(), + new UInt32Converter(), + new UInt64Converter(), + new BoolConverter(), + new StringConverter(false), + new StringConverter(), + new ByteConverter(), + //new ScopeConverter() + }; + + // Explicit static constructor to tell C# compiler + // not to mark type as beforefieldinit + static DefaultConverterRepository() + { + } + + private DefaultConverterRepository() + { + + foreach (var converter in defaultConverter) { + ConverterSignature signature = converter.GetSignature(); + + deserializationConverterList.Add( + new Tuple.Predicate, IConverter>( + new IsExactMatch(signature.Schema), + converter + )); + + // this will add a second string converter in the informer list. + // I assume the first one wins and i don't think, that this is intended. Checks and Exceptions should be added at sometime + + serializationConverterList.Add( + new Tuple.Predicate, IConverter>( + new IsExactMatch(signature.DataType), + converter + )); + } + + DeserializationConverterSelector = new PredicateConverterSelection(deserializationConverterList); + SerializationConverterSelector = new PredicateConverterSelection(serializationConverterList); + + } + + public static DefaultConverterRepository Instance + { + get + { + return instance; + } + } + + public void addConverter(IConverter converter) { + deserializationConverterList.Add( + new Tuple.Predicate, IConverter>( + new IsExactMatch(converter.GetSignature().Schema), + converter + )); + serializationConverterList.Add( + new Tuple.Predicate, IConverter>( + new IsExactMatch(converter.GetSignature().DataType), + converter + )); + } + } +} diff --git a/rsb-cil/rsb-cil.csproj b/rsb-cil/rsb-cil.csproj index 916d69b..9b86e03 100644 --- a/rsb-cil/rsb-cil.csproj +++ b/rsb-cil/rsb-cil.csproj @@ -42,6 +42,7 @@ + -- 2.14.2.windows.1