Files
Umbraco-CMS/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicBackingItem.cs
agrath@gmail.com 1164ea3ab1 Fixed a bug where if the ContentType (DocumentType) tree was a different tree to the Content or Media (Node) tree then the datatype lookup could fail when retrieving a property recursively.
If GetProperty recursively walked up the content tree to the first node that defined the property and eventutally found it, and the NodeType[Alias] of the node it was found on was not a parent of the original content's node type, then the lookup would fail.
Changed DynamicBackingItem.GetProperty (and PropertyResult class) to return the Node/Context where the property is being returned from and used this context's NodeTypeAlias as the in the data type lookup.
2011-07-03 09:32:29 -12:00

447 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using umbraco.interfaces;
using umbraco.cms.businesslogic.media;
using umbraco.cms.businesslogic;
using umbraco.cms.businesslogic.property;
using umbraco.presentation.nodeFactory;
using System.Data;
namespace umbraco.MacroEngines
{
public class DynamicBackingItem
{
internal INode content;
internal ExamineBackedMedia media;
public DynamicBackingItemType Type;
public DynamicBackingItem(INode iNode)
{
this.content = iNode;
this.Type = DynamicBackingItemType.Content;
}
public DynamicBackingItem(ExamineBackedMedia media)
{
this.media = media;
this.Type = DynamicBackingItemType.Media;
}
public DynamicBackingItem(int Id)
{
NodeFactory.Node baseNode = new NodeFactory.Node(Id);
//todo: trace this with media
if (baseNode == null)
{
this.media = ExamineBackedMedia.GetUmbracoMedia(Id);
this.Type = DynamicBackingItemType.Media;
}
else
{
this.content = baseNode;
this.Type = DynamicBackingItemType.Content;
}
}
public DynamicBackingItem(CMSNode node)
{
this.content = (INode)node;
this.Type = DynamicBackingItemType.Content;
}
public bool IsNull()
{
return (content == null && media == null);
}
public List<DynamicBackingItem> ChildrenAsList
{
get
{
if (IsNull()) return null;
if (Type == DynamicBackingItemType.Content)
{
var children = content.ChildrenAsList;
if (children != null)
{
return children.ConvertAll(c => new DynamicBackingItem(c));
}
}
else
{
var children = media.ChildrenAsList.Value;
if (children != null)
{
return children.ToList().ConvertAll(m => new DynamicBackingItem(m));
}
}
return new List<DynamicBackingItem>();
}
}
public PropertyResult GetProperty(string alias)
{
if (IsNull()) return null;
if (Type == DynamicBackingItemType.Content)
{
return GetPropertyInternal(alias, content);
}
else
{
return GetPropertyInternal(alias, media);
}
}
private PropertyResult GetPropertyInternal(string alias, INode content)
{
bool propertyExists = false;
var prop = content.GetProperty(alias, out propertyExists);
if (prop != null)
{
return new PropertyResult(prop) { ContextAlias = content.NodeTypeAlias, ContextId = content.Id };
}
else
{
if (alias.Substring(0, 1).ToUpper() == alias.Substring(0, 1) && !propertyExists)
{
prop = content.GetProperty(alias.Substring(0, 1).ToLower() + alias.Substring((1)), out propertyExists);
if (prop != null)
{
return new PropertyResult(prop) { ContextAlias = content.NodeTypeAlias, ContextId = content.Id };
}
else
{
//reflect
object result = null;
try
{
result = content.GetType().InvokeMember(alias,
System.Reflection.BindingFlags.GetProperty |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic,
null,
content,
null);
}
catch (MissingMethodException)
{
}
if (result != null)
{
return new PropertyResult(alias, string.Format("{0}", result), Guid.Empty) { ContextAlias = content.NodeTypeAlias, ContextId = content.Id };
}
}
}
}
return null;
}
private PropertyResult GetPropertyInternal(string alias, ExamineBackedMedia content)
{
bool propertyExists = false;
var prop = content.GetProperty(alias, out propertyExists);
if (prop != null)
{
return new PropertyResult(prop) { ContextAlias = content.NodeTypeAlias, ContextId = content.Id };
}
else
{
if (alias.Substring(0, 1).ToUpper() == alias.Substring(0, 1) && !propertyExists)
{
prop = content.GetProperty(alias.Substring(0, 1).ToLower() + alias.Substring((1)), out propertyExists);
if (prop != null)
{
return new PropertyResult(prop) { ContextAlias = content.NodeTypeAlias, ContextId = content.Id };
}
else
{
object result = null;
try
{
result = content.GetType().InvokeMember(alias,
System.Reflection.BindingFlags.GetProperty |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic,
null,
content,
null);
}
catch (MissingMethodException)
{
}
if (result != null)
{
return new PropertyResult(alias, string.Format("{0}", result), Guid.Empty) { ContextAlias = content.NodeTypeAlias, ContextId = content.Id };
}
}
}
}
return null;
}
public PropertyResult GetProperty(string alias, out bool propertyExists)
{
if (IsNull())
{
propertyExists = false;
return null;
}
PropertyResult property = null;
IProperty innerProperty = null;
if (Type == DynamicBackingItemType.Content)
{
innerProperty = content.GetProperty(alias, out propertyExists);
if (innerProperty != null)
{
property = new PropertyResult(innerProperty);
property.ContextAlias = content.NodeTypeAlias;
property.ContextId = content.Id;
}
}
else
{
innerProperty = media.GetProperty(alias, out propertyExists);
if (innerProperty != null)
{
property = new PropertyResult(innerProperty);
property.ContextAlias = media.NodeTypeAlias;
property.ContextId = media.Id;
}
}
return property;
}
public PropertyResult GetProperty(string alias, bool recursive)
{
bool propertyExists = false;
return GetProperty(alias, recursive, out propertyExists);
}
public PropertyResult GetProperty(string alias, bool recursive, out bool propertyExists)
{
if (!recursive)
{
return GetProperty(alias, out propertyExists);
}
if (IsNull())
{
propertyExists = false;
return null;
}
DynamicBackingItem context = this;
PropertyResult prop = this.GetProperty(alias, out propertyExists);
while (prop == null || string.IsNullOrEmpty(prop.Value))
{
context = context.Parent;
if (context == null) break;
prop = context.GetProperty(alias, out propertyExists);
}
if (prop != null)
{
return prop;
}
return null;
}
public string GetPropertyValue(string alias)
{
var prop = GetProperty(alias);
if (prop != null) return prop.Value;
return null;
}
public string GetPropertyValue(string alias, bool recursive)
{
var prop = GetProperty(alias, recursive);
if (prop != null) return prop.Value;
return null;
}
public List<IProperty> PropertiesAsList
{
get
{
if (IsNull()) return null;
if (Type == DynamicBackingItemType.Content)
{
return content.PropertiesAsList;
}
else
{
return media.PropertiesAsList;
}
}
}
public DataTable ChildrenAsTable()
{
if (IsNull()) return null;
if (Type == DynamicBackingItemType.Content)
{
return content.ChildrenAsTable();
}
else
{
//sorry
return null;
}
}
public DataTable ChildrenAsTable(string nodeTypeAlias)
{
if (IsNull()) return null;
if (Type == DynamicBackingItemType.Content)
{
return content.ChildrenAsTable(nodeTypeAlias);
}
else
{
//sorry
return null;
}
}
public int Level
{
get { if (IsNull()) return 0; return Type == DynamicBackingItemType.Content ? content.Level : media.Level; }
}
public int Id
{
get { if (IsNull()) return 0; return Type == DynamicBackingItemType.Content ? content.Id : media.Id; }
}
public string NodeTypeAlias
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.NodeTypeAlias : media.NodeTypeAlias; }
}
public DynamicBackingItem Parent
{
get
{
if (IsNull()) return null;
if (Type == DynamicBackingItemType.Content)
{
var parent = content.Parent;
if (parent != null)
{
return new DynamicBackingItem(parent);
}
}
else
{
var parent = media.Parent;
if (parent != null && parent.Value != null)
{
return new DynamicBackingItem(parent.Value);
}
}
return null;
}
}
public DateTime CreateDate
{
get { if (IsNull()) return DateTime.MinValue; return Type == DynamicBackingItemType.Content ? content.CreateDate : media.CreateDate; }
}
public DateTime UpdateDate
{
get { if (IsNull()) return DateTime.MinValue; return Type == DynamicBackingItemType.Content ? content.UpdateDate : media.UpdateDate; }
}
public string WriterName
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.WriterName : null; }
}
public string Name
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.Name : media.Name; }
}
public string nodeName
{
get { return Name; }
}
public string pageName
{
get { return Name; }
}
public Guid Version
{
get { if (IsNull()) return Guid.Empty; return Type == DynamicBackingItemType.Content ? content.Version : media.Version; }
}
public string Url
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.Url : media.Url; }
}
public string NiceUrl
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.NiceUrl : media.NiceUrl; }
}
public string UrlName
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.UrlName : null; }
}
public int template
{
get { if (IsNull()) return 0; return Type == DynamicBackingItemType.Content ? content.template : 0; }
}
public int SortOrder
{
get { if (IsNull()) return 0; return Type == DynamicBackingItemType.Content ? content.SortOrder : media.SortOrder; }
}
public string CreatorName
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.CreatorName : media.CreatorName; }
}
public int WriterID
{
get { if (IsNull()) return 0; return Type == DynamicBackingItemType.Content ? content.WriterID : 0; }
}
public int CreatorID
{
get { if (IsNull()) return 0; return Type == DynamicBackingItemType.Content ? content.CreatorID : media.CreatorID; }
}
public string Path
{
get { if (IsNull()) return null; return Type == DynamicBackingItemType.Content ? content.Path : media.Path; }
}
public List<DynamicBackingItem> GetChildrenAsList
{
get
{
if (Type == DynamicBackingItemType.Content)
{
List<INode> children = content.ChildrenAsList;
//testing
if (children.Count == 0 && content.Id == 0)
{
return new List<DynamicBackingItem>(new DynamicBackingItem[] { this });
}
return children.ConvertAll(n => new DynamicBackingItem(n));
}
else
{
List<ExamineBackedMedia> children = media.ChildrenAsList.Value;
//testing
if (children.Count == 0 && content.Id == 0)
{
return new List<DynamicBackingItem>(new DynamicBackingItem[] { this });
}
return children.ConvertAll(n => new DynamicBackingItem(n));
}
}
}
}
}