From 586ad9be84217bbf95aa73314502ff49b073a4bf Mon Sep 17 00:00:00 2001 From: mahsaro Date: Thu, 23 Jul 2015 14:19:24 +0100 Subject: [PATCH 01/17] Alias step builder and executer --- .../Orchard.Alias/Orchard.Alias.csproj | 18 +-- .../Recipes/Builders/AliasStep.cs | 129 +++++++++++++++++ .../Recipes/Executors/AliasStep.cs | 132 ++++++++++++++++++ 3 files changed, 271 insertions(+), 8 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj b/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj index 5f56dcfe8..75ee4a0d0 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj +++ b/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj @@ -110,6 +110,8 @@ + + @@ -123,20 +125,20 @@ - $(ProjectDir)\..\Manifests - - diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs new file mode 100644 index 000000000..9ec528ec1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -0,0 +1,129 @@ +using System.Linq; +using System.Xml.Linq; +using Orchard.Data; +using Orchard.Localization; +using Orchard.Recipes.Services; +using Orchard.Alias.Records; +using Orchard.Alias.Implementation.Holder; + +namespace Orchard.Roles.Recipes.Builders { + public class RolesStep : RecipeBuilderStep { + private readonly IRepository _aliasRecordepository; + private readonly IAliasHolder _aliasHolder; + + public RolesStep(IRepository aliasRecordRepository, IAliasHolder aliasHolder) + { + _aliasRecordepository = aliasRecordRepository; + _aliasHolder = aliasHolder; + } + + public override string Name { + get { return "Alias"; } + } + + public override LocalizedString DisplayName { + get { return T("Alias"); } + } + + public override LocalizedString Description { + get { return T("Exports the aliases."); } + } + + public override void Build(BuildContext context) { + //var aliases = _aliasRecordepository.Table.ToList(); + + var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).ToList(); + + if (!aliases.Any()) + return; + + var root = new XElement("Aliases"); + context.RecipeDocument.Element("Orchard").Add(root); + + foreach (var alias in aliases.OrderBy(x => x.Path)) + { + var aliasElement = new XElement("Alias", new XAttribute("Path", alias.Path)); + //root.Add( + // new XElement("Alias", + // new XAttribute("Path", alias.Path))); + var routeValuesElement = new XElement("RouteValues"); + foreach (var routeValue in alias.RouteValues) + { + routeValuesElement.Add(new XElement("Add", new XAttribute("Key", routeValue.Key), new XAttribute("Value", routeValue.Value))); + } + + aliasElement.Add(routeValuesElement); + root.Add(aliasElement); + } + + //add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely + var pathsElement = new XElement("Paths"); + foreach (var aliasInfo in aliases) + { + pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); + } + + root.Add(pathsElement); + + //var rootElement = context.Document.Descendants("Orchard").FirstOrDefault(); + + //if (rootElement == null) + //{ + // var ex = new OrchardException(T("Could not export this site's Aliases because the document passed via the Export Context did not contain a node called 'Orchard'. The document was malformed.")); + // Logger.Error(ex, ex.Message); + // throw ex; + //} + + //rootElement.Add(xmlElement); + } + + //public void Exporting(ExportContext context) + //{ + // if (!context.ExportOptions.CustomSteps.Contains("Aliases")) { return; } + + // var xmlElement = new XElement("Aliases"); + + // var autoroutePaths = _contentManager.Query().List().Select(p => p.Path); + // var allAliasInfos = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).ToList(); + + // //we need to remove any aliases that are autoroutes because the remote conent id may not sync up with the local content id. the autoroutes will be imported as part of the content import + // var aliasInfosToExport = allAliasInfos.Where(ai => !autoroutePaths.Contains(ai.Path)); + + // foreach (var aliasInfo in aliasInfosToExport) + // { + // var aliasElement = new XElement("Alias", new XAttribute("Path", aliasInfo.Path)); + + // var routeValuesElement = new XElement("RouteValues"); + // foreach (var routeValue in aliasInfo.RouteValues) + // { + // routeValuesElement.Add(new XElement("Add", new XAttribute("Key", routeValue.Key), new XAttribute("Value", routeValue.Value))); + // } + + // aliasElement.Add(routeValuesElement); + // xmlElement.Add(aliasElement); + // } + + // //add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely + // var pathsElement = new XElement("Paths"); + // foreach (var aliasInfo in allAliasInfos) + // { + // pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); + // } + + // xmlElement.Add(pathsElement); + + // var rootElement = context.Document.Descendants("Orchard").FirstOrDefault(); + + // if (rootElement == null) + // { + // var ex = new OrchardException(T("Could not export this site's Aliases because the document passed via the Export Context did not contain a node called 'Orchard'. The document was malformed.")); + // Logger.Error(ex, ex.Message); + // throw ex; + // } + + // rootElement.Add(xmlElement); + //} + + + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs new file mode 100644 index 000000000..67b2ba56e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -0,0 +1,132 @@ +using System; +using System.Web; +using System.Web.Routing; +using System.Linq; +using Orchard.Alias; +using Orchard.Logging; +using Orchard.Recipes.Models; +using Orchard.Recipes.Services; + + +namespace Orchard.Alias.Recipes.Executors { + public class AliasStep : RecipeExecutionStep { + private readonly IAliasService _aliasService; + + public AliasStep(IAliasService aliasService) + { + _aliasService = aliasService; + } + + public override string Name { + get { return "Alias"; } + } + + public override void Execute(RecipeExecutionContext context) { + //var installedPermissions = _roleService.GetInstalledPermissions().SelectMany(p => p.Value).ToList(); + + foreach (var aliasElement in context.RecipeStep.Step.Elements()) { + var aliasPath = aliasElement.Attribute("Path").Value; + + Logger.Information("Processing alias '{0}'.", aliasPath); + + //var path = aliasElement.Attribute("Path").Value; + var rvd = new RouteValueDictionary(); + + var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); + + if (routeValuesElement != null) + { + foreach (var routeValue in routeValuesElement.Descendants("Add")) + { + rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); + } + } + + _aliasService.Set(aliasPath, rvd, "Custom"); + + try { + _aliasService.Set(aliasPath, rvd, "Custom"); + //var role = _roleService.GetRoleByName(roleName); + //if (role == null) { + // _roleService.CreateRole(roleName); + // role = _roleService.GetRoleByName(roleName); + } + + // var permissions = roleElement.Attribute("Permissions").Value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + // // Only import permissions for currenlty installed modules. + // var permissionsValid = permissions.Where(permission => installedPermissions.Any(x => x.Name == permission)).ToList(); + + // // Union to keep existing permissions. + // _roleService.UpdateRole(role.Id, role.Name, permissionsValid.Union(role.RolesPermissions.Select(p => p.Permission.Name))); + //} + catch (Exception ex) { + Logger.Error(ex, "Error while processing alias '{0}'.", aliasPath); + throw; + } + + ////remove all local pathys that are not present in the remote export + //var allRemotePaths = recipeContext.RecipeStep.Step.XPathSelectElements("Paths/Add").Select(e => e.Attribute("Path").Value); + //var allLocalPaths = _aliasService.List().Select(t => t.Item1).ToList(); + + //foreach (var path in allLocalPaths.Where(p => !allRemotePaths.Contains(p))) + //{ + // _aliasService.Delete(path); + //} + + + //recipeContext.Executed = true; + } + } + + /* + + + + + + + + + */ + //Enable any features that are in the list, disable features that aren't in the list + //public override void Execute(RecipeExecutionContext context) + //{ + // if (!String.Equals(context.RecipeStep.Name, "Aliases", StringComparison.OrdinalIgnoreCase)) + // { + // return; + // } + + // var aliasElements = context.RecipeStep.Step.Descendants("Alias"); + + // foreach (var aliasElement in aliasElements) + // { + // var path = aliasElement.Attribute("Path").Value; + // var rvd = new RouteValueDictionary(); + + // var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); + + // if (routeValuesElement != null) + // { + // foreach (var routeValue in routeValuesElement.Descendants("Add")) + // { + // rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); + // } + // } + + // _aliasService.Set(path, rvd, "Custom"); + // } + + // //remove all local pathys that are not present in the remote export + // var allRemotePaths = recipeContext.RecipeStep.Step.XPathSelectElements("Paths/Add").Select(e => e.Attribute("Path").Value); + // var allLocalPaths = _aliasService.List().Select(t => t.Item1).ToList(); + + // foreach (var path in allLocalPaths.Where(p => !allRemotePaths.Contains(p))) + // { + // _aliasService.Delete(path); + // } + + + // recipeContext.Executed = true; + //} + } +} \ No newline at end of file From 6718f1902b3af9c2deab3341ba63b4f5e2f162bd Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 28 Jul 2015 13:52:55 +0100 Subject: [PATCH 02/17] Export and import works --- .../Controllers/AdminController.cs | 4 +-- .../Modules/Orchard.Alias/IAliasService.cs | 8 ++--- .../Implementation/AliasRoute.cs | 8 +++-- .../Implementation/DefaultAliasService.cs | 19 +++++++----- .../Implementation/Holder/AliasInfo.cs | 1 + .../Implementation/Map/AliasMap.cs | 29 +++++++++++++------ .../Implementation/Storage/AliasStorage.cs | 29 +++++++++++-------- .../Updater/AliasHolderUpdater.cs | 2 +- .../Modules/Orchard.Alias/Migrations.cs | 9 ++++++ .../Recipes/Builders/AliasStep.cs | 14 ++++----- .../Recipes/Executors/AliasStep.cs | 6 ++-- .../Orchard.Alias/Records/AliasRecord.cs | 1 + .../ViewModels/AdminIndexViewModel.cs | 1 + .../Services/AutorouteService.cs | 2 +- .../Routing/ArchiveConstraint.CS | 14 +++++---- .../Orchard.Blogs/Routing/RsdConstraint.CS | 15 ++++++---- 16 files changed, 100 insertions(+), 62 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index 79669da3f..6303e4bfc 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -140,7 +140,7 @@ namespace Orchard.Alias.Controllers { } try { - _aliasService.Set(aliasPath, routePath, "Custom"); + _aliasService.Set(aliasPath, routePath, "Custom",false); } catch(Exception ex) { Services.TransactionManager.Cancel(); @@ -204,7 +204,7 @@ namespace Orchard.Alias.Controllers { } try { - _aliasService.Set(aliasPath, routePath, "Custom"); + _aliasService.Set(aliasPath, routePath, "Custom",false); } catch (Exception ex) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs b/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs index 6eb151cf2..843f78932 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs @@ -5,8 +5,8 @@ using System.Web.Routing; namespace Orchard.Alias { public interface IAliasService : IDependency { RouteValueDictionary Get(string aliasPath); - void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource); - void Set(string aliasPath, string routePath, string aliasSource); + void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged); + void Set(string aliasPath, string routePath, string aliasSource, bool isManaged); void Delete(string aliasPath); void Delete(string aliasPath, string aliasSource); /// @@ -18,8 +18,8 @@ namespace Orchard.Alias { IEnumerable Lookup(RouteValueDictionary routeValues); IEnumerable Lookup(string routePath); - void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource); - void Replace(string aliasPath, string routePath, string aliasSource); + void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged); + void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged); IEnumerable> List(); IEnumerable> List(string sourceStartsWith); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs index 2e7a3ace7..b6555e678 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs @@ -29,12 +29,14 @@ namespace Orchard.Alias.Implementation { var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo; // Attempt to lookup RouteValues in the alias map - IDictionary routeValues; + //IDictionary routeValues; + AliasInfo aliasInfo; // TODO: Might as well have the lookup in AliasHolder... - if (_aliasMap.TryGetAlias(virtualPath, out routeValues)) { + if (_aliasMap.TryGetAlias(virtualPath, out aliasInfo)) + { // Construct RouteData from the route values var data = new RouteData(this, _routeHandler); - foreach (var routeValue in routeValues) { + foreach (var routeValue in aliasInfo.RouteValues) { var key = routeValue.Key; if (key.EndsWith("-")) data.Values.Add(key.Substring(0, key.Length - 1), routeValue.Value); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs index 8e8747de4..e373ecbba 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs @@ -31,18 +31,20 @@ namespace Orchard.Alias.Implementation { return _aliasStorage.Get(aliasPath).ToRouteValueDictionary(); } - public void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource) { + public void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged) { _aliasStorage.Set( aliasPath, ToDictionary(routeValues), - aliasSource); + aliasSource, + isManaged); } - public void Set(string aliasPath, string routePath, string aliasSource) { + public void Set(string aliasPath, string routePath, string aliasSource, bool isManaged) { _aliasStorage.Set( aliasPath.TrimStart('/'), ToDictionary(routePath), - aliasSource); + aliasSource, + isManaged); } public void Delete(string aliasPath) { @@ -71,15 +73,16 @@ namespace Orchard.Alias.Implementation { return Lookup(ToDictionary(routePath).ToRouteValueDictionary()); } - public void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource) { + public void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged) { foreach (var lookup in Lookup(routeValues).Where(path => path != aliasPath)) { Delete(lookup, aliasSource); } - Set(aliasPath, routeValues, aliasSource); + Set(aliasPath, routeValues, aliasSource, isManaged); } - public void Replace(string aliasPath, string routePath, string aliasSource) { - Replace(aliasPath, ToDictionary(routePath).ToRouteValueDictionary(), aliasSource); + public void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged) + { + Replace(aliasPath, ToDictionary(routePath).ToRouteValueDictionary(), aliasSource, isManaged); } public IEnumerable Lookup(RouteValueDictionary routeValues) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/AliasInfo.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/AliasInfo.cs index a85c4377a..0c3ffed2f 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/AliasInfo.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/AliasInfo.cs @@ -5,5 +5,6 @@ namespace Orchard.Alias.Implementation.Holder { public string Area { get; set; } public string Path { get; set; } public IDictionary RouteValues { get; set; } + public bool IsManaged { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs index 834da797a..a801872db 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs @@ -9,21 +9,29 @@ using System.Collections.Concurrent; namespace Orchard.Alias.Implementation.Map { public class AliasMap { private readonly string _area; - private readonly ConcurrentDictionary> _aliases; - private readonly Node _root; + //private readonly ConcurrentDictionary> _aliases; + private readonly ConcurrentDictionary _aliases; + private readonly Node _root; public AliasMap(string area) { _area = area; - _aliases = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); + //_aliases = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); + _aliases = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); _root = new Node(); + //_isManaged = isManaged; } public IEnumerable GetAliases() { - return _aliases.Select(x => new AliasInfo {Area = _area, Path = x.Key, RouteValues = x.Value}); + return _aliases.Select(x => new AliasInfo { Area = _area, Path = x.Key, RouteValues = x.Value.RouteValues, IsManaged = x.Value.IsManaged }); } - public bool TryGetAlias(string virtualPath, out IDictionary routeValues) { - return _aliases.TryGetValue(virtualPath, out routeValues); + //public bool TryGetAlias(string virtualPath, out IDictionary routeValues) { + // return _aliases.TryGetValue(virtualPath, out routeValues); + //} + + public bool TryGetAlias(string virtualPath, out AliasInfo aliasInfo) + { + return _aliases.TryGetValue(virtualPath, out aliasInfo); } public Tuple, string> Locate(RouteValueDictionary routeValues) { @@ -39,7 +47,8 @@ namespace Orchard.Alias.Implementation.Map { throw new ArgumentNullException(); } - _aliases[info.Path] = info.RouteValues; + //_aliases[info.Path] = info.RouteValues; + _aliases[info.Path] = info; ExpandTree(_root, info.Path, info.RouteValues); } @@ -48,8 +57,10 @@ namespace Orchard.Alias.Implementation.Map { /// /// public void Remove(AliasInfo info) { - IDictionary values; - _aliases.TryRemove(info.Path, out values); + //IDictionary values; + AliasInfo aliasInfo; + _aliases.TryRemove(info.Path, out aliasInfo); + //_aliases.TryRemove(info.Path, out info); CollapseTree(_root, info.Path, info.RouteValues); } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs index 736fcece6..12858d45d 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs @@ -10,15 +10,15 @@ using Orchard.Validation; namespace Orchard.Alias.Implementation.Storage { public interface IAliasStorage : IDependency { - void Set(string path, IDictionary routeValues, string source); + void Set(string path, IDictionary routeValues, string source, bool isManaged); IDictionary Get(string aliasPath); void Remove(Expression> filter); void Remove(string path); void Remove(string path, string aliasSource); void RemoveBySource(string aliasSource); - IEnumerable, string, int>> List(Expression> predicate); - IEnumerable, string, int>> List(); - IEnumerable, string, int>> List(string sourceStartsWith); + IEnumerable, string, int, bool>> List(Expression> predicate); + IEnumerable, string, int, bool>> List(); + IEnumerable, string, int, bool>> List(string sourceStartsWith); } public class AliasStorage : IAliasStorage { @@ -31,7 +31,7 @@ namespace Orchard.Alias.Implementation.Storage { _aliasHolder = aliasHolder; } - public void Set(string path, IDictionary routeValues, string source) { + public void Set(string path, IDictionary routeValues, string source, bool isManaged) { if (path == null) { throw new ArgumentNullException("path"); } @@ -66,6 +66,7 @@ namespace Orchard.Alias.Implementation.Storage { aliasRecord.RouteValues = values.ToString(); aliasRecord.Source = source; + aliasRecord.IsManaged = isManaged; if (aliasRecord.Action.Id == 0 || aliasRecord.Id == 0) { if (aliasRecord.Action.Id == 0) { _actionRepository.Create(aliasRecord.Action); @@ -78,7 +79,7 @@ namespace Orchard.Alias.Implementation.Storage { } // Transform and push into AliasHolder var dict = ToDictionary(aliasRecord); - _aliasHolder.SetAlias(new AliasInfo { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3 }); + _aliasHolder.SetAlias(new AliasInfo { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6 }); } public IDictionary Get(string path) { @@ -109,15 +110,17 @@ namespace Orchard.Alias.Implementation.Storage { // Bulk updates might go wrong if we don't flush. _aliasRepository.Flush(); var dict = ToDictionary(aliasRecord); - _aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3 }); + //TODO: + _aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6}); } } - public IEnumerable, string, int>> List() { + public IEnumerable, string, int, bool>> List() + { return List((Expression>)null); } - public IEnumerable, string, int>> List(Expression> predicate) { + public IEnumerable, string, int, bool>> List(Expression> predicate) { var table = _aliasRepository.Table; if (predicate != null) { @@ -127,11 +130,13 @@ namespace Orchard.Alias.Implementation.Storage { return table.OrderBy(a => a.Id).Select(ToDictionary).ToList(); } - public IEnumerable, string, int>> List(string sourceStartsWith) { + public IEnumerable, string, int, bool>> List(string sourceStartsWith) + { return List(a => a.Source.StartsWith(sourceStartsWith)); } - private static Tuple, string, int> ToDictionary(AliasRecord aliasRecord) { + private static Tuple, string, int, bool> ToDictionary(AliasRecord aliasRecord) + { IDictionary routeValues = new Dictionary(); if (aliasRecord.Action.Area != null) { routeValues.Add("area", aliasRecord.Action.Area); @@ -147,7 +152,7 @@ namespace Orchard.Alias.Implementation.Storage { routeValues.Add(attr.Name.LocalName, attr.Value); } } - return Tuple.Create(aliasRecord.Path, aliasRecord.Action.Area, routeValues, aliasRecord.Source, aliasRecord.Id); + return Tuple.Create(aliasRecord.Path, aliasRecord.Action.Area, routeValues, aliasRecord.Source, aliasRecord.Id, aliasRecord.IsManaged); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs index aec6d63ad..3763aabbe 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs @@ -34,7 +34,7 @@ namespace Orchard.Alias.Implementation.Updater { // update the last processed id if (aliases.Any()) { _cursor.Cursor = aliases.Last().Item5; - _aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3 })); + _aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3, IsManaged = alias.Item6 })); } } catch (Exception ex) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs index 1b36b99ea..f8a222614 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs @@ -20,5 +20,14 @@ namespace Orchard.Alias { return 1; } + public int UpdateFrom1() + { + SchemaBuilder.AlterTable("AliasRecord", + table => table + .AddColumn("IsManaged", column => column.WithDefault(false)) + ); + return 2; + } + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index 9ec528ec1..1cb3d0868 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -32,7 +32,7 @@ namespace Orchard.Roles.Recipes.Builders { public override void Build(BuildContext context) { //var aliases = _aliasRecordepository.Table.ToList(); - var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).ToList(); + var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged== false).ToList(); if (!aliases.Any()) return; @@ -57,13 +57,13 @@ namespace Orchard.Roles.Recipes.Builders { } //add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely - var pathsElement = new XElement("Paths"); - foreach (var aliasInfo in aliases) - { - pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); - } + //var pathsElement = new XElement("Paths"); + //foreach (var aliasInfo in aliases) + //{ + // pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); + //} - root.Add(pathsElement); + //root.Add(pathsElement); //var rootElement = context.Document.Descendants("Orchard").FirstOrDefault(); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index 67b2ba56e..f6d73d18c 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -18,7 +18,7 @@ namespace Orchard.Alias.Recipes.Executors { } public override string Name { - get { return "Alias"; } + get { return "Aliases"; } } public override void Execute(RecipeExecutionContext context) { @@ -42,10 +42,10 @@ namespace Orchard.Alias.Recipes.Executors { } } - _aliasService.Set(aliasPath, rvd, "Custom"); + //_aliasService.Set(aliasPath, rvd, "Custom",false); try { - _aliasService.Set(aliasPath, rvd, "Custom"); + _aliasService.Set(aliasPath, rvd, "Custom", false); //var role = _roleService.GetRoleByName(roleName); //if (role == null) { // _roleService.CreateRole(roleName); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Records/AliasRecord.cs b/src/Orchard.Web/Modules/Orchard.Alias/Records/AliasRecord.cs index 258667261..e243c7ad5 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Records/AliasRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Records/AliasRecord.cs @@ -5,5 +5,6 @@ public virtual ActionRecord Action { get; set; } public virtual string RouteValues { get; set; } public virtual string Source { get; set; } + public virtual bool IsManaged { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs index da53408b8..d7debdf9d 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs @@ -12,6 +12,7 @@ namespace Orchard.Alias.ViewModels { public class AliasEntry { public AliasInfo Alias { get; set; } public bool IsChecked { get; set; } + public bool IsManaged { get; set; } } public class AdminIndexOptions { public string Search { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs index df0f07afc..be917f062 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs @@ -96,7 +96,7 @@ namespace Orchard.Autoroute.Services { public void PublishAlias(AutoroutePart part) { var displayRouteValues = _contentManager.GetItemMetadata(part).DisplayRouteValues; - _aliasService.Replace(part.DisplayAlias, displayRouteValues, AliasSource); + _aliasService.Replace(part.DisplayAlias, displayRouteValues, AliasSource, true); _routeEvents.Routed(part, part.DisplayAlias); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS index 61ade43a1..01bfb6373 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS @@ -37,18 +37,20 @@ namespace Orchard.Blogs.Routing { return false; } - IDictionary routeValues; - if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) { + //IDictionary routeValues; + AliasInfo aliasInfo; + if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo)) + { return false; } var isBlog = //routeValues.ContainsKey("area") && //routeValues["area"] == "Orchard.Blogs" && - routeValues.ContainsKey("controller") && - routeValues["controller"] == "Blog" && - routeValues.ContainsKey("action") && - routeValues["action"] == "Item" + aliasInfo.RouteValues.ContainsKey("controller") && + aliasInfo.RouteValues["controller"] == "Blog" && + aliasInfo.RouteValues.ContainsKey("action") && + aliasInfo.RouteValues["action"] == "Item" ; return isBlog; diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS index d41b9fde6..a3676c8c8 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS @@ -25,18 +25,21 @@ namespace Orchard.Blogs.Routing { return false; } - IDictionary routeValues; - if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) { + //IDictionary routeValues; + AliasInfo aliasInfo; + //if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) { + if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo)) + { return false; } var isBlog = //routeValues.ContainsKey("area") && //routeValues["area"] == "Orchard.Blogs" && - routeValues.ContainsKey("controller") && - routeValues["controller"] == "Blog" && - routeValues.ContainsKey("action") && - routeValues["action"] == "Item" + aliasInfo.RouteValues.ContainsKey("controller") && + aliasInfo.RouteValues["controller"] == "Blog" && + aliasInfo.RouteValues.ContainsKey("action") && + aliasInfo.RouteValues["action"] == "Item" ; return isBlog; From 8ef3ca1eacd3c51ea5f3863b3c1dd258e9800613 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 28 Jul 2015 18:37:22 +0100 Subject: [PATCH 03/17] Sort,Filter and showing IsManaged Admin UI --- .../Controllers/AdminController.cs | 26 ++++++++------ .../Implementation/Storage/AliasStorage.cs | 2 +- .../Recipes/Executors/AliasStep.cs | 35 +++---------------- .../ViewModels/AdminIndexViewModel.cs | 7 ++-- .../Orchard.Alias/Views/Admin/Index.cshtml | 18 ++++++++-- 5 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index 6303e4bfc..93ab2feb5 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -45,13 +45,7 @@ namespace Orchard.Alias.Controllers { if (options == null) options = new AdminIndexOptions(); - switch (options.Filter) { - case AliasFilter.All: - break; - default: - throw new ArgumentOutOfRangeException(); - } - + var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()); if (!String.IsNullOrWhiteSpace(options.Search)) { @@ -61,6 +55,19 @@ namespace Orchard.Alias.Controllers { aliases = aliases.ToList(); + switch (options.Filter) + { + case AliasFilter.Managed: + aliases = aliases.Where(x => x.IsManaged); + break; + case AliasFilter.Custom: + aliases = aliases.Where(x => !x.IsManaged); + break; + case AliasFilter.All: + break; + default: + throw new ArgumentOutOfRangeException(); + } var pagerShape = Services.New.Pager(pager).TotalItemCount(aliases.Count()); switch (options.Order) { @@ -76,7 +83,7 @@ namespace Orchard.Alias.Controllers { var model = new AdminIndexViewModel { Options = options, Pager = pagerShape, - AliasEntries = aliases.Select(x => new AliasEntry() { Alias = x, IsChecked = false }).ToList() + AliasEntries = aliases.Select(x => new AliasEntry() { Alias = x, IsChecked = false }).OrderBy(x => x.Alias.IsManaged).ToList() }; return View(model); @@ -104,8 +111,7 @@ namespace Orchard.Alias.Controllers { break; default: throw new ArgumentOutOfRangeException(); - } - + } return RedirectToAction("Index"); } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs index 12858d45d..7569adb38 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs @@ -91,7 +91,7 @@ namespace Orchard.Alias.Implementation.Storage { } public void Remove(string path) { - Remove(x => x.Path == path && x.Source == path); + Remove(x => x.Path == path); } public void Remove(string path, string aliasSource) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index f6d73d18c..068a95ee4 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -21,8 +21,7 @@ namespace Orchard.Alias.Recipes.Executors { get { return "Aliases"; } } - public override void Execute(RecipeExecutionContext context) { - //var installedPermissions = _roleService.GetInstalledPermissions().SelectMany(p => p.Value).ToList(); + public override void Execute(RecipeExecutionContext context) { foreach (var aliasElement in context.RecipeStep.Step.Elements()) { var aliasPath = aliasElement.Attribute("Path").Value; @@ -41,40 +40,16 @@ namespace Orchard.Alias.Recipes.Executors { rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); } } - - //_aliasService.Set(aliasPath, rvd, "Custom",false); - + try { - _aliasService.Set(aliasPath, rvd, "Custom", false); - //var role = _roleService.GetRoleByName(roleName); - //if (role == null) { - // _roleService.CreateRole(roleName); - // role = _roleService.GetRoleByName(roleName); + _aliasService.Set(aliasPath, rvd, "Custom", false); } - - // var permissions = roleElement.Attribute("Permissions").Value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - // // Only import permissions for currenlty installed modules. - // var permissionsValid = permissions.Where(permission => installedPermissions.Any(x => x.Name == permission)).ToList(); - - // // Union to keep existing permissions. - // _roleService.UpdateRole(role.Id, role.Name, permissionsValid.Union(role.RolesPermissions.Select(p => p.Permission.Name))); - //} + catch (Exception ex) { Logger.Error(ex, "Error while processing alias '{0}'.", aliasPath); throw; } - - ////remove all local pathys that are not present in the remote export - //var allRemotePaths = recipeContext.RecipeStep.Step.XPathSelectElements("Paths/Add").Select(e => e.Attribute("Path").Value); - //var allLocalPaths = _aliasService.List().Select(t => t.Item1).ToList(); - - //foreach (var path in allLocalPaths.Where(p => !allRemotePaths.Contains(p))) - //{ - // _aliasService.Delete(path); - //} - - - //recipeContext.Executed = true; + } } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs index d7debdf9d..e0670dee3 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs @@ -11,8 +11,7 @@ namespace Orchard.Alias.ViewModels { public class AliasEntry { public AliasInfo Alias { get; set; } - public bool IsChecked { get; set; } - public bool IsManaged { get; set; } + public bool IsChecked { get; set; } } public class AdminIndexOptions { public string Search { get; set; } @@ -26,7 +25,9 @@ namespace Orchard.Alias.ViewModels { } public enum AliasFilter { - All + All, + Managed, + Custom } public enum AliasBulkAction { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml index 417632e11..c112c1b97 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml @@ -36,6 +36,12 @@ + + @@ -54,6 +60,7 @@ @T("Alias") @T("Route") + @T("IsManaged")   @@ -79,9 +86,14 @@ @Html.Link(url, Href("~/" + urlPrefix + "/" + url)) - @Html.ActionLink(T("Edit").Text, "Edit", new { path = alias.Path == String.Empty ? "/" : alias.Path }) - | - @Html.ActionLink(T("Delete").Text, "Delete", new { path = alias.Path }, new { itemprop = "UnsafeUrl RemoveUrl" }) + + + + @if (!alias.IsManaged) { + @Html.ActionLink(T("Edit").Text, "Edit", new { path = alias.Path == String.Empty ? "/" : alias.Path }) + | + @Html.ActionLink(T("Delete").Text, "Delete", new { path = alias.Path }, new { itemprop = "UnsafeUrl RemoveUrl" }) + } } From 057a2a32ad95373864f50e5e75abc9bb68f1545e Mon Sep 17 00:00:00 2001 From: mahsaro Date: Fri, 31 Jul 2015 17:42:44 +0100 Subject: [PATCH 04/17] Cleanup --- .../Implementation/Map/AliasMap.cs | 15 +--- .../Implementation/Storage/AliasStorage.cs | 1 - .../Recipes/Builders/AliasStep.cs | 76 +------------------ .../Recipes/Executors/AliasStep.cs | 66 +++------------- .../Orchard.Blogs/Routing/RsdConstraint.CS | 2 - 5 files changed, 16 insertions(+), 144 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs index a801872db..93eb18635 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs @@ -8,27 +8,20 @@ using System.Collections.Concurrent; namespace Orchard.Alias.Implementation.Map { public class AliasMap { - private readonly string _area; - //private readonly ConcurrentDictionary> _aliases; + private readonly string _area; private readonly ConcurrentDictionary _aliases; private readonly Node _root; public AliasMap(string area) { - _area = area; - //_aliases = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); + _area = area; _aliases = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); _root = new Node(); - //_isManaged = isManaged; } public IEnumerable GetAliases() { return _aliases.Select(x => new AliasInfo { Area = _area, Path = x.Key, RouteValues = x.Value.RouteValues, IsManaged = x.Value.IsManaged }); } - //public bool TryGetAlias(string virtualPath, out IDictionary routeValues) { - // return _aliases.TryGetValue(virtualPath, out routeValues); - //} - public bool TryGetAlias(string virtualPath, out AliasInfo aliasInfo) { return _aliases.TryGetValue(virtualPath, out aliasInfo); @@ -46,8 +39,6 @@ namespace Orchard.Alias.Implementation.Map { if(info == null) { throw new ArgumentNullException(); } - - //_aliases[info.Path] = info.RouteValues; _aliases[info.Path] = info; ExpandTree(_root, info.Path, info.RouteValues); } @@ -57,10 +48,8 @@ namespace Orchard.Alias.Implementation.Map { /// /// public void Remove(AliasInfo info) { - //IDictionary values; AliasInfo aliasInfo; _aliases.TryRemove(info.Path, out aliasInfo); - //_aliases.TryRemove(info.Path, out info); CollapseTree(_root, info.Path, info.RouteValues); } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs index 7569adb38..ae9d37656 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs @@ -110,7 +110,6 @@ namespace Orchard.Alias.Implementation.Storage { // Bulk updates might go wrong if we don't flush. _aliasRepository.Flush(); var dict = ToDictionary(aliasRecord); - //TODO: _aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6}); } } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index 1cb3d0868..d90ef7bb1 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -30,8 +30,6 @@ namespace Orchard.Roles.Recipes.Builders { } public override void Build(BuildContext context) { - //var aliases = _aliasRecordepository.Table.ToList(); - var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged== false).ToList(); if (!aliases.Any()) @@ -43,9 +41,7 @@ namespace Orchard.Roles.Recipes.Builders { foreach (var alias in aliases.OrderBy(x => x.Path)) { var aliasElement = new XElement("Alias", new XAttribute("Path", alias.Path)); - //root.Add( - // new XElement("Alias", - // new XAttribute("Path", alias.Path))); + var routeValuesElement = new XElement("RouteValues"); foreach (var routeValue in alias.RouteValues) { @@ -55,75 +51,7 @@ namespace Orchard.Roles.Recipes.Builders { aliasElement.Add(routeValuesElement); root.Add(aliasElement); } - - //add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely - //var pathsElement = new XElement("Paths"); - //foreach (var aliasInfo in aliases) - //{ - // pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); - //} - - //root.Add(pathsElement); - - //var rootElement = context.Document.Descendants("Orchard").FirstOrDefault(); - - //if (rootElement == null) - //{ - // var ex = new OrchardException(T("Could not export this site's Aliases because the document passed via the Export Context did not contain a node called 'Orchard'. The document was malformed.")); - // Logger.Error(ex, ex.Message); - // throw ex; - //} - - //rootElement.Add(xmlElement); } - - //public void Exporting(ExportContext context) - //{ - // if (!context.ExportOptions.CustomSteps.Contains("Aliases")) { return; } - - // var xmlElement = new XElement("Aliases"); - - // var autoroutePaths = _contentManager.Query().List().Select(p => p.Path); - // var allAliasInfos = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).ToList(); - - // //we need to remove any aliases that are autoroutes because the remote conent id may not sync up with the local content id. the autoroutes will be imported as part of the content import - // var aliasInfosToExport = allAliasInfos.Where(ai => !autoroutePaths.Contains(ai.Path)); - - // foreach (var aliasInfo in aliasInfosToExport) - // { - // var aliasElement = new XElement("Alias", new XAttribute("Path", aliasInfo.Path)); - - // var routeValuesElement = new XElement("RouteValues"); - // foreach (var routeValue in aliasInfo.RouteValues) - // { - // routeValuesElement.Add(new XElement("Add", new XAttribute("Key", routeValue.Key), new XAttribute("Value", routeValue.Value))); - // } - - // aliasElement.Add(routeValuesElement); - // xmlElement.Add(aliasElement); - // } - - // //add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely - // var pathsElement = new XElement("Paths"); - // foreach (var aliasInfo in allAliasInfos) - // { - // pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); - // } - - // xmlElement.Add(pathsElement); - - // var rootElement = context.Document.Descendants("Orchard").FirstOrDefault(); - - // if (rootElement == null) - // { - // var ex = new OrchardException(T("Could not export this site's Aliases because the document passed via the Export Context did not contain a node called 'Orchard'. The document was malformed.")); - // Logger.Error(ex, ex.Message); - // throw ex; - // } - - // rootElement.Add(xmlElement); - //} - - + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index 068a95ee4..290e40463 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -21,6 +21,16 @@ namespace Orchard.Alias.Recipes.Executors { get { return "Aliases"; } } + /* + + + + + + + + + */ public override void Execute(RecipeExecutionContext context) { foreach (var aliasElement in context.RecipeStep.Step.Elements()) { @@ -28,7 +38,6 @@ namespace Orchard.Alias.Recipes.Executors { Logger.Information("Processing alias '{0}'.", aliasPath); - //var path = aliasElement.Attribute("Path").Value; var rvd = new RouteValueDictionary(); var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); @@ -48,60 +57,9 @@ namespace Orchard.Alias.Recipes.Executors { catch (Exception ex) { Logger.Error(ex, "Error while processing alias '{0}'.", aliasPath); throw; - } - + } } } - /* - - - - - - - - - */ - //Enable any features that are in the list, disable features that aren't in the list - //public override void Execute(RecipeExecutionContext context) - //{ - // if (!String.Equals(context.RecipeStep.Name, "Aliases", StringComparison.OrdinalIgnoreCase)) - // { - // return; - // } - - // var aliasElements = context.RecipeStep.Step.Descendants("Alias"); - - // foreach (var aliasElement in aliasElements) - // { - // var path = aliasElement.Attribute("Path").Value; - // var rvd = new RouteValueDictionary(); - - // var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); - - // if (routeValuesElement != null) - // { - // foreach (var routeValue in routeValuesElement.Descendants("Add")) - // { - // rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); - // } - // } - - // _aliasService.Set(path, rvd, "Custom"); - // } - - // //remove all local pathys that are not present in the remote export - // var allRemotePaths = recipeContext.RecipeStep.Step.XPathSelectElements("Paths/Add").Select(e => e.Attribute("Path").Value); - // var allLocalPaths = _aliasService.List().Select(t => t.Item1).ToList(); - - // foreach (var path in allLocalPaths.Where(p => !allRemotePaths.Contains(p))) - // { - // _aliasService.Delete(path); - // } - - - // recipeContext.Executed = true; - //} - } + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS index a3676c8c8..c722ec0a7 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/RsdConstraint.CS @@ -25,9 +25,7 @@ namespace Orchard.Blogs.Routing { return false; } - //IDictionary routeValues; AliasInfo aliasInfo; - //if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) { if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo)) { return false; From bb143d7236e81e59f520cdd3e576dc4595396c6d Mon Sep 17 00:00:00 2001 From: mahsaro Date: Mon, 3 Aug 2015 12:28:16 +0100 Subject: [PATCH 05/17] Fixed format settings. Made IsManaged optional with default value false in IAliasService. --- .../Modules/Orchard.Alias/AdminMenu.cs | 9 +- .../Controllers/AdminController.cs | 26 ++--- .../Modules/Orchard.Alias/IAliasService.cs | 8 +- .../Implementation/AliasRoute.cs | 3 +- .../Implementation/DefaultAliasService.cs | 24 ++-- .../Implementation/Holder/IAliasHolder.cs | 2 +- .../Implementation/Map/AliasMap.cs | 35 +++--- .../Implementation/Storage/AliasStorage.cs | 11 +- .../Updater/AliasHolderUpdater.cs | 4 +- .../Updater/IAliasUpdateCursor.cs | 2 +- .../Modules/Orchard.Alias/Migrations.cs | 5 +- .../Recipes/Builders/AliasStep.cs | 17 ++- .../Recipes/Executors/AliasStep.cs | 23 ++-- .../Modules/Orchard.Alias/Routes.cs | 2 +- .../ViewModels/AdminIndexViewModel.cs | 3 +- .../Orchard.Alias/Views/Admin/Add.cshtml | 44 +++---- .../Orchard.Alias/Views/Admin/Delete.cshtml | 14 +-- .../Orchard.Alias/Views/Admin/Edit.cshtml | 44 +++---- .../Orchard.Alias/Views/Admin/Index.cshtml | 110 +++++++++--------- .../Services/AutorouteService.cs | 3 +- .../Routing/ArchiveConstraint.CS | 9 +- 21 files changed, 189 insertions(+), 209 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs index 5d524b196..15b1cc5d4 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs @@ -3,17 +3,14 @@ using Orchard.Localization; using Orchard.Security; using Orchard.UI.Navigation; -namespace Orchard.Alias -{ +namespace Orchard.Alias { [OrchardFeature("Orchard.Alias.UI")] - public class AdminMenu : INavigationProvider - { + public class AdminMenu : INavigationProvider { public Localizer T { get; set; } public string MenuName { get { return "admin"; } } - public void GetNavigation(NavigationBuilder builder) - { + public void GetNavigation(NavigationBuilder builder) { builder .Add(T("Aliases"), "4", item => item.Action("Index", "Admin", new { area = "Orchard.Alias" }).Permission(StandardPermissions.SiteOwner)); } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index 93ab2feb5..c7aa21242 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -45,7 +45,7 @@ namespace Orchard.Alias.Controllers { if (options == null) options = new AdminIndexOptions(); - + var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()); if (!String.IsNullOrWhiteSpace(options.Search)) { @@ -55,8 +55,7 @@ namespace Orchard.Alias.Controllers { aliases = aliases.ToList(); - switch (options.Filter) - { + switch (options.Filter) { case AliasFilter.Managed: aliases = aliases.Where(x => x.IsManaged); break; @@ -111,7 +110,7 @@ namespace Orchard.Alias.Controllers { break; default: throw new ArgumentOutOfRangeException(); - } + } return RedirectToAction("Index"); } @@ -146,9 +145,9 @@ namespace Orchard.Alias.Controllers { } try { - _aliasService.Set(aliasPath, routePath, "Custom",false); + _aliasService.Set(aliasPath, routePath, "Custom", false); } - catch(Exception ex) { + catch (Exception ex) { Services.TransactionManager.Cancel(); Services.Notifier.Error(T("An error occured while creating the alias {0}: {1}. Please check the values are correct.", aliasPath, ex.Message)); Logger.Error(ex, T("An error occured while creating the alias {0}", aliasPath).Text); @@ -210,10 +209,9 @@ namespace Orchard.Alias.Controllers { } try { - _aliasService.Set(aliasPath, routePath, "Custom",false); + _aliasService.Set(aliasPath, routePath, "Custom", false); } - catch (Exception ex) - { + catch (Exception ex) { Services.TransactionManager.Cancel(); Services.Notifier.Error(T("An error occured while editing the alias '{0}': {1}. Please check the values are correct.", aliasPath, ex.Message)); Logger.Error(ex, T("An error occured while creating the alias '{0}'", aliasPath).Text); @@ -251,8 +249,7 @@ namespace Orchard.Alias.Controllers { return this.RedirectLocal(returnUrl, Url.Action("Index")); } - private string GetExistingPathForAlias(string aliasPath) - { + private string GetExistingPathForAlias(string aliasPath) { var routeValues = _aliasService.Get(aliasPath.TrimStart('/', '\\')); if (routeValues == null) return null; @@ -261,8 +258,7 @@ namespace Orchard.Alias.Controllers { .FirstOrDefault(); } - private bool CheckAndWarnIfAliasExists(string aliasPath) - { + private bool CheckAndWarnIfAliasExists(string aliasPath) { var routePath = GetExistingPathForAlias(aliasPath); if (routePath == null) return false; @@ -273,8 +269,8 @@ namespace Orchard.Alias.Controllers { var changeLink = T("change", editUrl); var deleteLink = T("delete", deleteUrl); - Services.Notifier.Error(T("Cannot save alias {0}. It conflicts with existing one pointing to {1}. Please {2} or {3} the existing alias first.", - aliasPath, + Services.Notifier.Error(T("Cannot save alias {0}. It conflicts with existing one pointing to {1}. Please {2} or {3} the existing alias first.", + aliasPath, routePathLink, changeLink, deleteLink)); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs b/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs index 843f78932..0f433eac6 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/IAliasService.cs @@ -5,8 +5,8 @@ using System.Web.Routing; namespace Orchard.Alias { public interface IAliasService : IDependency { RouteValueDictionary Get(string aliasPath); - void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged); - void Set(string aliasPath, string routePath, string aliasSource, bool isManaged); + void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged = false); + void Set(string aliasPath, string routePath, string aliasSource, bool isManaged = false); void Delete(string aliasPath); void Delete(string aliasPath, string aliasSource); /// @@ -18,8 +18,8 @@ namespace Orchard.Alias { IEnumerable Lookup(RouteValueDictionary routeValues); IEnumerable Lookup(string routePath); - void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged); - void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged); + void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged = false); + void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged = false); IEnumerable> List(); IEnumerable> List(string sourceStartsWith); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs index b6555e678..2be33d808 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/AliasRoute.cs @@ -32,8 +32,7 @@ namespace Orchard.Alias.Implementation { //IDictionary routeValues; AliasInfo aliasInfo; // TODO: Might as well have the lookup in AliasHolder... - if (_aliasMap.TryGetAlias(virtualPath, out aliasInfo)) - { + if (_aliasMap.TryGetAlias(virtualPath, out aliasInfo)) { // Construct RouteData from the route values var data = new RouteData(this, _routeHandler); foreach (var routeValue in aliasInfo.RouteValues) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs index e373ecbba..23e0043ac 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs @@ -80,8 +80,7 @@ namespace Orchard.Alias.Implementation { Set(aliasPath, routeValues, aliasSource, isManaged); } - public void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged) - { + public void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged) { Replace(aliasPath, ToDictionary(routePath).ToRouteValueDictionary(), aliasSource, isManaged); } @@ -92,7 +91,7 @@ namespace Orchard.Alias.Implementation { // the route has an area, lookup in the specific alias map var map = _aliasHolder.GetMap(area.ToString()); - + if (map == null) { return Enumerable.Empty(); } @@ -105,7 +104,7 @@ namespace Orchard.Alias.Implementation { return new[] { locate.Item2 }; } - + // no specific area, lookup in all alias maps var result = new List(); foreach (var map in _aliasHolder.GetMaps()) { @@ -118,7 +117,7 @@ namespace Orchard.Alias.Implementation { return result; } - + public IEnumerable> List() { return _aliasStorage.List().Select(item => Tuple.Create(item.Item1, item.Item3.ToRouteValueDictionary())); } @@ -148,21 +147,20 @@ namespace Orchard.Alias.Implementation { private IEnumerable GetRouteDescriptors() { return _routeProviders .SelectMany(routeProvider => { - var routes = new List(); - routeProvider.GetRoutes(routes); - return routes; - }) + var routes = new List(); + routeProvider.GetRoutes(routes); + return routes; + }) .Where(routeDescriptor => !(routeDescriptor.Route is AliasRoute)) .OrderByDescending(routeDescriptor => routeDescriptor.Priority); } private class StubHttpContext : HttpContextBase { - public override HttpRequestBase Request - { - get{return new StubHttpRequest();} + public override HttpRequestBase Request { + get { return new StubHttpRequest(); } } - private class StubHttpRequest : HttpRequestBase {} + private class StubHttpRequest : HttpRequestBase { } } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/IAliasHolder.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/IAliasHolder.cs index cff41f482..f198c978e 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/IAliasHolder.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Holder/IAliasHolder.cs @@ -26,7 +26,7 @@ namespace Orchard.Alias.Implementation.Holder { /// Adds or updates a set of aliases in the tree /// void SetAliases(IEnumerable aliases); - + /// /// Removes an alias from the tree based on its path /// diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs index 93eb18635..3667db0b4 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs @@ -8,12 +8,12 @@ using System.Collections.Concurrent; namespace Orchard.Alias.Implementation.Map { public class AliasMap { - private readonly string _area; + private readonly string _area; private readonly ConcurrentDictionary _aliases; - private readonly Node _root; + private readonly Node _root; public AliasMap(string area) { - _area = area; + _area = area; _aliases = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); _root = new Node(); } @@ -21,9 +21,8 @@ namespace Orchard.Alias.Implementation.Map { public IEnumerable GetAliases() { return _aliases.Select(x => new AliasInfo { Area = _area, Path = x.Key, RouteValues = x.Value.RouteValues, IsManaged = x.Value.IsManaged }); } - - public bool TryGetAlias(string virtualPath, out AliasInfo aliasInfo) - { + + public bool TryGetAlias(string virtualPath, out AliasInfo aliasInfo) { return _aliases.TryGetValue(virtualPath, out aliasInfo); } @@ -36,7 +35,7 @@ namespace Orchard.Alias.Implementation.Map { /// /// The intance to add public void Insert(AliasInfo info) { - if(info == null) { + if (info == null) { throw new ArgumentNullException(); } _aliases[info.Path] = info; @@ -73,18 +72,18 @@ namespace Orchard.Alias.Implementation.Map { } // Set the path at the end of the tree object takenPath; - focus.Paths.TryRemove(path,out takenPath); + focus.Paths.TryRemove(path, out takenPath); } } private static void ExpandTree(Node root, string path, IDictionary routeValues) { - foreach(var expanded in Expand(routeValues)) { + foreach (var expanded in Expand(routeValues)) { var focus = root; foreach (var routeValue in expanded.OrderBy(kv => kv.Key, StringComparer.InvariantCultureIgnoreCase)) { // See if we already have a stem for this route key (i.e. "controller") and create if not - var stem = focus.Stems.GetOrAdd(routeValue.Key,key=>new ConcurrentDictionary(StringComparer.InvariantCultureIgnoreCase)); + var stem = focus.Stems.GetOrAdd(routeValue.Key, key => new ConcurrentDictionary(StringComparer.InvariantCultureIgnoreCase)); // See if the stem has a node for this value (i.e. "Item") and create if not - var node = stem.GetOrAdd(routeValue.Value, key=>new Node()); + var node = stem.GetOrAdd(routeValue.Value, key => new Node()); // Keep switching to new node until we reach deepest match // TODO: (PH) Thread safety: at this point something could techincally traverse and find an empty node with a blank path ... not fatal // since it will simply not match and therefore return a default-looking route instead of the aliased one. And the changes of that route @@ -111,16 +110,16 @@ namespace Orchard.Alias.Implementation.Map { // For each key/value pair, we want a list containing a single list with either the term, or the term and the "default" value var termSets = ordered.Select(term => { - if (term.Key.EndsWith("-")) { - var termKey = term.Key.Substring(0, term.Key.Length - 1); - return new[] { + if (term.Key.EndsWith("-")) { + var termKey = term.Key.Substring(0, term.Key.Length - 1); + return new[] { // This entry will auto-match in some cases because it was omitted from the route values new [] { new KeyValuePair(termKey, "\u0000") }, new [] { new KeyValuePair(termKey, term.Value) } }; - } - return new[] {new[] {term}}; - }); + } + return new[] { new[] { term } }; + }); // Run each of those lists through an aggregation function, by taking the product of each set, so producting a tree of possibilities var produced = termSets.Aggregate(new[] { empty }.AsEnumerable(), (coords, termSet) => Product(coords, termSet, (coord, term) => coord.Concat(term))); @@ -191,7 +190,7 @@ namespace Orchard.Alias.Implementation.Map { } public ConcurrentDictionary> Stems { get; set; } - public ConcurrentDictionary Paths { get; set; } + public ConcurrentDictionary Paths { get; set; } } } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs index ae9d37656..e8d8feb1d 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs @@ -110,12 +110,11 @@ namespace Orchard.Alias.Implementation.Storage { // Bulk updates might go wrong if we don't flush. _aliasRepository.Flush(); var dict = ToDictionary(aliasRecord); - _aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6}); + _aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6 }); } } - public IEnumerable, string, int, bool>> List() - { + public IEnumerable, string, int, bool>> List() { return List((Expression>)null); } @@ -129,13 +128,11 @@ namespace Orchard.Alias.Implementation.Storage { return table.OrderBy(a => a.Id).Select(ToDictionary).ToList(); } - public IEnumerable, string, int, bool>> List(string sourceStartsWith) - { + public IEnumerable, string, int, bool>> List(string sourceStartsWith) { return List(a => a.Source.StartsWith(sourceStartsWith)); } - private static Tuple, string, int, bool> ToDictionary(AliasRecord aliasRecord) - { + private static Tuple, string, int, bool> ToDictionary(AliasRecord aliasRecord) { IDictionary routeValues = new Dictionary(); if (aliasRecord.Action.Area != null) { routeValues.Add("area", aliasRecord.Action.Area); diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs index 3763aabbe..9a3e03322 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasHolderUpdater.cs @@ -44,13 +44,13 @@ namespace Orchard.Alias.Implementation.Updater { } public class AliasUpdaterEvent : IOrchardShellEvents { - + private readonly IAliasHolderUpdater _aliasHolderUpdater; public AliasUpdaterEvent(IAliasHolderUpdater aliasHolderUpdater) { _aliasHolderUpdater = aliasHolderUpdater; } - + void IOrchardShellEvents.Activated() { _aliasHolderUpdater.Refresh(); } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs index c80d50678..9fa35b2e7 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs @@ -1,5 +1,5 @@ namespace Orchard.Alias.Implementation.Updater { public interface IAliasUpdateCursor : ISingletonDependency { - int Cursor { get; set; } + int Cursor { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs index f8a222614..563bfa3de 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Migrations.cs @@ -20,11 +20,10 @@ namespace Orchard.Alias { return 1; } - public int UpdateFrom1() - { + public int UpdateFrom1() { SchemaBuilder.AlterTable("AliasRecord", table => table - .AddColumn("IsManaged", column => column.WithDefault(false)) + .AddColumn("IsManaged", column => column.WithDefault(false)) ); return 2; } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index d90ef7bb1..9439a29d7 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -7,12 +7,11 @@ using Orchard.Alias.Records; using Orchard.Alias.Implementation.Holder; namespace Orchard.Roles.Recipes.Builders { - public class RolesStep : RecipeBuilderStep { + public class AliasStep : RecipeBuilderStep { private readonly IRepository _aliasRecordepository; private readonly IAliasHolder _aliasHolder; - public RolesStep(IRepository aliasRecordRepository, IAliasHolder aliasHolder) - { + public AliasStep(IRepository aliasRecordRepository, IAliasHolder aliasHolder) { _aliasRecordepository = aliasRecordRepository; _aliasHolder = aliasHolder; } @@ -30,7 +29,7 @@ namespace Orchard.Roles.Recipes.Builders { } public override void Build(BuildContext context) { - var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged== false).ToList(); + var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged == false).ToList(); if (!aliases.Any()) return; @@ -38,13 +37,11 @@ namespace Orchard.Roles.Recipes.Builders { var root = new XElement("Aliases"); context.RecipeDocument.Element("Orchard").Add(root); - foreach (var alias in aliases.OrderBy(x => x.Path)) - { + foreach (var alias in aliases.OrderBy(x => x.Path)) { var aliasElement = new XElement("Alias", new XAttribute("Path", alias.Path)); - + var routeValuesElement = new XElement("RouteValues"); - foreach (var routeValue in alias.RouteValues) - { + foreach (var routeValue in alias.RouteValues) { routeValuesElement.Add(new XElement("Add", new XAttribute("Key", routeValue.Key), new XAttribute("Value", routeValue.Value))); } @@ -52,6 +49,6 @@ namespace Orchard.Roles.Recipes.Builders { root.Add(aliasElement); } } - + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index 290e40463..1988b1fa3 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -12,8 +12,7 @@ namespace Orchard.Alias.Recipes.Executors { public class AliasStep : RecipeExecutionStep { private readonly IAliasService _aliasService; - public AliasStep(IAliasService aliasService) - { + public AliasStep(IAliasService aliasService) { _aliasService = aliasService; } @@ -31,7 +30,7 @@ namespace Orchard.Alias.Recipes.Executors { */ - public override void Execute(RecipeExecutionContext context) { + public override void Execute(RecipeExecutionContext context) { foreach (var aliasElement in context.RecipeStep.Step.Elements()) { var aliasPath = aliasElement.Attribute("Path").Value; @@ -42,24 +41,22 @@ namespace Orchard.Alias.Recipes.Executors { var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); - if (routeValuesElement != null) - { - foreach (var routeValue in routeValuesElement.Descendants("Add")) - { + if (routeValuesElement != null) { + foreach (var routeValue in routeValuesElement.Descendants("Add")) { rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); } } - + try { - _aliasService.Set(aliasPath, rvd, "Custom", false); - } - + _aliasService.Set(aliasPath, rvd, "Custom", false); + } + catch (Exception ex) { Logger.Error(ex, "Error while processing alias '{0}'.", aliasPath); throw; - } + } } } - } + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Routes.cs b/src/Orchard.Web/Modules/Orchard.Alias/Routes.cs index f09bcac46..563516d65 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Routes.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Routes.cs @@ -10,7 +10,7 @@ namespace Orchard.Alias { public class Routes : IRouteProvider { private readonly ShellBlueprint _blueprint; private readonly IAliasHolder _aliasHolder; - + public Routes(ShellBlueprint blueprint, IAliasHolder aliasHolder) { _blueprint = blueprint; _aliasHolder = aliasHolder; diff --git a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs index e0670dee3..e73634766 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs @@ -11,8 +11,9 @@ namespace Orchard.Alias.ViewModels { public class AliasEntry { public AliasInfo Alias { get; set; } - public bool IsChecked { get; set; } + public bool IsChecked { get; set; } } + public class AdminIndexOptions { public string Search { get; set; } public AliasOrder Order { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml index da790c3ad..364e52751 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml @@ -4,25 +4,25 @@ @using (Html.BeginFormAntiForgeryPost()) { @Html.ValidationSummary() -
- @T("Create Alias") -
- - @Html.TextBox("aliasPath", (object)ViewBag.Path, new { @class = "text large" }) - @Html.ValidationMessage("aliasPath") - @T("The path of the alias e.g., my-blog/my-post") -
-
- - @Html.TextBox("routePath", (object)ViewBag.Route, new { @class = "text medium" }) - @Html.ValidationMessage("routePath") - @T("The actual route Orchard should call when the path is requested e.g., Blogs/Blog/Item?blogId=18") -
-
-
-
- - @Html.ActionLink(T("Cancel").ToString(), "Index", new { }, new { @class = "button" }) -
-
- } \ No newline at end of file +
+ @T("Create Alias") +
+ + @Html.TextBox("aliasPath", (object)ViewBag.Path, new { @class = "text large" }) + @Html.ValidationMessage("aliasPath") + @T("The path of the alias e.g., my-blog/my-post") +
+
+ + @Html.TextBox("routePath", (object)ViewBag.Route, new { @class = "text medium" }) + @Html.ValidationMessage("routePath") + @T("The actual route Orchard should call when the path is requested e.g., Blogs/Blog/Item?blogId=18") +
+
+
+
+ + @Html.ActionLink(T("Cancel").ToString(), "Index", new { }, new { @class = "button" }) +
+
+} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Delete.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Delete.cshtml index bda927365..1c61a71a5 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Delete.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Delete.cshtml @@ -3,11 +3,11 @@ } @using (Html.BeginFormAntiForgeryPost()) { -
- @T("Delete alias") -

@T("Removing alias '{0}'. Are you sure?", ViewBag.Path)

- @Html.Hidden("path") - @Html.Hidden("confirmed", true) - -
+
+ @T("Delete alias") +

@T("Removing alias '{0}'. Are you sure?", ViewBag.Path)

+ @Html.Hidden("path") + @Html.Hidden("confirmed", true) + +
} diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml index 072569b9c..048173003 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml @@ -4,25 +4,25 @@ @using (Html.BeginFormAntiForgeryPost()) { @Html.ValidationSummary() -
- @T("Edit alias") -
- - @Html.TextBox("aliasPath", null, new { @class = "text large" }) - @Html.ValidationMessage("aliasPath") - @T("The path of the alias e.g., my-blog/my-post") -
-
- - @Html.TextBox("routePath", null, new { @class = "text medium" }) - @Html.ValidationMessage("routePath") - @T("The actual route Orchard should call when the path is requested e.g., Blogs/Blog/Item?blogId=18") -
-
-
-
- - @Html.ActionLink(T("Cancel").ToString(), "Index", new { }, new { @class = "button" }) -
-
- } +
+ @T("Edit alias") +
+ + @Html.TextBox("aliasPath", null, new { @class = "text large" }) + @Html.ValidationMessage("aliasPath") + @T("The path of the alias e.g., my-blog/my-post") +
+
+ + @Html.TextBox("routePath", null, new { @class = "text medium" }) + @Html.ValidationMessage("routePath") + @T("The actual route Orchard should call when the path is requested e.g., Blogs/Blog/Item?blogId=18") +
+
+
+
+ + @Html.ActionLink(T("Cancel").ToString(), "Index", new { }, new { @class = "button" }) +
+
+} diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml index c112c1b97..b2c92d4af 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml @@ -1,5 +1,5 @@ @model AdminIndexViewModel - + @using Orchard.Alias @using Orchard.Alias.ViewModels @using Orchard.Environment.Configuration @@ -7,12 +7,12 @@ @{ var urlPrefix = WorkContext.Resolve().RequestUrlPrefix; - + Layout.Title = T("Manage Aliases").Text; var aliasService = WorkContext.Resolve(); AdminIndexOptions options = Model.Options; int index = -1; - + var pageSizes = new List() { 10, 50, 100 }; var defaultPageSize = WorkContext.CurrentSite.PageSize; if (!pageSizes.Contains(defaultPageSize)) { @@ -33,7 +33,7 @@
- + @@ -43,62 +43,62 @@ @Html.SelectOption(Model.Options.Filter, AliasFilter.Managed, T("Managed").ToString()) @Html.SelectOption(Model.Options.Filter, AliasFilter.Custom, T("Custom").ToString()) - - - + + +
-
+
- - - - - - - - - - @foreach (var aliasEntry in Model.AliasEntries) { - var alias = aliasEntry.Alias; - index++; - var virtualPathData = aliasService.LookupVirtualPaths(alias.RouteValues.ToRouteValueDictionary(), ViewContext.HttpContext).FirstOrDefault(); - - if (virtualPathData == null) { - continue; + + + + + + + + + + @foreach (var aliasEntry in Model.AliasEntries) { + var alias = aliasEntry.Alias; + index++; + var virtualPathData = aliasService.LookupVirtualPaths(alias.RouteValues.ToRouteValueDictionary(), ViewContext.HttpContext).FirstOrDefault(); + + if (virtualPathData == null) { + continue; + } + + var url = virtualPathData.VirtualPath; + + + + + + + } - - var url = virtualPathData.VirtualPath; - - - - - - - - }
@T("Alias")@T("Route")@T("IsManaged") 
@T("Alias")@T("Route")@T("IsManaged") 
+ + + + @Html.Link(alias.Path == String.Empty ? "/" : alias.Path, Href("~/" + urlPrefix + alias.Path)) + + @Html.Link(url, Href("~/" + urlPrefix + "/" + url)) + + + + @if (!alias.IsManaged) { + @Html.ActionLink(T("Edit").Text, "Edit", new { path = alias.Path == String.Empty ? "/" : alias.Path }) + | + @Html.ActionLink(T("Delete").Text, "Delete", new { path = alias.Path }, new { itemprop = "UnsafeUrl RemoveUrl" }) + } +
- - - - @Html.Link(alias.Path == String.Empty ? "/" : alias.Path, Href("~/" + urlPrefix + alias.Path)) - - @Html.Link(url, Href("~/" + urlPrefix + "/" + url)) - - - - @if (!alias.IsManaged) { - @Html.ActionLink(T("Edit").Text, "Edit", new { path = alias.Path == String.Empty ? "/" : alias.Path }) - | - @Html.ActionLink(T("Delete").Text, "Delete", new { path = alias.Path }, new { itemprop = "UnsafeUrl RemoveUrl" }) - } -
- + @Display(Model.Pager)
} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs index be917f062..dfedcf80d 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs @@ -146,7 +146,8 @@ namespace Orchard.Autoroute.Services { if (String.Equals(culture, _cultureManager.GetSiteCulture(), StringComparison.OrdinalIgnoreCase) && !String.IsNullOrWhiteSpace(patternIndex)) { settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = patternIndex, Culture = culture }); return settings.Patterns.Where(x => x.Culture == null).ElementAt(Convert.ToInt32(settings.DefaultPatterns.Where(x => x.Culture == culture).FirstOrDefault().PatternIndex)); - } else { + } + else { settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = culture }); return new RoutePattern { Name = "Title", Description = "my-title", Pattern = "{Content.Slug}", Culture = culture }; } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS index 01bfb6373..a9de1cf0e 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS @@ -39,18 +39,17 @@ namespace Orchard.Blogs.Routing { //IDictionary routeValues; AliasInfo aliasInfo; - if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo)) - { + if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo)) { return false; } - var isBlog = + var isBlog = //routeValues.ContainsKey("area") && //routeValues["area"] == "Orchard.Blogs" && aliasInfo.RouteValues.ContainsKey("controller") && aliasInfo.RouteValues["controller"] == "Blog" && aliasInfo.RouteValues.ContainsKey("action") && - aliasInfo.RouteValues["action"] == "Item" + aliasInfo.RouteValues["action"] == "Item" ; return isBlog; @@ -86,7 +85,7 @@ namespace Orchard.Blogs.Routing { } // archive for blog as homepage ? - if(path.StartsWith("archive/", StringComparison.OrdinalIgnoreCase)) { + if (path.StartsWith("archive/", StringComparison.OrdinalIgnoreCase)) { return String.Empty; } From 60ad30c9eff0a52203993f25e5088101cba44fdc Mon Sep 17 00:00:00 2001 From: mahsaro Date: Mon, 3 Aug 2015 12:30:49 +0100 Subject: [PATCH 06/17] Fixed typo in AliasStep. --- .../Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index 9439a29d7..7bdc8f820 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -6,7 +6,7 @@ using Orchard.Recipes.Services; using Orchard.Alias.Records; using Orchard.Alias.Implementation.Holder; -namespace Orchard.Roles.Recipes.Builders { +namespace Orchard.Alias.Recipes.Builders { public class AliasStep : RecipeBuilderStep { private readonly IRepository _aliasRecordepository; private readonly IAliasHolder _aliasHolder; From 7944a1510e9c1a30bab1c6b87b8ff35de53454c4 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Mon, 3 Aug 2015 14:05:52 +0100 Subject: [PATCH 07/17] Renamed "Custom" to "Unmanaged" in UI. Hidden BulkAction checkbox for Managed aliases. --- .../Modules/Orchard.Alias/Controllers/AdminController.cs | 2 +- .../Orchard.Alias/ViewModels/AdminIndexViewModel.cs | 2 +- .../Modules/Orchard.Alias/Views/Admin/Index.cshtml | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index c7aa21242..ce5bd21ee 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -59,7 +59,7 @@ namespace Orchard.Alias.Controllers { case AliasFilter.Managed: aliases = aliases.Where(x => x.IsManaged); break; - case AliasFilter.Custom: + case AliasFilter.Unmanaged: aliases = aliases.Where(x => !x.IsManaged); break; case AliasFilter.All: diff --git a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs index e73634766..f39737fae 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/ViewModels/AdminIndexViewModel.cs @@ -28,7 +28,7 @@ namespace Orchard.Alias.ViewModels { public enum AliasFilter { All, Managed, - Custom + Unmanaged } public enum AliasBulkAction { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml index b2c92d4af..23cb59a1d 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml @@ -41,7 +41,7 @@ @@ -60,7 +60,7 @@ @T("Alias") @T("Route") - @T("IsManaged") + @T("Managed")   @@ -77,7 +77,9 @@ - + @if (!alias.IsManaged) { + + } @Html.Link(alias.Path == String.Empty ? "/" : alias.Path, Href("~/" + urlPrefix + alias.Path)) From e09cd37de2efe4b3b1f2f71d905d240ab4f2ea8a Mon Sep 17 00:00:00 2001 From: mahsaro Date: Mon, 3 Aug 2015 23:09:09 +0100 Subject: [PATCH 08/17] Fix export description text for Aliases and Roles. --- .../Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs | 4 ++-- .../Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index 7bdc8f820..2ba2581f7 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -21,11 +21,11 @@ namespace Orchard.Alias.Recipes.Builders { } public override LocalizedString DisplayName { - get { return T("Alias"); } + get { return T("Aliases"); } } public override LocalizedString Description { - get { return T("Exports the aliases."); } + get { return T("Exports unmanaged aliases."); } } public override void Build(BuildContext context) { diff --git a/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs b/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs index c6a0c2389..05c98912a 100644 --- a/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs @@ -22,7 +22,7 @@ namespace Orchard.Roles.Recipes.Builders { } public override LocalizedString Description { - get { return T("Exports the user roles."); } + get { return T("Exports user roles."); } } public override void Build(BuildContext context) { From 6c7c84acee259a7f2bc16533391605ff4852198c Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 10:20:00 +0100 Subject: [PATCH 09/17] Adding tabs to Alias admin UI for Managed/Unmanaged aliases. --- .../Modules/Orchard.Alias/AdminMenu.cs | 10 +- .../Controllers/AdminController.cs | 70 +++++-- .../Orchard.Alias/Orchard.Alias.csproj | 6 +- .../Views/Admin/IndexManaged.cshtml | 74 +++++++ .../{Index.cshtml => IndexUnmanaged.cshtml} | 195 ++++++++---------- 5 files changed, 225 insertions(+), 130 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexManaged.cshtml rename src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/{Index.cshtml => IndexUnmanaged.cshtml} (71%) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs index 15b1cc5d4..52e1c9d87 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs @@ -3,6 +3,7 @@ using Orchard.Localization; using Orchard.Security; using Orchard.UI.Navigation; + namespace Orchard.Alias { [OrchardFeature("Orchard.Alias.UI")] public class AdminMenu : INavigationProvider { @@ -11,8 +12,13 @@ namespace Orchard.Alias { public string MenuName { get { return "admin"; } } public void GetNavigation(NavigationBuilder builder) { - builder - .Add(T("Aliases"), "4", item => item.Action("Index", "Admin", new { area = "Orchard.Alias" }).Permission(StandardPermissions.SiteOwner)); + builder.AddImageSet("aliases"); + builder.Add(T("Aliases"), "1.4.1", menu => { + menu.LinkToFirstChild(true); + + menu.Add(T("Unmanaged"), "1", item => item.Action("IndexUnmanaged", "Admin", new { area = "Orchard.Alias" }).Permission(StandardPermissions.SiteOwner).LocalNav()); + menu.Add(T("Managed"), "2", item => item.Action("IndexManaged", "Admin", new { area = "Orchard.Alias" }).Permission(StandardPermissions.SiteOwner).LocalNav()); + }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index ce5bd21ee..b35d4c1b3 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -35,7 +35,7 @@ namespace Orchard.Alias.Controllers { public Localizer T { get; set; } public ILogger Logger { get; set; } - public ActionResult Index(AdminIndexOptions options, PagerParameters pagerParameters) { + public ActionResult IndexUnmanaged(AdminIndexOptions options, PagerParameters pagerParameters) { if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to manage aliases"))) return new HttpUnauthorizedResult(); @@ -46,7 +46,7 @@ namespace Orchard.Alias.Controllers { options = new AdminIndexOptions(); - var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()); + var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()).Where(x => !x.IsManaged); if (!String.IsNullOrWhiteSpace(options.Search)) { var invariantSearch = options.Search.ToLowerInvariant(); @@ -54,19 +54,6 @@ namespace Orchard.Alias.Controllers { } aliases = aliases.ToList(); - - switch (options.Filter) { - case AliasFilter.Managed: - aliases = aliases.Where(x => x.IsManaged); - break; - case AliasFilter.Unmanaged: - aliases = aliases.Where(x => !x.IsManaged); - break; - case AliasFilter.All: - break; - default: - throw new ArgumentOutOfRangeException(); - } var pagerShape = Services.New.Pager(pager).TotalItemCount(aliases.Count()); switch (options.Order) { @@ -82,7 +69,7 @@ namespace Orchard.Alias.Controllers { var model = new AdminIndexViewModel { Options = options, Pager = pagerShape, - AliasEntries = aliases.Select(x => new AliasEntry() { Alias = x, IsChecked = false }).OrderBy(x => x.Alias.IsManaged).ToList() + AliasEntries = aliases.Select(x => new AliasEntry() { Alias = x, IsChecked = false }).ToList() }; return View(model); @@ -90,7 +77,7 @@ namespace Orchard.Alias.Controllers { [HttpPost] [FormValueRequired("submit.BulkEdit")] - public ActionResult Index(FormCollection input) { + public ActionResult IndexUnmanaged(FormCollection input) { if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to manage aliases"))) return new HttpUnauthorizedResult(); @@ -111,7 +98,48 @@ namespace Orchard.Alias.Controllers { default: throw new ArgumentOutOfRangeException(); } - return RedirectToAction("Index"); + return RedirectToAction("IndexUnmanaged"); + } + + public ActionResult IndexManaged(AdminIndexOptions options, PagerParameters pagerParameters) { + if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to manage aliases"))) + return new HttpUnauthorizedResult(); + + var pager = new Pager(Services.WorkContext.CurrentSite, pagerParameters); + + // default options + if (options == null) + options = new AdminIndexOptions(); + + + var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()).Where(x => x.IsManaged); + + if (!String.IsNullOrWhiteSpace(options.Search)) { + var invariantSearch = options.Search.ToLowerInvariant(); + aliases = aliases.Where(x => x.Path.ToLowerInvariant().Contains(invariantSearch)); + } + + aliases = aliases.ToList(); + + var pagerShape = Services.New.Pager(pager).TotalItemCount(aliases.Count()); + + switch (options.Order) { + case AliasOrder.Path: + aliases = aliases.OrderBy(x => x.Path); + break; + } + + if (pager.PageSize != 0) { + aliases = aliases.Skip(pager.GetStartIndex()).Take(pager.PageSize); + } + + var model = new AdminIndexViewModel { + Options = options, + Pager = pagerShape, + AliasEntries = aliases.Select(x => new AliasEntry() { Alias = x, IsChecked = false }).ToList() + }; + + return View(model); } public ActionResult Add() { @@ -160,7 +188,7 @@ namespace Orchard.Alias.Controllers { Services.Notifier.Information(T("Alias {0} created", aliasPath)); - return RedirectToAction("Index"); + return RedirectToAction("IndexUnmanaged"); } public ActionResult Edit(string path) { @@ -230,7 +258,7 @@ namespace Orchard.Alias.Controllers { Services.Notifier.Information(T("Alias {0} updated", path)); - return RedirectToAction("Index"); + return RedirectToAction("IndexUnmanaged"); } [HttpPost] @@ -246,7 +274,7 @@ namespace Orchard.Alias.Controllers { Services.Notifier.Information(T("Alias {0} deleted", path)); - return this.RedirectLocal(returnUrl, Url.Action("Index")); + return this.RedirectLocal(returnUrl, Url.Action("IndexUnmanaged")); } private string GetExistingPathForAlias(string aliasPath) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj b/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj index 75ee4a0d0..29073c9d5 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj +++ b/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj @@ -75,7 +75,7 @@ - + @@ -117,7 +117,9 @@ - + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexManaged.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexManaged.cshtml new file mode 100644 index 000000000..6404513b8 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexManaged.cshtml @@ -0,0 +1,74 @@ +@model AdminIndexViewModel + +@using Orchard.Alias +@using Orchard.Alias.ViewModels +@using Orchard.Environment.Configuration +@using Orchard.Utility.Extensions + +@{ + var urlPrefix = WorkContext.Resolve().RequestUrlPrefix; + + Layout.Title = T("Manage Aliases").Text; + var aliasService = WorkContext.Resolve(); + AdminIndexOptions options = Model.Options; + int index = -1; + + var pageSizes = new List() { 10, 50, 100 }; + var defaultPageSize = WorkContext.CurrentSite.PageSize; + if (!pageSizes.Contains(defaultPageSize)) { + pageSizes.Add(defaultPageSize); + } +} + +@using (Html.BeginFormAntiForgeryPost()) { + @Html.ValidationSummary() + +
+ + + + + + +
+
+ + + + + + + + + @foreach (var aliasEntry in Model.AliasEntries) { + var alias = aliasEntry.Alias; + index++; + var virtualPathData = aliasService.LookupVirtualPaths(alias.RouteValues.ToRouteValueDictionary(), ViewContext.HttpContext).FirstOrDefault(); + + if (virtualPathData == null) { + continue; + } + + var url = virtualPathData.VirtualPath; + + + + + } +
@T("Alias")@T("Route") 
+ + @Html.Link(alias.Path == String.Empty ? "/" : alias.Path, Href("~/" + urlPrefix + alias.Path)) + + @Html.Link(url, Href("~/" + urlPrefix + "/" + url)) +
+ + @Display(Model.Pager) +
+} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexUnmanaged.cshtml similarity index 71% rename from src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml rename to src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexUnmanaged.cshtml index 23cb59a1d..22bb3e247 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/IndexUnmanaged.cshtml @@ -1,106 +1,91 @@ -@model AdminIndexViewModel - -@using Orchard.Alias -@using Orchard.Alias.ViewModels -@using Orchard.Environment.Configuration -@using Orchard.Utility.Extensions - -@{ - var urlPrefix = WorkContext.Resolve().RequestUrlPrefix; - - Layout.Title = T("Manage Aliases").Text; - var aliasService = WorkContext.Resolve(); - AdminIndexOptions options = Model.Options; - int index = -1; - - var pageSizes = new List() { 10, 50, 100 }; - var defaultPageSize = WorkContext.CurrentSite.PageSize; - if (!pageSizes.Contains(defaultPageSize)) { - pageSizes.Add(defaultPageSize); - } -} - -@using (Html.BeginFormAntiForgeryPost()) { - @Html.ValidationSummary() -
@Html.ActionLink(T("Add new Alias").Text, "Add", new { returnurl = HttpContext.Current.Request.RawUrl }, new { @class = "button primaryAction" })
- -
- - - -
-
- - - - - - - - -
-
- - - - - - - - - - - @foreach (var aliasEntry in Model.AliasEntries) { - var alias = aliasEntry.Alias; - index++; - var virtualPathData = aliasService.LookupVirtualPaths(alias.RouteValues.ToRouteValueDictionary(), ViewContext.HttpContext).FirstOrDefault(); - - if (virtualPathData == null) { - continue; - } - - var url = virtualPathData.VirtualPath; - - - - - - - - } -
@T("Alias")@T("Route")@T("Managed") 
- - @if (!alias.IsManaged) { - - } - - @Html.Link(alias.Path == String.Empty ? "/" : alias.Path, Href("~/" + urlPrefix + alias.Path)) - - @Html.Link(url, Href("~/" + urlPrefix + "/" + url)) - - - - @if (!alias.IsManaged) { - @Html.ActionLink(T("Edit").Text, "Edit", new { path = alias.Path == String.Empty ? "/" : alias.Path }) - | - @Html.ActionLink(T("Delete").Text, "Delete", new { path = alias.Path }, new { itemprop = "UnsafeUrl RemoveUrl" }) - } -
- - @Display(Model.Pager) -
+@model AdminIndexViewModel + +@using Orchard.Alias +@using Orchard.Alias.ViewModels +@using Orchard.Environment.Configuration +@using Orchard.Utility.Extensions + +@{ + var urlPrefix = WorkContext.Resolve().RequestUrlPrefix; + + Layout.Title = T("Manage Aliases").Text; + var aliasService = WorkContext.Resolve(); + AdminIndexOptions options = Model.Options; + int index = -1; + + var pageSizes = new List() { 10, 50, 100 }; + var defaultPageSize = WorkContext.CurrentSite.PageSize; + if (!pageSizes.Contains(defaultPageSize)) { + pageSizes.Add(defaultPageSize); + } +} + +@using (Html.BeginFormAntiForgeryPost()) { + @Html.ValidationSummary() +
@Html.ActionLink(T("Add new Alias").Text, "Add", new { returnurl = HttpContext.Current.Request.RawUrl }, new { @class = "button primaryAction" })
+ +
+ + + +
+
+ + + + + + +
+
+ + + + + + + + + + @foreach (var aliasEntry in Model.AliasEntries) { + var alias = aliasEntry.Alias; + index++; + var virtualPathData = aliasService.LookupVirtualPaths(alias.RouteValues.ToRouteValueDictionary(), ViewContext.HttpContext).FirstOrDefault(); + + if (virtualPathData == null) { + continue; + } + + var url = virtualPathData.VirtualPath; + + + + + + + } +
@T("Alias")@T("Route") 
+ + + + @Html.Link(alias.Path == String.Empty ? "/" : alias.Path, Href("~/" + urlPrefix + alias.Path)) + + @Html.Link(url, Href("~/" + urlPrefix + "/" + url)) + + @Html.ActionLink(T("Edit").Text, "Edit", new { path = alias.Path == String.Empty ? "/" : alias.Path }) + @Html.ActionLink(T("Delete").Text, "Delete", new { path = alias.Path }, new { itemprop = "UnsafeUrl RemoveUrl" }) +
+ + @Display(Model.Pager) +
} \ No newline at end of file From 2d70794c8b6a8768b5a1be32bb82b998eafb4dc9 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 11:04:51 +0100 Subject: [PATCH 10/17] Remove comments... --- .../Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS index a9de1cf0e..e740de62a 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Routing/ArchiveConstraint.CS @@ -37,7 +37,6 @@ namespace Orchard.Blogs.Routing { return false; } - //IDictionary routeValues; AliasInfo aliasInfo; if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo)) { return false; From 5bfd175482c7fa4d6ccb2536dc42e97831709ba8 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 11:58:57 +0100 Subject: [PATCH 11/17] Fixed action names. --- src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml | 2 +- src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml index 364e52751..f94f52ae0 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Add.cshtml @@ -22,7 +22,7 @@
- @Html.ActionLink(T("Cancel").ToString(), "Index", new { }, new { @class = "button" }) + @Html.ActionLink(T("Cancel").ToString(), "IndexUnmanaged", new { }, new { @class = "button" })
} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml index 048173003..5a8afe8a1 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Alias/Views/Admin/Edit.cshtml @@ -22,7 +22,7 @@
- @Html.ActionLink(T("Cancel").ToString(), "Index", new { }, new { @class = "button" }) + @Html.ActionLink(T("Cancel").ToString(), "IndexUnmanaged", new { }, new { @class = "button" })
} From 492631da854dadf7554d054b0f9f9c256b7b3ecb Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 14:03:27 +0100 Subject: [PATCH 12/17] Added RecipeExecutionLogger to AliasStep constructor. --- .../Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index 1988b1fa3..c06c23ee7 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -12,7 +12,9 @@ namespace Orchard.Alias.Recipes.Executors { public class AliasStep : RecipeExecutionStep { private readonly IAliasService _aliasService; - public AliasStep(IAliasService aliasService) { + public AliasStep( + IAliasService aliasService, + RecipeExecutionLogger logger) : base(logger) { _aliasService = aliasService; } From 14ddaeb713a1cc9a6cf7d1271c53e19a337d6ca3 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 21:44:13 +0100 Subject: [PATCH 13/17] Optimize LINQ queries AliasStep and RolesStep. --- .../Modules/Orchard.Alias/Controllers/AdminController.cs | 3 --- .../Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs | 4 ++-- .../Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index b35d4c1b3..cbfe821ef 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -53,7 +53,6 @@ namespace Orchard.Alias.Controllers { aliases = aliases.Where(x => x.Path.ToLowerInvariant().Contains(invariantSearch)); } - aliases = aliases.ToList(); var pagerShape = Services.New.Pager(pager).TotalItemCount(aliases.Count()); switch (options.Order) { @@ -119,8 +118,6 @@ namespace Orchard.Alias.Controllers { aliases = aliases.Where(x => x.Path.ToLowerInvariant().Contains(invariantSearch)); } - aliases = aliases.ToList(); - var pagerShape = Services.New.Pager(pager).TotalItemCount(aliases.Count()); switch (options.Order) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index 2ba2581f7..6b6b8682f 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -29,7 +29,7 @@ namespace Orchard.Alias.Recipes.Builders { } public override void Build(BuildContext context) { - var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged == false).ToList(); + var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged == false).OrderBy(m => m.Path).ToList(); if (!aliases.Any()) return; @@ -37,7 +37,7 @@ namespace Orchard.Alias.Recipes.Builders { var root = new XElement("Aliases"); context.RecipeDocument.Element("Orchard").Add(root); - foreach (var alias in aliases.OrderBy(x => x.Path)) { + foreach (var alias in aliases) { var aliasElement = new XElement("Alias", new XAttribute("Path", alias.Path)); var routeValuesElement = new XElement("RouteValues"); diff --git a/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs b/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs index 05c98912a..577ca085e 100644 --- a/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Roles/Recipes/Builders/RolesStep.cs @@ -26,7 +26,7 @@ namespace Orchard.Roles.Recipes.Builders { } public override void Build(BuildContext context) { - var roles = _roleRecordepository.Table.ToList(); + var roles = _roleRecordepository.Table.OrderBy(x => x.Name).ToList(); if (!roles.Any()) return; @@ -34,7 +34,7 @@ namespace Orchard.Roles.Recipes.Builders { var root = new XElement("Roles"); context.RecipeDocument.Element("Orchard").Add(root); - foreach (var role in roles.OrderBy(x => x.Name)) { + foreach (var role in roles) { root.Add( new XElement("Role", new XAttribute("Name", role.Name), From e53f29a51578afbc1adda16f05f55a1e058d9e9e Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 22:02:10 +0100 Subject: [PATCH 14/17] Log text change. Change try place in the code to cover more. --- .../Recipes/Executors/AliasStep.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index c06c23ee7..2d25489c0 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -37,19 +37,20 @@ namespace Orchard.Alias.Recipes.Executors { foreach (var aliasElement in context.RecipeStep.Step.Elements()) { var aliasPath = aliasElement.Attribute("Path").Value; - Logger.Information("Processing alias '{0}'.", aliasPath); - - var rvd = new RouteValueDictionary(); - - var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); - - if (routeValuesElement != null) { - foreach (var routeValue in routeValuesElement.Descendants("Add")) { - rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); - } - } + Logger.Information("Importing alias '{0}'.", aliasPath); try { + var rvd = new RouteValueDictionary(); + + var routeValuesElement = aliasElement.Descendants("RouteValues").FirstOrDefault(); + + if (routeValuesElement != null) { + foreach (var routeValue in routeValuesElement.Descendants("Add")) { + rvd.Add(routeValue.Attribute("Key").Value, routeValue.Attribute("Value").Value); + } + } + + _aliasService.Set(aliasPath, rvd, "Custom", false); } From a97cbb5e98314cb78e7a1c3ac675e7fe256f8896 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 22:11:51 +0100 Subject: [PATCH 15/17] Remove newline. --- .../Modules/Orchard.Alias/Controllers/AdminController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index cbfe821ef..be66e4e25 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -45,7 +45,6 @@ namespace Orchard.Alias.Controllers { if (options == null) options = new AdminIndexOptions(); - var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()).Where(x => !x.IsManaged); if (!String.IsNullOrWhiteSpace(options.Search)) { From d75af074bb6b0ce8fe86eebd721850ab81f88ba7 Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 22:20:02 +0100 Subject: [PATCH 16/17] Remove extra line. --- .../Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs | 1 - .../Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs index 6b6b8682f..627ca7d9a 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Builders/AliasStep.cs @@ -49,6 +49,5 @@ namespace Orchard.Alias.Recipes.Builders { root.Add(aliasElement); } } - } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs index 2d25489c0..cd17744ab 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Recipes/Executors/AliasStep.cs @@ -7,7 +7,6 @@ using Orchard.Logging; using Orchard.Recipes.Models; using Orchard.Recipes.Services; - namespace Orchard.Alias.Recipes.Executors { public class AliasStep : RecipeExecutionStep { private readonly IAliasService _aliasService; @@ -50,7 +49,6 @@ namespace Orchard.Alias.Recipes.Executors { } } - _aliasService.Set(aliasPath, rvd, "Custom", false); } @@ -60,6 +58,5 @@ namespace Orchard.Alias.Recipes.Executors { } } } - } } \ No newline at end of file From 5e58cf9d70dc014b3fa695ed9d41bea5651f669e Mon Sep 17 00:00:00 2001 From: mahsaro Date: Tue, 4 Aug 2015 22:23:17 +0100 Subject: [PATCH 17/17] Removed extra line breaks. --- src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs | 1 - .../Modules/Orchard.Alias/Controllers/AdminController.cs | 1 - .../Modules/Orchard.Alias/Implementation/Map/AliasMap.cs | 1 - src/Orchard.Web/Modules/Orchard.Alias/Implementation/Utils.cs | 1 - 4 files changed, 4 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs index 52e1c9d87..77d3c61bf 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/AdminMenu.cs @@ -3,7 +3,6 @@ using Orchard.Localization; using Orchard.Security; using Orchard.UI.Navigation; - namespace Orchard.Alias { [OrchardFeature("Orchard.Alias.UI")] public class AdminMenu : INavigationProvider { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs index be66e4e25..500f49dcf 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Controllers/AdminController.cs @@ -109,7 +109,6 @@ namespace Orchard.Alias.Controllers { if (options == null) options = new AdminIndexOptions(); - var aliases = _aliasHolder.GetMaps().SelectMany(x => x.GetAliases()).Where(x => x.IsManaged); if (!String.IsNullOrWhiteSpace(options.Search)) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs index 3667db0b4..3211768b0 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs @@ -126,7 +126,6 @@ namespace Orchard.Alias.Implementation.Map { return produced; } - private static Tuple, string> Traverse(Node focus, RouteValueDictionary routeValues, string areaName) { // Initialize a match variable diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Utils.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Utils.cs index b0551264c..304068a74 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Utils.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Utils.cs @@ -65,7 +65,6 @@ namespace Orchard.Alias.Implementation { return key.EndsWith("-", StringComparison.InvariantCulture) ? key.Substring(0, key.Length - 1) : key; } - private static Dictionary ToRouteValues(RouteData routeData, string queryString) { var routeValues = routeData.Values .Select(kv => {