Hi, Hannes!

I tried your implementation, and it worked right away, I just returned the
value "TESTING TESTING" from my DbMessages class that extends Abstract
Messages.

But, what I need is for the valueForKey(String key) method to be aware of
the languageId/customerId of the currently logged in user. In all my other
pages, I get this through injecting the request and getting my user object
from HttpSession. Alternatively this can be moved to an ASO, but I haven't
taken the time to do that yet.

I've tried injecting HttpServletRequest and ApplicationState on all the
classes listed in the implementation from Hannes, but none of them work
(only null values). How can I make information from the current user session
available to my AbstractMessages implementation?

Regards

Inge

On Wed, Apr 16, 2008 at 10:22 AM, Hannes Heijkenskjöld <
[EMAIL PROTECTED]> wrote:

> Great!
>
> Glad I could help you. :-)
>
> /Hannes
>
> Michael Capper skrev:
>
>  Thanks Hannes!
>>
>> I tried the route with the Decorator once, and ended up having to write
>> some
>> java-code into the interceptor via the BodyBuilder .... 'twas not nice.
>>
>> Your example worked great, i only had to pass some more Services
>> (AssetSource to get the URLs, my ProjectContextProvider to get the
>> ResourceBundles for my text) into the build-Method in AppModule, then i
>> could return the value for a Message-Key from the bundles, or if not
>> existant, from the fallbackMessages.
>>
>> Cheers,
>> Mike
>>
>>
>> Hannes Heijkenskjöld wrote:
>>
>>> Hi
>>>
>>> I have recently wondered about the same, and have now built something
>>> that after much trial and error now works.
>>>
>>> Basically, I have created a Messages implementation that wraps both a
>>> tapestry Messages object and our own database messages. If a message is not
>>> found in our database, the default Messages object is queried.
>>>
>>> To get Tapestry to use my Messages implementation i had to decorate the
>>> ComponentMessagesSource (and ValidationMessagesSource), since it is not
>>> possible to replace the one in Tapestry. I think I read about decorating
>>> services here:
>>> http://tapestry.apache.org/tapestry5/tapestry-ioc/decorator.html and on
>>> the mailing list.
>>>
>>> My messages source service doesn't implement the ComponentMessagesSource
>>> interface. I use an interception object for that. Hopefully you can
>>> understand how it works from my example code below:
>>>
>>> public class CommonsMessages extends AbstractMessages {
>>>
>>>     private Messages fallbackMessages;
>>>
>>>     protected String valueForKey(final key) {
>>>        ... logic to get key from db, use fallbackMessages as fallback...
>>>     }
>>>
>>> }
>>>
>>> -----
>>>
>>> public class CommonsMessagesSource {
>>>
>>>     public Messages getMessages(Locale locale, Messages fallbackMessages)
>>> {
>>>        ... code that creates a CommonsMessages object, with
>>> fallbackMessages ...
>>>     }
>>> }
>>>
>>> ----
>>>
>>> // This is the decorating class
>>> public class CommonsComponentMessagesSourceInterceptor implements
>>>     ComponentMessagesSource {
>>>
>>>     private final CommonsMessagesSource service;
>>>     private final ComponentMessagesSource delegate;
>>>
>>>     public CommonsComponentMessagesSourceInterceptor
>>>         (CommonsMessagesSource service, ComponentMessagesSource delegate)
>>>     {
>>>         this.service = service;
>>>         this.delegate = delegate;
>>>     }
>>>
>>>     public Messages getMessages(ComponentModel componentModel, Locale
>>> locale) {
>>>
>>>         return service.getMessages(locale,
>>>             delegate.getMessages(componentModel, locale));
>>>     }
>>>
>>>     // Not sure about how I should handle this one
>>>     public void addInvalidationListener(
>>>         InvalidationListener invalidationlistener) {
>>>         delegate.addInvalidationListener(invalidationlistener);
>>>     }
>>> }
>>>
>>> ---
>>>
>>> In AppModule.java:
>>>
>>>     // Method for instantiating and configuring the custom messages
>>> source
>>>     public static CommonsMessagesSource buildCommonsMessagesSource()
>>>     {
>>>         CommonsMessagesSource messagesSource = new
>>> CommonsMessagesSource();
>>>         return messagesSource;
>>>     }
>>>
>>>     // Method that decorates the default MessagesSource using the
>>> interceptor class
>>>     @Match("ComponentMessagesSource")
>>>     public static ComponentMessagesSource decorateComponentMessagesSource
>>>          (Object delegate, CommonsMessagesSource service)
>>>      {
>>>          return new CommonsComponentMessagesSourceInterceptor(service,
>>> (ComponentMessagesSource)delegate);
>>>      }
>>>
>>> This is how I got it to work, there may be other ways ofcourse. There
>>> might even be better ways :-)
>>>
>>> Cheers,
>>> /Hannes
>>>
>>> Michael Capper skrev:
>>>
>>>> Summary: How do I include additional localization-key/values-pairs in my
>>>> global messages-catalog, originating from some app_<lang>.properties or
>>>> from
>>>> a database?
>>>>
>>>> Hi,
>>>> I'd like to extend the Hash-Table containing the message-keys and
>>>> message-values used in my app. The app_en.properties provides the basic
>>>> global localization data, but I need even more data, which is spead
>>>> about
>>>> in
>>>> other .properties-files or even in a Database. What I'd like to do would
>>>> be
>>>> to read in the data somewhere, and pass it on to the Messages(or
>>>> ResourceBundle) somehow, so when I @Inject the Messages into a
>>>> page/component or use the 'message:' binding, the extra localization is
>>>> available at a root level.
>>>>
>>>> Thanks for any help or pointers,
>>>> Mike
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>>
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Reply via email to