Author: hlship
Date: Wed Nov 29 18:00:43 2006
New Revision: 480804

URL: http://svn.apache.org/viewvc?view=rev&rev=480804
Log:
Properly use the thread's locale when loading pages and component templates.
Document the current state of localization.

Added:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/MessageBindingFactory.java
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/localization.apt
Modified:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
    
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/services/TapestryModule.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt
    tapestry/tapestry5/tapestry-core/trunk/src/site/site.xml
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
    
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/MessageBindingFactory.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/MessageBindingFactory.java?view=auto&rev=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/MessageBindingFactory.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/MessageBindingFactory.java
 Wed Nov 29 18:00:43 2006
@@ -0,0 +1,37 @@
+// 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.bindings;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.ioc.Location;
+import org.apache.tapestry.services.Binding;
+import org.apache.tapestry.services.BindingFactory;
+
+/**
+ * Implementation of the message: binding prefix -- we simply get the message 
key and store it
+ * inside at [EMAIL PROTECTED] LiteralBinding}.
+ */
+public class MessageBindingFactory implements BindingFactory
+{
+
+    public Binding newBinding(String description, ComponentResources 
component, String expression,
+            Location location)
+    {
+        String messageValue = component.getMessages().get(expression);
+
+        return new LiteralBinding(description, messageValue, location);
+    }
+
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
 Wed Nov 29 18:00:43 2006
@@ -84,6 +84,8 @@
 
     private final WebResponse _response;
 
+    private final ThreadLocale _threadLocale;
+
     public InternalModule(@InjectService("ComponentInstantiatorSource")
     ComponentInstantiatorSource componentInstantiatorSource, 
@InjectService("UpdateListenerHub")
     UpdateListenerHub updateListenerHub, 
@InjectService("tapestry.ioc.ThreadCleanupHub")
@@ -94,7 +96,8 @@
             @InjectService("tapestry.ioc.ChainBuilder")
             ChainBuilder chainBuilder, @Inject("infrastructure:request")
             WebRequest request, @Inject("infrastructure:response")
-            WebResponse response)
+            WebResponse response, @InjectService("tapestry.ioc.ThreadLocale")
+            ThreadLocale threadLocale)
     {
         _componentInstantiatorSource = componentInstantiatorSource;
         _updateListenerHub = updateListenerHub;
@@ -104,6 +107,7 @@
         _chainBuilder = chainBuilder;
         _request = request;
         _response = response;
+        _threadLocale = threadLocale;
     }
 
     public ComponentClassTransformer buildComponentClassTransformer(
@@ -179,7 +183,7 @@
     PageLoader pageLoader, @Inject("infrastructure:componentMessagesSource")
     ComponentMessagesSource componentMessagesSource)
     {
-        PagePoolImpl service = new PagePoolImpl(log, pageLoader);
+        PagePoolImpl service = new PagePoolImpl(log, pageLoader, 
_threadLocale);
 
         // This covers invalidations due to changes to classes
 
@@ -248,15 +252,14 @@
     @Contribute("tapestry.WebRequestHandler")
     public void 
contributeWebRequestFilters(OrderedConfiguration<WebRequestFilter> 
configuration,
             @InjectService("tapestry.RequestGlobals")
-            final RequestGlobals requestGlobals, 
@InjectService("tapestry.ioc.ThreadLocale")
-            ThreadLocale threadLocale, 
@Inject("${tapestry.file-check-interval}")
+            final RequestGlobals requestGlobals, 
@Inject("${tapestry.file-check-interval}")
             long checkInterval, @Inject("${tapestry.supported-locales}")
             String localeNames)
     {
         configuration.add("CheckForUpdates", new 
CheckForUpdatesFilter(_updateListenerHub,
                 checkInterval), "before:*.*");
 
-        configuration.add("Localization", new LocalizationFilter(threadLocale, 
localeNames));
+        configuration.add("Localization", new 
LocalizationFilter(_threadLocale, localeNames));
     }
 
     /**

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=480804&r1=480803&r2=480804
==============================================================================
--- 
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
 Wed Nov 29 18:00:43 2006
@@ -12,74 +12,84 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.internal.services;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.tapestry.events.InvalidationListener;
-import org.apache.tapestry.internal.structure.Page;
+package org.apache.tapestry.internal.services;
+
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.events.InvalidationListener;
+import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.ioc.internal.util.CollectionFactory;
-
-/**
- * A very naive implementation just to get us past the start line.
- * <p>
- * Registered as an invalidation listener with the
- * [EMAIL PROTECTED] org.apache.tapestry.internal.services.PageLoader}; thus 
the pool is cleared whenever
- */
-public class PagePoolImpl implements PagePool, InvalidationListener
-{
-    private final Log _log;
-
-    private final PageLoader _pageLoader;
-
-    private final Map<String, List<Page>> _pool = CollectionFactory.newMap();
-
-    public PagePoolImpl(Log log, PageLoader pageLoader)
-    {
-        _log = log;
-        _pageLoader = pageLoader;
-    }
-
-    public synchronized Page checkout(String pageName)
-    {
-        List<Page> pages = _pool.get(pageName);
-
-        if (pages == null || pages.isEmpty())
-            return _pageLoader.loadPage(pageName, Locale.getDefault());
-
-        // Remove and return the last page in the pool.
-
-        return pages.remove(pages.size() - 1);
-    }
-
-    public synchronized void release(Page page)
-    {
-        boolean dirty = page.detached();
-
-        if (dirty)
-        {
-            _log.error(ServicesMessages.pageIsDirty(page));
-            return;
-        }
-
-        String key = page.getName();
-        List<Page> pages = _pool.get(key);
-
-        if (pages == null)
-        {
-            pages = CollectionFactory.newList();
-            _pool.put(key, pages);
-        }
-
-        pages.add(page);
-    }
-
-    public synchronized void objectWasInvalidated()
-    {
-        _pool.clear();
-    }
-
-}
+import org.apache.tapestry.ioc.services.ThreadLocale;
+
+/**
+ * A very naive implementation just to get us past the start line.
+ * <p>
+ * Registered as an invalidation listener with the
+ * [EMAIL PROTECTED] org.apache.tapestry.internal.services.PageLoader}; thus 
the pool is cleared whenever
+ */
+public class PagePoolImpl implements PagePool, InvalidationListener
+{
+    private final Log _log;
+
+    private final PageLoader _pageLoader;
+
+    private final ThreadLocale _threadLocale;
+
+    private final Map<String, List<Page>> _pool = newMap();
+
+    public PagePoolImpl(Log log, PageLoader pageLoader, ThreadLocale 
threadLocale)
+    {
+        _log = log;
+        _pageLoader = pageLoader;
+        _threadLocale = threadLocale;
+    }
+
+    public synchronized Page checkout(String pageName)
+    {
+        List<Page> pages = _pool.get(pageName);
+
+        // 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.
+        // This is not as bad in T5 as in T4, since a seperate request will
+        // 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());
+
+        // Remove and return the last page in the pool.
+
+        return pages.remove(pages.size() - 1);
+    }
+
+    public synchronized void release(Page page)
+    {
+        boolean dirty = page.detached();
+
+        if (dirty)
+        {
+            _log.error(ServicesMessages.pageIsDirty(page));
+            return;
+        }
+
+        String key = page.getName();
+        List<Page> pages = _pool.get(key);
+
+        if (pages == null)
+        {
+            pages = CollectionFactory.newList();
+            _pool.put(key, pages);
+        }
+
+        pages.add(page);
+    }
+
+    public synchronized void objectWasInvalidated()
+    {
+        _pool.clear();
+    }
+
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 Wed Nov 29 18:00:43 2006
@@ -42,6 +42,7 @@
 import org.apache.tapestry.internal.InternalConstants;
 import org.apache.tapestry.internal.bindings.ComponentBindingFactory;
 import org.apache.tapestry.internal.bindings.LiteralBindingFactory;
+import org.apache.tapestry.internal.bindings.MessageBindingFactory;
 import org.apache.tapestry.internal.services.ApplicationGlobalsImpl;
 import org.apache.tapestry.internal.services.BindingSourceImpl;
 import org.apache.tapestry.internal.services.CommonResourcesInjectionProvider;
@@ -459,7 +460,10 @@
         return new BindingSourceImpl(configuration);
     }
 
-    /** Contributes the factory for "literal:" bindings. */
+    /**
+     * Contributes the factory for serveral built-in binding prefixes 
("literal", prop", "component"
+     * and "message").
+     */
     public static void contributeBindingSource(
             MappedConfiguration<String, BindingFactory> configuration,
             @InjectService("tapestry.internal.PropBindingFactory")
@@ -468,6 +472,7 @@
         configuration.add(InternalConstants.LITERAL_BINDING_PREFIX, new 
LiteralBindingFactory());
         configuration.add(InternalConstants.PROP_BINDING_PREFIX, 
propBindingFactory);
         configuration.add("component", new ComponentBindingFactory());
+        configuration.add("message", new MessageBindingFactory());
     }
 
     /**

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
 Wed Nov 29 18:00:43 2006
@@ -41,6 +41,7 @@
 import org.apache.tapestry.ioc.Resource;
 import org.apache.tapestry.ioc.ServiceLocator;
 import org.apache.tapestry.ioc.internal.util.ClasspathResource;
+import org.apache.tapestry.ioc.services.ThreadLocale;
 import org.apache.tapestry.ioc.test.IOCTestCase;
 import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.model.MutableComponentModel;
@@ -406,5 +407,10 @@
     protected final void train_getBaseResource(ComponentModel model, Resource 
resource)
     {
         expect(model.getBaseResource()).andReturn(resource).atLeastOnce();
+    }
+
+    protected final void train_getLocale(ThreadLocale threadLocale, Locale 
locale)
+    {
+        expect(threadLocale.getLocale()).andReturn(locale);
     }
 }

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/localization.apt
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/localization.apt?view=auto&rev=480804
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/localization.apt 
(added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/localization.apt 
Wed Nov 29 18:00:43 2006
@@ -0,0 +1,144 @@
+ ----
+  Localization
+ ----
+ 
+Localization
+
+  Localization is all about getting the right text to the user, in the right 
language.
+  
+  Localization support is well integrated into Tapestry.  Tapestry allows you 
to easily seperate the text you present to your users
+  from the rest of your application ... pull it out of your Java code and even 
out of your component templates.  You can then translate
+  your messages into other languages and let Tapestry put everthing together.
+  
+Component Message Catalogs
+
+  Each component class may have a component message catalog. A component 
message catalog is a set of files with the extension ".properties".
+  These property files are the same format used by java.util.ResourceBundle, 
just lines of <<<key=value>>>.  These files are packaged with the component's 
HTML template.
+  
+  So for a class named org.example.myapp.pages.MyPage, you would have a main 
properties file as <<<org/example/myapp/pages/MyPage.properties>>>.
+  
+  If you have a translations of these values, you provide additional 
properties file, adding an
+  {{{http://www.loc.gov/standards/iso639-2/englangn.html}ISO language code}} 
before the extension.  Thus, if you have a French translation,
+  you could create a file <<<MyPage_fr.properties>>>.
+  
+  Any values in the more language specific file will <override> values from 
the main properties file.  If you had an even more specific
+  localization for just French as spoken in France, you could create 
<<<MyPage_fr_FR.properties>>> (thats a language code plus a country code, you 
can even go further
+  and add variants ... but its unlikely that you'll ever need to go beyond 
just language codes in practice).
+  
+Message Catalog Inheritance
+
+  If a component class is a subclass of another component class, then it 
inherits that base class' message catalog. Its own message catalog extends and 
overrides
+  the values inherited from the base class.
+  
+  In this way, you could have a base component class that contained common 
messages, and extend or override those messages in subclasses (just as you would
+  extend or override the methods of the base component class). This, of 
course, works for as many levels of inheritance as you care to support.
+  
+Application Message Catalog
+
+  Tapestry 4 supports an application-wide message catalog; this is <<not yet>> 
in Tapestry 5, but will likely be coming soon.
+  
+Localized Component Templates
+
+  The same lookup mechanism applies to component templates.  Tapestry will 
search for a localized version of each component template and use the closest
+  match.  Thus you could have <<<MyPage_fr.html>>> for French users, and 
<<<MyPage.html>>> for all other users.
+  
+Accessing Localized Messages
+
+  The above discusses what files to create and where to store them, but 
doesn't address how to make use of that information.
+  
+  Messages can be accessed in one of two ways:
+  
+  * Using the {{{parameters.html}message: binding prefix}} in a component 
template
+  
+  * By injecting the comopnent's Messages object
+  
+  []
+  
+  In the first case, you may use the message: binding prefix with component 
parameters, or with template expansions:
+  
++-----+
+<t:comp type="Border" title="message:page-title">
+
+  ${message:greeting}, ${user.name}!
+  
+  . . .
+</t:comp>
++-----+
+
+  Here, the <<<page-title>>> message is extracted from the catalog and passed 
to the Border component's title parameter.
+  
+  In addition, the <<<greeting>>> message is extracted and written into the 
response as part of the template.
+  
+  As usual, "prop:" is the defalt binding prefix, thus <<<user.name>>> is a 
property path, not a message key.
+  
+  You would extend this with a set of properties files:
+  
++----+
+page-title=Your Account
+greeting=Welcome back
++----+
+
+  Or, perhaps, a French version:
+  
++----+
+page-title=Votre Compte
+greeting=Bienvenue en arriere
++----+
+    
+    Programattically, you may inject your component message catalog into your 
class, as an instance of the Messages interface:
+    
++----+
+  @Inject
+  private Messages _messages;
++----+
+
+  You could then <<<get()>>> messages, or <<<format()>>> them:
+  
++----+
+
+  public String getCartSummary()     
+  {
+    if (_items.isEmpty())
+      return _messages.get("no-items");
+      
+    return _messages.format("item-summary", _items.size());
+  }
++----+
+
+  The format() option works using a java.text.Formatter, with all the 
printf-style loveliness you've come to expect:
+  
++----+
+no-items=Your shopping cart is empty.     
+item-summary=You have %d items in your cart.
++----+
+
+  As easy as conditionals are to do inside a Tapestry template, sometimes its 
even easier to do it in Java code.    
+    
+Missing Keys
+
+  If you reference a key that is not in the message catalog, Tapestry does not 
throw an exception (that would make initially developing
+  an application very frustrating).  Instead, it converts the key to upper 
case, surrounds it in brackets, and returns it.  You'll sometimes
+  see output such as <<<[NO-ITMS]>>> in your output when a key (here, 
"no-itms") is misspelled.
+  
+Reloading
+
+  If you change a property file in a message catalog, you'll see the change 
immediately, just as with component classes and component templates.
+      
+Locale Selection
+
+  The locale for each request is determined from the HTTP request headers.  
The request locale reflects the environment of the web browser and possibly even
+  the keyboard selection of the user on the client.  It can be highly 
specific, for example, identifying British English (as en_GB) vs. American 
English (en).
+  
+  Tapestry "narrows" the raw request locale, as specified in the request, to a 
known quantity. 
+  It uses the {{{conf.html}configuration symbol}} tapestry.supported-locales 
to choose the effective locale for each request.  This value is a 
comma-separated
+  list of locale names. Tapestry searches the list for the best
+  match for the request locale; for example, a request locale of "fr_FR" would 
match "fr" but not "de".  If no match is found, then the first locale name
+  in the list is used as the effective locale (it is used as the default for 
non-matches).  Thus a site that primarily caters to French speakers
+  would want to list "fr" as the first locale in the list.  
+  
+Changing the Locale
+
+  Tapestry does not yet support changing the locale, but that will be 
available shortly.  The intent is to mimic Tapestry 4 behavior: store a cookie
+  on the client to provide the default for the locale on the next visit, and 
store a locale name in the session (if a session exists).
+  
+  
\ No newline at end of file

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt 
(original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt 
Wed Nov 29 18:00:43 2006
@@ -121,8 +121,11 @@
 
*------------+----------------------------------------------------------------------------------+
 | literal:   | A literal string.                                               
                 |
 
*------------+----------------------------------------------------------------------------------+
+| message    | Retrieves a value from the component's 
{{{localization.html}message catalog}}.   |
+*------------+----------------------------------------------------------------------------------+
 | prop:      | The name of a property of the containing component to read or 
update.            |
 
*------------+----------------------------------------------------------------------------------+
+
 
   The default binding prefix is "prop:".
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/site.xml
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/site.xml?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/site.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/site.xml Wed Nov 29 
18:00:43 2006
@@ -56,6 +56,7 @@
             <item name="Component Parameters" href="guide/parameters.html"/>
             <item name="Component Events" href="guide/event.html"/>
             <item name="Component Mixins" href="guide/mixins.html"/>
+            <item name="Localization" href="guide/localization.html"/>
             <item name="Type Coercion" href="guide/coercion.html"/>
             <item name="Component Rendering" href="guide/rendering.html"/>
             <item name="Persistent Data" href="guide/persist.html"/>

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
 Wed Nov 29 18:00:43 2006
@@ -316,6 +316,8 @@
         clickAndWait("link=Localization");
 
         assertTextPresent("Via injected Messages property: [Accessed via 
injected Messages]");
+        assertTextPresent("Via message: binding prefix: [Accessed via message: 
binding prefix]");
+        assertTextPresent("Page locale: [en]");
     }
 
     private void assertText(String locator, String expected)

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
 Wed Nov 29 18:00:43 2006
@@ -14,10 +14,13 @@
 
 package org.apache.tapestry.integration.app1.pages;
 
+import java.util.Locale;
+
 import org.apache.tapestry.annotations.ComponentClass;
 import org.apache.tapestry.annotations.Inject;
 import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.services.ClassFactory;
+import org.apache.tapestry.services.WebRequest;
 
 @ComponentClass
 public class Localization
@@ -30,6 +33,22 @@
 
     @Inject("service:tapestry.ComponentClassFactory")
     private ClassFactory _componentClassFactory;
+
+    @Inject
+    private Locale _locale;
+
+    @Inject("infrastructure:request")
+    private WebRequest _request;
+
+    public Locale getLocale()
+    {
+        return _locale;
+    }
+
+    public WebRequest getRequest()
+    {
+        return _request;
+    }
 
     public String getInjectedMessage()
     {

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=480804&r1=480803&r2=480804
==============================================================================
--- 
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
 Wed Nov 29 18:00:43 2006
@@ -21,6 +21,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.ioc.services.ThreadLocale;
 import org.testng.annotations.Test;
 
 /**
@@ -39,12 +40,15 @@
     {
         PageLoader loader = newPageLoader();
         Page page = newPage();
+        ThreadLocale tl = newThreadLocale();
+
+        train_getLocale(tl, _locale);
 
         train_loadPage(loader, PAGE_NAME, _locale, page);
 
         replay();
 
-        PagePool pool = new PagePoolImpl(null, loader);
+        PagePool pool = new PagePoolImpl(null, loader, tl);
 
         assertSame(page, pool.checkout(PAGE_NAME));
 
@@ -57,15 +61,18 @@
         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);
 
         replay();
 
-        PagePool pool = new PagePoolImpl(null, loader);
+        PagePool pool = new PagePoolImpl(null, loader, tl);
 
         pool.release(page1);
 
@@ -78,6 +85,8 @@
         verify();
     }
 
+    // This should move up to IOCTestCase
+
     protected final void train_detached(Page page, boolean dirty)
     {
         expect(page.detached()).andReturn(dirty);
@@ -100,7 +109,7 @@
 
         replay();
 
-        PagePool pool = new PagePoolImpl(null, loader);
+        PagePool pool = new PagePoolImpl(null, loader, null);
 
         pool.release(page1);
         pool.release(page2);
@@ -126,7 +135,7 @@
 
         replay();
 
-        PagePool pool = new PagePoolImpl(log, loader);
+        PagePool pool = new PagePoolImpl(log, loader, null);
 
         pool.release(page);
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
 Wed Nov 29 18:00:43 2006
@@ -8,6 +8,13 @@
 
     <p> Via injected Messages property: [${injectedMessage}] </p>
 
+    <p> Via message: binding prefix: [${message:via-prefix}]</p>
+    
+    <p> Page locale: [${locale}]</p>
+    
+    <p> Request locale: [${request.locale}]</p>
+
+<hr/>
 
     <h2>Fabricated classes:</h2>
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties?view=diff&rev=480804&r1=480803&r2=480804
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
 Wed Nov 29 18:00:43 2006
@@ -1 +1,2 @@
-via-inject=Accessed via injected Messages
\ No newline at end of file
+via-inject=Accessed via injected Messages
+via-prefix=Accessed via message: binding prefix


Reply via email to