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); }
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); }
public void AssignAndPostRetrieving(IMListPrivate newList, PostRetrievingContext ctx) { this.AssignMList((MList <T>)newList); this.PostRetrieving(ctx); }
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); } }
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); }
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; }