using System; using System.Collections; using System.Collections.Generic; using System.Linq; using BeWo.Data.Entities; using BeWo.Service.Core; using BeWo.Service.Interfaces; using BS.Shared; using BS.Shared.Extensions; namespace BeWo.Service.DCEntityMapper { public abstract class AbstractIDCEntityMapper : IDCEntityMapper where TDC : class, new() where TEntity : BeWoEntityBase, new() { public bool ConcurrencyCheck(long? pDataContractVersion, BeWoEntityBase pEntity) { return ServiceLogic.ConcurrencyCheck(pDataContractVersion, pEntity); } public virtual List MapToNewDCs(IEnumerable pEntitys) { List lResult = new List(); if (pEntitys != null) { foreach (TEntity iEntity in pEntitys) { lResult.Add(this.MergeWithDC(iEntity, CreateNewDC())); } } return lResult; } public virtual TDC CreateOrMapToNewDC(TEntity pEntity, bool nullDCOnNullEntity = false) { if (pEntity is object) return MapToNewDC(pEntity); if (nullDCOnNullEntity) return null; return CreateNewDC(); } public virtual TDC MapToNewDC(TEntity pEntity, bool dontCreateNewDConNullEntity) { if (dontCreateNewDConNullEntity || pEntity is object) return MapToNewDC(pEntity); return CreateNewDC(); } public virtual TDC MapToNewDC(TEntity pEntity) { return MergeWithDC(pEntity, CreateNewDC()); } public virtual TDC CreateNewDC() { return new TDC(); } public virtual List MapToNewEntities(IEnumerable pDataContracts) { List lResult = new List(); if (pDataContracts != null) { foreach (TDC iDataContract in pDataContracts) { lResult.Add(this.MergeWithEntity(iDataContract, new TEntity())); } } return lResult; } public virtual TEntity MapToNewEntity(TDC pDataContract, bool ignoreNullDC) { if (ignoreNullDC || pDataContract is object) return MergeWithEntity(pDataContract, new TEntity()); return CreateNewEntity(); } public virtual TEntity MapToNewEntity(TDC pDataContract) { return MergeWithEntity(pDataContract, new TEntity()); } public virtual TEntity CreateNewEntity() { return new TEntity(); } public abstract TDC MergeWithDC(TEntity pEntity, TDC pDataContract); public virtual void MergeWithEntitys(IList pDataContractList, IList pEntityList) { if (pEntityList.Count == 0 && pDataContractList != null && pDataContractList.Count > 0) { pEntityList.AddRange(pDataContractList.Select(dc => this.MapToNewEntity(dc))); return; } if (pDataContractList == null || pDataContractList.Count == 0) { pEntityList.Clear(); return; } // remove deleted pEntityList.RemoveRange(entity => pDataContractList.Count(dc => this.AreDCAndEntityEqual(dc, entity)) == 0); // merge same var lToMerge = pEntityList.Select(entity => new { Entity = entity, DataContract = pDataContractList.Single(dc => this.AreDCAndEntityEqual(dc, entity)) }); foreach (var iToMerge in lToMerge) { MergeWithEntity(iToMerge.DataContract, iToMerge.Entity); } // add new List newList = new List(); foreach (TDC dc in pDataContractList) { bool isnew = true; foreach (TEntity entity in pEntityList) { if (isnew && AreDCAndEntityEqual(dc, entity)) { isnew = false; } } if (isnew) newList.Add(dc); } foreach (TDC newDC in newList) { pEntityList.Add(MapToNewEntity(newDC)); } //pEntityList.AddRange( // pDataContractList // .Where(dc => pEntityList // .Count(entity => AreDCAndEntityEqual(dc, entity)) == 0) // .Select(dc => MapToNewEntity(dc))); } public virtual TEntity MergeOrCreateWithEntity(TDC pDataContract, TEntity pEntity) { if (pDataContract is object) { if (pEntity is null) pEntity = CreateNewEntity(); return MergeWithEntity(pDataContract, pEntity); } return null; } public abstract TEntity MergeWithEntity(TDC pDataContract, TEntity pEntity); protected abstract bool AreDCAndEntityEqual(TDC pDC, TEntity pEntity); // Ausgelagert in AiCore - Kann bei Zeit entfernt werden //public virtual Dictionary ToJsonDictionary(TDC pDC) //{ // throw new NotImplementedException("ToJsonDictionary"); //} //public Dictionary ToJsonDictionary(TEntity pEntity) //{ // var dc = MapToNewDC(pEntity); // var dict = ToJsonDictionary(dc); // return dict; //} //public IList> ToJsonDictionary(IList pEntities) //{ // var dcs = MapToNewDCs(pEntities); // var dicts = ToJsonDictionary(dcs); // return dicts; //} //public IList> ToJsonDictionary(IList pDCs) //{ // var dicts = new List>(); // if (pDCs == null) // return dicts; // foreach (var dc in pDCs) // dicts.Add(ToJsonDictionary(dc)); // return dicts; //} } }