using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Web.Routing;
namespace Umbraco.Web.Models
{
///
/// Represents an IPublishedContent which is created based on an Xml structure
///
[Serializable]
[XmlType(Namespace = "http://umbraco.org/webservices/")]
internal class XmlPublishedContent : PublishedContentBase
{
///
/// Constructor
///
///
public XmlPublishedContent(XmlNode xmlNode)
{
_pageXmlNode = xmlNode;
InitializeStructure();
Initialize();
}
///
/// Constructor
///
///
///
internal XmlPublishedContent(XmlNode xmlNode, bool disableInitializing)
{
_pageXmlNode = xmlNode;
InitializeStructure();
if (!disableInitializing)
Initialize();
}
private bool _initialized = false;
private readonly ICollection _children = new Collection();
private IPublishedContent _parent = null;
private int _id;
private int _template;
private string _name;
private string _docTypeAlias;
private int _docTypeId;
private string _writerName;
private string _creatorName;
private int _writerId;
private int _creatorId;
private string _urlName;
private string _path;
private DateTime _createDate;
private DateTime _updateDate;
private Guid _version;
private readonly Collection _properties = new Collection();
private readonly XmlNode _pageXmlNode;
private int _sortOrder;
private int _level;
public override IEnumerable Children
{
get
{
if (!_initialized)
Initialize();
return _children;
}
}
public override IPublishedContentProperty GetProperty(string alias)
{
return Properties.FirstOrDefault(x => x.Alias.InvariantEquals(alias));
}
///
/// returns 'Content' as the ItemType
///
public override PublishedItemType ItemType
{
get { return PublishedItemType.Content; }
}
public override IPublishedContent Parent
{
get
{
if (!_initialized)
Initialize();
return _parent;
}
}
public override int Id
{
get
{
if (!_initialized)
Initialize();
return _id;
}
}
public override int TemplateId
{
get
{
if (!_initialized)
Initialize();
return _template;
}
}
public override int SortOrder
{
get
{
if (!_initialized)
Initialize();
return _sortOrder;
}
}
public override string Name
{
get
{
if (!_initialized)
Initialize();
return _name;
}
}
public override string DocumentTypeAlias
{
get
{
if (!_initialized)
Initialize();
return _docTypeAlias;
}
}
public override int DocumentTypeId
{
get
{
if (!_initialized)
Initialize();
return _docTypeId;
}
}
public override string WriterName
{
get
{
if (!_initialized)
Initialize();
return _writerName;
}
}
public override string CreatorName
{
get
{
if (!_initialized)
Initialize();
return _creatorName;
}
}
public override int WriterId
{
get
{
if (!_initialized)
Initialize();
return _writerId;
}
}
public override int CreatorId
{
get
{
if (!_initialized)
Initialize();
return _creatorId;
}
}
public override string Path
{
get
{
if (!_initialized)
Initialize();
return _path;
}
}
public override DateTime CreateDate
{
get
{
if (!_initialized)
Initialize();
return _createDate;
}
}
public override DateTime UpdateDate
{
get
{
if (!_initialized)
Initialize();
return _updateDate;
}
}
public override Guid Version
{
get
{
if (!_initialized)
Initialize();
return _version;
}
}
public override string UrlName
{
get
{
if (!_initialized)
Initialize();
return _urlName;
}
}
public override int Level
{
get
{
if (!_initialized)
Initialize();
return _level;
}
}
public override ICollection Properties
{
get
{
if (!_initialized)
Initialize();
return _properties;
}
}
private void InitializeStructure()
{
// Load parent if it exists and is a node
if (_pageXmlNode != null && _pageXmlNode.SelectSingleNode("..") != null)
{
XmlNode parent = _pageXmlNode.SelectSingleNode("..");
if (parent != null && (parent.Name == "node" || (parent.Attributes != null && parent.Attributes.GetNamedItem("isDoc") != null)))
_parent = new XmlPublishedContent(parent, true);
}
}
private void Initialize()
{
if (_pageXmlNode != null)
{
_initialized = true;
if (_pageXmlNode.Attributes != null)
{
_id = int.Parse(_pageXmlNode.Attributes.GetNamedItem("id").Value);
if (_pageXmlNode.Attributes.GetNamedItem("template") != null)
_template = int.Parse(_pageXmlNode.Attributes.GetNamedItem("template").Value);
if (_pageXmlNode.Attributes.GetNamedItem("sortOrder") != null)
_sortOrder = int.Parse(_pageXmlNode.Attributes.GetNamedItem("sortOrder").Value);
if (_pageXmlNode.Attributes.GetNamedItem("nodeName") != null)
_name = _pageXmlNode.Attributes.GetNamedItem("nodeName").Value;
if (_pageXmlNode.Attributes.GetNamedItem("writerName") != null)
_writerName = _pageXmlNode.Attributes.GetNamedItem("writerName").Value;
if (_pageXmlNode.Attributes.GetNamedItem("urlName") != null)
_urlName = _pageXmlNode.Attributes.GetNamedItem("urlName").Value;
// Creatorname is new in 2.1, so published xml might not have it!
try
{
_creatorName = _pageXmlNode.Attributes.GetNamedItem("creatorName").Value;
}
catch
{
_creatorName = _writerName;
}
//Added the actual userID, as a user cannot be looked up via full name only...
if (_pageXmlNode.Attributes.GetNamedItem("creatorID") != null)
_creatorId = int.Parse(_pageXmlNode.Attributes.GetNamedItem("creatorID").Value);
if (_pageXmlNode.Attributes.GetNamedItem("writerID") != null)
_writerId = int.Parse(_pageXmlNode.Attributes.GetNamedItem("writerID").Value);
if (UmbracoSettings.UseLegacyXmlSchema)
{
if (_pageXmlNode.Attributes.GetNamedItem("nodeTypeAlias") != null)
_docTypeAlias = _pageXmlNode.Attributes.GetNamedItem("nodeTypeAlias").Value;
}
else
{
_docTypeAlias = _pageXmlNode.Name;
}
if (_pageXmlNode.Attributes.GetNamedItem("nodeType") != null)
_docTypeId = int.Parse(_pageXmlNode.Attributes.GetNamedItem("nodeType").Value);
if (_pageXmlNode.Attributes.GetNamedItem("path") != null)
_path = _pageXmlNode.Attributes.GetNamedItem("path").Value;
if (_pageXmlNode.Attributes.GetNamedItem("version") != null)
_version = new Guid(_pageXmlNode.Attributes.GetNamedItem("version").Value);
if (_pageXmlNode.Attributes.GetNamedItem("createDate") != null)
_createDate = DateTime.Parse(_pageXmlNode.Attributes.GetNamedItem("createDate").Value);
if (_pageXmlNode.Attributes.GetNamedItem("updateDate") != null)
_updateDate = DateTime.Parse(_pageXmlNode.Attributes.GetNamedItem("updateDate").Value);
if (_pageXmlNode.Attributes.GetNamedItem("level") != null)
_level = int.Parse(_pageXmlNode.Attributes.GetNamedItem("level").Value);
}
// load data
var dataXPath = UmbracoSettings.UseLegacyXmlSchema ? "data" : "* [not(@isDoc)]";
foreach (XmlNode n in _pageXmlNode.SelectNodes(dataXPath))
_properties.Add(new XmlPublishedContentProperty(n));
// load children
var childXPath = UmbracoSettings.UseLegacyXmlSchema ? "node" : "* [@isDoc]";
var nav = _pageXmlNode.CreateNavigator();
var expr = nav.Compile(childXPath);
expr.AddSort("@sortOrder", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
var iterator = nav.Select(expr);
while (iterator.MoveNext())
{
_children.Add(
new XmlPublishedContent(((IHasXmlNode)iterator.Current).GetNode(), true)
);
}
}
// else
// throw new ArgumentNullException("Node xml source is null");
}
}
}