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 2007/12/19 18:31:22 UTC

svn commit: r605629 - 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: Wed Dec 19 09:31:22 2007
New Revision: 605629

URL: http://svn.apache.org/viewvc?rev=605629&view=rev
Log:
TAPESTRY-1541: Can't find page with same name as parent folder

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=605629&r1=605628&r2=605629&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 Wed Dec 19 09:31:22 2007
@@ -28,6 +28,7 @@
 import org.slf4j.Logger;
 
 import java.util.*;
+import java.util.regex.Pattern;
 
 public class ComponentClassResolverImpl implements ComponentClassResolver, InvalidationListener
 {
@@ -207,7 +208,8 @@
     {
         if (savedMap.equals(newMap)) return;
 
-        Map<String, String> fixed = CollectionFactory.newMap();
+        Map<String, String> core = CollectionFactory.newMap();
+        Map<String, String> nonCore = CollectionFactory.newMap();
 
         int maxLength = 0;
 
@@ -217,28 +219,27 @@
         {
             if (name.startsWith(CORE_LIBRARY_PREFIX))
             {
-
-                // Strip of the "core/" prefix.
+                // Strip off the "core/" prefix.
 
                 String key = name.substring(CORE_LIBRARY_PREFIX.length());
 
                 maxLength = Math.max(maxLength, key.length());
 
-                fixed.put(key, newMap.get(name));
+                core.put(key, newMap.get(name));
             }
-        }
-
-        // Pass #2: Get everything else (may overwrite some of  pass #1).
-
-        for (String name : newMap.keySet())
-        {
-            if (name.startsWith(CORE_LIBRARY_PREFIX)) continue;
-
-            maxLength = Math.max(maxLength, name.length());
+            else
+            {
+                maxLength = Math.max(maxLength, name.length());
 
-            fixed.put(name, newMap.get(name));
+                nonCore.put(name, newMap.get(name));
+            }
         }
 
+        // Merge the non-core mappings into the core mappings. Where there are conflicts on name, it
+        // means the application overrode a core page/component/mixin and that's ok ... the
+        // merged core map will reflect the application's mapping.
+
+        core.putAll(nonCore);
 
         StringBuilder builder = new StringBuilder(2000);
         Formatter f = new Formatter(builder);
@@ -247,11 +248,11 @@
 
         String formatString = "%" + maxLength + "s: %s\n";
 
-        List<String> sorted = InternalUtils.sortedKeys(fixed);
+        List<String> sorted = InternalUtils.sortedKeys(core);
 
         for (String name : sorted)
         {
-            String className = fixed.get(name);
+            String className = core.get(name);
 
             f.format(formatString, name, className);
         }
@@ -291,6 +292,8 @@
         }
     }
 
+    private static final Pattern SPLIT_PACKAGE_PATTERN = Pattern.compile("\\.");
+
     /**
      * Converts a fully qualified class name to a logical name
      *
@@ -303,11 +306,13 @@
      */
     private String toLogicalName(String className, String pathPrefix, int startPos)
     {
-        String[] terms = className.substring(startPos).split("\\.");
+        String[] terms = SPLIT_PACKAGE_PATTERN.split(className.substring(startPos));
+
         StringBuilder builder = new StringBuilder(pathPrefix);
         String sep = "";
 
         String logicalName = terms[terms.length - 1];
+        String unstripped = logicalName;
 
         for (int i = 0; i < terms.length - 1; i++)
         {
@@ -322,9 +327,7 @@
             logicalName = stripTerm(term, logicalName);
         }
 
-        // The problem here is that you can eventually end up with the empty string.
-
-        assert logicalName.length() > 0;
+        if (logicalName.equals("")) logicalName = unstripped;
 
         builder.append(sep);
         builder.append(logicalName);

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=605629&r1=605628&r2=605629&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 Wed Dec 19 09:31:22 2007
@@ -80,6 +80,32 @@
         verify();
     }
 
+    /**
+     * https://issues.apache.org/jira/browse/TAPESTRY-1541
+     */
+    @Test
+    public void page_name_matches_containing_folder_name()
+    {
+        ComponentInstantiatorSource source = mockComponentInstantiatorSource();
+        ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
+
+        train_for_app_packages(source);
+
+        String className = APP_ROOT_PACKAGE + ".pages.admin.product.ProductAdmin";
+
+        train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
+
+        replay();
+
+        ComponentClassResolver resolver = create(logger, source, locator);
+
+        assertEquals(resolver.resolvePageNameToClassName("admin/product/ProductAdmin"), className);
+
+        verify();
+    }
+
+
     @Test
     public void canonicalize_existing_page_name()
     {