From dff3905e85208bcef81cb7da7eda75f9ab6cde88 Mon Sep 17 00:00:00 2001 From: "shannon@ShandemVaio" Date: Wed, 1 Aug 2012 11:24:39 +0600 Subject: [PATCH] Converted over ThumbnailProviderManager to ThumbnailProvidersResolver using the new apis. --- .../Interfaces/IThumbnailProvider.cs | 1 + .../LegacyTransientObjectsResolver.cs | 2 +- ...lverBase.cs => ManyObjectsResolverBase.cs} | 18 ++--- src/Umbraco.Core/Umbraco.Core.csproj | 2 +- src/Umbraco.Tests/ContentStoreTests.cs | 6 +- .../ThumbnailProviderManager.cs | 75 ------------------- .../ThumbnailProvidersResolver.cs | 60 +++++++++++++++ .../PluginTypeResolverExtensions.cs | 11 +++ .../Routing/DocumentLookupsResolver.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 +- .../WebServices/FolderBrowserService.cs | 2 +- 11 files changed, 89 insertions(+), 92 deletions(-) rename src/Umbraco.Core/Resolving/{ManyObjectResolverBase.cs => ManyObjectsResolverBase.cs} (84%) delete mode 100644 src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProviderManager.cs create mode 100644 src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProvidersResolver.cs diff --git a/src/Umbraco.Core/Interfaces/IThumbnailProvider.cs b/src/Umbraco.Core/Interfaces/IThumbnailProvider.cs index 99a96a519a..f3159cf7fd 100644 --- a/src/Umbraco.Core/Interfaces/IThumbnailProvider.cs +++ b/src/Umbraco.Core/Interfaces/IThumbnailProvider.cs @@ -11,4 +11,5 @@ namespace Umbraco.Core.Interfaces bool CanProvideThumbnail(string fileUrl); string GetThumbnailUrl(string fileUrl); } + } diff --git a/src/Umbraco.Core/LegacyTransientObjectsResolver.cs b/src/Umbraco.Core/LegacyTransientObjectsResolver.cs index a884070113..36b88c7c03 100644 --- a/src/Umbraco.Core/LegacyTransientObjectsResolver.cs +++ b/src/Umbraco.Core/LegacyTransientObjectsResolver.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core /// these old classes don't contain metadata, the objects need to be instantiated first to get their metadata, we then store this /// for use in the GetById method. /// - internal abstract class LegacyTransientObjectsResolver : ManyObjectResolverBase + internal abstract class LegacyTransientObjectsResolver : ManyObjectsResolverBase where T : class { diff --git a/src/Umbraco.Core/Resolving/ManyObjectResolverBase.cs b/src/Umbraco.Core/Resolving/ManyObjectsResolverBase.cs similarity index 84% rename from src/Umbraco.Core/Resolving/ManyObjectResolverBase.cs rename to src/Umbraco.Core/Resolving/ManyObjectsResolverBase.cs index 33d9c234fa..ee75e56666 100644 --- a/src/Umbraco.Core/Resolving/ManyObjectResolverBase.cs +++ b/src/Umbraco.Core/Resolving/ManyObjectsResolverBase.cs @@ -5,7 +5,7 @@ using System.Web; namespace Umbraco.Core.Resolving { - internal abstract class ManyObjectResolverBase + internal abstract class ManyObjectsResolverBase where TResolved : class { private List _applicationInstances = null; @@ -13,10 +13,10 @@ namespace Umbraco.Core.Resolving #region Constructors /// - /// Initializes a new instance of the class with an empty list of objects. + /// Initializes a new instance of the class with an empty list of objects. /// /// The lifetime scope of instantiated objects, default is per Application - protected ManyObjectResolverBase(ObjectLifetimeScope scope = ObjectLifetimeScope.Application) + protected ManyObjectsResolverBase(ObjectLifetimeScope scope = ObjectLifetimeScope.Application) { if (scope == ObjectLifetimeScope.HttpRequest) { @@ -32,11 +32,11 @@ namespace Umbraco.Core.Resolving } /// - /// Initializes a new instance of the class with an empty list of objects. + /// Initializes a new instance of the class with an empty list of objects. /// with creation of objects based on an HttpRequest lifetime scope. /// /// - protected ManyObjectResolverBase(HttpContextBase httpContext) + protected ManyObjectsResolverBase(HttpContextBase httpContext) { LifetimeScope = ObjectLifetimeScope.HttpRequest; CurrentHttpContext = httpContext; @@ -44,23 +44,23 @@ namespace Umbraco.Core.Resolving } /// - /// Initializes a new instance of the class with an initial list of objects. + /// Initializes a new instance of the class with an initial list of objects. /// /// The list of objects. /// If set to true will resolve singleton objects which will be created once for the lifetime of the application - protected ManyObjectResolverBase(IEnumerable value, ObjectLifetimeScope scope = ObjectLifetimeScope.Application) + protected ManyObjectsResolverBase(IEnumerable value, ObjectLifetimeScope scope = ObjectLifetimeScope.Application) : this(scope) { InstanceTypes = new List(value); } /// - /// Initializes a new instance of the class with an initial list of objects + /// Initializes a new instance of the class with an initial list of objects /// with creation of objects based on an HttpRequest lifetime scope. /// /// /// - protected ManyObjectResolverBase(HttpContextBase httpContext, IEnumerable value) + protected ManyObjectsResolverBase(HttpContextBase httpContext, IEnumerable value) : this(httpContext) { InstanceTypes = new List(value); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 6a935b95fd..8b8582f60a 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -70,7 +70,7 @@ - + diff --git a/src/Umbraco.Tests/ContentStoreTests.cs b/src/Umbraco.Tests/ContentStoreTests.cs index 675143b1a5..5cf28c2b14 100644 --- a/src/Umbraco.Tests/ContentStoreTests.cs +++ b/src/Umbraco.Tests/ContentStoreTests.cs @@ -70,7 +70,7 @@ namespace Umbraco.Tests { } - private sealed class TransientObjectsResolver : ManyObjectResolverBase + private sealed class TransientObjectsResolver : ManyObjectsResolverBase { public TransientObjectsResolver() : base(ObjectLifetimeScope.Transient) @@ -83,7 +83,7 @@ namespace Umbraco.Tests } } - private sealed class ApplicationObjectsResolver : ManyObjectResolverBase + private sealed class ApplicationObjectsResolver : ManyObjectsResolverBase { public ApplicationObjectsResolver() : base(ObjectLifetimeScope.Application) @@ -96,7 +96,7 @@ namespace Umbraco.Tests } } - private sealed class HttpRequestObjectsResolver : ManyObjectResolverBase + private sealed class HttpRequestObjectsResolver : ManyObjectsResolverBase { public HttpRequestObjectsResolver(HttpContextBase httpContext) : base(httpContext) diff --git a/src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProviderManager.cs b/src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProviderManager.cs deleted file mode 100644 index a5a3c11bb0..0000000000 --- a/src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProviderManager.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Web; -using Umbraco.Core.Interfaces; -using umbraco.BusinessLogic; -using umbraco.BusinessLogic.Utils; - -namespace Umbraco.Web.Media.ThumbnailProviders -{ - public class ThumbnailProviderManager - { - private const string CacheKey = "ThumbnailProviderCache"; - - internal static IEnumerable Providers - { - get - { - EnsureCache(); - - return HttpRuntime.Cache[CacheKey] as List; - } - set - { - HttpRuntime.Cache.Insert(CacheKey, value); - } - } - - public static string GetThumbnailUrl(string fileUrl) - { - var provider = Providers.FirstOrDefault(x => x.CanProvideThumbnail(fileUrl)); - return provider != null ? provider.GetThumbnailUrl(fileUrl) : string.Empty; - } - - private static void EnsureCache() - { - if (HttpRuntime.Cache[CacheKey] != null) - return; - - var providers = new List(); - var types = TypeFinder.FindClassesOfType(); - - foreach (var t in types) - { - IThumbnailProvider typeInstance = null; - - try - { - if (t.IsVisible) - { - typeInstance = Activator.CreateInstance(t) as IThumbnailProvider; - } - } - catch { } - - if (typeInstance != null) - { - try - { - providers.Add(typeInstance); - } - catch (Exception ee) - { - Log.Add(LogTypes.Error, -1, "Can't import IThumbnailProvider '" + t.FullName + "': " + ee); - } - } - } - - providers.Sort((f1, f2) => f1.Priority.CompareTo(f2.Priority)); - - Providers = providers; - } - } -} diff --git a/src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProvidersResolver.cs b/src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProvidersResolver.cs new file mode 100644 index 0000000000..69097746d1 --- /dev/null +++ b/src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProvidersResolver.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using Umbraco.Core; +using Umbraco.Core.Interfaces; +using Umbraco.Core.Resolving; +using umbraco.BusinessLogic; +using umbraco.BusinessLogic.Utils; + +namespace Umbraco.Web.Media.ThumbnailProviders +{ + internal sealed class ThumbnailProvidersResolver : ManyObjectsResolverBase + { + + #region Singleton + + private static readonly ThumbnailProvidersResolver Instance = + new ThumbnailProvidersResolver(PluginTypeResolver.Current.ResolveThumbnailProviders()); + + public static ThumbnailProvidersResolver Current + { + get { return Instance; } + } + #endregion + + #region Constructors + static ThumbnailProvidersResolver() { } + + /// + /// Constructor + /// + /// + internal ThumbnailProvidersResolver(IEnumerable providers) + : base(providers) + { + + } + #endregion + + public IEnumerable Providers + { + get + { + var vals = Values.ToList(); + //ensure they are sorted + vals.Sort((f1, f2) => f1.Priority.CompareTo(f2.Priority)); + return vals; + } + } + + public string GetThumbnailUrl(string fileUrl) + { + var provider = Providers.FirstOrDefault(x => x.CanProvideThumbnail(fileUrl)); + return provider != null ? provider.GetThumbnailUrl(fileUrl) : string.Empty; + } + + } +} diff --git a/src/Umbraco.Web/PluginTypeResolverExtensions.cs b/src/Umbraco.Web/PluginTypeResolverExtensions.cs index 4e536dd6e9..67f578ba3d 100644 --- a/src/Umbraco.Web/PluginTypeResolverExtensions.cs +++ b/src/Umbraco.Web/PluginTypeResolverExtensions.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Threading; using Umbraco.Core; +using Umbraco.Core.Interfaces; using Umbraco.Web.Routing; using umbraco; using umbraco.interfaces; @@ -44,5 +45,15 @@ namespace Umbraco.Web { return resolver.ResolveAttributedTypes(); } + + /// + /// Returns all IThumbnailProvider classes + /// + /// + /// + internal static IEnumerable ResolveThumbnailProviders(this PluginTypeResolver resolver) + { + return resolver.ResolveTypes(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs b/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs index 5fe0cffdee..1692144def 100644 --- a/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs +++ b/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs @@ -13,7 +13,7 @@ namespace Umbraco.Web.Routing /// /// A multiply registered resolver to manage all IDocumentLookup objects /// - internal sealed class DocumentLookupsResolver : ManyObjectResolverBase + internal sealed class DocumentLookupsResolver : ManyObjectsResolverBase { #region Singleton private static readonly DocumentLookupsResolver Instance = new DocumentLookupsResolver( diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index dd04b8ac04..46c88a3387 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -249,7 +249,7 @@ - + diff --git a/src/Umbraco.Web/WebServices/FolderBrowserService.cs b/src/Umbraco.Web/WebServices/FolderBrowserService.cs index 60c3e8b45b..62579e6b34 100644 --- a/src/Umbraco.Web/WebServices/FolderBrowserService.cs +++ b/src/Umbraco.Web/WebServices/FolderBrowserService.cs @@ -44,7 +44,7 @@ namespace Umbraco.Web.WebServices x.PropertyType.DataTypeDefinition.DataType.Id == new Guid("5032a6e6-69e3-491d-bb28-cd31cd11086c")); var fileUrl = fileProp != null ? fileProp.Value.ToString() : ""; - var thumbUrl = ThumbnailProviderManager.GetThumbnailUrl(fileUrl); + var thumbUrl = ThumbnailProvidersResolver.Current.GetThumbnailUrl(fileUrl); data.Add(new {