Author: hlship
Date: Mon Oct 13 15:57:35 2008
New Revision: 704281

URL: http://svn.apache.org/viewvc?rev=704281&view=rev
Log:
TAP5-258: RequestPageCache should canonicalize page name

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePool.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCacheImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PagePoolImplTest.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPageCacheImplTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
 Mon Oct 13 15:57:35 2008
@@ -103,9 +103,9 @@
 
 
     @Scope(PERTHREAD_SCOPE)
-    public static RequestPageCache buildRequestPageCache(PagePool pagePool, 
PerthreadManager perthreadManager)
+    public static RequestPageCache buildRequestPageCache(ObjectLocator 
locator, PerthreadManager perthreadManager)
     {
-        RequestPageCacheImpl service = new RequestPageCacheImpl(pagePool);
+        RequestPageCacheImpl service = 
locator.autobuild(RequestPageCacheImpl.class);
 
         perthreadManager.addThreadCleanupListener(service);
 
@@ -216,7 +216,6 @@
             {
                 requestGlobals.getHTTPServletResponse().addCookie(cookie);
             }
-
         };
     }
 
@@ -256,5 +255,4 @@
     {
         return builder.build(componentInstantiatorSource, "classSource", 
CtClassSource.class);
     }
-
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePool.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePool.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePool.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePool.java
 Mon Oct 13 15:57:35 2008
@@ -27,12 +27,12 @@
      * combination) and may wait for a page to become available rather than 
create a new instance. There's also a hard
      * limit, at which point an exception is raised.
      *
-     * @param logicalPageName logical name used to identify the page
+     * @param pageName the canonical page name
      * @return a page instance
      * @throws RuntimeException if the name is not valid, if the page cannot 
be loaded, or if an instance of the page
      *                          can't be created.
      */
-    Page checkout(String logicalPageName);
+    Page checkout(String pageName);
 
     /**
      * Releases a previously checked-out page.

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java
 Mon Oct 13 15:57:35 2008
@@ -22,7 +22,6 @@
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ThreadLocale;
 import org.apache.tapestry5.ioc.util.TimeInterval;
-import org.apache.tapestry5.services.ComponentClassResolver;
 import org.slf4j.Logger;
 
 import java.util.Locale;
@@ -56,8 +55,6 @@
 
     private final ThreadLocale threadLocale;
 
-    private final ComponentClassResolver resolver;
-
     private final int softLimit;
 
     private final long softWait;
@@ -74,8 +71,6 @@
 
                         ThreadLocale threadLocale,
 
-                        ComponentClassResolver resolver,
-
                         @Symbol("tapestry.page-pool.soft-limit")
                         int softLimit,
 
@@ -91,18 +86,15 @@
         this.logger = logger;
         this.pageLoader = pageLoader;
         this.threadLocale = threadLocale;
-        this.resolver = resolver;
         this.softLimit = softLimit;
         this.softWait = softWait;
         this.hardLimit = hardLimit;
         this.activeWindow = activeWindow;
     }
 
-    public Page checkout(String logicalPageName)
+    public Page checkout(String pageName)
     {
-        String canonicalPageName = 
resolver.canonicalizePageName(logicalPageName);
-
-        PagePoolCache cache = get(canonicalPageName, threadLocale.getLocale());
+        PagePoolCache cache = get(pageName, threadLocale.getLocale());
 
         return cache.checkout();
     }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java
 Mon Oct 13 15:57:35 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.
@@ -26,8 +26,9 @@
 public interface RequestPageCache
 {
     /**
-     * Gets the page via its page name, in the current locale. The page name 
is resolved to a class name, which is used
-     * to obtain the page (from the page pool).
+     * Gets the page via its page name, in the current locale. The logical 
page name is resolved to a class name, which
+     * is used to obtain the page (from the page pool).  Note that under 
certain circumstances, a page may have multiple
+     * names (even beyond simple case-insensitivity), and RequestPageCache 
caches correctly.
      *
      * @param logicalPageName the name of the page to retrieve (this is the 
logical page name, not the fully qualified
      *                        class name)

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCacheImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCacheImpl.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCacheImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCacheImpl.java
 Mon Oct 13 15:57:35 2008
@@ -16,7 +16,9 @@
 
 import org.apache.tapestry5.internal.structure.Page;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.Defense;
 import org.apache.tapestry5.ioc.services.ThreadCleanupListener;
+import org.apache.tapestry5.services.ComponentClassResolver;
 
 import java.util.Map;
 
@@ -24,23 +26,29 @@
 {
     private final PagePool pagePool;
 
+    private final ComponentClassResolver resolver;
     /**
-     * Keyed on logical page name (case insensitive).
+     * Keyed on canonical page name (case insensitive).
      */
     private final Map<String, Page> cache = 
CollectionFactory.newCaseInsensitiveMap();
 
-    public RequestPageCacheImpl(PagePool pagePool)
+    public RequestPageCacheImpl(PagePool pagePool, ComponentClassResolver 
resolver)
     {
         this.pagePool = pagePool;
+        this.resolver = resolver;
     }
 
     public Page get(String logicalPageName)
     {
-        Page page = cache.get(logicalPageName);
+        Defense.notNull(logicalPageName, "logicalPageName");
+
+        String canonicalName = resolver.canonicalizePageName(logicalPageName);
+
+        Page page = cache.get(canonicalName);
 
         if (page == null)
         {
-            page = pagePool.checkout(logicalPageName);
+            page = pagePool.checkout(canonicalName);
 
             try
             {
@@ -53,7 +61,7 @@
                 throw ex;
             }
 
-            cache.put(logicalPageName, page);
+            cache.put(canonicalName, page);
         }
 
         return page;

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PagePoolImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PagePoolImplTest.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PagePoolImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PagePoolImplTest.java
 Mon Oct 13 15:57:35 2008
@@ -17,7 +17,6 @@
 import org.apache.tapestry5.internal.structure.Page;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.services.ThreadLocale;
-import org.apache.tapestry5.services.ComponentClassResolver;
 import static org.easymock.EasyMock.contains;
 import org.slf4j.Logger;
 import org.testng.annotations.Test;
@@ -26,7 +25,6 @@
 
 public class PagePoolImplTest extends InternalBaseTestCase
 {
-    private static final String INPUT_PAGE_NAME = "mypage";
 
     private static final String LOGICAL_PAGE_NAME = "MyPage";
 
@@ -40,20 +38,17 @@
         PageLoader loader = mockPageLoader();
         Page page = mockPage();
         ThreadLocale tl = mockThreadLocale();
-        ComponentClassResolver resolver = mockComponentClassResolver();
         Logger logger = mockLogger();
 
-        train_canonicalizePageName(resolver, INPUT_PAGE_NAME, 
LOGICAL_PAGE_NAME);
-
         train_getLocale(tl, locale);
 
         train_loadPage(loader, LOGICAL_PAGE_NAME, locale, page);
 
         replay();
 
-        PagePool pool = new PagePoolImpl(logger, loader, tl, resolver, 5, 0, 
20, 600000);
+        PagePool pool = new PagePoolImpl(logger, loader, tl, 5, 0, 20, 600000);
 
-        assertSame(page, pool.checkout(INPUT_PAGE_NAME));
+        assertSame(page, pool.checkout(LOGICAL_PAGE_NAME));
 
         verify();
     }
@@ -66,9 +61,6 @@
         PageLoader loader = mockPageLoader();
         Logger logger = mockLogger();
         ThreadLocale tl = mockThreadLocale();
-        ComponentClassResolver resolver = mockComponentClassResolver();
-
-        train_canonicalizePageName(resolver, INPUT_PAGE_NAME, 
LOGICAL_PAGE_NAME);
 
         train_getLocale(tl, locale);
 
@@ -76,9 +68,9 @@
 
         replay();
 
-        PagePool pool = new PagePoolImpl(logger, loader, tl, resolver, 5, 0, 
20, 600000);
+        PagePool pool = new PagePoolImpl(logger, loader, tl, 5, 0, 20, 600000);
 
-        assertSame(pool.checkout(INPUT_PAGE_NAME), page1);
+        assertSame(pool.checkout(LOGICAL_PAGE_NAME), page1);
 
         verify();
 
@@ -92,21 +84,18 @@
 
         verify();
 
-        train_canonicalizePageName(resolver, INPUT_PAGE_NAME, 
LOGICAL_PAGE_NAME);
         train_getLocale(tl, locale);
 
-        train_canonicalizePageName(resolver, INPUT_PAGE_NAME, 
LOGICAL_PAGE_NAME);
         train_getLocale(tl, locale);
 
         train_loadPage(loader, LOGICAL_PAGE_NAME, locale, page2);
 
         replay();
 
-        assertSame(pool.checkout(INPUT_PAGE_NAME), page1);
-        assertSame(pool.checkout(INPUT_PAGE_NAME), page2);
+        assertSame(pool.checkout(LOGICAL_PAGE_NAME), page1);
+        assertSame(pool.checkout(LOGICAL_PAGE_NAME), page2);
 
         verify();
-
     }
 
     @Test
@@ -127,7 +116,7 @@
 
         replay();
 
-        PagePool pool = new PagePoolImpl(logger, loader, null, null, 5, 0, 20, 
600000);
+        PagePool pool = new PagePoolImpl(logger, loader, null, 5, 0, 20, 
600000);
 
         pool.release(page);
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPageCacheImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPageCacheImplTest.java?rev=704281&r1=704280&r2=704281&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPageCacheImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPageCacheImplTest.java
 Mon Oct 13 15:57:35 2008
@@ -16,35 +16,44 @@
 
 import org.apache.tapestry5.internal.structure.Page;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.apache.tapestry5.services.ComponentClassResolver;
 import org.easymock.EasyMock;
 import org.testng.annotations.Test;
 
 public class RequestPageCacheImplTest extends InternalBaseTestCase
 {
-    private static final String PAGE_NAME = "MyPage";
+    private static final String PAGE_NAME = "edit/EditFoo";
+
+    private static final String CANON_PAGE_NAME = "edit/Foo";
 
     @Test
     public void get_is_cached()
     {
         PagePool pool = mockPagePool();
         Page page = mockPage();
+        ComponentClassResolver resolver = mockComponentClassResolver();
+
+        train_canonicalizePageName(resolver, PAGE_NAME, CANON_PAGE_NAME);
 
-        expect(pool.checkout(PAGE_NAME)).andReturn(page);
+        expect(pool.checkout(CANON_PAGE_NAME)).andReturn(page);
 
         page.attached();
 
         replay();
 
-        RequestPageCacheImpl cache = new RequestPageCacheImpl(pool);
+        RequestPageCacheImpl cache = new RequestPageCacheImpl(pool, resolver);
 
         assertSame(cache.get(PAGE_NAME), page);
 
         verify();
 
+        train_canonicalizePageName(resolver, CANON_PAGE_NAME, CANON_PAGE_NAME);
+
         replay();
 
-        // Again, same object, but no PagePool this time.
-        assertSame(cache.get(PAGE_NAME), page);
+        // Again, same object, but no PagePool this time.  Also checks that 
name is
+        // properly resolved to canon name.
+        assertSame(cache.get(CANON_PAGE_NAME), page);
 
         verify();
 
@@ -65,8 +74,11 @@
         PagePool pool = mockPagePool();
         Page page = mockPage();
         RuntimeException t = new RuntimeException("Failure in attach.");
+        ComponentClassResolver resolver = mockComponentClassResolver();
+
+        train_canonicalizePageName(resolver, PAGE_NAME, CANON_PAGE_NAME);
 
-        expect(pool.checkout(PAGE_NAME)).andReturn(page);
+        expect(pool.checkout(CANON_PAGE_NAME)).andReturn(page);
 
         page.attached();
 
@@ -76,7 +88,7 @@
 
         replay();
 
-        RequestPageCacheImpl cache = new RequestPageCacheImpl(pool);
+        RequestPageCacheImpl cache = new RequestPageCacheImpl(pool, resolver);
 
         try
         {


Reply via email to