Segments are working and persisting and configurable
This commit is contained in:
@@ -25,9 +25,9 @@ namespace Umbraco.Tests.Routing
|
||||
[ContentSegment("Test2")]
|
||||
private class MyTestProvider : ContentSegmentProvider
|
||||
{
|
||||
public override IDictionary<string, object> GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest)
|
||||
public override SegmentCollection GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest)
|
||||
{
|
||||
return new Dictionary<string, object>();
|
||||
return new SegmentCollection(Enumerable.Empty<Segment>());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<HttpRequestBase>());
|
||||
new MyTestProvider1(),
|
||||
new MyTestProvider2()
|
||||
}, new Uri("http://localhost/test?blah=1"), new Uri("http://localhost/test/"),
|
||||
Mock.Of<HttpRequestBase>(req => req.Cookies == new HttpCookieCollection()),
|
||||
new Dictionary<string, bool>
|
||||
{
|
||||
{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<HttpRequestBase>(req => req.Cookies == new HttpCookieCollection()),
|
||||
new Dictionary<string, bool>
|
||||
{
|
||||
{typeof(MyTestProvider1).FullName, true},
|
||||
{typeof(MyTestProvider2).FullName, false}
|
||||
});
|
||||
|
||||
Assert.AreEqual(3, result.Count());
|
||||
}
|
||||
|
||||
private class MyTestProvider1 : ContentSegmentProvider
|
||||
{
|
||||
public override IDictionary<string, object> GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest)
|
||||
public override SegmentCollection GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest)
|
||||
{
|
||||
return new Dictionary<string, object> { { "key1", false }, { "key2", "blahdd" }, { "key3", 9876 } };
|
||||
return new SegmentCollection(new List<Segment>
|
||||
{
|
||||
new Segment("key1", true),
|
||||
new Segment("key2", "blahdd"),
|
||||
new Segment("key3", 9876)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private class MyTestProvider2 : ContentSegmentProvider
|
||||
{
|
||||
public override IDictionary<string, object> GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest)
|
||||
public override SegmentCollection GetSegmentsForRequest(Uri originalRequestUrl, Uri cleanedRequestUrl, HttpRequestBase httpRequest)
|
||||
{
|
||||
return new Dictionary<string, object> {{"key1", true}, {"key2", "blah"}, {"key4", 123}};
|
||||
return new SegmentCollection(new List<Segment>
|
||||
{
|
||||
new Segment("key1", true),
|
||||
new Segment("key2", "blah"),
|
||||
new Segment("key4", 123)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace Umbraco.Web.Routing.Segments
|
||||
|
||||
private static readonly string[] PropNames =
|
||||
{
|
||||
"Browser",
|
||||
"IsMobileDevice",
|
||||
"JavaApplets",
|
||||
"MajorVersion",
|
||||
|
||||
@@ -79,24 +79,6 @@ namespace Umbraco.Web.Routing.Segments
|
||||
}
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// Saves an individual config, matches on the existing key. if one is already there it will be overwritten
|
||||
///// </summary>
|
||||
///// <param name="existingKey"></param>
|
||||
///// <param name="config"></param>
|
||||
//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<SegmentProviderMatch> config)
|
||||
{
|
||||
using (new WriteLock(_lock))
|
||||
|
||||
@@ -19,8 +19,9 @@ namespace Umbraco.Web.Routing.Segments
|
||||
|
||||
public static string GetDisplayName(ContentSegmentProvider provider)
|
||||
{
|
||||
var att = provider.GetType().GetCustomAttribute<DisplayNameAttribute>(false);
|
||||
return att == null ? GetTypeName(provider) : att.DisplayName;
|
||||
var type = provider.GetType();
|
||||
var att = type.GetCustomAttribute<DisplayNameAttribute>(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<DescriptionAttribute>(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<string> _advertised;
|
||||
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if any assigned segment value that is a boolean is set to true that matches the specified key
|
||||
/// </summary>
|
||||
@@ -174,19 +173,29 @@ namespace Umbraco.Web.Routing.Segments
|
||||
/// <param name="originalRequestUrl"></param>
|
||||
/// <param name="cleanedRequestUrl"></param>
|
||||
/// <param name="httpRequest"></param>
|
||||
/// <param name="providersStatus"></param>
|
||||
/// <returns>
|
||||
/// </returns>
|
||||
internal static SegmentCollection GetAllSegmentsForRequest(
|
||||
IEnumerable<ContentSegmentProvider> segmentProviders,
|
||||
Uri originalRequestUrl,
|
||||
Uri cleanedRequestUrl,
|
||||
HttpRequestBase httpRequest)
|
||||
HttpRequestBase httpRequest,
|
||||
IDictionary<string, bool> providersStatus)
|
||||
{
|
||||
//get all key/vals, there might be duplicates so we will simply take the last one in
|
||||
|
||||
var d = new List<Segment>();
|
||||
|
||||
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();
|
||||
|
||||
@@ -31,8 +31,18 @@ namespace Umbraco.Web.Security
|
||||
_reguestSegments = reguestSegments;
|
||||
_services = services;
|
||||
}
|
||||
|
||||
public IEnumerable<Segment> 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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user