예제 #1
0
        /// <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);
                }
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }