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 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()