using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Models
{
[DebuggerDisplay("Tree - {Title} ({ApplicationAlias})")]
public class ApplicationTree
{
///
/// Initializes a new instance of the class.
///
public ApplicationTree() { }
///
/// Initializes a new instance of the class.
///
/// if set to true [initialize].
/// The sort order.
/// The application alias.
/// The tree alias.
/// The tree title.
/// The icon closed.
/// The icon opened.
/// The tree type.
public ApplicationTree(bool initialize, int sortOrder, string applicationAlias, string alias, string title, string iconClosed, string iconOpened, string type)
{
this.Initialize = initialize;
this.SortOrder = sortOrder;
this.ApplicationAlias = applicationAlias;
this.Alias = alias;
this.Title = title;
this.IconClosed = iconClosed;
this.IconOpened = iconOpened;
this.Type = type;
}
///
/// Gets or sets a value indicating whether this should initialize.
///
/// true if initialize; otherwise, false.
public bool Initialize { get; set; }
///
/// Gets or sets the sort order.
///
/// The sort order.
public int SortOrder { get; set; }
///
/// Gets the application alias.
///
/// The application alias.
public string ApplicationAlias { get; private set; }
///
/// Gets the tree alias.
///
/// The alias.
public string Alias { get; private set; }
///
/// Gets or sets the tree title.
///
/// The title.
public string Title { get; set; }
///
/// Gets or sets the icon closed.
///
/// The icon closed.
public string IconClosed { get; set; }
///
/// Gets or sets the icon opened.
///
/// The icon opened.
public string IconOpened { get; set; }
///
/// Gets or sets the tree type assembly name.
///
/// The type.
public string Type { get; set; }
private Type _runtimeType;
///
/// Returns the CLR type based on it's assembly name stored in the config
///
///
public Type GetRuntimeType()
{
if (_runtimeType != null)
return _runtimeType;
_runtimeType = TryGetType(Type);
return _runtimeType;
}
///
/// Used to try to get and cache the tree type
///
///
///
internal static Type TryGetType(string type)
{
try
{
return ResolvedTypes.GetOrAdd(type, s =>
{
var result = System.Type.GetType(type);
if (result != null)
{
return result;
}
//we need to implement a bit of a hack here due to some trees being renamed and backwards compat
var parts = type.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 2)
{
if (parts[1].Trim() == "umbraco" && parts[0].StartsWith("Umbraco.Web.Trees") && parts[0].EndsWith("Controller") == false)
{
//if it's one of our controllers but it's not suffixed with "Controller" then add it and try again
var tempType = parts[0] + "Controller, umbraco";
result = System.Type.GetType(tempType);
if (result != null)
{
return result;
}
}
}
throw new InvalidOperationException("Could not resolve type");
});
}
catch (InvalidOperationException)
{
//swallow, this is our own exception, couldn't find the type
return null;
}
}
private static readonly ConcurrentDictionary ResolvedTypes = new ConcurrentDictionary();
}
}