I have introduced a MultiKey class into T5 already; do we really need the PageLocator class?
---------- Forwarded message ---------- From: [EMAIL PROTECTED] <[EMAIL PROTECTED]> Date: Dec 22, 2006 1:41 AM Subject: svn commit: r489591 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/internal/structure/ test/java/org/apache/tapestry/integration/pagelevel/ test/java/org/apache/tapestry/... To: [email protected] Author: freemant Date: Fri Dec 22 01:41:57 2006 New Revision: 489591 URL: http://svn.apache.org/viewvc?view=rev&rev=489591 Log: Modified PagePoolImpl to consider the locale when checking out & releasing a page. A simple PageLocator is implemented as the lookup key. Not sure if we should let it delegate to the MultiKey in T4. Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLocator.java (with props) tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java (with props) tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLocatorTest.java (with props) Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/pagelevel/LocaleTest.java tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLocator.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLocator.java?view=auto&rev=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLocator.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLocator.java Fri Dec 22 01:41:57 2006 @@ -0,0 +1,57 @@ +// Copyright 2006 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry.internal.services; + +import java.util.Locale; + +/** + * Used as a key to lookup a page from the [EMAIL PROTECTED] org.apache.tapestry.internal.services.PagePool}. + */ +public class PageLocator +{ + private final String _pageName; + + private final Locale _locale; + + public PageLocator(String pageName, Locale locale) + { + _pageName = pageName; + _locale = locale; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null || !(obj instanceof PageLocator)) + { + return false; + } + PageLocator locator = (PageLocator) obj; + return _pageName.equals(locator._pageName) && _locale.equals(locator._locale); + } + + @Override + public int hashCode() + { + return _pageName.hashCode() * 17 + _locale.hashCode(); + } + + @Override + public String toString() + { + return String.format("%s[%s, %s]", getClass().getSimpleName(), _pageName, _locale + .toString()); + } +} Propchange: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLocator.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java?view=diff&rev=489591&r1=489590&r2=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java Fri Dec 22 01:41:57 2006 @@ -17,6 +17,7 @@ import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap ; import java.util.List; +import java.util.Locale; import java.util.Map; import org.apache.commons.logging.Log; @@ -39,7 +40,7 @@ private final ThreadLocale _threadLocale; - private final Map<String, List<Page>> _pool = newMap(); + private final Map<PageLocator, List<Page>> _pool = newMap(); public PagePoolImpl(Log log, PageLoader pageLoader, ThreadLocale threadLocale) { @@ -50,7 +51,8 @@ public synchronized Page checkout(String pageName) { - List<Page> pages = _pool.get(pageName); + Locale locale = _threadLocale.getLocale(); + List<Page> pages = _pool.get(new PageLocator(pageName, locale)); // When we load a page, we load it in the active locale, whatever that is. // Even if the locale later changes, we keep the version we originally got. @@ -58,7 +60,7 @@ // render the response (and will have a chance to get the page in a different locale). if (pages == null || pages.isEmpty()) - return _pageLoader.loadPage(pageName, _threadLocale.getLocale()); + return _pageLoader.loadPage(pageName, locale); // Remove and return the last page in the pool. @@ -75,13 +77,13 @@ return; } - String key = page.getName(); - List<Page> pages = _pool.get(key); + PageLocator locator = new PageLocator(page.getName(), page.getLocale()); + List<Page> pages = _pool.get(locator); if (pages == null) { pages = CollectionFactory.newList(); - _pool.put(key, pages); + _pool.put(locator, pages); } pages.add(page); Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java?view=diff&rev=489591&r1=489590&r2=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java Fri Dec 22 01:41:57 2006 @@ -74,7 +74,7 @@ * <p> * The page pool should discard pages that are dirty, rather than store them into the pool. * - * @return true if the page is "clean", false otherwise + * @return true if the page is "dirty", false otherwise * @see org.apache.tapestry.runtime.PageLifecycleListener#containingPageDidDetach() */ boolean detached(); Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/pagelevel/LocaleTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/pagelevel/LocaleTest.java?view=diff&rev=489591&r1=489590&r2=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/pagelevel/LocaleTest.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/pagelevel/LocaleTest.java Fri Dec 22 01:41:57 2006 @@ -42,6 +42,16 @@ assertEquals(doc.getElementById("id1").getChildText(), "French page"); } + @Test + public void change_language() + { + Document doc = _tester.renderPage("TestPageForLocale"); + assertEquals(doc.getElementById("id1").getChildText(), "English page"); + _tester.setPreferedLanguage(Locale.CANADA_FRENCH); + doc = _tester.renderPage("TestPageForLocale"); + assertEquals(doc.getElementById("id1").getChildText(), "French page"); + } + @BeforeMethod public void before() { Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java?view=auto&rev=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java Fri Dec 22 01:41:57 2006 @@ -0,0 +1,118 @@ +// Copyright 2006 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry.internal.services; + +import java.util.Locale; + +import org.apache.commons.logging.Log; +import org.apache.tapestry.Link; +import org.apache.tapestry.internal.structure.ComponentPageElement; +import org.apache.tapestry.internal.structure.Page; +import org.apache.tapestry.runtime.Component; +import org.apache.tapestry.runtime.PageLifecycleListener; + +public class NoOpPage implements Page +{ + private final String _pageName; + private final Locale _locale; + + public NoOpPage(String pageName, Locale locale) + { + _pageName = pageName; + _locale = locale; + } + + public String getName() + { + return _pageName; + } + + public Locale getLocale() + { + return _locale; + } + + public void setRootElement(ComponentPageElement component) + { + + } + + public ComponentPageElement getRootElement() + { + return null; + } + + public Component getRootComponent() + { + return null; + } + + public boolean detached() + { + // It is not dirty. + return false; + } + + public void attached() + { + + } + + public void loaded() + { + + } + + public void addLifecycleListener(PageLifecycleListener listener) + { + + } + + public Log getLog() + { + return null; + } + + public ComponentPageElement getComponentElementByNestedId(String nestedId) + { + return null; + } + + public Link createActionLink(ComponentPageElement element, String action, boolean forForm, Object... context) + { + return null; + } + + public void persistFieldChange(ComponentPageElement element, String fieldName, Object newValue) + { + + } + + public Object getFieldChange(ComponentPageElement element, String fieldName) + { + return null; + } + + public void incrementDirtyCount() + { + + } + + public void decrementDirtyCount() + { + + } + +} Propchange: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java ------------------------------------------------------------------------------ svn:eol-style = native Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLocatorTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLocatorTest.java?view=auto&rev=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLocatorTest.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLocatorTest.java Fri Dec 22 01:41:57 2006 @@ -0,0 +1,28 @@ +package org.apache.tapestry.internal.services; + +import java.util.Locale; + +import org.testng.Assert; +import org.testng.annotations.Test; + +public class PageLocatorTest extends Assert +{ + @Test + public void equals() + { + PageLocator locator = new PageLocator("p1", Locale.ENGLISH); + assertEquals(locator, new PageLocator("p1", Locale.ENGLISH)); + assertFalse(locator.equals(null)); + assertFalse(locator.equals("p1")); + assertFalse(locator.equals(new PageLocator("p1", Locale.CHINESE))); + assertFalse(locator.equals(new PageLocator("p2", Locale.ENGLISH))); + } + + @Test + public void to_string() + { + PageLocator locator = new PageLocator("p1", Locale.ENGLISH); + assertEquals(locator.toString(), "PageLocator[p1, en]"); + } + +} Propchange: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLocatorTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java?view=diff&rev=489591&r1=489590&r2=489591 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java Fri Dec 22 01:41:57 2006 @@ -19,8 +19,10 @@ import java.util.Locale; import org.apache.commons.logging.Log; +import org.apache.tapestry.events.InvalidationListener; import org.apache.tapestry.internal.structure.Page; import org.apache.tapestry.internal.test.InternalBaseTestCase; +import org.apache.tapestry.ioc.internal.services.ThreadLocaleImpl; import org.apache.tapestry.ioc.services.ThreadLocale; import org.testng.annotations.Test; @@ -58,31 +60,34 @@ @Test public void checkout_when_page_list_is_empty() { - PageLoader loader = newPageLoader(); - Page page1 = newPage(); - Page page2 = newPage(); - ThreadLocale tl = newThreadLocale(); - - train_detached(page1, false); - train_getName(page1, PAGE_NAME); - - train_getLocale(tl, _locale); - - train_loadPage(loader, PAGE_NAME, _locale, page2); + final Page page1 = new NoOpPage(PAGE_NAME, _locale); + final Page page2 = new NoOpPage(PAGE_NAME, _locale); - replay(); + PageLoader loader = new PageLoader() + { - PagePool pool = new PagePoolImpl(null, loader, tl); + public void addInvalidationListener(InvalidationListener listener) + { + } + + public Page loadPage(String pageClassName, Locale locale) + { + if (pageClassName.equals(PAGE_NAME)) + { + return page2; + } + return null; + } + + }; + ThreadLocale threadLocale = new ThreadLocaleImpl(); + threadLocale.setLocale(_locale); + PagePool pool = new PagePoolImpl(null, loader, threadLocale); pool.release(page1); - assertSame(page1, pool.checkout(PAGE_NAME)); - // Now the list is empty, but not null. - assertSame(page2, pool.checkout(PAGE_NAME)); - - verify(); } // This should move up to IOCTestCase @@ -95,29 +100,33 @@ @Test public void release_last_in_first_out() { - PageLoader loader = newPageLoader(); - Page page1 = newPage(); - Page page2 = newPage(); - - train_detached(page1, false); + final Page page1 = new NoOpPage(PAGE_NAME, _locale); + final Page page2 = new NoOpPage(PAGE_NAME, _locale); - train_getName(page1, PAGE_NAME); + PageLoader loader = new PageLoader() + { - train_detached(page2, false); + public void addInvalidationListener(InvalidationListener listener) + { - train_getName(page2, PAGE_NAME); - - replay(); - - PagePool pool = new PagePoolImpl(null, loader, null); + } + + public Page loadPage(String pageClassName, Locale locale) + { + fail(); + return null; + } + + }; + ThreadLocale threadLocale = new ThreadLocaleImpl(); + threadLocale.setLocale(_locale); + PagePool pool = new PagePoolImpl(null, loader, threadLocale); pool.release(page1); pool.release(page2); assertSame(page2, pool.checkout(PAGE_NAME)); assertSame(page1, pool.checkout(PAGE_NAME)); - - verify(); } @Test @@ -140,5 +149,42 @@ pool.release(page); verify(); + } + + @Test + public void diff_locales() + { + final Page germanPage = new NoOpPage("p1", Locale.GERMAN); + final Page frenchPage = new NoOpPage("p1", Locale.FRENCH); + + PageLoader loader = new PageLoader() + { + + public void addInvalidationListener(InvalidationListener listener) + { + + } + + public Page loadPage(String pageClassName, Locale locale) + { + if (pageClassName.equals("p1")) + { + return locale.equals(Locale.GERMAN) ? germanPage + : locale.equals(Locale.FRENCH) ? frenchPage : null; + } + return null; + } + + }; + ThreadLocale threadLocale = new ThreadLocaleImpl(); + PagePool pool = new PagePoolImpl(null, loader, threadLocale); + threadLocale.setLocale(Locale.GERMAN); + Page page = pool.checkout("p1"); + assertSame(page, germanPage); + pool.release(page); + threadLocale.setLocale(Locale.FRENCH); + page = pool.checkout("p1"); + assertSame(page, frenchPage); + pool.release(page); } } -- Howard M. Lewis Ship TWD Consulting, Inc. Independent J2EE / Open-Source Java Consultant Creator and PMC Chair, Apache Tapestry Creator, Apache HiveMind Professional Tapestry training, mentoring, support and project work. http://howardlewisship.com
