diff --git a/src/Umbraco.Tests/Routing/ContentSegmentProviderTests.cs b/src/Umbraco.Tests/Routing/ContentSegmentProviderTests.cs index 4675fd1a8e..5dd940c810 100644 --- a/src/Umbraco.Tests/Routing/ContentSegmentProviderTests.cs +++ b/src/Umbraco.Tests/Routing/ContentSegmentProviderTests.cs @@ -25,9 +25,9 @@ namespace Umbraco.Tests.Routing [ContentSegment("Test2")] private class MyTestProvider : ContentSegmentProvider { - public override IDictionary GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest) + public override SegmentCollection GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest) { - return new Dictionary(); + return new SegmentCollection(Enumerable.Empty()); } } diff --git a/src/Umbraco.Tests/Routing/ContentSegmentsTests.cs b/src/Umbraco.Tests/Routing/ContentSegmentsTests.cs index fa4b5a8d6f..bdeeeead38 100644 --- a/src/Umbraco.Tests/Routing/ContentSegmentsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentSegmentsTests.cs @@ -18,29 +18,64 @@ namespace Umbraco.Tests.Routing { var result = RequestSegments.GetAllSegmentsForRequest(new ContentSegmentProvider[] { - new MyTestProvider1(), new MyTestProvider2() - }, new Uri("http://localhost/test?blah=1"), new Uri("http://localhost/test/"), Mock.Of()); + new MyTestProvider1(), + new MyTestProvider2() + }, new Uri("http://localhost/test?blah=1"), new Uri("http://localhost/test/"), + Mock.Of(req => req.Cookies == new HttpCookieCollection()), + new Dictionary + { + {typeof(MyTestProvider1).FullName, true}, + {typeof(MyTestProvider2).FullName, true} + }); Assert.AreEqual(4, result.Count()); - Assert.AreEqual(true, result["key1"]); - Assert.AreEqual("blah", result["key2"]); - Assert.AreEqual(9876, result["key3"]); - Assert.AreEqual(123, result["key4"]); + Assert.AreEqual(true, result["key1"].Value); + Assert.AreEqual("blah", result["key2"].Value); + Assert.AreEqual(9876, result["key3"].Value); + Assert.AreEqual(123, result["key4"].Value); + } + + [Test] + public void Get_All_Segments_For_Request_With_Approval() + { + var result = RequestSegments.GetAllSegmentsForRequest(new ContentSegmentProvider[] + { + new MyTestProvider1(), + new MyTestProvider2() + }, new Uri("http://localhost/test?blah=1"), new Uri("http://localhost/test/"), + Mock.Of(req => req.Cookies == new HttpCookieCollection()), + new Dictionary + { + {typeof(MyTestProvider1).FullName, true}, + {typeof(MyTestProvider2).FullName, false} + }); + + Assert.AreEqual(3, result.Count()); } private class MyTestProvider1 : ContentSegmentProvider { - public override IDictionary GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest) + public override SegmentCollection GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest) { - return new Dictionary { { "key1", false }, { "key2", "blahdd" }, { "key3", 9876 } }; + return new SegmentCollection(new List + { + new Segment("key1", true), + new Segment("key2", "blahdd"), + new Segment("key3", 9876) + }); } } private class MyTestProvider2 : ContentSegmentProvider { - public override IDictionary GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest) + public override SegmentCollection GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest) { - return new Dictionary {{"key1", true}, {"key2", "blah"}, {"key4", 123}}; + return new SegmentCollection(new List + { + new Segment("key1", true), + new Segment("key2", "blah"), + new Segment("key4", 123) + }); } } } diff --git a/src/Umbraco.Web/Editors/SegmentDashboardController.cs b/src/Umbraco.Web/Editors/SegmentDashboardController.cs index 121da34aaa..a2fcead58b 100644 --- a/src/Umbraco.Web/Editors/SegmentDashboardController.cs +++ b/src/Umbraco.Web/Editors/SegmentDashboardController.cs @@ -28,7 +28,7 @@ namespace Umbraco.Web.Editors var result = providers .Select(x => new { - typeName = ContentSegmentProvider.GetTypeName(x), + typeName = x.GetType().FullName, displayName = ContentSegmentProvider.GetDisplayName(x), description = ContentSegmentProvider.GetDescription(x), asConfigurable = x as ConfigurableSegmentProvider @@ -51,7 +51,7 @@ namespace Umbraco.Web.Editors //TODO: We need to validate the config to ensure there are no nulls like null keys var providers = ContentSegmentProviderResolver.Current.Providers.ToArray(); - var provider = providers.FirstOrDefault(x => ContentSegmentProvider.GetTypeName(x) == typeName) as ConfigurableSegmentProvider; + var provider = providers.FirstOrDefault(x => x.GetType().FullName == typeName) as ConfigurableSegmentProvider; if (provider == null) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No provider found with name " + typeName + " or the provider type is not configurable"); @@ -66,7 +66,7 @@ namespace Umbraco.Web.Editors var providers = ContentSegmentProviderResolver.Current.Providers.ToArray(); var status = ContentSegmentProvidersStatus.GetProviderStatus(); - var provider = providers.FirstOrDefault(x => ContentSegmentProvider.GetTypeName(x) == typeName); + var provider = providers.FirstOrDefault(x => x.GetType().FullName == typeName); if (provider != null) { if (status.ContainsKey(typeName)) diff --git a/src/Umbraco.Web/Routing/Segments/BrowserCapabilitiesProvider.cs b/src/Umbraco.Web/Routing/Segments/BrowserCapabilitiesProvider.cs index 1387e1a816..9214c0fd46 100644 --- a/src/Umbraco.Web/Routing/Segments/BrowserCapabilitiesProvider.cs +++ b/src/Umbraco.Web/Routing/Segments/BrowserCapabilitiesProvider.cs @@ -25,6 +25,7 @@ namespace Umbraco.Web.Routing.Segments private static readonly string[] PropNames = { + "Browser", "IsMobileDevice", "JavaApplets", "MajorVersion", diff --git a/src/Umbraco.Web/Routing/Segments/ConfigurableSegmentProvider.cs b/src/Umbraco.Web/Routing/Segments/ConfigurableSegmentProvider.cs index 966136f2f9..549af30e61 100644 --- a/src/Umbraco.Web/Routing/Segments/ConfigurableSegmentProvider.cs +++ b/src/Umbraco.Web/Routing/Segments/ConfigurableSegmentProvider.cs @@ -79,24 +79,6 @@ namespace Umbraco.Web.Routing.Segments } } - ///// - ///// Saves an individual config, matches on the existing key. if one is already there it will be overwritten - ///// - ///// - ///// - //public void AddOrUpdateConfiguration(string existingKey, SegmentProviderMatch config) - //{ - // var currConfig = ReadConfiguration().ToList(); - // var existing = currConfig.FirstOrDefault(x => x.Key == existingKey); - // if (existing != null) - // { - // currConfig.Remove(existing); - // } - // currConfig.Add(config); - - // SaveConfiguration(currConfig); - //} - public void SaveConfiguration(IEnumerable config) { using (new WriteLock(_lock)) diff --git a/src/Umbraco.Web/Routing/Segments/ContentSegmentProvider.cs b/src/Umbraco.Web/Routing/Segments/ContentSegmentProvider.cs index 52649a230e..18c4bc5600 100644 --- a/src/Umbraco.Web/Routing/Segments/ContentSegmentProvider.cs +++ b/src/Umbraco.Web/Routing/Segments/ContentSegmentProvider.cs @@ -19,8 +19,9 @@ namespace Umbraco.Web.Routing.Segments public static string GetDisplayName(ContentSegmentProvider provider) { - var att = provider.GetType().GetCustomAttribute(false); - return att == null ? GetTypeName(provider) : att.DisplayName; + var type = provider.GetType(); + var att = type.GetCustomAttribute(false); + return att == null ? type.FullName : att.DisplayName; } public static string GetDescription(ContentSegmentProvider provider) @@ -28,13 +29,7 @@ namespace Umbraco.Web.Routing.Segments var att = provider.GetType().GetCustomAttribute(false); return att == null ? string.Empty : att.Description; } - - public static string GetTypeName(ContentSegmentProvider provider) - { - var type = provider.GetType(); - return type.Namespace.EnsureEndsWith('.') + type.Name; - } - + private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); private IEnumerable _advertised; diff --git a/src/Umbraco.Web/Routing/Segments/RequestSegments.cs b/src/Umbraco.Web/Routing/Segments/RequestSegments.cs index 42228663f3..128bea49b8 100644 --- a/src/Umbraco.Web/Routing/Segments/RequestSegments.cs +++ b/src/Umbraco.Web/Routing/Segments/RequestSegments.cs @@ -38,7 +38,8 @@ namespace Umbraco.Web.Routing.Segments _segmentProviders, originalRequestUrl, cleanedRequestUrl, - httpRequest), + httpRequest, + ContentSegmentProvidersStatus.GetProviderStatus()), //This class should ONLY be used by one thread at a time (i.e. current request) LazyThreadSafetyMode.None); } @@ -120,9 +121,7 @@ namespace Umbraco.Web.Routing.Segments { get { return _assignedSegments.Value.Where(x => x.Persist); } } - - //TODO: Add an GetAll method! - + /// /// Returns true if any assigned segment value that is a boolean is set to true that matches the specified key /// @@ -174,19 +173,29 @@ namespace Umbraco.Web.Routing.Segments /// /// /// + /// /// /// internal static SegmentCollection GetAllSegmentsForRequest( IEnumerable segmentProviders, Uri originalRequestUrl, Uri cleanedRequestUrl, - HttpRequestBase httpRequest) + HttpRequestBase httpRequest, + IDictionary providersStatus) { //get all key/vals, there might be duplicates so we will simply take the last one in var d = new List(); - foreach (var provider in segmentProviders) + foreach (var provider in segmentProviders + .Select(x => new + { + instance = x, + typeName = x.GetType().FullName + }) + //ensure it is enabled + .Where(x => providersStatus.ContainsKey(x.typeName) && providersStatus[x.typeName]) + .Select(x => x.instance)) { var segments = provider.GetSegmentsForRequest(originalRequestUrl, cleanedRequestUrl, httpRequest).ToArray(); var advertised = provider.SegmentsAdvertised.ToArray(); diff --git a/src/Umbraco.Web/Security/MemberSegments.cs b/src/Umbraco.Web/Security/MemberSegments.cs index 4fe52ac514..96fab30924 100644 --- a/src/Umbraco.Web/Security/MemberSegments.cs +++ b/src/Umbraco.Web/Security/MemberSegments.cs @@ -31,8 +31,18 @@ namespace Umbraco.Web.Security _reguestSegments = reguestSegments; _services = services; } + + public IEnumerable AssignedSegments + { + get + { + var requestAssigned = _reguestSegments.AssignedSegments.ToArray(); + var memberPersisted = PersistedSegments; - //TODO: Add an GetAll method! + //combine and return, the request supercedes the persisted + return requestAssigned.Union(memberPersisted.Except(requestAssigned)); + } + } public bool Is(string segmentKey) {