Segments are working and persisting and configurable

This commit is contained in:
Shannon
2014-05-20 12:56:39 +10:00
parent fa002ec3b2
commit 26b95afdad
8 changed files with 81 additions and 49 deletions
@@ -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();
+11 -1
View File
@@ -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)
{