I've been looking into extending the MessageResources class and providing my own
MessageResourcesFactory. The end goal is to house the ApplicationResource files in a
database table. The issue I'm noticing is that the MessageResources class maintains a
HashMap of key/values called 'formats'. So any class that extends MessageResources
only get's called when the particular value is not in the cache(hashmap) in the
MessageResource class. This is the method that gets called in the MessageResources
class:
String formatKey = messageKey(locale, key);
synchronized (formats) {
format = (MessageFormat) formats.get(formatKey);
if (format == null) {
String formatString = getMessage(locale, key);
if (formatString == null) {
if (returnNull)
return (null);
else
return ("???" + formatKey + "???");
}
format = new MessageFormat(escape(formatString));
formats.put(formatKey, format);
}
}
Notice how the 1st step is to check to see if the formats hashmap contains the key.
If it doesn't it then calls the getMessage(locale,key) which is provided by my
implemenation class. At that point, it gets back a value and then puts it on the
HashMap.
The problem I'm having is when I want to update a value. How do you tell the
MessageResources class to refresh it's cache. This becomes even more complicated if
the application resides in a clustered environment. You could use OJB or even Entity
Bean to retrieve the data from the database in the Custom Implemenation, but you still
have the problem with the MessageResources class maintaining a seperate cache. The
EJB or OJB classes would contain the correct values, but the cache at the parent level
would not. I basically need a way when a value gets updated to tell the
MessageResources class to either 1) clear it's cache all together or 2) take the value
off of the HashMap so the next call to it would go to my custom implementation.
I hope this wasn't 2 confusing....
Thanks
---------------------------------
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!