From 9e3d9c8557b7c4ff647933847153181c1db0c9bb Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 12 Sep 2015 14:44:46 +0100 Subject: [PATCH 1/3] Changed home alias and fixed blog feature specflow test. - The Home Alias change causes home page content items to be reachable via two URLS (e.g. ~/ and ~/my-blog), so accomodated the specflow test for that. - Fixed a bug with HomeAlias where it would not find content items if their display route values contains keys other than "Id". Blogs uses "blogId", so the former implementation of just looking up the "Id" entry was too naive. --- src/Orchard.Specs/Blogs.feature | 4 +- src/Orchard.Specs/Blogs.feature.cs | 248 +++++++++--------- .../Implementation/Map/AliasMap.cs | 3 +- .../Drivers/AutoroutePartDriver.cs | 2 +- .../Handlers/AutoroutePartHandler.cs | 6 +- .../Orchard.Autoroute/Providers/SlugTokens.cs | 21 +- .../Services/AutorouteService.cs | 15 +- .../Services/HomeAliasService.cs | 44 +++- .../Services/IHomeAliasService.cs | 3 +- 9 files changed, 186 insertions(+), 160 deletions(-) diff --git a/src/Orchard.Specs/Blogs.feature b/src/Orchard.Specs/Blogs.feature index 237384d14..307db8d95 100644 --- a/src/Orchard.Specs/Blogs.feature +++ b/src/Orchard.Specs/Blogs.feature @@ -155,7 +155,9 @@ Scenario: I set my blog to be the content for the home page and the posts for th And I go to "/" Then I should see "

My Blog

" When I go to "/my-blog" - Then the status should be 404 "Not Found" + Then the status should be 200 "OK" + When I go to "/" + Then the status should be 200 "OK" When I go to "/my-post" Then I should see "

My Post

" diff --git a/src/Orchard.Specs/Blogs.feature.cs b/src/Orchard.Specs/Blogs.feature.cs index 74fabba3f..a5c63de77 100644 --- a/src/Orchard.Specs/Blogs.feature.cs +++ b/src/Orchard.Specs/Blogs.feature.cs @@ -484,10 +484,14 @@ this.ScenarioSetup(scenarioInfo); #line 157 testRunner.When("I go to \"/my-blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line 158 - testRunner.Then("the status should be 404 \"Not Found\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.Then("the status should be 200 \"OK\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line 159 - testRunner.When("I go to \"/my-post\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); + testRunner.When("I go to \"/\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line 160 + testRunner.Then("the status should be 200 \"OK\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line 161 + testRunner.When("I go to \"/my-post\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line 162 testRunner.Then("I should see \"

My Post

\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden this.ScenarioCleanup(); @@ -498,11 +502,11 @@ this.ScenarioSetup(scenarioInfo); public virtual void ICanCreateBrowseBlogPostsOnSeveralPages() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("I can create browse blog posts on several pages", ((string[])(null))); -#line 162 -this.ScenarioSetup(scenarioInfo); -#line 163 - testRunner.Given("I have installed Orchard", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line 164 +this.ScenarioSetup(scenarioInfo); +#line 165 + testRunner.Given("I have installed Orchard", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line 166 testRunner.When("I go to \"admin/blogs/create\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden TechTalk.SpecFlow.Table table14 = new TechTalk.SpecFlow.Table(new string[] { @@ -511,15 +515,15 @@ this.ScenarioSetup(scenarioInfo); table14.AddRow(new string[] { "Title.Title", "My Blog"}); -#line 165 +#line 167 testRunner.And("I fill in", ((string)(null)), table14, "And "); -#line 168 - testRunner.And("I hit \"Save\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 169 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 170 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Save\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 171 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 172 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 173 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table15 = new TechTalk.SpecFlow.Table(new string[] { @@ -528,17 +532,17 @@ this.ScenarioSetup(scenarioInfo); table15.AddRow(new string[] { "Title.Title", "My Post 1"}); -#line 172 +#line 174 testRunner.And("I fill in", ((string)(null)), table15, "And "); -#line 175 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 176 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 177 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 178 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 179 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 180 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 181 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table16 = new TechTalk.SpecFlow.Table(new string[] { @@ -547,17 +551,17 @@ this.ScenarioSetup(scenarioInfo); table16.AddRow(new string[] { "Title.Title", "My Post 2"}); -#line 180 +#line 182 testRunner.And("I fill in", ((string)(null)), table16, "And "); -#line 183 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 184 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 185 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 186 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 187 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 188 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 189 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table17 = new TechTalk.SpecFlow.Table(new string[] { @@ -566,17 +570,17 @@ this.ScenarioSetup(scenarioInfo); table17.AddRow(new string[] { "Title.Title", "My Post 3"}); -#line 188 +#line 190 testRunner.And("I fill in", ((string)(null)), table17, "And "); -#line 191 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 192 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 193 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 194 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 195 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 196 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 197 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table18 = new TechTalk.SpecFlow.Table(new string[] { @@ -585,17 +589,17 @@ this.ScenarioSetup(scenarioInfo); table18.AddRow(new string[] { "Title.Title", "My Post 4"}); -#line 196 +#line 198 testRunner.And("I fill in", ((string)(null)), table18, "And "); -#line 199 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 200 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 201 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 202 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 203 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 204 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 205 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table19 = new TechTalk.SpecFlow.Table(new string[] { @@ -604,17 +608,17 @@ this.ScenarioSetup(scenarioInfo); table19.AddRow(new string[] { "Title.Title", "My Post 5"}); -#line 204 +#line 206 testRunner.And("I fill in", ((string)(null)), table19, "And "); -#line 207 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 208 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 209 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 210 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 211 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 212 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 213 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table20 = new TechTalk.SpecFlow.Table(new string[] { @@ -623,17 +627,17 @@ this.ScenarioSetup(scenarioInfo); table20.AddRow(new string[] { "Title.Title", "My Post 6"}); -#line 212 +#line 214 testRunner.And("I fill in", ((string)(null)), table20, "And "); -#line 215 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 216 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 217 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 218 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 219 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 220 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 221 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table21 = new TechTalk.SpecFlow.Table(new string[] { @@ -642,17 +646,17 @@ this.ScenarioSetup(scenarioInfo); table21.AddRow(new string[] { "Title.Title", "My Post 7"}); -#line 220 +#line 222 testRunner.And("I fill in", ((string)(null)), table21, "And "); -#line 223 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 224 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 225 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 226 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 227 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 228 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 229 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table22 = new TechTalk.SpecFlow.Table(new string[] { @@ -661,17 +665,17 @@ this.ScenarioSetup(scenarioInfo); table22.AddRow(new string[] { "Title.Title", "My Post 8"}); -#line 228 +#line 230 testRunner.And("I fill in", ((string)(null)), table22, "And "); -#line 231 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 232 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 233 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 234 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 235 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 236 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 237 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table23 = new TechTalk.SpecFlow.Table(new string[] { @@ -680,17 +684,17 @@ this.ScenarioSetup(scenarioInfo); table23.AddRow(new string[] { "Title.Title", "My Post 9"}); -#line 236 +#line 238 testRunner.And("I fill in", ((string)(null)), table23, "And "); -#line 239 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 240 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 241 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 242 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 243 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 244 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 245 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table24 = new TechTalk.SpecFlow.Table(new string[] { @@ -699,17 +703,17 @@ this.ScenarioSetup(scenarioInfo); table24.AddRow(new string[] { "Title.Title", "My Post 10"}); -#line 244 +#line 246 testRunner.And("I fill in", ((string)(null)), table24, "And "); -#line 247 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 248 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 249 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 250 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 251 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 252 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 253 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table25 = new TechTalk.SpecFlow.Table(new string[] { @@ -718,17 +722,17 @@ this.ScenarioSetup(scenarioInfo); table25.AddRow(new string[] { "Title.Title", "My Post 11"}); -#line 252 +#line 254 testRunner.And("I fill in", ((string)(null)), table25, "And "); -#line 255 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 256 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 257 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 258 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 259 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 260 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 261 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table26 = new TechTalk.SpecFlow.Table(new string[] { @@ -737,33 +741,33 @@ this.ScenarioSetup(scenarioInfo); table26.AddRow(new string[] { "Title.Title", "My Post 12"}); -#line 260 +#line 262 testRunner.And("I fill in", ((string)(null)), table26, "And "); -#line 263 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 264 - testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 265 - testRunner.Then("I should see \"Your Blog Post has been created.\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 266 - testRunner.When("I go to \"my-blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); + testRunner.And("I am redirected", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 267 - testRunner.Then("I should see \"]*>.*?My Blog.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.Then("I should see \"Your Blog Post has been created.\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line 268 - testRunner.And("I should see \"]*>.*?My Post 12.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.When("I go to \"my-blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line 269 - testRunner.And("I should see \"]*>.*?My Post 11.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 270 - testRunner.And("I should not see \"]*>.*?My Post 10.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 271 - testRunner.When("I go to \"my-blog?page=2\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); -#line 272 testRunner.Then("I should see \"]*>.*?My Blog.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line 270 + testRunner.And("I should see \"]*>.*?My Post 12.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 271 + testRunner.And("I should see \"]*>.*?My Post 11.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 272 + testRunner.And("I should not see \"]*>.*?My Post 10.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 273 - testRunner.And("I should see \"]*>.*?My Post 1.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.When("I go to \"my-blog?page=2\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line 274 - testRunner.And("I should see \"]*>.*?My Post 2.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.Then("I should see \"]*>.*?My Blog.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line 275 + testRunner.And("I should see \"]*>.*?My Post 1.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 276 + testRunner.And("I should see \"]*>.*?My Post 2.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 277 testRunner.And("I should not see \"]*>.*?My Post 3.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden this.ScenarioCleanup(); @@ -776,11 +780,11 @@ this.ScenarioSetup(scenarioInfo); { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("I can create a new blog with a percent sign in the title and it gets stripped out" + " of the slug", ((string[])(null))); -#line 277 -this.ScenarioSetup(scenarioInfo); -#line 278 - testRunner.Given("I have installed Orchard", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line 279 +this.ScenarioSetup(scenarioInfo); +#line 280 + testRunner.Given("I have installed Orchard", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line 281 testRunner.When("I go to \"admin/blogs/create\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden TechTalk.SpecFlow.Table table27 = new TechTalk.SpecFlow.Table(new string[] { @@ -789,15 +793,15 @@ this.ScenarioSetup(scenarioInfo); table27.AddRow(new string[] { "Title.Title", "My Blog"}); -#line 280 +#line 282 testRunner.And("I fill in", ((string)(null)), table27, "And "); -#line 283 - testRunner.And("I hit \"Save\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 284 - testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 285 - testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); + testRunner.And("I hit \"Save\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 286 + testRunner.And("I go to \"admin/blogs\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 287 + testRunner.And("I follow \"My Blog\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 288 testRunner.And("I follow \"New Post\" where class name has \"primaryAction\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden TechTalk.SpecFlow.Table table28 = new TechTalk.SpecFlow.Table(new string[] { @@ -809,15 +813,15 @@ this.ScenarioSetup(scenarioInfo); table28.AddRow(new string[] { "Body.Text", "Hi there."}); -#line 287 +#line 289 testRunner.And("I fill in", ((string)(null)), table28, "And "); -#line 291 - testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 292 - testRunner.And("I go to \"my-blog/my-post-with-a-sign\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 293 - testRunner.Then("I should see \"]*>.*?My Post with a % Sign.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.And("I hit \"Publish Now\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 294 + testRunner.And("I go to \"my-blog/my-post-with-a-sign\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line 295 + testRunner.Then("I should see \"]*>.*?My Post with a % Sign.*?\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line 296 testRunner.And("I should see \"Hi there.\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line hidden this.ScenarioCleanup(); 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 3211768b0..8df2be595 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs @@ -171,7 +171,8 @@ namespace Orchard.Alias.Implementation.Map { } if (match == null) { - var foundPath = focus.Paths.Keys.FirstOrDefault(); + // Get the shortest path available to ensure the "home" alias is always taken if present. + var foundPath = focus.Paths.Keys.OrderBy(x => x).FirstOrDefault(); if (foundPath != null) { // Here the deepest match is being created, which will be populated as it rises back up the stack, but save the path here. // Within this function it's used to count how many items match so we get the best one; but when it's returned diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs index 6d19bba34..a60447e97 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs @@ -115,7 +115,7 @@ namespace Orchard.Autoroute.Drivers { }; // Retrieve home page. - var homePageId = _homeAliasService.GetHomePageId(); + var homePageId = _homeAliasService.GetHomePageId(VersionOptions.Latest); var isHomePage = part.Id == homePageId; viewModel.IsHomePage = isHomePage; diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Handlers/AutoroutePartHandler.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Handlers/AutoroutePartHandler.cs index fd4ec72c9..da1e7c164 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Handlers/AutoroutePartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Handlers/AutoroutePartHandler.cs @@ -39,7 +39,7 @@ namespace Orchard.Autoroute.Handlers { OnPublished((ctx, part) => PublishAlias(part)); // Remove alias if removed or unpublished - OnRemoved((ctx, part) => RemoveAlias(part)); + OnRemoving((ctx, part) => RemoveAlias(part)); OnUnpublished((ctx, part) => RemoveAlias(part)); // Register alias as identity @@ -73,7 +73,7 @@ namespace Orchard.Autoroute.Handlers { // Update the home alias to point to this item being published. _homeAliasService.PublishHomeAlias(part); } - + _autorouteService.Value.PublishAlias(part); } @@ -99,7 +99,7 @@ namespace Orchard.Autoroute.Handlers { } void RemoveAlias(AutoroutePart part) { - var homePageId = _homeAliasService.GetHomePageId(); + var homePageId = _homeAliasService.GetHomePageId(VersionOptions.Latest); // Is this the current home page? if (part.ContentItem.Id == homePageId) { diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Providers/SlugTokens.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Providers/SlugTokens.cs index 5eb4b841a..de6c5c033 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Providers/SlugTokens.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Providers/SlugTokens.cs @@ -10,10 +10,12 @@ using Orchard.Core.Common.Models; namespace Orchard.Autoroute.Providers { public class SlugTokens : ITokenProvider { private readonly ISlugService _slugService; + private readonly IHomeAliasService _homeAliasService; - public SlugTokens(ISlugService slugService) { + public SlugTokens(ISlugService slugService, IHomeAliasService homeAliasService) { T = NullLocalizer.Instance; _slugService = slugService; + _homeAliasService = homeAliasService; } public Localizer T { get; set; } @@ -40,11 +42,12 @@ namespace Orchard.Autoroute.Providers { // {Content.Slug} .Token("Slug", (content => content == null ? String.Empty : _slugService.Slugify(content))) .Token("Path", (content => { - var autoroute = content.As(); - if (autoroute == null) { + var autoroutePart = content.As(); + if (autoroutePart == null) { return String.Empty; } - return autoroute.DisplayAlias; + var isHomePage = _homeAliasService.IsHomePage(autoroutePart); + return isHomePage ? String.Empty : autoroutePart.DisplayAlias; })) // {Content.ParentPath} .Token("ParentPath", (content => { @@ -52,13 +55,15 @@ namespace Orchard.Autoroute.Providers { if (common == null || common.Container == null) { return String.Empty; } - var ar = common.Container.As(); - if (ar == null) { + var containerAutoroutePart = common.Container.As(); + if (containerAutoroutePart == null) { return String.Empty; } - if (String.IsNullOrEmpty(ar.DisplayAlias)) + if (String.IsNullOrEmpty(containerAutoroutePart.DisplayAlias)) return String.Empty; - return ar.DisplayAlias + "/"; + + var isHomePage = _homeAliasService.IsHomePage(containerAutoroutePart); + return isHomePage ? "/" : containerAutoroutePart.DisplayAlias + "/"; })); context.For("TypeDefinition") diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs index 8231aa167..1e4f0606d 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs @@ -13,7 +13,6 @@ using Orchard.Localization.Services; using Orchard.Mvc; using System.Web; using Orchard.ContentManagement.Aspects; -using Orchard.Alias.Implementation.Storage; namespace Orchard.Autoroute.Services { public class AutorouteService : Component, IAutorouteService { @@ -24,7 +23,6 @@ namespace Orchard.Autoroute.Services { private readonly IContentManager _contentManager; private readonly IRouteEvents _routeEvents; private readonly ICultureManager _cultureManager; - private readonly IAliasStorage _aliasStorage; private readonly IHttpContextAccessor _httpContextAccessor; private const string AliasSource = "Autoroute:View"; @@ -35,15 +33,13 @@ namespace Orchard.Autoroute.Services { IContentManager contentManager, IRouteEvents routeEvents, ICultureManager cultureManager, - IHttpContextAccessor httpContextAccessor, - IAliasStorage aliasStorage) { + IHttpContextAccessor httpContextAccessor) { _aliasService = aliasService; _tokenizer = tokenizer; _contentDefinitionManager = contentDefinitionManager; _contentManager = contentManager; _routeEvents = routeEvents; - _aliasStorage = aliasStorage; _cultureManager = cultureManager; _httpContextAccessor = httpContextAccessor; } @@ -69,13 +65,14 @@ namespace Orchard.Autoroute.Services { if (settings.UseCulturePattern) { // TODO: Refactor the below so that we don't need to know about Request.Form["Localization.SelectedCulture"]. // If we are creating from a form post we use the form value for culture. - HttpContextBase context = _httpContextAccessor.Current(); - if (!String.IsNullOrEmpty(context.Request.Form["Localization.SelectedCulture"])) { - itemCulture = context.Request.Form["Localization.SelectedCulture"].ToString(); + var context = _httpContextAccessor.Current(); + var selectedCulture = context.Request.Form["Localization.SelectedCulture"]; + if (!String.IsNullOrEmpty(selectedCulture)) { + itemCulture = selectedCulture; } } - string pattern = GetDefaultPattern(part.ContentItem.ContentType, itemCulture).Pattern; + var pattern = GetDefaultPattern(part.ContentItem.ContentType, itemCulture).Pattern; // String.Empty forces pattern based generation. if (part.UseCustomPattern && (!String.IsNullOrWhiteSpace(part.CustomPattern))) { diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/HomeAliasService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/HomeAliasService.cs index 50c6ebde0..f11ba7dd3 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/HomeAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/HomeAliasService.cs @@ -1,17 +1,22 @@ using System; +using System.Linq; using System.Web.Routing; using Orchard.Alias; +using Orchard.Alias.Implementation.Holder; +using Orchard.Autoroute.Models; using Orchard.ContentManagement; namespace Orchard.Autoroute.Services { public class HomeAliasService : IHomeAliasService { private readonly IAliasService _aliasService; private readonly IContentManager _contentManager; + private readonly IAliasHolder _aliasHolder; private const string AliasSource = "Autoroute:Home"; private const string HomeAlias = ""; - public HomeAliasService(IAliasService aliasService, IContentManager contentManager) { + public HomeAliasService(IAliasService aliasService, IAliasHolder aliasHolder, IContentManager contentManager) { _aliasService = aliasService; + _aliasHolder = aliasHolder; _contentManager = contentManager; } @@ -19,21 +24,27 @@ namespace Orchard.Autoroute.Services { return _aliasService.Get(HomeAlias); } - public int? GetHomePageId() { - var homePageRoute = GetHomeRoute(); - var homePageIdValue = homePageRoute != null && homePageRoute.ContainsKey("id") ? (string)homePageRoute["id"] : default(string); - var homePageId = TryParseInt32(homePageIdValue); - - return homePageId; + public int? GetHomePageId(VersionOptions version = null) { + var homePage = GetHomePage(version); + return homePage != null ? homePage.Id : default(int?); } public IContent GetHomePage(VersionOptions version = null) { - var homePageId = GetHomePageId(); - var homePage = homePageId != null ? _contentManager.Get(homePageId.Value, version ?? VersionOptions.Published) : default(IContent); + var homePageRoute = GetHomeRoute(); + var alias = LookupAlias(homePageRoute); + if (alias == null) + return null; + + var homePage = _contentManager.Query(version).Where(x => x.DisplayAlias == alias).Slice(0, 1).SingleOrDefault(); return homePage; } + public bool IsHomePage(IContent content, VersionOptions homePageVersion = null) { + var homePageId = GetHomePageId(homePageVersion); + return content.Id == homePageId; + } + public void PublishHomeAlias(IContent content) { var routeValues = _contentManager.GetItemMetadata(content).DisplayRouteValues; PublishHomeAlias(routeValues); @@ -49,13 +60,18 @@ namespace Orchard.Autoroute.Services { _aliasService.Set(HomeAlias, route, AliasSource); } - private int? TryParseInt32(string value) { - int i; + private string LookupAlias(RouteValueDictionary routeValues) { + object area; - if (String.IsNullOrWhiteSpace(value) || !Int32.TryParse(value, out i)) + if (!routeValues.TryGetValue("area", out area)) return null; - - return i; + + var map = _aliasHolder.GetMap(area.ToString()); + if (map == null) + return null; + + var alias = map.GetAliases().FirstOrDefault(x => !String.IsNullOrWhiteSpace(x.Path)); + return alias != null ? alias.Path : null; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/IHomeAliasService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/IHomeAliasService.cs index d617b1dce..f85cd64fc 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/IHomeAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/IHomeAliasService.cs @@ -5,8 +5,9 @@ namespace Orchard.Autoroute.Services { public interface IHomeAliasService : IDependency { RouteValueDictionary GetHomeRoute(); - int? GetHomePageId(); + int? GetHomePageId(VersionOptions version = null); IContent GetHomePage(VersionOptions version = null); + bool IsHomePage(IContent content, VersionOptions homePageVersion = null); void PublishHomeAlias(IContent content); void PublishHomeAlias(string route); void PublishHomeAlias(RouteValueDictionary route); From 8ca6c3367aeb49be8557129959cd7326ed5733fe Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 12 Sep 2015 15:03:12 +0100 Subject: [PATCH 2/3] Fixed Pages specflow test. Note: this changes the specification from the hime page being accessible only via ~/ to being accessible via both ~/ as well as ~/my-page. --- src/Orchard.Specs/Pages.feature | 6 +++--- src/Orchard.Specs/Pages.feature.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Orchard.Specs/Pages.feature b/src/Orchard.Specs/Pages.feature index 382d20e2d..a299c4a61 100644 --- a/src/Orchard.Specs/Pages.feature +++ b/src/Orchard.Specs/Pages.feature @@ -25,13 +25,13 @@ Scenario: In the admin (menu) there is a link to create a Page And I fill in | name | value | | Title.Title | Super Duper | - | AutoroutePart.LayoutEditor.Data | { "type": "Content", "data": "TypeName=Orchard.Layouts.Elements.Text&Content=This+is+super+number+two", "isTemplated": false, "contentType": "Orchard.Layouts.Elements.Text", "contentTypeLabel": "Text", "contentTypeClass": "text", "html": "This is super number two", "hasEditor": true } | + | LayoutPart.LayoutEditor.Data | { "type": "Content", "data": "TypeName=Orchard.Layouts.Elements.Text&Content=This+is+super+number+two", "isTemplated": false, "contentType": "Orchard.Layouts.Elements.Text", "contentTypeLabel": "Text", "contentTypeClass": "text", "html": "This is super number two", "hasEditor": true } | And I hit "Publish Now" And I go to "super-duper-2" Then I should see "]*>.*?Super Duper.*?" And I should see "This is super number two." - # A new page marked to be the home page and publish does take over the home page and is not accessible from its own standard path + # A new page marked to be the home page and publish does take over the home page and is also accessible from its own standard path When I go to "Admin/Contents/Create/Page" And I fill in | name | value | @@ -41,7 +41,7 @@ Scenario: In the admin (menu) there is a link to create a Page And I go to "/" Then I should see "

Another

" When I go to "another" - Then the status should be 404 "Not Found" + Then the status should be 200 "OK" # A new page marked to be the home page but only saved as draft does not take over the home page When I go to "Admin/Contents/Create/Page" diff --git a/src/Orchard.Specs/Pages.feature.cs b/src/Orchard.Specs/Pages.feature.cs index 5a60be007..f75cbe52f 100644 --- a/src/Orchard.Specs/Pages.feature.cs +++ b/src/Orchard.Specs/Pages.feature.cs @@ -110,7 +110,7 @@ this.ScenarioSetup(scenarioInfo); "Title.Title", "Super Duper"}); table2.AddRow(new string[] { - "AutoroutePart.LayoutEditor.Data", + "LayoutPart.LayoutEditor.Data", @"{ ""type"": ""Content"", ""data"": ""TypeName=Orchard.Layouts.Elements.Text&Content=This+is+super+number+two"", ""isTemplated"": false, ""contentType"": ""Orchard.Layouts.Elements.Text"", ""contentTypeLabel"": ""Text"", ""contentTypeClass"": ""text"", ""html"": ""This is super number two"", ""hasEditor"": true }"}); #line 25 testRunner.And("I fill in", ((string)(null)), table2, "And "); @@ -145,7 +145,7 @@ this.ScenarioSetup(scenarioInfo); #line 43 testRunner.When("I go to \"another\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line 44 - testRunner.Then("the status should be 404 \"Not Found\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.Then("the status should be 200 \"OK\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line 47 testRunner.When("I go to \"Admin/Contents/Create/Page\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden From d0e7c09ba504b16ac793d3018a3bd55d389a32c8 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 14 Sep 2015 13:21:57 +0100 Subject: [PATCH 3/3] Updated AliasMap Ordering by key Length rather than key value. --- .../Modules/Orchard.Alias/Implementation/Map/AliasMap.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 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 8df2be595..7a2be0e51 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Map/AliasMap.cs @@ -172,7 +172,7 @@ namespace Orchard.Alias.Implementation.Map { if (match == null) { // Get the shortest path available to ensure the "home" alias is always taken if present. - var foundPath = focus.Paths.Keys.OrderBy(x => x).FirstOrDefault(); + var foundPath = focus.Paths.Keys.OrderBy(x => x.Length).FirstOrDefault(); if (foundPath != null) { // Here the deepest match is being created, which will be populated as it rises back up the stack, but save the path here. // Within this function it's used to count how many items match so we get the best one; but when it's returned @@ -194,4 +194,4 @@ namespace Orchard.Alias.Implementation.Map { } } -} \ No newline at end of file +}