From 733b6aa94597974917dec89b9191fcffc6d3ee32 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 29 Aug 2013 17:14:34 +1000 Subject: [PATCH] Completes: U4-2742 Remove legacy xsltExtensions.config - xslt extensions are configured using attributes --- src/Umbraco.Core/IO/SystemFiles.cs | 10 +- src/Umbraco.Core/Macros/XsltExtension.cs | 17 +++ .../Macros/XsltExtensionAttribute.cs | 34 +++++ .../Macros/XsltExtensionsResolver.cs | 59 ++++++++ .../ManyObjectsResolverBase.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 3 + .../Resolvers/ActionsResolverTests.cs | 2 +- .../Resolvers/XsltExtensionsResolverTests.cs | 78 +++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 4 - .../config/xsltExtensions.Release.config | 12 -- .../config/xsltExtensions.config | 12 -- .../install/steps/Renaming.ascx.cs | 77 +--------- src/Umbraco.Web/PluginManagerExtensions.cs | 2 +- src/Umbraco.Web/WebBootManager.cs | 4 + .../XsltExtensionAttribute.cs | 45 +++--- src/Umbraco.Web/umbraco.presentation/macro.cs | 131 +----------------- .../umbraco/xslt/eXslt/ExsltCommon.cs | 1 + .../umbraco/xslt/eXslt/ExsltDatesAndTimes.cs | 1 + .../umbraco/xslt/eXslt/ExsltMath.cs | 1 + .../xslt/eXslt/ExsltRegularExpressions.cs | 1 + .../umbraco/xslt/eXslt/ExsltSets.cs | 1 + .../umbraco/xslt/eXslt/ExsltStrings.cs | 1 + src/UmbracoExamine/XsltExtensions.cs | 2 + src/umbraco.businesslogic/IO/SystemFiles.cs | 5 - .../PackageActions/addXsltExtension.cs | 102 -------------- src/umbraco.cms/umbraco.cms.csproj | 1 - 27 files changed, 236 insertions(+), 373 deletions(-) create mode 100644 src/Umbraco.Core/Macros/XsltExtension.cs create mode 100644 src/Umbraco.Core/Macros/XsltExtensionAttribute.cs create mode 100644 src/Umbraco.Core/Macros/XsltExtensionsResolver.cs create mode 100644 src/Umbraco.Tests/Resolvers/XsltExtensionsResolverTests.cs delete mode 100644 src/Umbraco.Web.UI/config/xsltExtensions.Release.config delete mode 100644 src/Umbraco.Web.UI/config/xsltExtensions.config delete mode 100644 src/umbraco.cms/businesslogic/Packager/PackageActions/addXsltExtension.cs diff --git a/src/Umbraco.Core/IO/SystemFiles.cs b/src/Umbraco.Core/IO/SystemFiles.cs index 3f459918a8..9dfde1e442 100644 --- a/src/Umbraco.Core/IO/SystemFiles.cs +++ b/src/Umbraco.Core/IO/SystemFiles.cs @@ -51,15 +51,7 @@ namespace Umbraco.Core.IO return SystemDirectories.Config + "/dashboard.config"; } } - - public static string XsltextensionsConfig - { - get - { - return SystemDirectories.Config + "/xsltextensions.config"; - } - } - + public static string SkinningXml { get diff --git a/src/Umbraco.Core/Macros/XsltExtension.cs b/src/Umbraco.Core/Macros/XsltExtension.cs new file mode 100644 index 0000000000..a26b8bfe7f --- /dev/null +++ b/src/Umbraco.Core/Macros/XsltExtension.cs @@ -0,0 +1,17 @@ +namespace Umbraco.Core.Macros +{ + /// + /// Encapsulates what an xslt extension object is when used for macros + /// + internal sealed class XsltExtension + { + public XsltExtension(string ns, object extensionObject) + { + Namespace = ns; + ExtensionObject = extensionObject; + } + + public string Namespace { get; private set; } + public object ExtensionObject { get; private set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Macros/XsltExtensionAttribute.cs b/src/Umbraco.Core/Macros/XsltExtensionAttribute.cs new file mode 100644 index 0000000000..080d0d54f5 --- /dev/null +++ b/src/Umbraco.Core/Macros/XsltExtensionAttribute.cs @@ -0,0 +1,34 @@ +using System; +using System.Security.Permissions; +using System.Web; + +namespace Umbraco.Core.Macros +{ + /// + /// Allows App_Code XSLT extensions to be declared using the [XsltExtension] class attribute. + /// + /// + /// An optional XML namespace can be specified using [XsltExtension("MyNamespace")]. + /// + [AttributeUsage(AttributeTargets.Class)] + [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium, Unrestricted = false)] + public class XsltExtensionAttribute : Attribute + { + public XsltExtensionAttribute() + { + Namespace = String.Empty; + } + + public XsltExtensionAttribute(string ns) + { + Namespace = ns; + } + + public string Namespace { get; set; } + + public override string ToString() + { + return Namespace; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Macros/XsltExtensionsResolver.cs b/src/Umbraco.Core/Macros/XsltExtensionsResolver.cs new file mode 100644 index 0000000000..6f7e61117d --- /dev/null +++ b/src/Umbraco.Core/Macros/XsltExtensionsResolver.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using Umbraco.Core.ObjectResolution; + +namespace Umbraco.Core.Macros +{ + /// + /// Used to resolve all xslt extension plugins + /// + internal sealed class XsltExtensionsResolver : LazyManyObjectsResolverBase + { + + /// + /// Constructor + /// + /// + internal XsltExtensionsResolver(Func> packageActions) + : base(packageActions, ObjectLifetimeScope.Application) + { + + } + + /// + /// Returns the list of all xslt extensions + /// + public IEnumerable XsltExtensions + { + get { return Values; } + } + + protected override IEnumerable CreateInstances() + { + var result = new HashSet(); + foreach (var xsltType in InstanceTypes) + { + var tpAttributes = xsltType.GetCustomAttributes(typeof(XsltExtensionAttribute), true); + foreach (XsltExtensionAttribute tpAttribute in tpAttributes) + { + var ns = string.IsNullOrEmpty(tpAttribute.Namespace) == false + ? tpAttribute.Namespace + : xsltType.FullName; + + result.Add(new XsltExtension(ns, Activator.CreateInstance(xsltType))); + } + } + return result; + } + + /// + /// We override this because really there's no limit to the type that can be used here + /// + /// + protected override void EnsureCorrectType(Type value) + { + //do nothing. + } + + } +} diff --git a/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs b/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs index 4f3bc2665b..c82a6598ff 100644 --- a/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs +++ b/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs @@ -488,7 +488,7 @@ namespace Umbraco.Core.ObjectResolution /// /// The type to test. /// the type is not a valid type for the resolver. - protected void EnsureCorrectType(Type value) + protected virtual void EnsureCorrectType(Type value) { if (!TypeHelper.IsTypeAssignableFrom(value)) throw new InvalidOperationException(string.Format( diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 34c67a2d02..6cb9ca7629 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -182,6 +182,9 @@ + + + diff --git a/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs b/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs index 9271fb17c8..47ba900ae6 100644 --- a/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs +++ b/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs @@ -8,7 +8,7 @@ using umbraco.interfaces; namespace Umbraco.Tests.Resolvers { - [TestFixture] + [TestFixture] public class ActionsResolverTests { [SetUp] diff --git a/src/Umbraco.Tests/Resolvers/XsltExtensionsResolverTests.cs b/src/Umbraco.Tests/Resolvers/XsltExtensionsResolverTests.cs new file mode 100644 index 0000000000..01e7502c59 --- /dev/null +++ b/src/Umbraco.Tests/Resolvers/XsltExtensionsResolverTests.cs @@ -0,0 +1,78 @@ +using System.Linq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Macros; +using Umbraco.Core.ObjectResolution; +using Umbraco.Tests.TestHelpers; +using Umbraco.Web; +using Umbraco.Web.Macros; +using umbraco; + +namespace Umbraco.Tests.Resolvers +{ + [TestFixture] + public class XsltExtensionsResolverTests + { + [SetUp] + public void Initialize() + { + TestHelper.SetupLog4NetForTests(); + + ActionsResolver.Reset(); + + // this ensures it's reset + PluginManager.Current = new PluginManager(false); + + // for testing, we'll specify which assemblies are scanned for the PluginTypeResolver + PluginManager.Current.AssembliesToScan = new[] + { + this.GetType().Assembly // this assembly only + }; + } + + [TearDown] + public void TearDown() + { + ActionsResolver.Reset(); + PluginManager.Current = null; + } + + // NOTE + // ManyResolverTests ensure that we'll get our actions back and ActionsResolver works, + // so all we're testing here is that plugin manager _does_ find our actions + // which should be ensured by PlugingManagerTests anyway, so this is useless? + // maybe not as it seems to handle the "instance" thing... so we test that we respect the singleton? + [Test] + public void Find_All_Extensions() + { + XsltExtensionsResolver.Current = new XsltExtensionsResolver( + () => PluginManager.Current.ResolveXsltExtensions()); + + Resolution.Freeze(); + + var extensions = XsltExtensionsResolver.Current.XsltExtensions; + Assert.AreEqual(3, extensions.Count()); + + Assert.IsTrue(extensions.Select(x => x.ExtensionObject.GetType()).Contains(typeof (XsltEx1))); + Assert.IsTrue(extensions.Select(x => x.ExtensionObject.GetType()).Contains(typeof(XsltEx2))); + Assert.AreEqual("test1", extensions.Single(x => x.ExtensionObject.GetType() == typeof(XsltEx1)).Namespace); + Assert.AreEqual("test2", extensions.Single(x => x.ExtensionObject.GetType() == typeof(XsltEx2)).Namespace); + } + + #region Classes for tests + + [Umbraco.Core.Macros.XsltExtension("test1")] + public class XsltEx1 + { + + } + + //test with legacy one + [umbraco.XsltExtension("test2")] + public class XsltEx2 + { + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 10bff78b44..576f7fd83a 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -218,6 +218,7 @@ + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index ae3485df0e..c74c41d77e 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -623,9 +623,6 @@ EmbeddedMedia.config - - xsltExtensions.config - UrlRewriting.config @@ -2599,7 +2596,6 @@ Designer - diff --git a/src/Umbraco.Web.UI/config/xsltExtensions.Release.config b/src/Umbraco.Web.UI/config/xsltExtensions.Release.config deleted file mode 100644 index dfd43863e0..0000000000 --- a/src/Umbraco.Web.UI/config/xsltExtensions.Release.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/Umbraco.Web.UI/config/xsltExtensions.config b/src/Umbraco.Web.UI/config/xsltExtensions.config deleted file mode 100644 index 91012fe61f..0000000000 --- a/src/Umbraco.Web.UI/config/xsltExtensions.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Umbraco.Web.UI/install/steps/Renaming.ascx.cs b/src/Umbraco.Web.UI/install/steps/Renaming.ascx.cs index 7237fdb95f..496690a715 100644 --- a/src/Umbraco.Web.UI/install/steps/Renaming.ascx.cs +++ b/src/Umbraco.Web.UI/install/steps/Renaming.ascx.cs @@ -12,10 +12,7 @@ namespace Umbraco.Web.UI.Install.Steps private bool _changesNeeded = false; protected void Page_Load(object sender, EventArgs e) - { - // check xslt extensions - identifyResult.Text += CheckExtensionPaths("xsltExtensions.config", "XSLT Extension"); - + { // check access.xml file identifyResult.Text += CheckAccessFile(); @@ -49,54 +46,7 @@ namespace Umbraco.Web.UI.Install.Steps { return File.Exists(_newAccessFilePath); } - - private string CheckExtensionPaths(string filename, string extensionName) - { - string tempResult = ""; - foreach (XmlNode ext in GetExtensions(filename, "ext")) - { - if (ext.Attributes.GetNamedItem("assembly") != null && - ext.Attributes.GetNamedItem("assembly").Value.StartsWith("/bin/")) - { - tempResult += String.Format("
  • {0} with Alias '{1}' has assembly reference that contains /bin/. That part needs to be removed
  • ", - extensionName, - ext.Attributes.GetNamedItem("alias").Value); - } - } - - if (String.IsNullOrEmpty(tempResult)) - { - tempResult = String.Format("
  • {0}s are all good. No changes needed
  • ", extensionName); - } - else - { - _changesNeeded = true; - } - - return tempResult; - } - - private static void UpdateExtensionPaths(string filename) - { - filename = IOHelper.MapPath(SystemDirectories.Config + "/" + filename); - var xsltExt = new XmlDocument(); - xsltExt.Load(filename); - - foreach (XmlNode ext in xsltExt.SelectNodes("//ext")) - { - if (ext.Attributes.GetNamedItem("assembly") != null && - ext.Attributes.GetNamedItem("assembly").Value.StartsWith("/bin/")) - { - ext.Attributes.GetNamedItem("assembly").Value = - ext.Attributes.GetNamedItem("assembly").Value.Substring(5); - } - } - - xsltExt.Save(filename); - - } - - + protected void UpdateChangesClick(object sender, EventArgs e) { bool succes = true; @@ -115,19 +65,7 @@ namespace Umbraco.Web.UI.Install.Steps progressText += String.Format("
  • Error renaming access file: {0}
  • ", ee.ToString()); succes = false; } - } - - // update xslt exts - try - { - UpdateExtensionPaths("xsltExtensions.config"); - progressText += "
  • xsltExtensions.config ensured.
  • "; - } - catch (Exception ee) - { - progressText += String.Format("
  • Error updating xsltExtensions.config: {0}
  • ", ee.ToString()); - succes = false; - } + } string resultClass = succes ? "success" : "error"; resultText.Text = String.Format("

    {1}

    ", @@ -137,14 +75,5 @@ namespace Umbraco.Web.UI.Install.Steps init.Visible = false; } - private XmlNodeList GetExtensions(string filename, string elementName) - { - - // Load the XSLT extensions configuration - var xsltExt = new XmlDocument(); - xsltExt.Load(IOHelper.MapPath(SystemDirectories.Config + "/" + filename)); - - return xsltExt.SelectNodes("//" + elementName); - } } } \ No newline at end of file diff --git a/src/Umbraco.Web/PluginManagerExtensions.cs b/src/Umbraco.Web/PluginManagerExtensions.cs index aca533bedb..7581971285 100644 --- a/src/Umbraco.Web/PluginManagerExtensions.cs +++ b/src/Umbraco.Web/PluginManagerExtensions.cs @@ -66,7 +66,7 @@ namespace Umbraco.Web /// internal static IEnumerable ResolveXsltExtensions(this PluginManager resolver) { - return resolver.ResolveAttributedTypes(); + return resolver.ResolveAttributedTypes(); } /// diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 32c9c5571c..f7ce77a825 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -10,11 +10,13 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Dictionary; using Umbraco.Core.Logging; +using Umbraco.Core.Macros; using Umbraco.Core.ObjectResolution; using Umbraco.Core.Profiling; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Sync; using Umbraco.Web.Dictionary; +using Umbraco.Web.Macros; using Umbraco.Web.Media; using Umbraco.Web.Media.ThumbnailProviders; using Umbraco.Web.Models; @@ -246,6 +248,8 @@ namespace Umbraco.Web { base.InitializeResolvers(); + XsltExtensionsResolver.Current = new XsltExtensionsResolver(() => PluginManager.Current.ResolveXsltExtensions()); + //set the default RenderMvcController DefaultRenderMvcControllerResolver.Current = new DefaultRenderMvcControllerResolver(typeof(RenderMvcController)); diff --git a/src/Umbraco.Web/umbraco.presentation/XsltExtensionAttribute.cs b/src/Umbraco.Web/umbraco.presentation/XsltExtensionAttribute.cs index b81109917f..44498ffa45 100644 --- a/src/Umbraco.Web/umbraco.presentation/XsltExtensionAttribute.cs +++ b/src/Umbraco.Web/umbraco.presentation/XsltExtensionAttribute.cs @@ -4,31 +4,26 @@ using System.Web; namespace umbraco { - /// - /// Allows App_Code XSLT extensions to be declared using the [XsltExtension] class attribute. - /// - /// - /// An optional XML namespace can be specified using [XsltExtension("MyNamespace")]. - /// - [AttributeUsage(AttributeTargets.Class)] - [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium, Unrestricted = false)] - public class XsltExtensionAttribute : Attribute - { - public XsltExtensionAttribute() - { - Namespace = String.Empty; - } + /// + /// Allows App_Code XSLT extensions to be declared using the [XsltExtension] class attribute. + /// + /// + /// An optional XML namespace can be specified using [XsltExtension("MyNamespace")]. + /// + [AttributeUsage(AttributeTargets.Class)] + [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium, Unrestricted = false)] + [Obsolete("Use Umbraco.Core.Macros.XsltExtensionAttribute instead")] + public class XsltExtensionAttribute : Umbraco.Core.Macros.XsltExtensionAttribute + { + public XsltExtensionAttribute() : base() + { + + } - public XsltExtensionAttribute(string ns) - { - Namespace = ns; - } + public XsltExtensionAttribute(string ns) : base(ns) + { + + } - public string Namespace { get; set; } - - public override string ToString() - { - return Namespace; - } - } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index 2028d338fd..55255f1a52 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -1,8 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; using System.IO; using System.Net; using System.Net.Security; @@ -17,19 +15,17 @@ using System.Web.UI.WebControls; using System.Xml; using System.Xml.XPath; using System.Xml.Xsl; -using StackExchange.Profiling; using Umbraco.Core; using Umbraco.Core.Cache; -using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; +using Umbraco.Core.Macros; using Umbraco.Core.Profiling; using Umbraco.Web; using Umbraco.Web.Cache; using Umbraco.Web.Macros; using Umbraco.Web.Templates; using umbraco.BusinessLogic; -using umbraco.cms.businesslogic; using umbraco.cms.businesslogic.macro; using umbraco.cms.businesslogic.member; using umbraco.DataLayer; @@ -38,6 +34,7 @@ using umbraco.presentation.templateControls; using Content = umbraco.cms.businesslogic.Content; using Macro = umbraco.cms.businesslogic.macro.Macro; using MacroErrorEventArgs = Umbraco.Core.Events.MacroErrorEventArgs; +using System.Linq; namespace umbraco { @@ -161,12 +158,6 @@ namespace umbraco private const string XsltExtensionsCacheKey = "UmbracoXsltExtensions"; - private static readonly string XsltExtensionsConfig = - IOHelper.MapPath(SystemDirectories.Config + "/xsltExtensions.config"); - - private static readonly Func _xsltExtensionsDependency = - () => new CacheDependency(XsltExtensionsConfig); - /// /// Creates an empty macro object. /// @@ -1063,122 +1054,10 @@ namespace umbraco /// A dictionary of name/extension instance pairs. public static Dictionary GetXsltExtensions() { - // zb-00041 #29966 : cache the extensions - - // We could cache the extensions in a static variable but then the cache - // would not be refreshed when the .config file is modified. An application - // restart would be required. Better use the cache and add a dependency. - - // SD: The only reason the above statement might be true is because the xslt extension .config file is not a - // real config file!! if it was, we wouldn't have this issue. Having these in a static variable would be preferred! - // If you modify a config file, the app restarts and thus all static variables are reset. - // Having this stuff in cache just adds to the gigantic amount of cache data and will cause more cache turnover to happen. - - return ApplicationContext.Current.ApplicationCache.GetCacheItem( - XsltExtensionsCacheKey, - CacheItemPriority.NotRemovable, // NH 4.7.1, Changing to NotRemovable - null, // no refresh action - _xsltExtensionsDependency(), // depends on the .config file - TimeSpan.FromDays(1), // expires in 1 day (?) - GetXsltExtensionsImpl); + return XsltExtensionsResolver.Current.XsltExtensions + .ToDictionary(x => x.Namespace, x => x.ExtensionObject); } - - private static Dictionary GetXsltExtensionsImpl() - { - // fill a dictionary with the predefined extensions - var extensions = new Dictionary(GetPredefinedXsltExtensions()); - - // Load the XSLT extensions configuration - var xsltExt = new XmlDocument(); - xsltExt.Load(XsltExtensionsConfig); - - // add all descendants of the XsltExtensions element - foreach (XmlNode xsltEx in xsltExt.SelectSingleNode("/XsltExtensions")) - { - if (xsltEx.NodeType == XmlNodeType.Element) - { - Debug.Assert(xsltEx.Attributes["assembly"] != null, "Extension attribute 'assembly' not specified."); - Debug.Assert(xsltEx.Attributes["type"] != null, "Extension attribute 'type' not specified."); - Debug.Assert(xsltEx.Attributes["alias"] != null, "Extension attribute 'alias' not specified."); - - // load the extension assembly - string extensionFile = - IOHelper.MapPath(string.Format("{0}/{1}.dll", SystemDirectories.Bin, - xsltEx.Attributes["assembly"].Value)); - - Assembly extensionAssembly; - try - { - extensionAssembly = Assembly.LoadFrom(extensionFile); - } - catch (Exception ex) - { - throw new Exception( - String.Format( - "Could not load assembly {0} for XSLT extension {1}. Please check config/xsltExtensions.config.", - extensionFile, xsltEx.Attributes["alias"].Value), ex); - } - - // load the extension type - Type extensionType = extensionAssembly.GetType(xsltEx.Attributes["type"].Value); - if (extensionType == null) - throw new Exception( - String.Format( - "Could not load type {0} ({1}) for XSLT extension {1}. Please check config/xsltExtensions.config.", - xsltEx.Attributes["type"].Value, extensionFile, xsltEx.Attributes["alias"].Value)); - - // create an instance and add it to the extensions list - extensions.Add(xsltEx.Attributes["alias"].Value, Activator.CreateInstance(extensionType)); - } - } - - //also get types marked with XsltExtension attribute - - // zb-00042 #29949 : do not hide errors, refactor - - var foundExtensions = Umbraco.Web.PluginManagerExtensions.ResolveXsltExtensions(PluginManager.Current); - foreach (var xsltType in foundExtensions) - { - var tpAttributes = xsltType.GetCustomAttributes(typeof(XsltExtensionAttribute), true); - foreach (XsltExtensionAttribute tpAttribute in tpAttributes) - { - var ns = !string.IsNullOrEmpty(tpAttribute.Namespace) - ? tpAttribute.Namespace - : xsltType.FullName; - extensions.Add(ns, Activator.CreateInstance(xsltType)); - } - } - - return extensions; - } - - /// - /// Gets the predefined XSLT extensions. - /// - /// - /// This is a legacy list of EXSLT extensions. - /// The Umbraco library is not included, because its instance is page specific. - /// - /// A dictionary of name/extension instance pairs. - public static Dictionary GetPredefinedXsltExtensions() - { - if (_predefinedExtensions == null) - { - _predefinedExtensions = new Dictionary(); - - // [LK] U4-86 Move EXSLT references from being predefined in core to xsltExtensions.config - //// add predefined EXSLT extensions - //m_PredefinedExtensions.Add("Exslt.ExsltCommon", new ExsltCommon()); - //m_PredefinedExtensions.Add("Exslt.ExsltDatesAndTimes", new ExsltDatesAndTimes()); - //m_PredefinedExtensions.Add("Exslt.ExsltMath", new ExsltMath()); - //m_PredefinedExtensions.Add("Exslt.ExsltRegularExpressions", new ExsltRegularExpressions()); - //m_PredefinedExtensions.Add("Exslt.ExsltStrings", new ExsltStrings()); - //m_PredefinedExtensions.Add("Exslt.ExsltSets", new ExsltSets()); - } - - return _predefinedExtensions; - } - + /// /// Returns an XSLT argument list with all XSLT extensions added, /// both predefined and configured ones. diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltCommon.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltCommon.cs index 2f2b025b1c..1633617451 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltCommon.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltCommon.cs @@ -9,6 +9,7 @@ namespace umbraco.presentation.xslt.Exslt /// /// This class implements the EXSLT functions in the http://exslt.org/common namespace. /// + [Umbraco.Core.Macros.XsltExtension("Exslt.ExsltCommon")] public class ExsltCommon { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltDatesAndTimes.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltDatesAndTimes.cs index 53cbe12e66..e539351ab8 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltDatesAndTimes.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltDatesAndTimes.cs @@ -8,6 +8,7 @@ namespace umbraco.presentation.xslt.Exslt /// /// This class implements the EXSLT functions in the http://exslt.org/dates-and-times namespace. /// + [Umbraco.Core.Macros.XsltExtension("Exslt.ExsltDatesAndTimes")] public class ExsltDatesAndTimes { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltMath.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltMath.cs index 9756e018fd..9c83b94235 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltMath.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltMath.cs @@ -7,6 +7,7 @@ namespace umbraco.presentation.xslt.Exslt /// /// This class implements the EXSLT functions in the http://exslt.org/math namespace. /// + [Umbraco.Core.Macros.XsltExtension("Exslt.ExsltMath")] public class ExsltMath { /// /// Implements the following function diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltRegularExpressions.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltRegularExpressions.cs index 7142f35843..889ea54c1b 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltRegularExpressions.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltRegularExpressions.cs @@ -8,6 +8,7 @@ namespace umbraco.presentation.xslt.Exslt /// /// This class implements the EXSLT functions in the http://exslt.org/regular-expressions namespace. /// + [Umbraco.Core.Macros.XsltExtension("Exslt.ExsltRegularExpressions")] public class ExsltRegularExpressions { /// diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltSets.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltSets.cs index 17dca05f6f..fc52c873f1 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltSets.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltSets.cs @@ -9,6 +9,7 @@ namespace umbraco.presentation.xslt.Exslt /// /// This class implements the EXSLT functions in the http://exslt.org/sets namespace. /// + [Umbraco.Core.Macros.XsltExtension("Exslt.ExsltSets")] public class ExsltSets { /// diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltStrings.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltStrings.cs index 2ad8c515f6..c19d013960 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltStrings.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/xslt/eXslt/ExsltStrings.cs @@ -9,6 +9,7 @@ namespace umbraco.presentation.xslt.Exslt /// /// Implements the functions in the http://exslt.org/strings namespace /// + [Umbraco.Core.Macros.XsltExtension("Exslt.ExsltStrings")] public class ExsltStrings { /// /// Implements the following function diff --git a/src/UmbracoExamine/XsltExtensions.cs b/src/UmbracoExamine/XsltExtensions.cs index 7944db42da..052c14a61c 100644 --- a/src/UmbracoExamine/XsltExtensions.cs +++ b/src/UmbracoExamine/XsltExtensions.cs @@ -8,6 +8,7 @@ using Examine.LuceneEngine.Providers; using Examine.LuceneEngine.SearchCriteria; using Examine.SearchCriteria; using Examine.Providers; +using Umbraco.Core.Macros; using UmbracoExamine.DataServices; namespace UmbracoExamine @@ -18,6 +19,7 @@ namespace UmbracoExamine /// /// XSLT extensions will ONLY work for provider that have a base class of BaseUmbracoIndexer /// + [XsltExtension("Examine")] public class XsltExtensions { /// diff --git a/src/umbraco.businesslogic/IO/SystemFiles.cs b/src/umbraco.businesslogic/IO/SystemFiles.cs index 02af967650..874f792cf4 100644 --- a/src/umbraco.businesslogic/IO/SystemFiles.cs +++ b/src/umbraco.businesslogic/IO/SystemFiles.cs @@ -38,11 +38,6 @@ namespace umbraco.IO get { return Umbraco.Core.IO.SystemFiles.DashboardConfig; } } - public static string XsltextensionsConfig - { - get { return Umbraco.Core.IO.SystemFiles.XsltextensionsConfig; } - } - public static string SkinningXml { get { return Umbraco.Core.IO.SystemFiles.SkinningXml; } diff --git a/src/umbraco.cms/businesslogic/Packager/PackageActions/addXsltExtension.cs b/src/umbraco.cms/businesslogic/Packager/PackageActions/addXsltExtension.cs deleted file mode 100644 index 848c3cf832..0000000000 --- a/src/umbraco.cms/businesslogic/Packager/PackageActions/addXsltExtension.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Xml; -using umbraco.IO; - -namespace umbraco.cms.businesslogic.packager.standardPackageActions -{ - public class addXsltExtension : umbraco.interfaces.IPackageAction - { - #region IPackageAction Members - - public bool Execute(string packageName, XmlNode xmlData) - { - - string _assembly = xmlData.Attributes["assembly"].Value; - string _type = xmlData.Attributes["type"].Value; - string _alias = xmlData.Attributes["extensionAlias"].Value; - string xeConfig = SystemFiles.XsltextensionsConfig; - - XmlDocument xdoc = new XmlDocument(); - xdoc.PreserveWhitespace = true; - xdoc = xmlHelper.OpenAsXmlDocument(xeConfig); - - XmlNode xn = xdoc.SelectSingleNode("//XsltExtensions"); - - if (xn != null) - { - bool insertExt = true; - if (xn.HasChildNodes) - { - foreach (XmlNode ext in xn.SelectNodes("//ext")) - { - if (ext.Attributes["alias"] != null && ext.Attributes["alias"].Value == _alias) - insertExt = false; - } - } - if (insertExt) - { - XmlNode newExt = umbraco.xmlHelper.addTextNode(xdoc, "ext", ""); - newExt.Attributes.Append(umbraco.xmlHelper.addAttribute(xdoc, "assembly", _assembly.Replace("/bin/", ""))); - newExt.Attributes.Append(umbraco.xmlHelper.addAttribute(xdoc, "type", _type)); - newExt.Attributes.Append(umbraco.xmlHelper.addAttribute(xdoc, "alias", _alias)); - xn.AppendChild(newExt); - - - xdoc.Save(IOHelper.MapPath(xeConfig)); - return true; - } - } - return false; - } - - public string Alias() - { - return "addXsltExtension"; - } - - public bool Undo(string packageName, XmlNode xmlData) - { - string _assembly = xmlData.Attributes["assembly"].Value; - string _type = xmlData.Attributes["type"].Value; - string _alias = xmlData.Attributes["extensionAlias"].Value; - string xeConfig = SystemFiles.XsltextensionsConfig; - - XmlDocument xdoc = new XmlDocument(); - xdoc.PreserveWhitespace = true; - xdoc = xmlHelper.OpenAsXmlDocument(xeConfig); - - XmlNode xn = xdoc.SelectSingleNode("//XsltExtensions"); - - if (xn != null) - { - bool inserted = false; - if (xn.HasChildNodes) - { - foreach (XmlNode ext in xn.SelectNodes("//ext")) - { - if (ext.Attributes["alias"] != null && ext.Attributes["alias"].Value == _alias) - { - xn.RemoveChild(ext); - inserted = true; - } - } - } - - if (inserted) - { - xdoc.Save(IOHelper.MapPath(xeConfig)); - return true; - } - } - return false; - } - - #endregion - - public XmlNode SampleXml() - { - throw new NotImplementedException(); - } - - } -} \ No newline at end of file diff --git a/src/umbraco.cms/umbraco.cms.csproj b/src/umbraco.cms/umbraco.cms.csproj index 612429d986..d1b61c6a11 100644 --- a/src/umbraco.cms/umbraco.cms.csproj +++ b/src/umbraco.cms/umbraco.cms.csproj @@ -251,7 +251,6 @@ -