Slugs in pages module no longer case sensitive. Introduces concept of transient and singleton dependencies. Singleton dependencies really mean single instance per shell.

--HG--
extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4042638
This commit is contained in:
loudej
2009-11-29 09:08:25 +00:00
parent 940e2bce07
commit 9852c56cb2
13 changed files with 290 additions and 30 deletions

View File

@@ -6,9 +6,11 @@ using Orchard.CmsPages.Services;
namespace Orchard.CmsPages.Controllers {
public class TemplatesController : Controller {
private readonly IPageManager _pageManager;
private readonly ISlugConstraint _slugConstraint;
public TemplatesController(IPageManager pageManager) {
public TemplatesController(IPageManager pageManager, ISlugConstraint slugConstraint) {
_pageManager = pageManager;
_slugConstraint = slugConstraint;
}
public ActionResult Show(string slug) {
@@ -17,7 +19,9 @@ namespace Orchard.CmsPages.Controllers {
throw new ArgumentNullException("slug");
}
var revision = _pageManager.GetPublishedBySlug(slug);
var correctedSlug = _slugConstraint.LookupPublishedSlug(slug);
var revision = _pageManager.GetPublishedBySlug(correctedSlug);
if (revision == null) {
//TODO: Error message
throw new HttpException(404, "slug " + slug + " was not found");

View File

@@ -96,6 +96,7 @@
<Compile Include="Services\Templates\MetadataEntry.cs" />
<Compile Include="Services\Templates\TemplateMetadataParser.cs" />
<Compile Include="Services\XmlRpcHandler.cs" />
<Compile Include="Services\SlugConstraint.cs" />
<Compile Include="ViewModels\ChooseTemplateViewModel.cs" />
<Compile Include="ViewModels\PageCreateViewModel.cs" />
<Compile Include="ViewModels\PageEditViewModel.cs" />

View File

@@ -1,18 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Routing;
using Orchard.CmsPages.Services;
using Orchard.Mvc.Routes;
namespace Orchard.CmsPages {
public class Routes : IRouteProvider, IRouteConstraint {
private readonly IPageManager _pageManager;
public Routes(IPageManager pageManager) {
_pageManager = pageManager;
public class Routes : IRouteProvider {
private readonly ISlugConstraint _slugConstraint;
public Routes(ISlugConstraint slugConstraint) {
_slugConstraint = slugConstraint;
}
public void GetRoutes(ICollection<RouteDescriptor> routes) {
@@ -21,7 +19,6 @@ namespace Orchard.CmsPages {
}
public IEnumerable<RouteDescriptor> GetRoutes() {
IRouteConstraint slugConstraint = this;
return new[] {
new RouteDescriptor {
Priority = 10,
@@ -33,7 +30,7 @@ namespace Orchard.CmsPages {
{"action", "show"}
},
new RouteValueDictionary {
{"slug", slugConstraint}
{"slug", _slugConstraint}
},
new RouteValueDictionary {
{"area", "Orchard.CmsPages"}
@@ -43,15 +40,5 @@ namespace Orchard.CmsPages {
};
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
//TEMP: direct db call...
object value;
if (values.TryGetValue(parameterName, out value)) {
var parameterValue = Convert.ToString(value);
bool result = _pageManager.GetCurrentlyPublishedSlugs().Count(slug => slug == parameterValue) != 0;
return result;
}
return false;
}
}
}

View File

@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using Orchard.Tasks;
namespace Orchard.CmsPages.Services {
public interface ISlugConstraint : IRouteConstraint, ISingletonDependency {
void SetCurrentlyPublishedSlugs(IEnumerable<string> slugs);
string LookupPublishedSlug(string slug);
}
public class SlugConstraint : ISlugConstraint {
private IDictionary<string, string> _currentlyPublishedSlugs = new Dictionary<string,string>();
public void SetCurrentlyPublishedSlugs(IEnumerable<string> values) {
_currentlyPublishedSlugs = values
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToDictionary(value => value, StringComparer.OrdinalIgnoreCase);
}
public string LookupPublishedSlug(string slug) {
string actual;
if (_currentlyPublishedSlugs.TryGetValue(slug, out actual))
return actual;
return slug;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
object value;
if (values.TryGetValue(parameterName, out value)) {
var parameterValue = Convert.ToString(value);
return _currentlyPublishedSlugs.ContainsKey(parameterValue);
}
return false;
}
}
public class SlugConstraintUpdater : IBackgroundTask{
private readonly IPageManager _pageManager;
private readonly ISlugConstraint _slugConstraint;
public SlugConstraintUpdater(IPageManager pageManager, ISlugConstraint slugConstraint) {
_pageManager = pageManager;
_slugConstraint = slugConstraint;
}
public void Sweep() {
_slugConstraint.SetCurrentlyPublishedSlugs(_pageManager.GetCurrentlyPublishedSlugs());
}
}
}