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