You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by fr...@apache.org on 2006/12/22 10:41:58 UTC
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/...
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 {@link 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);
}
}