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;
}
}
}