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("",
@@ -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 @@
-