Beispiel #1
0
        private bool ValidateMList(IMListPrivate mlist)
        {
            bool isValid     = true;
            Type elementType = mlist.GetType().ElementType() !;

            int i = 0;

            foreach (object?element in (IEnumerable)mlist)
            {
                if (element != null && this.CurrentPath.Push(element))
                {
                    using (StateManager.Recurse(this, this.Key + "[" + (i++) + "].element", null, element, null))
                    {
                        if (element is ModifiableEntity me)
                        {
                            isValid &= ValidateModifiableEntity(me);
                        }
                        else if (element is Lite <Entity> lite)
                        {
                            isValid &= ValidateLite(lite);
                        }
                        else
                        {
                            isValid &= true;
                        }
                    }
                }
            }

            return(isValid);
        }
Beispiel #2
0
        private bool ValidateMList(ValidationContext validationContext, IMListPrivate mlist)
        {
            bool          isValid         = true;
            Type          elementType     = mlist.GetType().ElementType();
            ModelMetadata elementMetadata = validationContext.MetadataProvider.GetMetadataForType(null, elementType);

            ElementScope elementScope = new ElementScope()
            {
                Index = 0
            };

            validationContext.KeyBuilders.Push(elementScope);

            PropertyScope property = new PropertyScope {
                PropertyName = "element"
            };

            validationContext.KeyBuilders.Push(property);

            foreach (object element in (IEnumerable)mlist)
            {
                elementMetadata.Model = element;
                if (!ValidateNodeAndChildren(elementMetadata, validationContext, mlist))
                {
                    isValid = false;
                }
                elementScope.Index++;
            }
            validationContext.KeyBuilders.Pop();

            validationContext.KeyBuilders.Pop();
            return(isValid);
        }
Beispiel #3
0
 public void AssignAndPostRetrieving(IMListPrivate newList, PostRetrievingContext ctx)
 {
     this.AssignMList((MList <T>)newList);
     this.PostRetrieving(ctx);
 }
Beispiel #4
0
        public override MList <S> GetValue(MappingContext <MList <S> > ctx)
        {
            using (HeavyProfiler.LogNoStackTrace("GetValue", () => "MListMapping<{0}>".FormatWith(typeof(S).TypeName())))
            {
                if (ctx.Empty())
                {
                    return(ctx.None());
                }

                IMListPrivate <S> mlistPriv = ctx.Value;

                var dic = mlistPriv == null ? new Dictionary <PrimaryKey, MList <S> .RowIdElement>() :
                          mlistPriv.InnerList.Where(a => a.RowId.HasValue).ToDictionary(a => a.RowId.Value, a => a);

                var newList = new List <MList <S> .RowIdElement>();
                foreach (MappingContext <S> itemCtx in GenerateItemContexts(ctx))
                {
                    Debug.Assert(!itemCtx.Empty());

                    string rowIdString = (itemCtx.Inputs.ContainsKey(EntityListBaseKeys.RowId)? itemCtx.Inputs[EntityListBaseKeys.RowId]:null);

                    if (rowIdString.HasText())
                    {
                        var rowId = new PrimaryKey((IComparable)ReflectionTools.Parse(rowIdString, GetRowIdType(ctx)));

                        var oldValue = dic.GetOrThrow(rowId, "No RowID {0} found");

                        itemCtx.Value = oldValue.Element;
                        itemCtx.Value = ElementMapping(itemCtx);

                        ctx.AddChild(itemCtx);

                        if (itemCtx.Value != null)
                        {
                            var val = itemCtx.SupressChange ? oldValue.Element : itemCtx.Value;

                            if (oldValue.Element.Equals(val))
                            {
                                newList.Add(new MList <S> .RowIdElement(val, rowId, oldValue.OldIndex));
                            }
                            else
                            {
                                newList.Add(new MList <S> .RowIdElement(val));
                            }
                        }
                    }
                    else
                    {
                        itemCtx.Value = ElementMapping(itemCtx);
                        ctx.AddChild(itemCtx);
                        if (itemCtx.Value != null && !itemCtx.SupressChange)
                        {
                            newList.Add(new MList <S> .RowIdElement(itemCtx.Value));
                        }
                    }
                }

                if (!AreEqual(newList, mlistPriv == null ? null : mlistPriv.InnerList))
                {
                    Signum.Web.Mapping.AssertCanChange(ctx.PropertyRoute);

                    if (ctx.Value == null)
                    {
                        mlistPriv = ctx.Value = new MList <S>();
                    }

                    var added   = newList.Select(a => a.Element).Except(mlistPriv.InnerList.Select(a => a.Element)).ToList();
                    var removed = mlistPriv.InnerList.Select(a => a.Element).Except(newList.Select(a => a.Element)).ToList();

                    mlistPriv.InnerList.Clear();
                    mlistPriv.InnerList.AddRange(newList);
                    mlistPriv.InnerListModified(added, removed);
                }

                return(ctx.Value);
            }
        }
Beispiel #5
0
 public void AssignAndPostRetrieving(IMListPrivate newList)
 {
     this.AssignMList((MList <T>)newList);
     this.PostRetrieving();
 }
        static MList <T> ReadJsonInternal <T>(JsonReader reader, IMListPrivate <T> existingValue, JsonSerializer serializer)
        {
            var dic = existingValue == null ? new Dictionary <PrimaryKey, MList <T> .RowIdElement>() :
                      existingValue.InnerList.Where(a => a.RowId.HasValue).ToDictionary(a => a.RowId.Value, a => a);

            var newList = new List <MList <T> .RowIdElement>();

            var pr = JsonSerializerExtensions.CurrentPropertyRoute;

            var elementPr = pr.Add("Item");

            var rowIdType = GetRowIdTypeFromAttribute(pr);


            reader.Assert(JsonToken.StartArray);

            reader.Read();

            using (JsonSerializerExtensions.SetCurrentPropertyRoute(elementPr))
            {
                while (reader.TokenType == JsonToken.StartObject)
                {
                    reader.Read();
                    reader.Assert(JsonToken.PropertyName);
                    if (((string)reader.Value) != "rowId")
                    {
                        throw new JsonSerializationException($"member 'rowId' expected in {reader.Path}");
                    }

                    reader.Read();
                    var rowIdValue = reader.Value;

                    reader.Read();
                    reader.Assert(JsonToken.PropertyName);
                    if (((string)reader.Value) != "element")
                    {
                        throw new JsonSerializationException($"member 'element' expected in {reader.Path}");
                    }

                    reader.Read();
                    if (rowIdValue != null && !rowIdValue.Equals(GraphExplorer.DummyRowId.Object))
                    {
                        var rowId = new PrimaryKey((IComparable)ReflectionTools.ChangeType(rowIdValue, rowIdType));

                        var oldValue = dic.TryGetS(rowId);

                        if (oldValue == null)
                        {
                            T newValue = (T)serializer.DeserializeValue(reader, typeof(T), null);

                            newList.Add(new MList <T> .RowIdElement(newValue, rowId, null));
                        }
                        else
                        {
                            T newValue = (T)serializer.DeserializeValue(reader, typeof(T), oldValue.Value.Element);

                            if (oldValue.Value.Element.Equals(newValue))
                            {
                                newList.Add(new MList <T> .RowIdElement(newValue, rowId, oldValue.Value.OldIndex));
                            }
                            else
                            {
                                newList.Add(new MList <T> .RowIdElement(newValue));
                            }
                        }
                    }
                    else
                    {
                        var newValue = (T)serializer.DeserializeValue(reader, typeof(T), null);
                        newList.Add(new MList <T> .RowIdElement(newValue));
                    }

                    reader.Read();

                    reader.Assert(JsonToken.EndObject);
                    reader.Read();
                }
            }

            reader.Assert(JsonToken.EndArray);

            if (existingValue == null) //Strange case...
            {
                if (newList.IsEmpty())
                {
                    return(null);
                }
                else
                {
                    existingValue = new MList <T>();
                }
            }

            bool orderMatters = GetPreserveOrderFromAttribute(pr);

            if (!existingValue.IsEqualTo(newList, orderMatters))
            {
                EntityJsonConverter.AssertCanWrite(pr);

                existingValue.AssignMList(newList);
            }

            return((MList <T>)existingValue);
        }
Beispiel #7
0
        static MList <T> ReadJsonInternal <T>(JsonReader reader, IMListPrivate <T> existingValue, JsonSerializer serializer)
        {
            var errors = new List <string>();

            serializer.Error += delegate(object?sender, ErrorEventArgs args)
            {
                // only log an error once
                if (args.CurrentObject == args.ErrorContext.OriginalObject)
                {
                    errors.Add(args.ErrorContext.Error.Message);
                }
            };

            var dic = existingValue == null ? new Dictionary <PrimaryKey, MList <T> .RowIdElement>() :
                      existingValue.InnerList.Where(a => a.RowId.HasValue).ToDictionary(a => a.RowId !.Value, a => a);

            var newList = new List <MList <T> .RowIdElement>();

            var pr = JsonSerializerExtensions.CurrentPropertyRoute !;

            var elementPr = pr.Add("Item");

            var rowIdType = GetRowIdTypeFromAttribute(pr);


            reader.Assert(JsonToken.StartArray);

            reader.Read();

            using (JsonSerializerExtensions.SetCurrentPropertyRoute(elementPr))
            {
                while (reader.TokenType == JsonToken.StartObject)
                {
                    reader.Read();
                    reader.Assert(JsonToken.PropertyName);
                    if (((string)reader.Value !) != "rowId")
                    {
                        throw new JsonSerializationException($"member 'rowId' expected in {reader.Path}");
                    }

                    reader.Read();
                    var rowIdValue = reader.Value;

                    reader.Read();
                    reader.Assert(JsonToken.PropertyName);
                    if (((string)reader.Value !) != "element")
                    {
                        throw new JsonSerializationException($"member 'element' expected in {reader.Path}");
                    }

                    reader.Read();
                    if (rowIdValue != null && !rowIdValue.Equals(GraphExplorer.DummyRowId.Object))
                    {
                        var rowId = new PrimaryKey((IComparable)ReflectionTools.ChangeType(rowIdValue, rowIdType) !);

                        var oldValue = dic.TryGetS(rowId);

                        if (oldValue == null)
                        {
                            T newValue = (T)serializer.DeserializeValue(reader, typeof(T), null) !;

                            newList.Add(new MList <T> .RowIdElement(newValue, rowId, null));
                        }
                        else
                        {
                            T newValue = (T)serializer.DeserializeValue(reader, typeof(T), oldValue.Value.Element) !;

                            if (oldValue.Value.Element !.Equals(newValue))
                            {
                                newList.Add(new MList <T> .RowIdElement(newValue, rowId, oldValue.Value.OldIndex));
                            }
                            else
                            {
                                newList.Add(new MList <T> .RowIdElement(newValue));
                            }
                        }
                    }
        private bool ValidateMList(ValidationContext validationContext, IMListPrivate mlist)
        {
            bool isValid = true;
            Type elementType = mlist.GetType().ElementType();
            ModelMetadata elementMetadata = validationContext.MetadataProvider.GetMetadataForType(null, elementType);

            ElementScope elementScope = new ElementScope() { Index = 0 };
            validationContext.KeyBuilders.Push(elementScope);

            PropertyScope property = new PropertyScope { PropertyName = "element" };
            validationContext.KeyBuilders.Push(property);

            foreach (object element in (IEnumerable)mlist)
            {
                elementMetadata.Model = element;
                if (!ValidateNodeAndChildren(elementMetadata, validationContext, mlist))
                {
                    isValid = false;
                }
                elementScope.Index++;
            }
            validationContext.KeyBuilders.Pop();

            validationContext.KeyBuilders.Pop();
            return isValid;
        }