From 3da387591ddfb02b6fe39a74b0d8dd9781f12f07 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Fri, 17 Aug 2012 06:22:51 +0600 Subject: [PATCH] Deprecated many of the classes for Dynamics in the macro engines project and proxied these calls to the superceded classes. --- src/Umbraco.Core/Dynamics/DynamicXml.cs | 40 +- .../Dynamics/ExtensionMethodFinder.cs | 28 +- src/Umbraco.Core/Dynamics/ExtensionMethods.cs | 8 +- .../{Dynamics => }/HtmlTagWrapper.cs | 6 +- .../{Dynamics => }/HtmlTagWrapperBase.cs | 2 +- .../{Dynamics => }/HtmlTagWrapperTextNode.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 6 +- src/Umbraco.Tests/DynamicNodeTests.cs | 130 ++++- .../RazorDynamicNode/DynamicDictionary.cs | 29 +- .../RazorDynamicNode/DynamicNull.cs | 38 +- .../DynamicQueryableBinders.cs | 14 +- .../RazorDynamicNode/DynamicXml.cs | 481 ++++-------------- .../RazorDynamicNode/ExtensionMethodFinder.cs | 172 +------ .../RazorDynamicNode/ExtensionMethods.cs | 99 ++-- .../RazorDynamicNode/HtmlTagWrapper.cs | 5 + .../RazorDynamicNode/HtmlTagWrapperBase.cs | 2 + .../HtmlTagWrapperTextNode.cs | 2 + 17 files changed, 336 insertions(+), 728 deletions(-) rename src/Umbraco.Core/{Dynamics => }/HtmlTagWrapper.cs (95%) rename src/Umbraco.Core/{Dynamics => }/HtmlTagWrapperBase.cs (76%) rename src/Umbraco.Core/{Dynamics => }/HtmlTagWrapperTextNode.cs (87%) diff --git a/src/Umbraco.Core/Dynamics/DynamicXml.cs b/src/Umbraco.Core/Dynamics/DynamicXml.cs index bd359e4319..89055c517f 100644 --- a/src/Umbraco.Core/Dynamics/DynamicXml.cs +++ b/src/Umbraco.Core/Dynamics/DynamicXml.cs @@ -425,77 +425,77 @@ namespace Umbraco.Core.Dynamics public bool IsDescendant(DynamicXml other) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue, string valueIfFalse) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsDescendantOrSelf(DynamicXml other) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsAncestor(DynamicXml other) { var descendants = this.Descendants(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue) { var descendants = this.Descendants(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue, string valueIfFalse) { var descendants = this.Descendants(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsAncestorOrSelf(DynamicXml other) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } - public List Descendants() + public IEnumerable Descendants() { return Descendants(n => true); } - public List Descendants(Func func) + public IEnumerable Descendants(Func func) { var flattenedNodes = this.BaseElement.Elements().Map(func, (XElement n) => { return n.Elements(); }); return flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n)); } - public List DescendantsOrSelf() + public IEnumerable DescendantsOrSelf() { return DescendantsOrSelf(n => true); } - public List DescendantsOrSelf(Func func) + public IEnumerable DescendantsOrSelf(Func func) { var flattenedNodes = this.BaseElement.Elements().Map(func, (XElement n) => { return n.Elements(); }); var list = new List(); @@ -503,11 +503,11 @@ namespace Umbraco.Core.Dynamics list.AddRange(flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n))); return list; } - public List Ancestors() + public IEnumerable Ancestors() { return Ancestors(item => true); } - public List Ancestors(Func func) + public IEnumerable Ancestors(Func func) { List ancestorList = new List(); var node = this.BaseElement; @@ -538,11 +538,11 @@ namespace Umbraco.Core.Dynamics ancestorList.Reverse(); return ancestorList.ConvertAll(item => new DynamicXml(item)); } - public List AncestorsOrSelf() + public IEnumerable AncestorsOrSelf() { return AncestorsOrSelf(item => true); } - public List AncestorsOrSelf(Func func) + public IEnumerable AncestorsOrSelf(Func func) { List ancestorList = new List(); var node = this.BaseElement; diff --git a/src/Umbraco.Core/Dynamics/ExtensionMethodFinder.cs b/src/Umbraco.Core/Dynamics/ExtensionMethodFinder.cs index b0bfae0425..124366c077 100644 --- a/src/Umbraco.Core/Dynamics/ExtensionMethodFinder.cs +++ b/src/Umbraco.Core/Dynamics/ExtensionMethodFinder.cs @@ -11,6 +11,8 @@ namespace Umbraco.Core.Dynamics { internal static class ExtensionMethodFinder { + //TODO: This should be highly optimized!!! Calls to BuildManager.GetReferencedAssemblies() are really expensive! + private static List GetAllExtensionMethods(Type thisType, string name, int argumentCount, bool argsContainsThis) { //get extension methods from runtime @@ -40,16 +42,16 @@ namespace Umbraco.Core.Dynamics //find the right overload that can take genericParameterType //which will be either DynamicNodeList or List which is IEnumerable` - var withGenericParameterType = isGenericAndRightParamCount.Select(m => new { m, t = firstParameterType(m) }); + var withGenericParameterType = isGenericAndRightParamCount.Select(m => new { m, t = FirstParameterType(m) }); var methodsWhereArgZeroIsTargetType = (from method in withGenericParameterType where - method.t != null && methodArgZeroHasCorrectTargetType(method.m, method.t, thisType) + method.t != null && MethodArgZeroHasCorrectTargetType(method.m, method.t, thisType) select method); return methodsWhereArgZeroIsTargetType.Select(mt => mt.m).ToList(); } - private static bool methodArgZeroHasCorrectTargetType(MethodInfo method, Type firstArgumentType, Type thisType) + private static bool MethodArgZeroHasCorrectTargetType(MethodInfo method, Type firstArgumentType, Type thisType) { //This is done with seperate method calls because you can't debug/watch lamdas - if you're trying to figure //out why the wrong method is returned, it helps to be able to see each boolean result @@ -57,21 +59,21 @@ namespace Umbraco.Core.Dynamics return // is it defined on me? - methodArgZeroHasCorrectTargetType_TypeMatchesExactly(method, firstArgumentType, thisType) || + MethodArgZeroHasCorrectTargetTypeTypeMatchesExactly(method, firstArgumentType, thisType) || // or on any of my interfaces? - methodArgZeroHasCorrectTargetType_AnInterfaceMatches(method, firstArgumentType, thisType) || + MethodArgZeroHasCorrectTargetTypeAnInterfaceMatches(method, firstArgumentType, thisType) || // or on any of my base types? - methodArgZeroHasCorrectTargetType_IsASubclassOf(method, firstArgumentType, thisType) || + MethodArgZeroHasCorrectTargetTypeIsASubclassOf(method, firstArgumentType, thisType) || //share a common interface (e.g. IEnumerable) - methodArgZeroHasCorrectTargetType_ShareACommonInterface(method, firstArgumentType, thisType); + MethodArgZeroHasCorrectTargetTypeShareACommonInterface(method, firstArgumentType, thisType); } - private static bool methodArgZeroHasCorrectTargetType_ShareACommonInterface(MethodInfo method, Type firstArgumentType, Type thisType) + private static bool MethodArgZeroHasCorrectTargetTypeShareACommonInterface(MethodInfo method, Type firstArgumentType, Type thisType) { Type[] interfaces = firstArgumentType.GetInterfaces(); if (interfaces.Length == 0) @@ -82,27 +84,27 @@ namespace Umbraco.Core.Dynamics return result; } - private static bool methodArgZeroHasCorrectTargetType_IsASubclassOf(MethodInfo method, Type firstArgumentType, Type thisType) + private static bool MethodArgZeroHasCorrectTargetTypeIsASubclassOf(MethodInfo method, Type firstArgumentType, Type thisType) { bool result = thisType.IsSubclassOf(firstArgumentType); return result; } - private static bool methodArgZeroHasCorrectTargetType_AnInterfaceMatches(MethodInfo method, Type firstArgumentType, Type thisType) + private static bool MethodArgZeroHasCorrectTargetTypeAnInterfaceMatches(MethodInfo method, Type firstArgumentType, Type thisType) { bool result = thisType.GetInterfaces().Contains(firstArgumentType); return result; } - private static bool methodArgZeroHasCorrectTargetType_TypeMatchesExactly(MethodInfo method, Type firstArgumentType, Type thisType) + private static bool MethodArgZeroHasCorrectTargetTypeTypeMatchesExactly(MethodInfo method, Type firstArgumentType, Type thisType) { bool result = (thisType == firstArgumentType); return result; } - private static Type firstParameterType(MethodInfo m) + private static Type FirstParameterType(MethodInfo m) { ParameterInfo[] p = m.GetParameters(); - if (p.Count() > 0) + if (p.Any()) { return p.First().ParameterType; } diff --git a/src/Umbraco.Core/Dynamics/ExtensionMethods.cs b/src/Umbraco.Core/Dynamics/ExtensionMethods.cs index ee77a6bf29..ce394098e0 100644 --- a/src/Umbraco.Core/Dynamics/ExtensionMethods.cs +++ b/src/Umbraco.Core/Dynamics/ExtensionMethods.cs @@ -52,10 +52,10 @@ namespace Umbraco.Core.Dynamics return all.Items.OrderBy(x => Guid.NewGuid()).First(); } - public static bool ContainsAny(this string haystack, List needles) + public static bool ContainsAny(this string haystack, IEnumerable needles) { if (haystack == null) throw new ArgumentNullException("haystack"); - if (!string.IsNullOrEmpty(haystack) || needles.Count > 0) + if (!string.IsNullOrEmpty(haystack) || needles.Any()) { return needles.Any(haystack.Contains); } @@ -70,10 +70,10 @@ namespace Umbraco.Core.Dynamics } return false; } - public static bool ContainsAny(this string haystack, StringComparison comparison, List needles) + public static bool ContainsAny(this string haystack, StringComparison comparison, IEnumerable needles) { if (haystack == null) throw new ArgumentNullException("haystack"); - if (!string.IsNullOrEmpty(haystack) || needles.Count > 0) + if (!string.IsNullOrEmpty(haystack) || needles.Any()) { return needles.Any(value => haystack.IndexOf(value, comparison) >= 0); } diff --git a/src/Umbraco.Core/Dynamics/HtmlTagWrapper.cs b/src/Umbraco.Core/HtmlTagWrapper.cs similarity index 95% rename from src/Umbraco.Core/Dynamics/HtmlTagWrapper.cs rename to src/Umbraco.Core/HtmlTagWrapper.cs index 88f9bdc1be..9543f276c3 100644 --- a/src/Umbraco.Core/Dynamics/HtmlTagWrapper.cs +++ b/src/Umbraco.Core/HtmlTagWrapper.cs @@ -4,7 +4,7 @@ using System.Web.UI; using System.IO; using System.Web; -namespace Umbraco.Core.Dynamics +namespace Umbraco.Core { internal class HtmlTagWrapper : IHtmlTagWrapper, IHtmlString { @@ -44,9 +44,9 @@ namespace Umbraco.Core.Dynamics public string Tag; public bool Visible; - public HtmlTagWrapper(string Tag) + public HtmlTagWrapper(string tag) { - this.Tag = Tag; + this.Tag = tag; this.Children = new List(); this.CssClasses = new List(); this.Attributes = new List>(); diff --git a/src/Umbraco.Core/Dynamics/HtmlTagWrapperBase.cs b/src/Umbraco.Core/HtmlTagWrapperBase.cs similarity index 76% rename from src/Umbraco.Core/Dynamics/HtmlTagWrapperBase.cs rename to src/Umbraco.Core/HtmlTagWrapperBase.cs index b744a99f19..c6c3172708 100644 --- a/src/Umbraco.Core/Dynamics/HtmlTagWrapperBase.cs +++ b/src/Umbraco.Core/HtmlTagWrapperBase.cs @@ -1,6 +1,6 @@ using System.Web.UI; -namespace Umbraco.Core.Dynamics +namespace Umbraco.Core { internal interface IHtmlTagWrapper { diff --git a/src/Umbraco.Core/Dynamics/HtmlTagWrapperTextNode.cs b/src/Umbraco.Core/HtmlTagWrapperTextNode.cs similarity index 87% rename from src/Umbraco.Core/Dynamics/HtmlTagWrapperTextNode.cs rename to src/Umbraco.Core/HtmlTagWrapperTextNode.cs index 37e1f9a6e7..f70fd3e577 100644 --- a/src/Umbraco.Core/Dynamics/HtmlTagWrapperTextNode.cs +++ b/src/Umbraco.Core/HtmlTagWrapperTextNode.cs @@ -1,4 +1,4 @@ -namespace Umbraco.Core.Dynamics +namespace Umbraco.Core { internal class HtmlTagWrapperTextNode : IHtmlTagWrapper { diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9daa0b809d..047e795895 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -82,9 +82,9 @@ - - - + + + diff --git a/src/Umbraco.Tests/DynamicNodeTests.cs b/src/Umbraco.Tests/DynamicNodeTests.cs index 9634f6ce3f..d5c7883cc5 100644 --- a/src/Umbraco.Tests/DynamicNodeTests.cs +++ b/src/Umbraco.Tests/DynamicNodeTests.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -38,7 +39,7 @@ namespace Umbraco.Tests var childrenAsList = asDynamic.ChildrenAsList; //test ChildrenAsList too Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(childrenAsList)); - var castChildren = (IEnumerable) children; + var castChildren = (IEnumerable)children; Assert.AreEqual(2, castChildren.Count()); var castChildrenAsList = (IEnumerable)childrenAsList; @@ -51,11 +52,11 @@ namespace Umbraco.Tests var dynamicNode = GetDynamicNode(1173); var asDynamic = dynamicNode.AsDynamic(); - var aos = asDynamic.AncestorOrSelf(); + var result = asDynamic.AncestorOrSelf(); - Assert.IsNotNull(aos); + Assert.IsNotNull(result); - Assert.AreEqual(1046, aos.Id); + Assert.AreEqual(1046, result.Id); } [Test] @@ -64,13 +65,128 @@ namespace Umbraco.Tests var dynamicNode = GetDynamicNode(1174); var asDynamic = dynamicNode.AsDynamic(); - var aos = asDynamic.AncestorsOrSelf(); + var result = asDynamic.AncestorsOrSelf(); - Assert.IsNotNull(aos); + Assert.IsNotNull(result); - var list = (IEnumerable) aos; + var list = (IEnumerable)result; Assert.AreEqual(3, list.Count()); Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1174, 1173, 1046 })); } + + [Test] + public void Ancestors() + { + var dynamicNode = GetDynamicNode(1174); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.Ancestors(); + + Assert.IsNotNull(result); + + var list = (IEnumerable)result; + Assert.AreEqual(2, list.Count()); + Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1173, 1046 })); + } + + [Test] + public void Descendants_Or_Self() + { + var dynamicNode = GetDynamicNode(1046); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.DescendantsOrSelf(); + + Assert.IsNotNull(result); + + var list = (IEnumerable)result; + Assert.AreEqual(5, list.Count()); + Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1046, 1173, 1174, 1176, 1175 })); + } + + [Test] + public void Descendants() + { + var dynamicNode = GetDynamicNode(1046); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.Descendants(); + + Assert.IsNotNull(result); + + var list = (IEnumerable)result; + Assert.AreEqual(4, list.Count()); + Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1173, 1174, 1176, 1175 })); + } + + [Test] + public void Up() + { + var dynamicNode = GetDynamicNode(1173); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.Up(); + + Assert.IsNotNull(result); + + Assert.AreEqual(1046, result.Id); + } + + [Test] + public void Down() + { + var dynamicNode = GetDynamicNode(1173); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.Down(); + + Assert.IsNotNull(result); + + Assert.AreEqual(1174, result.Id); + } + + [Test] + public void Next() + { + var dynamicNode = GetDynamicNode(1173); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.Next(); + + Assert.IsNotNull(result); + + Assert.AreEqual(1175, result.Id); + } + + [Test] + public void Next_Without_Sibling() + { + var dynamicNode = GetDynamicNode(1176); + var asDynamic = dynamicNode.AsDynamic(); + + Assert.IsNull(asDynamic.Next()); + } + + [Test] + public void Previous_Without_Sibling() + { + var dynamicNode = GetDynamicNode(1173); + var asDynamic = dynamicNode.AsDynamic(); + + Assert.IsNull(asDynamic.Previous()); + } + + [Test] + public void Previous() + { + var dynamicNode = GetDynamicNode(1176); + var asDynamic = dynamicNode.AsDynamic(); + + var result = asDynamic.Previous(); + + Assert.IsNotNull(result); + + Assert.AreEqual(1174, result.Id); + } } } \ No newline at end of file diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicDictionary.cs b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicDictionary.cs index dfe85bb561..1257149399 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicDictionary.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicDictionary.cs @@ -6,36 +6,23 @@ using System.Dynamic; namespace umbraco.MacroEngines { + + [Obsolete("This class has been superceded by Umbraco.Core.Dynamics.DynamicDictionary")] public class DynamicDictionary : DynamicObject - { - Dictionary _dictionary; + { + private readonly Umbraco.Core.Dynamics.DynamicDictionary _internal; + public DynamicDictionary(Dictionary sourceItems) { - _dictionary = sourceItems; + _internal = new Umbraco.Core.Dynamics.DynamicDictionary(sourceItems); } public override bool TrySetMember(SetMemberBinder binder, object value) { - if (_dictionary.ContainsKey(binder.Name)) - { - _dictionary[binder.Name.ToLower()] = value; - } - else - { - _dictionary.Add(binder.Name.ToLower(), value); - } - return true; + return _internal.TrySetMember(binder, value); } public override bool TryGetMember(GetMemberBinder binder, out object result) { - if (_dictionary != null) - { - if (_dictionary.TryGetValue(binder.Name.ToLower(), out result)) - { - return true; - } - } - result = null; - return true; + return _internal.TryGetMember(binder, out result); } } } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNull.cs b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNull.cs index ea5a5d3239..30f0d761b0 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNull.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNull.cs @@ -13,11 +13,14 @@ namespace umbraco.MacroEngines //Because it's IEnumerable, if the user is actually trying @Model.TextPages or similar //it will still return an enumerable object (assuming the call actually failed because there were no children of that type) //but in .Where, if they use a property that doesn't exist, the lambda will bypass this and return false - public class DynamicNull : DynamicObject, IEnumerable, IHtmlString - { + [Obsolete("This class has been superceded by Umbraco.Core.Dynamics.DynamicNull")] + public class DynamicNull : DynamicObject, IEnumerable, IHtmlString + { + private readonly Umbraco.Core.Dynamics.DynamicNull _inner = new Umbraco.Core.Dynamics.DynamicNull(); + public IEnumerator GetEnumerator() { - return (new List()).GetEnumerator(); + return _inner.GetEnumerator(); } public DynamicNull Where(string predicate, params object[] values) { @@ -29,48 +32,39 @@ namespace umbraco.MacroEngines } public int Count() { - return 0; + return _inner.Count(); } public override string ToString() { - return string.Empty; + return _inner.ToString(); } public override bool TryGetMember(GetMemberBinder binder, out object result) { - result = this; - return true; + return _inner.TryGetMember(binder, out result); } public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { - result = this; - return true; + return _inner.TryGetIndex(binder, indexes, out result); } public override bool TryInvoke(InvokeBinder binder, object[] args, out object result) { - result = this; - return true; + return _inner.TryInvoke(binder, args, out result); } public bool IsNull() { - return true; + return _inner.IsNull(); } public bool HasValue() { - return false; + return _inner.HasValue(); } public string Name { - get - { - return string.Empty; - } + get { return _inner.Name; } } public int Id { - get - { - return 0; - } + get { return _inner.Id; } } public static implicit operator bool(DynamicNull n) @@ -92,7 +86,7 @@ namespace umbraco.MacroEngines public string ToHtmlString() { - return string.Empty; + return _inner.ToHtmlString(); } } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicQueryableBinders.cs b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicQueryableBinders.cs index f95c62dc82..ca907a2a82 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicQueryableBinders.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicQueryableBinders.cs @@ -6,13 +6,21 @@ using System.Dynamic; namespace umbraco.MacroEngines { + + [Obsolete("This class has been superceded by Umbraco.Core.Dynamics.DynamicQueryableGetMemberBinder")] public class DynamicQueryableGetMemberBinder : GetMemberBinder - { - public DynamicQueryableGetMemberBinder(string name, bool ignoreCase) : base(name, ignoreCase) { } + { + private readonly Umbraco.Core.Dynamics.DynamicQueryableGetMemberBinder _inner; + + public DynamicQueryableGetMemberBinder(string name, bool ignoreCase) + : base(name, ignoreCase) + { + _inner = new Umbraco.Core.Dynamics.DynamicQueryableGetMemberBinder(name, ignoreCase); + } public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { - throw new NotImplementedException(); + return _inner.FallbackGetMember(target, errorSuggestion); } } } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicXml.cs b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicXml.cs index f807b3a274..4b29a3dcb6 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicXml.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicXml.cs @@ -11,156 +11,55 @@ using System.Web; namespace umbraco.MacroEngines { + + [Obsolete("This class has been superceded by Umbraco.Core.Dynamics.DynamicXml")] public class DynamicXml : DynamicObject, IEnumerable - { - public XElement BaseElement { get; set; } + { + private readonly Umbraco.Core.Dynamics.DynamicXml _inner; + + public XElement BaseElement + { + get { return _inner.BaseElement; } + set { _inner.BaseElement = value; } + } public DynamicXml(XElement baseElement) { - this.BaseElement = baseElement; + _inner = new Umbraco.Core.Dynamics.DynamicXml(baseElement); } public DynamicXml(string xml) { - var baseElement = XElement.Parse(xml); - this.BaseElement = baseElement; + _inner = new Umbraco.Core.Dynamics.DynamicXml(xml); } public DynamicXml(XPathNodeIterator xpni) { - if (xpni != null) - { - if (xpni.Current != null) - { - var xml = xpni.Current.OuterXml; - var baseElement = XElement.Parse(xml); - this.BaseElement = baseElement; - } - } + _inner = new Umbraco.Core.Dynamics.DynamicXml(xpni); } public string InnerText { - get - { - return BaseElement.Value; - } + get { return _inner.InnerText; } } public string ToXml() { - return BaseElement.ToString(SaveOptions.DisableFormatting); + return _inner.ToXml(); } public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { - int index = 0; - if (indexes.Length > 0) - { - index = (int)indexes[0]; - result = new DynamicXml(this.BaseElement.Elements().ToList()[index]); - return true; - } - return base.TryGetIndex(binder, indexes, out result); + return _inner.TryGetIndex(binder, indexes, out result); } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { - if (args.Length == 0 && binder.Name == "ToXml") - { - result = this.BaseElement.ToString(); - return true; - } - if (args.Length == 1 && binder.Name == "XPath") - { - var elements = this.BaseElement.XPathSelectElements(args[0].ToString()); - HandleIEnumerableXElement(elements, out result); - return true; //anyway - } - return base.TryInvokeMember(binder, args, out result); + return _inner.TryInvokeMember(binder, args, out result); } public override bool TryGetMember(GetMemberBinder binder, out object result) { - if (BaseElement == null || binder == null) - { - result = null; - return false; - } - //Go ahead and try to fetch all of the elements matching the member name, and wrap them - var elements = BaseElement.Elements(binder.Name); - if (elements.Count() == 0 && BaseElement.Name == "root" && BaseElement.Elements().Count() == 1) - { - //no elements matched, lets try first child - elements = BaseElement.Elements().ElementAt(0).Elements(binder.Name); - } - if (HandleIEnumerableXElement(elements, out result)) - { - return true; - } - else - { - - //Ok, so no elements matched, so lets try attributes - IEnumerable attributes = BaseElement.Attributes(binder.Name).Select(attr => attr.Value); - int count = attributes.Count(); - - if (count > 0) - { - if (count > 1) - result = attributes; //more than one attribute matched, lets return the collection - else - result = attributes.FirstOrDefault(); //only one attribute matched, lets just return it - - return true; // return true because we matched - } - else - { - //no attributes matched, lets try first child - if (BaseElement.Name == "root" && BaseElement.Elements().Count() == 1) - { - attributes = BaseElement.Elements().ElementAt(0).Attributes(binder.Name).Select(attr => attr.Value); - count = attributes.Count(); - if (count > 1) - result = attributes; //more than one attribute matched, lets return the collection - else - result = attributes.FirstOrDefault(); //only one attribute matched, lets just return it - - return true; // return true because we matched - } - } - } - return base.TryGetMember(binder, out result); + return _inner.TryGetMember(binder, out result); } - private bool HandleIEnumerableXElement(IEnumerable elements, out object result) - { - //Get the count now, so we don't have to call it twice - int count = elements.Count(); - if (count > 0) - { - var firstElement = elements.FirstOrDefault(); - //we have a single element, does it have any children? - if (firstElement != null && firstElement.Elements().Count() == 0 && !firstElement.HasAttributes) - { - //no, return the text - result = firstElement.Value; - return true; - } - else - { - //We have more than one matching element, so let's return the collection - //elements is IEnumerable - //but we want to be able to re-enter this code - XElement root = new XElement(XName.Get("root")); - root.Add(elements); - result = new DynamicXml(root); - - //From here, you'll either end up back here (because you have ) - //or you use [] indexing and you end up with a single element - return true; - } - } - result = null; - return false; - } public DynamicXml XPath(string expression) { - var matched = this.BaseElement.XPathSelectElements(expression); - DynamicXml root = new DynamicXml(""); + var matched = _inner.BaseElement.XPathSelectElements(expression); + var root = new DynamicXml(""); foreach (var element in matched) { root.BaseElement.Add(element); @@ -169,427 +68,267 @@ namespace umbraco.MacroEngines } public IHtmlString ToHtml() { - return new HtmlString(this.ToXml()); + return _inner.ToHtml(); } public DynamicXml Find(string expression) { - return new DynamicXml(this.BaseElement.XPathSelectElements(expression).FirstOrDefault()); + return new DynamicXml(_inner.BaseElement.XPathSelectElements(expression).FirstOrDefault()); } public DynamicXml Find(string attributeName, object value) { string expression = string.Format("//*[{0}='{1}']", attributeName, value); - return new DynamicXml(this.BaseElement.XPathSelectElements(expression).FirstOrDefault()); + return new DynamicXml(_inner.BaseElement.XPathSelectElements(expression).FirstOrDefault()); } public IEnumerator GetEnumerator() { - return this.BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator(); + return _inner.GetEnumerator(); } public int Count() { - return this.BaseElement.Elements().Count(); + return _inner.Count(); } public bool IsNull() { - return false; + return _inner.IsNull(); } public bool HasValue() { - return true; + return _inner.HasValue(); } public bool IsFirst() { - return IsHelper(n => n.Index() == 0); + return _inner.IsFirst(); } public HtmlString IsFirst(string valueIfTrue) { - return IsHelper(n => n.Index() == 0, valueIfTrue); + return _inner.IsFirst(valueIfTrue); } public HtmlString IsFirst(string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.Index() == 0, valueIfTrue, valueIfFalse); + return _inner.IsFirst(valueIfTrue, valueIfFalse); } public bool IsNotFirst() { - return !IsHelper(n => n.Index() == 0); + return _inner.IsNotFirst(); } public HtmlString IsNotFirst(string valueIfTrue) { - return IsHelper(n => n.Index() != 0, valueIfTrue); + return _inner.IsNotFirst(valueIfTrue); } public HtmlString IsNotFirst(string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.Index() != 0, valueIfTrue, valueIfFalse); + return _inner.IsNotFirst(valueIfTrue, valueIfFalse); } public bool IsPosition(int index) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return false; - } - return IsHelper(n => n.Index() == index); + return _inner.IsPosition(index); } public HtmlString IsPosition(int index, string valueIfTrue) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(string.Empty); - } - return IsHelper(n => n.Index() == index, valueIfTrue); + return _inner.IsPosition(index, valueIfTrue); } public HtmlString IsPosition(int index, string valueIfTrue, string valueIfFalse) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(valueIfFalse); - } - return IsHelper(n => n.Index() == index, valueIfTrue, valueIfFalse); + return _inner.IsPosition(index, valueIfTrue, valueIfFalse); } public bool IsModZero(int modulus) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return false; - } - return IsHelper(n => n.Index() % modulus == 0); + return _inner.IsModZero(modulus); } public HtmlString IsModZero(int modulus, string valueIfTrue) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(string.Empty); - } - return IsHelper(n => n.Index() % modulus == 0, valueIfTrue); + return _inner.IsModZero(modulus, valueIfTrue); } public HtmlString IsModZero(int modulus, string valueIfTrue, string valueIfFalse) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(valueIfFalse); - } - return IsHelper(n => n.Index() % modulus == 0, valueIfTrue, valueIfFalse); + return _inner.IsModZero(modulus, valueIfTrue, valueIfFalse); } public bool IsNotModZero(int modulus) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return false; - } - return IsHelper(n => n.Index() % modulus != 0); + return _inner.IsNotModZero(modulus); } public HtmlString IsNotModZero(int modulus, string valueIfTrue) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(string.Empty); - } - return IsHelper(n => n.Index() % modulus != 0, valueIfTrue); + return _inner.IsNotModZero(modulus, valueIfTrue); } public HtmlString IsNotModZero(int modulus, string valueIfTrue, string valueIfFalse) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(valueIfFalse); - } - return IsHelper(n => n.Index() % modulus != 0, valueIfTrue, valueIfFalse); + return _inner.IsNotModZero(modulus, valueIfTrue, valueIfFalse); } public bool IsNotPosition(int index) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return false; - } - return !IsHelper(n => n.Index() == index); + return _inner.IsNotPosition(index); } public HtmlString IsNotPosition(int index, string valueIfTrue) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(string.Empty); - } - return IsHelper(n => n.Index() != index, valueIfTrue); + return _inner.IsNotPosition(index, valueIfTrue); } public HtmlString IsNotPosition(int index, string valueIfTrue, string valueIfFalse) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(valueIfFalse); - } - return IsHelper(n => n.Index() != index, valueIfTrue, valueIfFalse); + return _inner.IsNotPosition(index, valueIfTrue); } public bool IsLast() { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return false; - } - int count = this.BaseElement.Parent.Elements().Count(); - return IsHelper(n => n.Index() == count - 1); + return _inner.IsLast(); } public HtmlString IsLast(string valueIfTrue) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(string.Empty); - } - int count = this.BaseElement.Parent.Elements().Count(); - return IsHelper(n => n.Index() == count - 1, valueIfTrue); + return _inner.IsLast(valueIfTrue); } public HtmlString IsLast(string valueIfTrue, string valueIfFalse) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(valueIfFalse); - } - int count = this.BaseElement.Parent.Elements().Count(); - return IsHelper(n => n.Index() == count - 1, valueIfTrue, valueIfFalse); + return _inner.IsLast(valueIfTrue, valueIfFalse); } public bool IsNotLast() { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return false; - } - int count = this.BaseElement.Parent.Elements().Count(); - return !IsHelper(n => n.Index() == count - 1); + return _inner.IsNotLast(); } public HtmlString IsNotLast(string valueIfTrue) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(string.Empty); - } - int count = this.BaseElement.Parent.Elements().Count(); - return IsHelper(n => n.Index() != count - 1, valueIfTrue); + return _inner.IsNotLast(valueIfTrue); } public HtmlString IsNotLast(string valueIfTrue, string valueIfFalse) { - if (this.BaseElement == null || this.BaseElement.Parent == null) - { - return new HtmlString(valueIfFalse); - } - int count = this.BaseElement.Parent.Elements().Count(); - return IsHelper(n => n.Index() != count - 1, valueIfTrue, valueIfFalse); + return _inner.IsNotLast(valueIfTrue, valueIfFalse); } public bool IsEven() { - return IsHelper(n => n.Index() % 2 == 0); + return _inner.IsEven(); } public HtmlString IsEven(string valueIfTrue) { - return IsHelper(n => n.Index() % 2 == 0, valueIfTrue); + return _inner.IsEven(valueIfTrue); } public HtmlString IsEven(string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.Index() % 2 == 0, valueIfTrue, valueIfFalse); + return _inner.IsEven(valueIfTrue, valueIfFalse); } public bool IsOdd() { - return IsHelper(n => n.Index() % 2 == 1); + return _inner.IsOdd(); } public HtmlString IsOdd(string valueIfTrue) { - return IsHelper(n => n.Index() % 2 == 1, valueIfTrue); + return _inner.IsOdd(valueIfTrue); } public HtmlString IsOdd(string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.Index() % 2 == 1, valueIfTrue, valueIfFalse); + return _inner.IsOdd(valueIfTrue, valueIfFalse); } + public bool IsEqual(DynamicXml other) { - return IsHelper(n => n.BaseElement == other.BaseElement); + return _inner.IsEqual(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement)); } public HtmlString IsEqual(DynamicXml other, string valueIfTrue) { - return IsHelper(n => n.BaseElement == other.BaseElement, valueIfTrue); + return _inner.IsEqual(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue); } public HtmlString IsEqual(DynamicXml other, string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.BaseElement == other.BaseElement, valueIfTrue, valueIfFalse); + return _inner.IsEqual(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue, valueIfFalse); } public bool IsNotEqual(DynamicXml other) { - return IsHelper(n => n.BaseElement != other.BaseElement); + return _inner.IsNotEqual(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement)); } public HtmlString IsNotEqual(DynamicXml other, string valueIfTrue) { - return IsHelper(n => n.BaseElement != other.BaseElement, valueIfTrue); + return _inner.IsNotEqual(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue); } public HtmlString IsNotEqual(DynamicXml other, string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.BaseElement != other.BaseElement, valueIfTrue, valueIfFalse); + return _inner.IsNotEqual(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue, valueIfFalse); } public bool IsDescendant(DynamicXml other) { - var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null); + return _inner.IsDescendant(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement)); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue) { - var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); + return _inner.IsDescendant(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue, string valueIfFalse) { - var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return _inner.IsDescendant(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue, valueIfFalse); } public bool IsDescendantOrSelf(DynamicXml other) { - var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null); + return _inner.IsDescendantOrSelf(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement)); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue) { - var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); + return _inner.IsDescendantOrSelf(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { - var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.Find(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return _inner.IsDescendantOrSelf(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue, valueIfFalse); } public bool IsAncestor(DynamicXml other) { - var descendants = this.Descendants(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null); + return _inner.IsAncestor(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement)); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue) { - var descendants = this.Descendants(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); + return _inner.IsAncestor(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue, string valueIfFalse) { - var descendants = this.Descendants(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return _inner.IsAncestor(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue, valueIfFalse); } public bool IsAncestorOrSelf(DynamicXml other) { - var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null); + return _inner.IsAncestorOrSelf(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement)); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue) { - var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); + return _inner.IsAncestorOrSelf(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { - var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.Find(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return _inner.IsAncestorOrSelf(new Umbraco.Core.Dynamics.DynamicXml(other.BaseElement), valueIfTrue, valueIfFalse); } public List Descendants() { - return Descendants(n => true); + return _inner.Descendants().Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List Descendants(Func func) { - var flattenedNodes = this.BaseElement.Elements().Map(func, (XElement n) => { return n.Elements(); }); - return flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n)); + return _inner.Descendants(func).Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List DescendantsOrSelf() { - return DescendantsOrSelf(n => true); + return _inner.DescendantsOrSelf().Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List DescendantsOrSelf(Func func) { - var flattenedNodes = this.BaseElement.Elements().Map(func, (XElement n) => { return n.Elements(); }); - var list = new List(); - list.Add(this); - list.AddRange(flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n))); - return list; + return _inner.DescendantsOrSelf(func).Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List Ancestors() { - return Ancestors(item => true); + return _inner.Ancestors().Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List Ancestors(Func func) { - List ancestorList = new List(); - var node = this.BaseElement; - while (node != null) - { - if (node.Parent == null) break; - XElement parent = node.Parent; - if (parent != null) - { - if (this.BaseElement != parent) - { - node = parent; - if (func(node)) - { - ancestorList.Add(node); - } - } - else - { - break; - } - } - else - { - break; - } - } - ancestorList.Reverse(); - return ancestorList.ConvertAll(item => new DynamicXml(item)); + return _inner.Ancestors(func).Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List AncestorsOrSelf() { - return AncestorsOrSelf(item => true); + return _inner.AncestorsOrSelf().Select(x => new DynamicXml(x.BaseElement)).ToList(); } public List AncestorsOrSelf(Func func) { - List ancestorList = new List(); - var node = this.BaseElement; - ancestorList.Add(node); - while (node != null) - { - if (node.Parent == null) break; - XElement parent = node.Parent; - if (parent != null) - { - if (this.BaseElement != parent) - { - node = parent; - if (func(node)) - { - ancestorList.Add(node); - } - } - else - { - break; - } - } - else - { - break; - } - } - ancestorList.Reverse(); - return ancestorList.ConvertAll(item => new DynamicXml(item)); + return _inner.AncestorsOrSelf(func).Select(x => new DynamicXml(x.BaseElement)).ToList(); } public int Index() { - if (this.BaseElement != null && this.BaseElement.Parent != null) - { - var elements = this.BaseElement.Parent.Elements(); - int index = 0; - foreach (var element in elements) - { - if (element == this.BaseElement) break; - index++; - } - return index; - } - return 0; + return _inner.Index(); } public bool IsHelper(Func test) @@ -607,55 +346,7 @@ namespace umbraco.MacroEngines public static string StripDashesInElementOrAttributeNames(string xml) { - using (MemoryStream outputms = new MemoryStream()) - { - using (TextWriter outputtw = new StreamWriter(outputms)) - { - using (MemoryStream ms = new MemoryStream()) - { - using (TextWriter tw = new StreamWriter(ms)) - { - tw.Write(xml); - tw.Flush(); - ms.Position = 0; - using (TextReader tr = new StreamReader(ms)) - { - bool IsInsideElement = false, IsInsideQuotes = false; - int ic = 0; - while ((ic = tr.Read()) != -1) - { - if (ic == (int)'<' && !IsInsideQuotes) - { - if (tr.Peek() != (int)'!') - { - IsInsideElement = true; - } - } - if (ic == (int)'>' && !IsInsideQuotes) - { - IsInsideElement = false; - } - if (ic == (int)'"') - { - IsInsideQuotes = !IsInsideQuotes; - } - if (!IsInsideElement || ic != (int)'-' || IsInsideQuotes) - { - outputtw.Write((char)ic); - } - } - - } - } - } - outputtw.Flush(); - outputms.Position = 0; - using (TextReader outputtr = new StreamReader(outputms)) - { - return outputtr.ReadToEnd(); - } - } - } + return Umbraco.Core.Dynamics.DynamicXml.StripDashesInElementOrAttributeNames(xml); } } } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethodFinder.cs b/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethodFinder.cs index ea1f6259e5..9030cecde2 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethodFinder.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethodFinder.cs @@ -10,173 +10,13 @@ using System.Linq.Expressions; namespace umbraco.MacroEngines { + + [Obsolete("This class has been superceded by Umbraco.Core.Dynamics.ExtensionMethodFinder")] public static class ExtensionMethodFinder { - private static List GetAllExtensionMethods(Type thisType, string name, int argumentCount, bool argsContainsThis) - { - //get extension methods from runtime - var candidates = ( - from assembly in BuildManager.GetReferencedAssemblies().Cast() - where assembly.IsDefined(typeof(ExtensionAttribute), false) - from type in assembly.GetTypes() - where (type.IsDefined(typeof(ExtensionAttribute), false) - && type.IsSealed && !type.IsGenericType && !type.IsNested) - from method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) - // this filters extension methods - where method.IsDefined(typeof(ExtensionAttribute), false) - select method - ); - - //search an explicit type (e.g. Enumerable, where most of the Linq methods are defined) - //if (explicitTypeToSearch != null) - //{ - candidates = candidates.Concat(typeof(IEnumerable).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)); - //} - - //filter by name - var methodsByName = candidates.Where(m => m.Name == name); - - var isGenericAndRightParamCount = methodsByName.Where(m => m.GetParameters().Length == argumentCount + (argsContainsThis ? 0 : 1)); - - //find the right overload that can take genericParameterType - //which will be either DynamicNodeList or List which is IEnumerable` - - var withGenericParameterType = isGenericAndRightParamCount.Select(m => new { m, t = firstParameterType(m) }); - - var methodsWhereArgZeroIsTargetType = (from method in withGenericParameterType - where - method.t != null && methodArgZeroHasCorrectTargetType(method.m, method.t, thisType) - select method); - - return methodsWhereArgZeroIsTargetType.Select(mt => mt.m).ToList(); - } - private static bool methodArgZeroHasCorrectTargetType(MethodInfo method, Type firstArgumentType, Type thisType) - { - //This is done with seperate method calls because you can't debug/watch lamdas - if you're trying to figure - //out why the wrong method is returned, it helps to be able to see each boolean result - - return - - // is it defined on me? - methodArgZeroHasCorrectTargetType_TypeMatchesExactly(method, firstArgumentType, thisType) || - - // or on any of my interfaces? - methodArgZeroHasCorrectTargetType_AnInterfaceMatches(method, firstArgumentType, thisType) || - - // or on any of my base types? - methodArgZeroHasCorrectTargetType_IsASubclassOf(method, firstArgumentType, thisType) || - - //share a common interface (e.g. IEnumerable) - methodArgZeroHasCorrectTargetType_ShareACommonInterface(method, firstArgumentType, thisType); - - - } - - private static bool methodArgZeroHasCorrectTargetType_ShareACommonInterface(MethodInfo method, Type firstArgumentType, Type thisType) - { - Type[] interfaces = firstArgumentType.GetInterfaces(); - if (interfaces.Length == 0) - { - return false; - } - bool result = interfaces.All(i => thisType.GetInterfaces().Contains(i)); - return result; - } - - private static bool methodArgZeroHasCorrectTargetType_IsASubclassOf(MethodInfo method, Type firstArgumentType, Type thisType) - { - bool result = thisType.IsSubclassOf(firstArgumentType); - return result; - } - - private static bool methodArgZeroHasCorrectTargetType_AnInterfaceMatches(MethodInfo method, Type firstArgumentType, Type thisType) - { - bool result = thisType.GetInterfaces().Contains(firstArgumentType); - return result; - } - - private static bool methodArgZeroHasCorrectTargetType_TypeMatchesExactly(MethodInfo method, Type firstArgumentType, Type thisType) - { - bool result = (thisType == firstArgumentType); - return result; - } - private static Type firstParameterType(MethodInfo m) - { - ParameterInfo[] p = m.GetParameters(); - if (p.Count() > 0) - { - return p.First().ParameterType; - } - return null; - } - - public static MethodInfo FindExtensionMethod(Type thisType, object[] args, string name, bool argsContainsThis) - { - Type genericType = null; - if (thisType.IsGenericType) - { - genericType = thisType.GetGenericArguments()[0]; - } - - var methods = GetAllExtensionMethods(thisType, name, args.Length, argsContainsThis); - - if (methods.Count == 0) - { - return null; - } - MethodInfo methodToExecute = null; - if (methods.Count > 1) - { - //Given the args, lets get the types and compare the type sequence to try and find the correct overload - var argTypes = args.ToList().ConvertAll(o => - { - Expression oe = (o as Expression); - if (oe != null) - { - return oe.Type.FullName; - } - return o.GetType().FullName; - }); - var methodsWithArgTypes = methods.ConvertAll(method => new { method = method, types = method.GetParameters().ToList().ConvertAll(pi => pi.ParameterType.FullName) }); - var firstMatchingOverload = methodsWithArgTypes.FirstOrDefault(m => - { - return m.types.SequenceEqual(argTypes); - }); - if (firstMatchingOverload != null) - { - methodToExecute = firstMatchingOverload.method; - } - } - - if (methodToExecute == null) - { - MethodInfo firstMethod = methods.FirstOrDefault(); - // NH: this is to ensure that it's always the correct one being chosen when using the LINQ extension methods - if (methods.Count > 1) - { - var firstGenericMethod = methods.FirstOrDefault(x => x.IsGenericMethodDefinition); - if (firstGenericMethod != null) - { - firstMethod = firstGenericMethod; - } - } - - if (firstMethod != null) - { - if (firstMethod.IsGenericMethodDefinition) - { - if (genericType != null) - { - methodToExecute = firstMethod.MakeGenericMethod(genericType); - } - } - else - { - methodToExecute = firstMethod; - } - } - } - return methodToExecute; - } + public static MethodInfo FindExtensionMethod(Type thisType, object[] args, string name, bool argsContainsThis) + { + return Umbraco.Core.Dynamics.ExtensionMethodFinder.FindExtensionMethod(thisType, args, name, argsContainsThis); + } } } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethods.cs b/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethods.cs index f00166997c..df08e906e1 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethods.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethods.cs @@ -8,32 +8,15 @@ namespace umbraco.MacroEngines { public static class ExtensionMethods { + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.Map method")] public static IEnumerable Map( this IEnumerable source, Func selectorFunction, Func> getChildrenFunction) { - if (source.Count() == 0) - { - return source; - } - // Add what we have to the stack - var flattenedList = source.Where(selectorFunction); - // Go through the input enumerable looking for children, - // and add those if we have them - foreach (TSource element in source) - { - var secondInner = getChildrenFunction(element); - if (secondInner.Count() > 0) - { - secondInner = secondInner.Map(selectorFunction, getChildrenFunction); - } - flattenedList = flattenedList.Concat(secondInner); - } - return flattenedList; + return Umbraco.Core.Dynamics.ExtensionMethods.Map(source, selectorFunction, getChildrenFunction); } - - + public static DynamicNodeList Random(this DynamicNodeList all, int Min, int Max) { //get a random number generator @@ -54,62 +37,40 @@ namespace umbraco.MacroEngines return all.Items.OrderBy(x => Guid.NewGuid()).First(); } + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny method")] public static bool ContainsAny(this string haystack, List needles) - { - if (!string.IsNullOrEmpty(haystack) || needles.Count > 0) - { - foreach (string value in needles) - { - if (haystack.Contains(value)) - return true; - } - } - return false; - } + { + return Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny(haystack, needles); + } + + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny method")] public static bool ContainsAny(this string haystack, params string[] needles) { - if (!string.IsNullOrEmpty(haystack) || needles.Length > 0) - { - foreach (string value in needles) - { - if (haystack.Contains(value)) - return true; - } - } - return false; - } - public static bool ContainsAny(this string haystack, StringComparison comparison, List needles) - { - if (!string.IsNullOrEmpty(haystack) || needles.Count > 0) - { - foreach (string value in needles) - { - if (haystack.IndexOf(value, comparison) >= 0) - return true; - } - } - return false; - } - public static bool ContainsAny(this string haystack, StringComparison comparison, params string[] needles) - { - if (!string.IsNullOrEmpty(haystack) || needles.Length > 0) - { - foreach (string value in needles) - { - if (haystack.IndexOf(value, comparison) >= 0) - return true; - } - } - return false; - } - public static bool ContainsInsensitive(this string haystack, string needle) - { - return haystack.IndexOf(needle, StringComparison.CurrentCultureIgnoreCase) >= 0; + return Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny(haystack, needles); } + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny method")] + public static bool ContainsAny(this string haystack, StringComparison comparison, List needles) + { + return Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny(haystack, comparison, needles); + } + + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny method")] + public static bool ContainsAny(this string haystack, StringComparison comparison, params string[] needles) + { + return Umbraco.Core.Dynamics.ExtensionMethods.ContainsAny(haystack, comparison, needles); + } + + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.ContainsInsensitive method")] + public static bool ContainsInsensitive(this string haystack, string needle) + { + return Umbraco.Core.Dynamics.ExtensionMethods.ContainsInsensitive(haystack, needle); + } + + [Obsolete("This has been superceded by Umbraco.Core.Dynamics.ExtensionMethods.HasValue method")] public static bool HasValue(this string s) { - return !string.IsNullOrWhiteSpace(s); + return Umbraco.Core.Dynamics.ExtensionMethods.HasValue(s); } } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapper.cs b/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapper.cs index 3e6ee891f8..d7debac607 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapper.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapper.cs @@ -8,8 +8,13 @@ using System.Web; namespace umbraco.MacroEngines { + + [Obsolete("This class has been superceded by Umbraco.Core.HtmlTagWrapper")] public class HtmlTagWrapper : HtmlTagWrapperBase, IHtmlString { + //NOTE: We could not actually wrap these methods to proxy to the superceded class because many of these methods return + //instances of itself. + public HtmlTagWrapper Parent; public List Children; public List> Attributes; diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperBase.cs b/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperBase.cs index 7754dbce43..3b98b999d9 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperBase.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperBase.cs @@ -7,6 +7,8 @@ using System.Web; namespace umbraco.MacroEngines { + + [Obsolete("This interface has been superceded by Umbraco.Core.IHtmlTagWrapper")] public interface HtmlTagWrapperBase { void WriteToHtmlTextWriter(HtmlTextWriter html); diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperTextNode.cs b/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperTextNode.cs index af9ea386aa..7d50309a33 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperTextNode.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/HtmlTagWrapperTextNode.cs @@ -5,6 +5,8 @@ using System.Text; namespace umbraco.MacroEngines { + + [Obsolete("This interface has been superceded by Umbraco.Core.HtmlTagWrapperTextNode")] public class HtmlTagWrapperTextNode : HtmlTagWrapperBase { public string content;