Author: uli Date: Wed Feb 16 08:33:24 2011 New Revision: 1071170 URL: http://svn.apache.org/viewvc?rev=1071170&view=rev Log: TAP5-1444: Index pages in subfolders should have precedence over start pages
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java?rev=1071170&r1=1071169&r2=1071170&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java Wed Feb 16 08:33:24 2011 @@ -322,9 +322,13 @@ public class ComponentClassResolverImpl String reducedName = lastSlashx < 0 ? "" : logicalName.substring(0, lastSlashx); // Make the super-stripped name another alias to the class. - - logicalNameToClassName.put(reducedName, name); - pageNameToCanonicalPageName.put(reducedName, logicalName); + // TAP5-1444: Everything else but a start page has precedence + + if (!(lastTerm.equalsIgnoreCase(startPageName) && logicalNameToClassName.containsKey(reducedName))) + { + logicalNameToClassName.put(reducedName, name); + pageNameToCanonicalPageName.put(reducedName, logicalName); + } } pageClassNameToLogicalName.put(name, logicalName); Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java?rev=1071170&r1=1071169&r2=1071170&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java Wed Feb 16 08:33:24 2011 @@ -183,6 +183,66 @@ public class ComponentClassResolverImplT verify(); } + + @Test + public void start_page_in_subfolder() + { + ComponentInstantiatorSource source = mockComponentInstantiatorSource(); + ClassNameLocator locator = newClassNameLocator(); + Logger logger = compliantLogger(); + + train_for_app_packages(source); + + String className = APP_ROOT_PACKAGE + ".pages.sub.HomePage"; + + train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className); + + replay(); + + List<LibraryMapping> mappings = Arrays.asList(); + + ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE, + "HomePage", mappings); + + assertEquals(resolver.canonicalizePageName("sub/HomePage"), "sub/HomePage"); + assertEquals(resolver.canonicalizePageName("sub"), "sub/HomePage"); + assertTrue(resolver.isPageName("sub/HomePage")); + + verify(); + } + + /** + * TAP5-1444 + */ + @Test + public void index_page_precedence() + { + ComponentInstantiatorSource source = mockComponentInstantiatorSource(); + ClassNameLocator locator = newClassNameLocator(); + Logger logger = compliantLogger(); + + train_for_app_packages(source); + + String[] classNames = { APP_ROOT_PACKAGE + ".pages.sub.HomePage", APP_ROOT_PACKAGE + ".pages.sub.SubIndex" }; + + train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", classNames); + + replay(); + + List<LibraryMapping> mappings = Arrays.asList(); + + ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE, + "HomePage", mappings); + + assertTrue(resolver.isPageName("sub/HomePage")); + assertTrue(resolver.isPageName("sub/subIndex")); + assertEquals(resolver.resolvePageNameToClassName("sub/HomePage"), APP_ROOT_PACKAGE + ".pages.sub.HomePage"); + assertEquals(resolver.resolvePageNameToClassName("sub/SubIndex"), APP_ROOT_PACKAGE + ".pages.sub.SubIndex"); + assertEquals(resolver.resolvePageNameToClassName("sub/Index"), APP_ROOT_PACKAGE + ".pages.sub.SubIndex"); + assertEquals(resolver.resolvePageNameToClassName("sub"), APP_ROOT_PACKAGE + ".pages.sub.SubIndex"); + + verify(); + } @Test public void page_name_in_subfolder() @@ -902,4 +962,26 @@ public class ComponentClassResolverImplT } } + + @Test + public void ignore_start_page_outside_root() + { + ComponentInstantiatorSource source = mockComponentInstantiatorSource(); + ClassNameLocator locator = newClassNameLocator(); + Logger logger = compliantLogger(); + + train_for_app_packages(source); + + String[] classNames = new String[] { APP_ROOT_PACKAGE + ".pages.exam.ExamIndex", APP_ROOT_PACKAGE + ".pages.exam.StartExam" }; + + train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", classNames); + + replay(); + + ComponentClassResolver resolver = create(logger, source, locator); + + assertEquals(resolver.resolvePageNameToClassName("exam"), classNames[0]); + + verify(); + } }