/// <summary> /// TODO: extract to base class together with class ApplyOverrideDocument /// </summary> /// <param name="models"></param> /// <param name="host"></param> private void ApplyOverrides(ImmutableList <FileModel> models, IHostService host) { foreach (var uid in host.GetAllUids()) { var ms = host.LookupByUid(uid); var od = ms.Where(m => m.Type == DocumentType.Override).ToList(); var articles = ms.Except(od).ToList(); if (articles.Count == 0 || od.Count == 0) { continue; } if (od.Count > 1) { var uidDefinitions = od[0].Uids.Where(u => u.Name == uid); var errorMessage = string.Join(",", uidDefinitions.Select(s => $"\"{s.File}\" Line {s.Line}")); throw new DocumentException($"UID \"{uid}\" is defined in multiple places: {errorMessage}. Only one overwrite document is allowed per particular UID."); } var ovm = ((List <RestApiItemViewModel>)od[0].Content).Single(vm => vm.Uid == uid); foreach ( var pair in from model in articles from item in new RestApiItemViewModel[] { (RestApiItemViewModel)model.Content }.Concat(((RestApiItemViewModel)model.Content).Children) where item.Uid == uid select new { model, item }) { var vm = pair.item; Merger.Merge(ref vm, ovm); vm.Metadata = MergeMetadata(vm.Metadata, ovm.Metadata); ((HashSet <string>)pair.model.Properties.LinkToUids).UnionWith((HashSet <string>)od[0].Properties.LinkToUids); ((HashSet <string>)pair.model.Properties.LinkToFiles).UnionWith((HashSet <string>)od[0].Properties.LinkToFiles); } } }
private T Merge(T baseModel, T overrideModel, FileModel model) { try { Merger.Merge(ref baseModel, overrideModel); } catch (Exception e) { throw new DocumentException($"Error merging overwrite document from {model.OriginalFileAndType}: {e.Message}", e); } return(baseModel); }
private T Merge <T>(T baseModel, T overrideModel, FileModel model) where T : class, IOverwriteDocumentViewModel { try { _merger.Merge(ref baseModel, overrideModel); } catch (Exception e) { var message = $"Error merging overwrite document from {model.OriginalFileAndType}: {e.Message}"; Logger.LogError(message, code: ErrorCodes.Overwrite.OverwriteDocumentMergeError); throw new DocumentException(message, e); } return(baseModel); }