You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2008/01/20 20:09:59 UTC

svn commit: r613658 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java

Author: hlship
Date: Sun Jan 20 11:09:58 2008
New Revision: 613658

URL: http://svn.apache.org/viewvc?rev=613658&view=rev
Log:
TAPESTRY-1526: Strip the folder name used to identify libraries from logical page names, just as the subfolder is stripped

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java?rev=613658&r1=613657&r2=613658&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java Sun Jan 20 11:09:58 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -72,19 +72,24 @@
     private final Map<String, String> _mixinToClassName = newCaseInsensitiveMap();
 
     /**
-     * Page class name to logical name (needed to build URLs). This one is case sensitive, since class names do always have a particular case.
+     * Page class name to logical name (needed to build URLs). This one is case sensitive, since class names do always
+     * have a particular case.
      */
     private final Map<String, String> _pageClassNameToLogicalName = newMap();
 
 
     /**
-     * Used to convert an logical page name to the canonical form of the page name; this ensures that uniform case for page
-     * names is used.
+     * Used to convert an logical page name to the canonical form of the page name; this ensures that uniform case for
+     * page names is used.
      */
     private final Map<String, String> _pageNameToCanonicalPageName = newCaseInsensitiveMap();
 
     private final ConcurrentBarrier _barrier = new ConcurrentBarrier();
 
+    private static final Pattern SPLIT_PACKAGE_PATTERN = Pattern.compile("\\.");
+
+    private static final Pattern SPLIT_FOLDER_PATTERN = Pattern.compile("/");
+
     public ComponentClassResolverImpl(Logger logger,
 
                                       ComponentInstantiatorSource componentInstantiatorSource,
@@ -155,8 +160,8 @@
     }
 
     /**
-     * Invoked from within a withRead() block, checks to see if a rebuild is needed,
-     * and then performs the rebuild within a withWrite() block.
+     * Invoked from within a withRead() block, checks to see if a rebuild is needed, and then performs the rebuild
+     * within a withWrite() block.
      */
     private void rebuild()
     {
@@ -292,37 +297,47 @@
         }
     }
 
-    private static final Pattern SPLIT_PACKAGE_PATTERN = Pattern.compile("\\.");
 
     /**
      * Converts a fully qualified class name to a logical name
      *
      * @param className  fully qualified class name
-     * @param pathPrefix prefix to be placed on the logical name (to identify the library from in which the
-     *                   class lives)
-     * @param startPos   start position within the class name to extract the logical name (i.e., after the
-     *                   final '.' in "rootpackage.pages.").
+     * @param pathPrefix prefix to be placed on the logical name (to identify the library from in which the class
+     *                   lives)
+     * @param startPos   start position within the class name to extract the logical name (i.e., after the final '.' in
+     *                   "rootpackage.pages.").
      * @return a short logical name in folder format ('.' replaced with '/')
      */
     private String toLogicalName(String className, String pathPrefix, int startPos)
     {
-        String[] terms = SPLIT_PACKAGE_PATTERN.split(className.substring(startPos));
+        List<String> terms = CollectionFactory.newList();
+
+        addAll(terms, SPLIT_FOLDER_PATTERN, pathPrefix);
+
+        int start = terms.size();
+
+        addAll(terms, SPLIT_PACKAGE_PATTERN, className.substring(startPos));
 
         StringBuilder builder = new StringBuilder(pathPrefix);
         String sep = "";
 
-        String logicalName = terms[terms.length - 1];
+        int count = terms.size();
+
+        String logicalName = terms.get(count - 1);
+
         String unstripped = logicalName;
 
-        for (int i = 0; i < terms.length - 1; i++)
+        for (int i = 0; i < count - 1; i++)
         {
+            String term = terms.get(i);
 
-            String term = terms[i];
-
-            builder.append(sep);
-            builder.append(term);
+            if (i >= start)
+            {
+                builder.append(sep);
+                builder.append(term);
 
-            sep = "/";
+                sep = "/";
+            }
 
             logicalName = stripTerm(term, logicalName);
         }
@@ -335,6 +350,16 @@
         return builder.toString();
     }
 
+    private void addAll(List<String> terms, Pattern splitter, String input)
+    {
+        for (String term : splitter.split(input))
+        {
+            if (term.equals("")) continue;
+
+            terms.add(term);
+        }
+    }
+
     private String stripTerm(String term, String logicalName)
     {
         if (isCaselessPrefix(term, logicalName))
@@ -441,8 +466,8 @@
     }
 
     /**
-     * Locates a class name within the provided map, given its logical name. If not found naturally,
-     * a search inside the "core" library is included.
+     * Locates a class name within the provided map, given its logical name. If not found naturally, a search inside the
+     * "core" library is included.
      *
      * @param logicalName            name to search for
      * @param logicalNameToClassName mapping from logical name to class name

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java?rev=613658&r1=613657&r2=613658&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java Sun Jan 20 11:09:58 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -81,7 +81,7 @@
     }
 
     /**
-     * https://issues.apache.org/jira/browse/TAPESTRY-1541
+     * TAPESTRY-1541
      */
     @Test
     public void page_name_matches_containing_folder_name()
@@ -193,7 +193,6 @@
         assertEquals(resolver.resolvePageNameToClassName("subfolder/NestedPage"), className);
 
         verify();
-
     }
 
     @Test
@@ -286,7 +285,7 @@
         train_for_app_packages(source);
         train_for_packages(source, CORE_ROOT_PACKAGE);
 
-        String className = CORE_ROOT_PACKAGE + ".pages.CorePage";
+        String className = CORE_ROOT_PACKAGE + ".pages.MyCorePage";
 
         train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", className);
 
@@ -297,11 +296,11 @@
 
         // Can look like an application page, but still resolves to the core library class name.
 
-        assertTrue(resolver.isPageName("CorePage"));
+        assertTrue(resolver.isPageName("MyCorePage"));
 
         // Or we can give it its true name
 
-        assertTrue(resolver.isPageName("core/corepage"));
+        assertTrue(resolver.isPageName("core/mycorepage"));
 
         assertFalse(resolver.isPageName("UnknownPage"));
 
@@ -401,7 +400,7 @@
     @Test
     public void page_found_in_core_lib()
     {
-        String className = CORE_ROOT_PACKAGE + ".pages.CorePage";
+        String className = CORE_ROOT_PACKAGE + ".pages.MyCorePage";
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
@@ -417,7 +416,7 @@
         ComponentClassResolver resolver = create(logger, source, locator,
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
-        assertEquals(resolver.resolvePageNameToClassName("CorePage"), className);
+        assertEquals(resolver.resolvePageNameToClassName("MyCorePage"), className);
 
         verify();
     }
@@ -425,7 +424,7 @@
     @Test
     public void page_class_name_resolved_to_core_page()
     {
-        String className = CORE_ROOT_PACKAGE + ".pages.CorePage";
+        String className = CORE_ROOT_PACKAGE + ".pages.MyCorePage";
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
@@ -441,7 +440,7 @@
         ComponentClassResolver resolver = create(logger, source, locator,
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
-        assertEquals(resolver.resolvePageClassNameToPageName(className), "core/CorePage");
+        assertEquals(resolver.resolvePageClassNameToPageName(className), "core/MyCorePage");
 
         verify();
     }
@@ -449,7 +448,7 @@
     @Test
     public void page_found_in_library()
     {
-        String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
+        String className = LIB_ROOT_PACKAGE + ".pages.MyLibPage";
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
@@ -467,7 +466,7 @@
                                                  new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
-        assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), className);
+        assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
 
         verify();
     }
@@ -475,6 +474,32 @@
     @Test
     public void lookup_by_logical_name_is_case_insensitive()
     {
+        String className = LIB_ROOT_PACKAGE + ".pages.MyLibPage";
+
+        ComponentInstantiatorSource source = mockComponentInstantiatorSource();
+        ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
+
+        train_for_packages(source, LIB_ROOT_PACKAGE);
+        train_for_packages(source, CORE_ROOT_PACKAGE);
+        train_for_app_packages(source);
+
+        train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
+
+        replay();
+
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+        assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
+
+        verify();
+    }
+
+    @Test
+    public void name_stripping_includes_library_folder()
+    {
         String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
@@ -493,13 +518,41 @@
                                                  new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
-        assertEquals(resolver.resolvePageNameToClassName("lib/libpage"), className);
-        assertEquals(resolver.resolvePageNameToClassName("LIB/LIBPAGE"), className);
+        assertEquals(resolver.resolvePageNameToClassName("lib/Page"), className);
 
         verify();
     }
 
     @Test
+    public void name_stripping_for_complex_library_folder_name()
+    {
+        String libPrefix = "lib/deep";
+
+        String className = LIB_ROOT_PACKAGE + ".pages.LibDeepPage";
+
+        ComponentInstantiatorSource source = mockComponentInstantiatorSource();
+        ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
+
+        train_for_packages(source, LIB_ROOT_PACKAGE);
+        train_for_packages(source, CORE_ROOT_PACKAGE);
+        train_for_app_packages(source);
+
+        train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
+
+        replay();
+
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(libPrefix, LIB_ROOT_PACKAGE),
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+        assertEquals(resolver.resolvePageNameToClassName("lib/deep/Page"), className);
+
+        verify();
+    }
+
+
+    @Test
     public void class_name_does_not_resolve_to_page_name()
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
@@ -595,7 +648,7 @@
     public void multiple_mappings_for_same_prefix()
     {
         String secondaryLibPackage = "org.examples.addon.lib";
-        String className = secondaryLibPackage + ".pages.LibPage";
+        String className = secondaryLibPackage + ".pages.MyLibPage";
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
@@ -615,7 +668,7 @@
                                                  new LibraryMapping(LIB_PREFIX, secondaryLibPackage),
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
-        assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), className);
+        assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
 
         verify();
     }
@@ -664,8 +717,8 @@
     }
 
     /**
-     * The logic for searching is pretty much identical for both components and pages, so even a
-     * cursory test of component types should nail it.
+     * The logic for searching is pretty much identical for both components and pages, so even a cursory test of
+     * component types should nail it.
      */
     @Test
     public void simple_component_type()