public ActionResult GetItemYamlWithChildren(RevisionModel data) { var guid = Guid.Parse(data.Id); using (new SecurityDisabler()) { IItemData item = _sitecore.GetItemData(guid); var localRev = _sitecore.GetItemAndChildrenRevision(guid); List <Guid> GrandChildren = new List <Guid>(); var items = new List <KeyValuePair <Guid, string> >(); if (data.Rev == null || !data.Rev.ContainsKey(item.Id) || data.Rev[item.Id] != localRev[item.Id]) { using (var stream = new MemoryStream()) { _yamlSerializationService.WriteSerializedItem(item, stream); stream.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(stream)) { items.Add(new KeyValuePair <Guid, string>(item.Id, reader.ReadToEnd())); } } } else { items.Add(new KeyValuePair <Guid, string>(item.Id, null)); } if (item.Path.StartsWith("/sitecore/media library/")) { GrandChildren.AddRange(_sitecore.GetChildren(item).Select(x => x.Id)); } else { items.AddRange(_sitecore.GetChildren(item).Select(x => { GrandChildren.AddRange(_sitecore.GetChildren(x).Select(c => c.Id)); if (data.Rev != null && data.Rev.ContainsKey(x.Id) && localRev.ContainsKey(x.Id) && data.Rev[x.Id] == localRev[x.Id]) { return(new KeyValuePair <Guid, string>(x.Id, null)); } using (var stream = new MemoryStream()) { _yamlSerializationService.WriteSerializedItem(x, stream); stream.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(stream)) { return(new KeyValuePair <Guid, string>(x.Id, reader.ReadToEnd())); } } })); } return(ScsJson(new ChildrenItemDataModel { Items = items, GrandChildren = GrandChildren })); } }
internal async Task GatherItems(bool getChildren, string server, CancellationToken cancellationToken, bool ignoreRevId) { ChildrenItemDataModel buffer = null; while (!Completed) { try { Guid id; if (!ProcessingIds.TryTake(out id, int.MaxValue, cancellationToken)) { break; } lock (_locker) _processing++; if (buffer == null) { buffer = _remoteContent.GetRemoteItemDataWithChildren(id, server, ignoreRevId ? null : _sitecore.GetItemAndChildrenRevision(id)); } if (GatheredRemoteItems.Count >= _maxQueue) { await Task.Delay(1000); } else { foreach (var item in (getChildren ? buffer.Items : buffer.Items.Where(x => x.Key == id))) { if (item.Value != null) { IItemData itemData = _yamlSerializationService.DeserializeYaml(item.Value, item.Key.ToString()); GatheredRemoteItems.Add(itemData, cancellationToken); } else { GatheredRemoteItems.Add(_sitecore.GetItemData(item.Key), cancellationToken); } } if (getChildren && buffer.GrandChildren != null) { foreach (var child in buffer.GrandChildren) { ProcessingIds.Add(child, cancellationToken); } } buffer = null; } } catch (OperationCanceledException e) { _log.Warn("Content migration operation was cancelled", e, this); break; } catch (Exception e) { _log.Error("error processing ids to gather remote content", e, this); } lock (_locker) { _processing--; if (_processing > 0 || ProcessingIds.Count != 0) { continue; } } Completed = true; ProcessingIds.CompleteAdding(); GatheredRemoteItems.CompleteAdding(); } }