using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using GreenTree.Nachtragsmanagement.Core.Domain.Appendix; using GreenTree.Nachtragsmanagement.Core.Domain.Deviation; using GreenTree.Nachtragsmanagement.Core.Domain.Site; using GreenTree.Nachtragsmanagement.Core.Domain.User; using GreenTree.Nachtragsmanagement.Data; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace GreenTree.Nachtragsmanagement.Services.Test { public class DbRelationService : IDbRelationService { private readonly IDbContext _idbContext; public DbRelationService( IDbContext idbContext) { _idbContext = idbContext; } #region Testing /// /// Serialize all existing entities of the current DbContext /// /// The depth the serialization should dive in. /// The output format. /// Return all entities either in JSON- or XML-format. public List GetRelations(int depth, DbRelationFormat format) { var result = new List(); var dbContext = (AppendixObjectContext)_idbContext; var userList = dbContext.Get().ToList(); var deviationList = dbContext.Get().ToList(); var siteList = dbContext.Get().ToList(); var appendixList = dbContext.Get().ToList(); if (format == DbRelationFormat.Json) { result.Add(SerializeObjectJson(userList, depth)); result.Add(SerializeObjectJson(deviationList, depth)); result.Add(SerializeObjectJson(siteList, depth)); result.Add(SerializeObjectJson(appendixList, depth)); } else result.Add(String.Empty); return result; } #endregion #region Utilities /// /// Serialize objects using CustomJsonTextWriter /// /// The object to be serialized. /// The maximum depth. public static string SerializeObjectJson(object obj, int maxDepth) { using (var strWriter = new StringWriter()) { using (var jsonWriter = new CustomJsonTextWriter(strWriter)) { Func include = () => jsonWriter.CurrentDepth <= maxDepth; var resolver = new CustomContractResolver(include); var serializer = new JsonSerializer { ContractResolver = resolver, Formatting = Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; serializer.Serialize(jsonWriter, obj); } return strWriter.ToString(); } } #endregion } public class CustomJsonTextWriter : JsonTextWriter { public CustomJsonTextWriter(TextWriter textWriter) : base(textWriter) { } public int CurrentDepth { get; private set; } public override void WriteStartObject() { CurrentDepth++; base.WriteStartObject(); } public override void WriteEndObject() { CurrentDepth--; base.WriteEndObject(); } } public class CustomContractResolver : DefaultContractResolver { private readonly Func _includeProperty; public CustomContractResolver(Func includeProperty) { _includeProperty = includeProperty; } protected override JsonProperty CreateProperty( MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); var shouldSerialize = property.ShouldSerialize; property.ShouldSerialize = obj => _includeProperty() && (shouldSerialize == null || shouldSerialize(obj)); return property; } } }