/* public void WriteFile(string name, string data)
         * {
         *  var path = Path.Combine(_path, name);
         *
         *  using (var ms = new MemoryStream())
         *  {
         *      var bytes = Encoding.UTF8.GetBytes(data);
         *      ms.Write(bytes, 0, bytes.Length);
         *      ms.Position = 0;
         *      _fs.WriteFile(path, ms);
         *  }
         * } */

        public IImportRecord SyncItem(ReplicatedItem item)
        {
            lock (this)
            {
                try
                {
                    var reader   = new ItemXmlReader(_definitions, _activator, _persister.Repository);
                    var importer = new Importer(null, reader, null);

                    // TODO download
                    var ins    = _fs.OpenFile(item.Path, true);
                    var record = importer.Read(ins, item.Path);
                    if (record.RootItem != null)
                    {
                        ContentVersion.ReorderBySortOrderRecursive(record.RootItem);
                    }
                    return(record);
                }
                catch (Exception ex)
                {
                    _logger.Error(string.Format("IMPORT Error: {0} - {1}", item.ID, ex.Message), ex);
                    throw;
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// load all content item files into the memory cache
        /// </summary>
        private void LoadAll()
        {
            lock (this)
            {
                _logger.Info("Loading Xml Files");
                var reader    = new ItemXmlReader(definitions, activator, this);
                var persister = new ContentPersister(null /* what is the contentsource? */, this);
                var importer  = new Importer(persister, reader, null);

                var records = new List <IImportRecord>();
                var files   = Directory.GetFileSystemEntries(DataDirectoryPhysical, "c-*.xml");

                records.AddRange(from f in files select importer.Read(f));

                // resolve links
                var itemsByid = (from x in records.SelectMany(f => f.ReadItems)
                                 group x by x.ID
                                 into y
                                 select new { ID = y.Key, ContentItem = y.First() })
                                .ToLookup(f => f.ID);

                //var stillUnresolved = new List<UnresolvedLink>();
                foreach (var unresolvedLink in records.SelectMany(f => f.UnresolvedLinks))
                {
                    if (itemsByid.Contains(unresolvedLink.ReferencedItemID))
                    {
                        unresolvedLink.Setter(itemsByid[unresolvedLink.ReferencedItemID].First().ContentItem);
                    }
                    else
                    {
                        _logger.ErrorFormat("Unresolved on Load {0} -> {1}", unresolvedLink.Item.ID, unresolvedLink.ReferencedItemID);
                    }
                }
                //stillUnresolved.Add(unresolvedLink);

                foreach (var x in itemsByid.Select(f => f.First().ContentItem))
                {
                    ContentVersion.ReorderBySortOrderRecursive(x);
                    if (x.IsPage)
                    {
                        Database.Add(x.ID, x);
                    }
                }

                var root = AllContentPages.FirstOrDefault(i => i is IRootPage);
                if (root != null)
                {
                    ContentVersion.ReorderBySortOrderRecursive(root);
                }

                foreach (var item in Database.Values.Where(i => (i != root) && i.Parent == null).ToArray())
                {
                    _logger.Error("Missing Parent for " + item + " removing from memory and local copy");
                    Delete(item);
                }
            }
        }
Beispiel #3
0
        public override void SaveOrUpdate(ContentItem item)
        {
            if (_readonly)
            {
                throw new Exception("Repository is in read only mode");
            }

            try
            {
                lock (this)
                {
                    if (item.ID == 0)
                    {
                        if (Database.All(x => x.Value != item))
                        {
                            item.ID = Database.Count > 0 ? AllContentItems.Max(f => f.ID) + 1 : 1;
                        }
                    }

                    var old = Database.ContainsKey(item.ID) ? Database[item.ID] : null;
                    if (old != null && !System.Object.ReferenceEquals(old, item))
                    {
                        // ALTERNATIVE (old as IUpdatable<ContentItem>).UpdateFrom(item);
                        var oldParent = old.Parent;
                        if (oldParent != null)
                        {
                            _logger.InfoFormat("Removing old version of {0}:{1} from {2}:{3}", item.ID, GetContentItemName(item), oldParent.ID, GetContentItemName(oldParent));
                            old.AddTo(null);
                            item.AddTo(oldParent); // will be overridden by final run of unresolved links
                        }

                        var oldChildPageIds = old.Children.Where(i => i.IsPage).Select(i => i.ID).ToArray();
                        foreach (var oldChildPageId in oldChildPageIds)
                        {
                            if (Database.ContainsKey(oldChildPageId))
                            {
                                var oldChildPage = Database[oldChildPageId];
                                if (item.Children.Any(i => i.ID == oldChildPageId))
                                {
                                    var itemToRemove = item.Children.First(i => i.ID == oldChildPageId);
                                    item.Children.Remove(itemToRemove);
                                }

                                _logger.InfoFormat("Transfering children from old to new version of {0}:{1}", item.ID, GetContentItemName(item));
                                oldChildPage.AddTo(item);
                                old.Children.Remove(oldChildPage);
                            }
                            else
                            {
                                _logger.Error(string.Format("Unable to link child page {0} to item {1}.", oldChildPageId, item.ID));
                            }
                        }
                        ContentVersion.ReorderBySortOrderRecursive(item);
#if DEBUG
                        var oldChildren = old.Children.Select(c => c.ID).ToList();
                        var newChildren = item.Children.Select(c => c.ID).ToList();
                        if (!(newChildren.All(oldChildren.Contains) && oldChildren.All(newChildren.Contains)))
                        {
                            _logger.DebugFormat("Replacing data {0}  - children {1} -> {2}",
                                                item.ID, string.Join(",", oldChildren), string.Join(",", newChildren));
                        }
#endif
                        Delete(old);
                    }

                    _logger.DebugFormat("Adding or Replacing item {0}:{1}", item.ID, item.Name);
                    Database[item.ID] = item;

                    if (item.IsPage)
                    {
                        InternalDeleteFiles(GetPath(item, true));
                        var path = Path.Combine(DataDirectoryPhysical, GetPath(item));
                        _logger.InfoFormat("Creating file \"{0}\"", path);
                        XmlPersistenceUtility.SaveXml(exporter, item, path);
                    }
                    else if (item.Parent != null)
                    {
                        SaveOrUpdate(item.Parent); // TODO optimize multiple saves during import by creating a real xml transaction on the page level
                    }
                    else
                    {
                        throw new ArgumentException("Invalid item: not a page and parent = null");
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error("SaveOrUpdate failed on " + item, ex);
            }
        }