You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@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()
{