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
{