コード例 #1
0
        internal static OperationStatus RegisterEvent(RemoteContentPullArgs args)
        {
            var ret = Guid.NewGuid().ToString();

            _operation[ret] = new OperationStatus(args, ret);
            return(_operation[ret]);
        }
コード例 #2
0
 public OperationStatus(RemoteContentPullArgs args, string operationId)
 {
     sw.Start();
     _args            = args;
     scDatastore      = new SitecoreDataStore(deserializer);
     this.OperationId = operationId;
     db = Factory.GetDatabase(args.database);
     tp = new CMThreadPool(this);
     Init();
     tp.Queue(GetNextItem, _args.id);
     for (int i = 0; i < ContentMigrationHandler.writerThreads; i++)
     {
         RunDatabaseWriterProcess();
     }
 }
コード例 #3
0
        public static IItemData GetRemoteItemData(RemoteContentPullArgs args, string itemId)
        {
            try
            {
                WebClient wc = new WebClient {
                    Encoding = Encoding.UTF8
                };
                string yamlList = wc.UploadString($"{args.server}/scs/cmcontenttreegetitem.scsvc", "POST",
                                                  args.GetSerializedData(itemId, false));
                string yaml      = JsonConvert.DeserializeObject <List <string> >(yamlList).FirstOrDefault();
                var    formatter = new YamlSerializationFormatter(null, null);
                if (yaml != null)
                {
                    using (var ms = new MemoryStream())
                    {
                        IItemData itemData = null;
                        try
                        {
                            var bytes = Encoding.UTF8.GetBytes(yaml);
                            ms.Write(bytes, 0, bytes.Length);

                            ms.Seek(0, SeekOrigin.Begin);
                            itemData = formatter.ReadSerializedItem(ms, itemId);
                            itemData.DatabaseName = args.database;
                        }
                        catch (Exception e)
                        {
                            Log.Error("Problem reading yaml from remote server", e, args);
                        }
                        if (itemData != null)
                        {
                            return(itemData);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Error getting remote item data for " + itemId, e, args);
            }
            return(null);
        }
コード例 #4
0
        private dynamic PullItem(HttpContextBase context)
        {
            var data = GetPostData(context);

            try
            {
                var args = new RemoteContentPullArgs(data);
                if (args.server != null)
                {
                    return(Puller.PullContentItem(args));
                }
            }
            catch (Exception ex)
            {
                Log.Error("Problem pulling item from remote server", ex, this);
                data.Error = "Problem pulling item from remote server\n\n" + ex;
                return(data);
            }
            return(true);
        }
コード例 #5
0
        private void InstallItem(RemoteContentPullArgs args, dynamic ret, string operationId, Database db, HashSet <Guid> allowedItems,
                                 IItemData idata)
        {
            bool exists = db.GetItem(new ID(idata.Id)) != null;

            if (!exists)
            {
                RecordEvent(ret, idata, "Insert", operationId);
                InstallItemData(idata, args, db);
                if (args.mirror)
                {
                    allowedItems.Remove(idata.Id);
                }
            }
            else if (args.overwrite)
            {
                RecordEvent(ret, idata, "Update", operationId);
                InstallItemData(idata, args, db);
                if (args.mirror)
                {
                    allowedItems.Remove(idata.Id);
                }
            }
        }
コード例 #6
0
        public dynamic PullContentItem(RemoteContentPullArgs args)
        {
            OperationStatus status = RegisterEvent(args);

            return(status.OperationId);
        }
コード例 #7
0
        public dynamic PullContentItem(RemoteContentPullArgs args)
        {
            string operationId = RegisterEvent();

            Task.Run(() =>
            {
                Stopwatch sw = Stopwatch.StartNew();
                dynamic ret  = new ExpandoObject();
                ret.Items    = 0;
                IEnumerable <IItemData> idataList = GetRemoteItemData(args);
                Database db = Factory.GetDatabase(args.database);

                string id = args.id;
                Item root = null;
                HashSet <Guid> allowedItems = new HashSet <Guid>();
                using (new BulkUpdateContext())
                {
                    using (new SecurityDisabler())
                    {
                        using (new EventDisabler())
                        {
                            if (args.mirror)
                            {
                                Stack <Item> items = new Stack <Item>();
                                items.Push(db.GetItem(new ID(idataList.First().Id)));
                                while (items.Any())
                                {
                                    var curItem = items.Pop();
                                    allowedItems.Add(curItem.ID.Guid);
                                    foreach (Item child in curItem.Children)
                                    {
                                        items.Push(child);
                                    }
                                }
                            }
                            ProcessItems(args, idataList, ret, operationId, root, db, allowedItems, id);
                            if (args.mirror)
                            {
                                foreach (Guid guid in allowedItems)
                                {
                                    Item item = db.GetItem(new ID(guid));
                                    if (item != null)
                                    {
                                        RecordEvent(ret, item.Name, item.ID.ToString(), item.Paths.FullPath, "Recycle", operationId);
                                        item.Recycle();
                                    }
                                }
                            }
                        }
                    }
                }
                ret.Time = sw.ElapsedMilliseconds / 1000;
                _operationLines[operationId].Add(ret);
                Task.Run(() =>
                {
                    Thread.Sleep(60000);
                    List <dynamic> outStuff;
                    _operationLines.TryRemove(operationId, out outStuff);
                });
            });
            return(operationId);
        }
コード例 #8
0
 private void InstallItemData(IItemData data, RemoteContentPullArgs args, Database db)
 {
     scDatastore.Save(data);
 }
コード例 #9
0
        private IEnumerable <IItemData> GetRemoteItemData(RemoteContentPullArgs args)
        {
            List <IItemData> ret      = new List <IItemData>();
            bool             children = args.children;

            args.children = false;
            Queue <string> pullableItems = new Queue <string>();
            WebClient      wc            = new WebClient {
                Encoding = Encoding.UTF8
            };

            pullableItems.Enqueue(args.id);
            while (pullableItems.Any())
            {
                string cur = pullableItems.Dequeue();
                args.id = cur;
                string yamlList = null;
                try
                {
                    yamlList = wc.UploadString($"{args.server}/scs/cmcontenttreegetitem.scsvc", "POST",
                                               args.GetSerializedData());
                }
                catch (Exception e)
                {
                    Log.Error("Problem reading remote server item data", e, this);
                }
                if (string.IsNullOrWhiteSpace(yamlList))
                {
                    yield return(new ErrorItemData()
                    {
                        Id = Guid.Parse(args.id), Path = "Problem reading remote server item data"
                    });

                    continue;
                }
                List <string> remoteItems = JsonConvert.DeserializeObject <List <string> >(yamlList);
                var           formatter   = new YamlSerializationFormatter(null, null);
                foreach (string yaml in remoteItems)
                {
                    using (var ms = new MemoryStream())
                    {
                        IItemData itemData = null;
                        try
                        {
                            var bytes = Encoding.UTF8.GetBytes(yaml);
                            ms.Write(bytes, 0, bytes.Length);

                            ms.Seek(0, SeekOrigin.Begin);
                            itemData = formatter.ReadSerializedItem(ms, args.id);
                            itemData.DatabaseName = args.database;
                        }
                        catch (Exception e)
                        {
                            Log.Error("Problem reading yaml from remote server", e, this);
                        }
                        if (itemData == null)
                        {
                            yield return(new ErrorItemData()
                            {
                                Id = Guid.Parse(args.id), Path = "Problem reading yaml from remote server"
                            });

                            continue;
                        }
                        yield return(itemData);
                    }
                }
                if (children)
                {
                    ContentTreeNode node = null;
                    try
                    {
                        node = JsonConvert.DeserializeObject <ContentTreeNode>(wc.UploadString($"{args.server}/scs/cmcontenttree.scsvc", "POST",
                                                                                               $@"{{ ""id"": ""{cur}"", ""database"": ""{args.database}"", ""server"": ""{args.server}"" }}"));
                        foreach (ContentTreeNode child in node.Nodes)
                        {
                            pullableItems.Enqueue(child.Id);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Error("Problem getting children of node " + cur, e, this);
                    }
                    if (node == null)
                    {
                        yield return new ErrorItemData()
                               {
                                   Id = Guid.Parse(cur), Path = "Problem getting children of node"
                               }
                    }
                    ;
                }
            }
        }
コード例 #10
0
        private void ProcessItems(RemoteContentPullArgs args, IEnumerable <IItemData> idataList, dynamic ret, string operationId, Item root,
                                  Database db, HashSet <Guid> allowedItems, string id)
        {
            foreach (IItemData idata in idataList)
            {
                try
                {
                    if (idata is ErrorItemData)
                    {
                        RecordEvent(ret, idata, "Error", operationId);
                        continue;
                    }
                    if (root == null)
                    {
                        root = db.GetItem(new ID(idata.Id));
                        Item      parent  = db.GetItem(new ID(idata.ParentId));
                        IItemData tmpData = idata;
                        if (args.pullParent && parent == null)
                        {
                            Stack <IItemData> path = new Stack <IItemData>();
                            args.children = false;
                            while (parent == null)
                            {
                                parent = db.GetItem(new ID(tmpData.ParentId));
                                path.Push(tmpData);
                                args.id = tmpData.ParentId.ToString();
                                tmpData = GetRemoteItemData(args).First();
                            }
                            while (path.Any())
                            {
                                var cur = path.Pop();
                                RecordEvent(ret, cur, "Insert", operationId);
                                InstallItemData(cur, args, db);
                                if (args.mirror)
                                {
                                    allowedItems.Remove(cur.Id);
                                }
                            }
                            args.id = id;
                        }
                    }
                    InstallItem(args, ret, operationId, db, allowedItems, idata);
                }
                catch (Exception e)
                {
                    Log.Error("problem deserializing sitecore data", e, this);
                    RecordEvent(ret, idata, "Error", operationId);
                    if (args.mirror)
                    {
                        Item         parent = db.GetItem(new ID(idata.ParentId));
                        Stack <Item> delrem = new Stack <Item>(parent.Children);

                        while (delrem.Any())
                        {
                            Item cur = delrem.Pop();
                            allowedItems.Remove(cur.ID.Guid);
                            foreach (Item child in cur.Children)
                            {
                                delrem.Push(child);
                            }
                        }
                    }
                }
            }
        }