From 6b17156fe8929615d73bd2a6c2b6215d5916b5a8 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 18 Aug 2016 10:02:46 +0200 Subject: [PATCH] Resvolution - ParameterEditorResolver --- src/Umbraco.Core/CoreBootManager.cs | 5 +- .../DependencyInjection/Current.cs | 3 + .../ParameterEditorCollection.cs | 25 +++++++ .../ParameterEditorCollectionBuilder.cs | 40 +++++++++++ .../ParameterEditorResolver.cs | 69 ------------------- src/Umbraco.Core/Umbraco.Core.csproj | 3 +- src/Umbraco.Web/Current.cs | 3 + .../Models/Mapping/MacroModelMapper.cs | 4 +- .../developer/Macros/editMacro.aspx.cs | 3 +- 9 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 src/Umbraco.Core/PropertyEditors/ParameterEditorCollection.cs create mode 100644 src/Umbraco.Core/PropertyEditors/ParameterEditorCollectionBuilder.cs delete mode 100644 src/Umbraco.Core/PropertyEditors/ParameterEditorResolver.cs diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index a7439eb88b..eb87439689 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -404,9 +404,8 @@ namespace Umbraco.Core PropertyEditorCollectionBuilder.Register(Container) .AddProducer(() => PluginManager.ResolvePropertyEditors()); - ParameterEditorResolver.Current = new ParameterEditorResolver( - Container, ProfilingLogger.Logger, () => PluginManager.ResolveParameterEditors(), - manifestBuilder); + ParameterEditorCollectionBuilder.Register(Container) + .AddProducer(() => PluginManager.ResolveParameterEditors()); //setup the validators resolver with our predefined validators ValidatorsResolver.Current = new ValidatorsResolver( diff --git a/src/Umbraco.Core/DependencyInjection/Current.cs b/src/Umbraco.Core/DependencyInjection/Current.cs index 5e6f31b897..30d7631c8a 100644 --- a/src/Umbraco.Core/DependencyInjection/Current.cs +++ b/src/Umbraco.Core/DependencyInjection/Current.cs @@ -50,6 +50,9 @@ namespace Umbraco.Core.DependencyInjection public static PropertyEditorCollection PropertyEditors => Container.GetInstance(); + public static ParameterEditorCollection ParameterEditors + => Container.GetInstance(); + #endregion } } diff --git a/src/Umbraco.Core/PropertyEditors/ParameterEditorCollection.cs b/src/Umbraco.Core/PropertyEditors/ParameterEditorCollection.cs new file mode 100644 index 0000000000..8593b8509c --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ParameterEditorCollection.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.DependencyInjection; + +namespace Umbraco.Core.PropertyEditors +{ + public class ParameterEditorCollection : BuilderCollectionBase + { + public ParameterEditorCollection(IEnumerable items) + : base(items) + { } + + public IParameterEditor this[string alias] + { + get + { + var editor = this.SingleOrDefault(x => x.Alias == alias); + if (editor != null) return editor; + + var mapped = LegacyParameterEditorAliasConverter.GetNewAliasFromLegacyAlias(alias); + return mapped == null ? null : this.SingleOrDefault(x => x.Alias == mapped); + } + } + } +} diff --git a/src/Umbraco.Core/PropertyEditors/ParameterEditorCollectionBuilder.cs b/src/Umbraco.Core/PropertyEditors/ParameterEditorCollectionBuilder.cs new file mode 100644 index 0000000000..6e6e2f97f2 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ParameterEditorCollectionBuilder.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using LightInject; +using Umbraco.Core.DependencyInjection; +using Umbraco.Core.Manifest; + +namespace Umbraco.Core.PropertyEditors +{ + internal class ParameterEditorCollectionBuilder : LazyCollectionBuilderBase + { + private readonly ManifestBuilder _manifestBuilder; + + public ParameterEditorCollectionBuilder(IServiceContainer container, ManifestBuilder manifestBuilder) + : base(container) + { + _manifestBuilder = manifestBuilder; + } + + protected override ParameterEditorCollectionBuilder This => this; + + protected override IEnumerable CreateItems(params object[] args) + { + //return base.CreateItems(args).Union(_manifestBuilder.PropertyEditors); + + // the buider's producer returns all IParameterEditor implementations + // this includes classes inheriting from both PropertyEditor and ParameterEditor + // but only some PropertyEditor inheritors are also parameter editors + // + // return items, + // that are NOT PropertyEditor OR that also have IsParameterEditor set to true + // union all manifest's parameter editors + // union all manifest's property editors that are ALSO parameter editors + + return base.CreateItems(args) + .Where(x => (x is PropertyEditor) == false || ((PropertyEditor) x).IsParameterEditor) + .Union(_manifestBuilder.ParameterEditors) + .Union(_manifestBuilder.PropertyEditors.Where(x => x.IsParameterEditor)); + } + } +} diff --git a/src/Umbraco.Core/PropertyEditors/ParameterEditorResolver.cs b/src/Umbraco.Core/PropertyEditors/ParameterEditorResolver.cs deleted file mode 100644 index d6fe9f5b49..0000000000 --- a/src/Umbraco.Core/PropertyEditors/ParameterEditorResolver.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using LightInject; -using Umbraco.Core.Logging; -using Umbraco.Core.Manifest; -using Umbraco.Core.ObjectResolution; - -namespace Umbraco.Core.PropertyEditors -{ - /// - /// A resolver to resolve all parameter editors - /// - /// - /// This resolver will contain any parameter editors defined in manifests as well as any property editors defined in manifests - /// that have the IsParameterEditorFlag = true and any PropertyEditors found in c# that have this flag as well. - /// - internal class ParameterEditorResolver : ContainerLazyManyObjectsResolver - { - private readonly ManifestBuilder _builder; - - public ParameterEditorResolver(IServiceContainer container, ILogger logger, Func> typeListProducerList, ManifestBuilder builder) - : base(container, logger, typeListProducerList, ObjectLifetimeScope.Application) - { - _builder = builder; - } - - /// - /// Returns the parameter editors - /// - public IEnumerable ParameterEditors - { - get - { - //This will by default include all property editors and parameter editors but we need to filter this - //list to ensure that none of the property editors that do not have the IsParameterEditor flag set to true - //are filtered. - var filtered = Values.Select(x => x as PropertyEditor) - .WhereNotNull() - .Where(x => x.IsParameterEditor == false); - - return Values - //exclude the non parameter editor c# property editors - .Except(filtered) - //include the manifest parameter editors - .Union(_builder.ParameterEditors) - //include the manifest prop editors that are parameter editors - .Union(_builder.PropertyEditors.Where(x => x.IsParameterEditor)); - } - } - - /// - /// Returns a property editor by alias - /// - /// - /// - public IParameterEditor GetByAlias(string alias) - { - var found = ParameterEditors.SingleOrDefault(x => x.Alias == alias); - if (found != null) return found; - - //couldn't find one, so try the map - var mapped = LegacyParameterEditorAliasConverter.GetNewAliasFromLegacyAlias(alias); - return mapped == null - ? null - : ParameterEditors.SingleOrDefault(x => x.Alias == mapped); - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index ab6faed426..6181d5bf90 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -448,6 +448,8 @@ + + @@ -1036,7 +1038,6 @@ - diff --git a/src/Umbraco.Web/Current.cs b/src/Umbraco.Web/Current.cs index 3931e4d014..acd11609ab 100644 --- a/src/Umbraco.Web/Current.cs +++ b/src/Umbraco.Web/Current.cs @@ -151,6 +151,9 @@ namespace Umbraco.Web public static PropertyEditorCollection PropertyEditors => Container.GetInstance(); + public static ParameterEditorCollection ParameterEditors + => Container.GetInstance(); + #endregion } } diff --git a/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs index eb8497c948..dfdd775e1f 100644 --- a/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs @@ -37,11 +37,11 @@ namespace Umbraco.Web.Models.Mapping { //map the view and the config - var paramEditor = ParameterEditorResolver.Current.GetByAlias(property.EditorAlias); + var paramEditor = Current.ParameterEditors[property.EditorAlias]; if (paramEditor == null) { //we'll just map this to a text box - paramEditor = ParameterEditorResolver.Current.GetByAlias(Constants.PropertyEditors.TextboxAlias); + paramEditor = Current.ParameterEditors[Constants.PropertyEditors.TextboxAlias]; LogHelper.Warn("Could not resolve a parameter editor with alias " + property.EditorAlias + ", a textbox will be rendered in it's place"); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs index 08d28617e2..3aa9728c36 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs @@ -16,6 +16,7 @@ using System.Linq; using Umbraco.Web.UI; using Umbraco.Web.UI.Pages; using Umbraco.Core.Services; +using Umbraco.Web; namespace umbraco.cms.presentation.developer { @@ -183,7 +184,7 @@ namespace umbraco.cms.presentation.developer protected IEnumerable GetMacroParameterEditors() { - return ParameterEditorResolver.Current.ParameterEditors; + return Current.ParameterEditors; } public void macroPropertyCreate(object sender, EventArgs e)