On Dec 13, 2008, at 8:46 AM, Adrian Crum wrote:

--- On Fri, 12/12/08, David E Jones <[email protected]> wrote:

From: David E Jones <[email protected]>
Subject: Re: LocalizedMap.java - Do we really need it?
To: [email protected]
Date: Friday, December 12, 2008, 7:50 PM
On Dec 12, 2008, at 5:42 PM, Adrian Crum wrote:

Thinking about this more...

Localizing data is a presentation layer issue. The
entity engine should be concerned with storing and
retrieving data - not localization issues. It's
unfortunate that presentation layer code has made its way
into the entity engine.

How could i18n/l10n be a presentation layer only issue? I
suppose if your app only had a presentation layer then that
would be true, but logic and data layers are generally used
for i18n functionality, and often need to be aware of the
user's Locale in order to preform and respond properly.

Are you saying that we should remove all Locale awareness
from the service engine and the entity engine?

No, just the entity engine.

From my perspective, a better way to implement entity
engine localization would be through presentation layer
decorators for the entity engine classes.

A decorator for a lower level class? That sounds buzzword
friendly, but using more literal language, what do you mean?
Do you mean something like that ProductContentWrapper (that
should really be turned into set of services, IMO... and yes
I'm the guilty party that wrote it) which is really just
a utility class to hide the complexity of the underlying
data model, which among other things supports localization?

It would be a simple change to make - since there are only a couple of methods in the entity engine that would be affected. So, let's say we take the LocalizedMap code out of the entity engine, then in ScreenRenderer.populateBasicContext change

context.put("delegator", delegator);

to

context.put("delegator", new LocalizedDelegator(delegator, context));

LocalizedDelegator would have similar decorators for the entity engine classes that need them - like GenericEntity. In the end, you have classes that behave the same as the decorated classes, only they hold a reference to the rendering context so they can do localization conversions when needed.

Tah-dah! From that point on, all calls to GenericEntity.get() will be localized - without the need for a Locale argument.

The same concept could be applied to the service engine.

With something like that in place, we don't need to develop kludges to get LocalizedMap to work with third party libraries that only know about a plain Map. Integration efforts like the UEL will be much easier.

By the way "decorator" is not a buzzword, it's a design pattern. Sun uses it a lot in the java.io package.

My favorite definition of a buzzword as anything that's used so commonly and in so many different circumstances that when someone uses it you can never really be sure of what they mean, though mostly people just assume that their interpretation of it is the one the speaker meant. In other words, it's a barrier to effective communication.

Anyway, wouldn't doing something like this result in needing a new delegator instance for basically every request, and in some cases multiple per request? Wouldn't this also lead to possible problems where a general instance of the delegator is used instead of one that is passed into the service call or ControlSerlvet request event or what what? You mentioned the screen rendering, but more would really have to be done, including processing of data coming in which might be formatted according to some locale-based variant on the consistently inconsistent standards in our funny world...

This would introduce something that we've tried to avoid a lot, and that is "controller" objects (as in the model-view-controller pattern) that are stateless and therefore inherently scalable with the context needed for each operation passed into it. That makes things much easier to understand, and therefore to maintain, along with generally performing better and having less risk of non-thread-safe issues coming up.

-David


Reply via email to