private void AssertUserModel(CompositeType compositeType)
        {
            Assert.IsNotNull(compositeType);

            Assert.AreEqual("Test.UserModel", compositeType.Name);
            Assert.AreEqual(typeof(UserModel), compositeType.Type);

            Assert.IsNotNull(compositeType.VersionProperty);
            Assert.IsNull(compositeType.VersionProperty.Setter);

            Assert.AreEqual(2, compositeType.Versions.Count());

            IEnumerator <CompositeVersion> versionEnumerator = compositeType.Versions.GetEnumerator();

            Assert.AreEqual(true, versionEnumerator.MoveNext());
            CompositeVersion version = versionEnumerator.Current;

            Assert.AreEqual(1, version.Version);
            Assert.AreEqual(2, version.Properties.Count());

            Assert.AreEqual(true, versionEnumerator.MoveNext());
            version = versionEnumerator.Current;
            Assert.AreEqual(2, version.Version);
            Assert.AreEqual(3, version.Properties.Count());
        }
Esempio n. 2
0
        private CompositeVersion GetCompositeVersion(CompositeType type, int version, Type inputType)
        {
            CompositeVersion typeVersion = type.Versions.FirstOrDefault(v => v.Version == version);

            if (typeVersion == null)
            {
                throw new MissingVersionException(inputType, version);
            }

            return(typeVersion);
        }
        private void AssertSingleVersion(CompositeType compositeType)
        {
            Assert.IsNotNull(compositeType);

            Assert.AreEqual(typeof(SingleVersion), compositeType.Type);
            Assert.AreEqual(1, compositeType.Versions.Count());

            IEnumerator <CompositeVersion> versionEnumerator = compositeType.Versions.GetEnumerator();

            Assert.AreEqual(true, versionEnumerator.MoveNext());
            CompositeVersion version = versionEnumerator.Current;

            Assert.AreEqual(1, version.Version);
            Assert.AreEqual(1, version.Properties.Count());
        }
Esempio n. 4
0
        public bool TrySerialize(object input, ISerializerContext context)
        {
            CompositeType type;

            if (!provider.TryGet(context.InputType, out type))
            {
                return(false);
            }

            int version = (int)type.VersionProperty.Getter(input);
            CompositeVersion typeVersion = GetCompositeVersion(type, version, context.InputType);

            ICompositeStorage storage = storageFactory.Create();
            bool result = TryStore(input, context, type, typeVersion, storage);

            storage.Store(context.Output);
            return(result);
        }
        public void Reflection_SingleModel()
        {
            ReflectionCompositeTypeProvider provider = new ReflectionCompositeTypeProvider(new ReflectionCompositeDelegateFactory(), BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            CompositeType compositeType;

            Assert.AreEqual(true, provider.TryGet(typeof(SingleModel), out compositeType));

            Assert.AreEqual(typeof(SingleModel), compositeType.Type);
            Assert.AreEqual(1, compositeType.Versions.Count());

            IEnumerator <CompositeVersion> versionEnumerator = compositeType.Versions.GetEnumerator();

            Assert.AreEqual(true, versionEnumerator.MoveNext());
            CompositeVersion version = versionEnumerator.Current;

            Assert.AreEqual(1, version.Version);
            Assert.AreEqual(1, version.Properties.Count());
        }
Esempio n. 6
0
        public Task <bool> TrySerializeAsync(object input, ISerializerContext context)
        {
            CompositeType type;

            if (!provider.TryGet(context.InputType, out type))
            {
                return(Task.FromResult(false));
            }

            int version = (int)type.VersionProperty.Getter(input);
            CompositeVersion typeVersion = GetCompositeVersion(type, version, context.InputType);

            ICompositeStorage storage = storageFactory.Create();
            bool result = TryStore(input, context, type, typeVersion, storage);

            Task task = storage.StoreAsync(context.Output);

            task.ConfigureAwait(false);
            return(Task <bool> .Factory.ContinueWhenAll(new Task[] { task }, t => result));
        }
Esempio n. 7
0
        /// <summary>
        /// Tries to load a object from the <paramref name="input"/> described by the <paramref name="type"/>.
        /// </summary>
        /// <param name="input">The serialized value to deserialize.</param>
        /// <param name="context">The deserialization context.</param>
        /// <param name="type">The composite type descriptor to load.</param>
        /// <param name="storage">The composite storage with loaded values.</param>
        /// <returns><c>true</c> if object was deserialized; <c>false</c> otherwise.</returns>
        protected virtual bool TryLoad(Stream input, IDeserializerContext context, CompositeType type, ICompositeStorage storage)
        {
            int version;

            if (!storage.TryGet(Name.Version, out version))
            {
                throw new MissingVersionValueException();
            }

            CompositeVersion  typeVersion = GetCompositeVersion(type, version, context.OutputType);
            ICompositeStorage valueStorage;

            if (!storage.TryGet(Name.Payload, out valueStorage))
            {
                throw new MissingPayloadValueException();
            }

            List <object> values = new List <object>();

            foreach (CompositeProperty property in typeVersion.Properties)
            {
                object value;
                if (!TryLoadValue(valueStorage, property.Name, property.Type, out value))
                {
                    throw new NotSupportedValueException(type.Type, property.Name, property.Type);
                }

                values.Add(value);
            }

            context.Output = typeVersion.Constructor.Factory(values.ToArray());

            if (type.VersionProperty.Setter != null)
            {
                type.VersionProperty.Setter(context.Output, version);
            }

            return(true);
        }
        public void Reflection_TwoVersionWithFirstImplied()
        {
            ReflectionCompositeTypeProvider provider = new ReflectionCompositeTypeProvider(new ReflectionCompositeDelegateFactory());
            CompositeType compositeType;

            Assert.AreEqual(true, provider.TryGet(typeof(TwoVersionWithFirstImplied), out compositeType));

            Assert.AreEqual(typeof(TwoVersionWithFirstImplied), compositeType.Type);
            Assert.AreEqual(2, compositeType.Versions.Count());

            IEnumerator <CompositeVersion> versionEnumerator = compositeType.Versions.GetEnumerator();

            Assert.AreEqual(true, versionEnumerator.MoveNext());
            CompositeVersion version = versionEnumerator.Current;

            Assert.AreEqual(1, version.Version);
            Assert.AreEqual(1, version.Properties.Count());

            Assert.AreEqual(true, versionEnumerator.MoveNext());
            version = versionEnumerator.Current;
            Assert.AreEqual(2, version.Version);
            Assert.AreEqual(2, version.Properties.Count());
        }
Esempio n. 9
0
            protected override bool TryStore(object input, ISerializerContext context, CompositeType type, CompositeVersion typeVersion, ICompositeStorage storage)
            {
                if (input is IList list)
                {
                    storage.Add("Count", list.Count);
                    for (int i = 0; i < list.Count; i++)
                    {
                        object item = list[i];

                        ICompositeStorage innerStorage = storage.Add(i.ToString());
                        if (!base.TryStore(item, context, type, typeVersion, innerStorage))
                        {
                            return(false);
                        }
                    }

                    return(true);
                }

                return(base.TryStore(input, context, type, typeVersion, storage));
            }
Esempio n. 10
0
        protected override bool TryStore(object input, ISerializerContext context, CompositeType type, CompositeVersion typeVersion, ICompositeStorage storage)
        {
            if (!base.TryStore(input, context, type, typeVersion, storage))
            {
                return(false);
            }

            ICompositeStorage payloadStorage;
            GuidedObject      guided = input as GuidedObject;

            if (guided != null && storage.TryGet(Name.Payload, out payloadStorage))
            {
                payloadStorage.Add("Guid", guided.Guid);
            }

            return(true);
        }
Esempio n. 11
0
        /// <summary>
        /// Tries to store the <paramref name="input"/> to the <paramref name="context"/>. The <paramref name="input"/> is described by the <paramref name="type"/>
        /// and in the <paramref name="typeVersion"/>.
        /// </summary>
        /// <param name="input">The object to store.</param>
        /// <param name="context">The serialization context.</param>
        /// <param name="type">The <paramref name="input"/> composite type descriptor.</param>
        /// <param name="typeVersion">The version of the <paramref name="input"/>.</param>
        /// <param name="storage">The composite storage to store values to.</param>
        /// <returns><c>true</c> if the <paramref name="input"/> was serialized to the <paramref name="context"/>; <c>false</c> otherwise.</returns>
        protected virtual bool TryStore(object input, ISerializerContext context, CompositeType type, CompositeVersion typeVersion, ICompositeStorage storage)
        {
            storage.Add(Name.TypeName, type.Name);
            storage.Add(Name.Version, type.VersionProperty.Getter(input));

            ICompositeStorage valueStorage = storage.Add(Name.Payload);

            foreach (CompositeProperty property in typeVersion.Properties)
            {
                object propertyValue = property.Getter(input);
                if (!TryStoreValue(valueStorage, property.Name, propertyValue))
                {
                    throw new NotSupportedValueException(type.Type, property.Name, property.Type, propertyValue);
                }
            }

            return(true);
        }
        protected override bool TryStore(object input, ISerializerContext context, CompositeType type, CompositeVersion typeVersion, ICompositeStorage storage)
        {
            if (base.TryStore(input, context, type, typeVersion, storage))
            {
                TryStore(GetOrAddPayloadStorage(storage), input);

                IReadOnlyKeyValueCollection metadata;
                if (context.TryGetEnvelopeMetadata(out metadata))
                {
                    ICompositeStorage metadataStorage = storage.Add(MetadataKey);
                    foreach (string key in metadata.Keys)
                    {
                        metadataStorage.Add(key, metadata.Get <object>(key));
                    }
                }

                return(true);
            }

            return(false);
        }
Esempio n. 13
0
        protected override bool TryStore(object input, ISerializerContext context, CompositeType type, CompositeVersion typeVersion, ICompositeStorage storage)
        {
            if (base.TryStore(input, context, type, typeVersion, storage))
            {
                if (input is AggregateRootException e)
                {
                    ICompositeStorage inner = storage.Add(Name.InnerStorage);
                    inner.Add(Name.AggregateRootKey, e.Key);
                    inner.Add(Name.CommandKey, e.CommandKey);
                    inner.Add(Name.SourceCommandKey, e.SourceCommandKey);
                }

                return(true);
            }

            return(false);
        }