Updating use of routable path constraint

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-06-08 11:01:39 -07:00
parent abf8357f1b
commit 379e9a60e8
3 changed files with 19 additions and 12 deletions

View File

@@ -12,15 +12,21 @@ namespace Orchard.Core.Routable.Controllers {
[ValidateInput(false)]
public class ItemController : Controller {
private readonly IContentManager _contentManager;
private readonly IRoutablePathConstraint _routablePathConstraint;
public ItemController(IContentManager contentManager) {
public ItemController(IContentManager contentManager, IRoutablePathConstraint routablePathConstraint) {
_contentManager = contentManager;
_routablePathConstraint = routablePathConstraint;
}
public ActionResult Display(string path) {
var matchedPath = _routablePathConstraint.FindPath(path);
if (string.IsNullOrEmpty(matchedPath)) {
throw new ApplicationException("404 - should not have passed path constraint");
}
var hits = _contentManager
.Query<IsRoutable, RoutableRecord>(VersionOptions.Published)
.Where(r => r.Path == path)
.Where(r => r.Path == matchedPath)
.Slice(0, 2);
if (hits.Count() == 0) {
throw new ApplicationException("404 - should not have passed path constraint");
@@ -34,7 +40,7 @@ namespace Orchard.Core.Routable.Controllers {
PrepareDisplayViewModel(model.Routable);
return View("Display", model);
}
private void PrepareDisplayViewModel(ContentItemViewModel<IRoutableAspect> itemViewModel) {
if (string.IsNullOrEmpty(itemViewModel.TemplateName)) {
itemViewModel.TemplateName = "Items/Contents.Item";

View File

@@ -16,6 +16,7 @@ namespace Orchard.Core.Routable.Drivers {
part.Record.Path = "routable" + part.ContentItem.Id;
return base.Editor(part, updater);
}
//private const string TemplateName = "Parts/Common.Routable";
//private readonly IOrchardServices _services;

View File

@@ -13,7 +13,7 @@ namespace Orchard.Core.Routable.Services {
/// Singleton object, per Orchard Shell instance. We need to protect concurrent access to the dictionary.
/// </summary>
private readonly object _syncLock = new object();
private IDictionary<string, string> _slugs = new Dictionary<string, string>();
private IDictionary<string, string> _paths = new Dictionary<string, string>();
public RoutablePathConstraint() {
Logger = NullLogger.Instance;
@@ -21,31 +21,31 @@ namespace Orchard.Core.Routable.Services {
public ILogger Logger { get; set; }
public void SetSlugs(IEnumerable<string> slugs) {
public void SetPaths(IEnumerable<string> paths) {
// Make a copy to avoid performing potential lazy computation inside the lock
var slugsArray = slugs.ToArray();
var slugsArray = paths.ToArray();
lock (_syncLock) {
_slugs = slugsArray.Distinct(StringComparer.OrdinalIgnoreCase).ToDictionary(value => value, StringComparer.OrdinalIgnoreCase);
_paths = slugsArray.Distinct(StringComparer.OrdinalIgnoreCase).ToDictionary(value => value, StringComparer.OrdinalIgnoreCase);
}
}
public string FindSlug(string slug) {
public string FindPath(string path) {
lock (_syncLock) {
string actual;
return _slugs.TryGetValue(slug, out actual) ? actual : slug;
return _paths.TryGetValue(path, out actual) ? actual : path;
}
}
public void AddSlug(string slug) {
lock (_syncLock) {
_slugs[slug] = slug;
_paths[slug] = slug;
}
}
public void RemoveSlug(string slug) {
lock (_syncLock) {
_slugs.Remove(slug);
_paths.Remove(slug);
}
}
@@ -58,7 +58,7 @@ namespace Orchard.Core.Routable.Services {
var parameterValue = Convert.ToString(value);
lock (_syncLock) {
return _slugs.ContainsKey(parameterValue);
return _paths.ContainsKey(parameterValue);
}
}