I agree with Stephen that the commons libraries probably don't need
this type of support.  They aren't doing anything that's "businessy"
enough (and they're not supposed to) to make it relevant to the user
(the user doesn't care that I'm using StringUtils to eat the white
space out of a String).  My point was that if you *are* going to do
it, at least make it easy to extend/adapt.

I don't necessarily agree that the exceptions aren't used to convey
information to the user.  As I've said, I use a BusinessLogicException
class in my code sometimes.  I do this so that I don't have to come up
with many different exception types (UsernameAlreadyExistsException,
InsufficientFundsException, etc.) that really add no logic, but just
let me know something different is going on.  I can use localized
messages for that case.

On 2/4/07, Stephen Colebourne <[EMAIL PROTECTED]> wrote:
I'm sorry, but I find this extremely complicated and unreasonable. It
really, really, really isn't a direction I want commons to take.

Firstly, the use of a static will annoy the IoC (Spring) crowd, so that
aspect of the proposal seems flawed.

Secondly, this proposes adding a whole ream of new interfaces, classes,
resources, factories and strategies to achieve this. All of this
additional code will need to be documented in detail, with explanations
of how to customise each part.

Thirdly, we can be sure that you haven't met all the weird requirements
that the users of the library will come up with. They will start asking
for changes which will add even more bloat.

Fourthly, since none of this is standard, each commons library will
probably do it slightly differently, making using all of them together
nigh on impossible.


Let me be clear, this is a (mostly) well-designed solution to the
perceived set of requirements. Its just that the requirements are in my
view completely inappropriate.

Exceptions are a programming tool. They are used by developers. They are
not intended for user interaction. Ever.

Adding ANY kind of localization behaviour to [math] or any other commons
component is completely OUT OF SCOPE!!! [math] is a library of
mathematics routines. Under no circumstances should I need to know or
learn or have to worry about this or that localized configuration.
Localization is completely orthogonal to the concept of well-tested
robust mathematical routines.

Finally, what is being proposed here is the creation of a FRAMEWORK. I
am so opposed to this because I believe it is the antithesis of what the
best commons components are, which is LIBRARIES.

A library is simple. It does what it says it does. Without complication
or need to buy into its specific religion.

A framework is religious. You have to agree to its terms, and its way of
doing things. Or choose not to use it.

Commons has done pretty well in resisting the complications and
religions of frameworks - we are a repository of libraries.


So, what is appropriate?

It is good to have multiple different exception classes, even as many as
one for each different possible error.

It is also good for those classes to store the data that caused the
error as instance variables accessed by get methods.
(http://joda-time.sourceforge.net/xref/org/joda/time/IllegalFieldValueException.html)

But they should only have one error message, and no way to localize it
(ie. there should be no error code for looking up resources). That is
the role of the application/framework that embeds the library - and it
can use the exception classname and get methods to access the data if
required. Why? because every application/framework that does want to
localize wants to do it differently. And in all probability, 90%+ of
applications/frameworks don't want to localize at all.

Stephen


Luc Maisonobe wrote:
> Two main classes would be used: the MathException base class and a
> MessageFactory base class. MathException would delegate to
> MessageFactory the task to build the message from its String key and
> Object[] parameters (point 2). Both the key, parameters and message
> would be available with appropriate getters (point 4 and 5). A static
> method in MathException would allow upper layers to prepend a customized
> MessageFactory instance (point 1) in front of already registered
> factories following a chain of responsibility. The initial chain would
> contain three different MessageFactory instances :
>  - a LocalizedMessageFactory using the key to retrieve a pattern from
>    a ResourceBundle for the default Locale (Locale.geDefault()) and
>    MessageFormat to build the message (point 3)
> - a NonLocalizedMessageFactory using the key directly as a pattern
>   for MessageFormat
> - a RawMessageFormat simply concatenating everything with toString
>
> The chain of responsibility is intended to provide robustness (point 6):
> the first message factory providing a non null message is used. If a
> factory fails, the next one is used. The last factory cannot fail.
>
> A user who simply wants to get messages localized for a Locale which is
> not the default one would therefore only need to do :
>
>  MathException.prependMessageFactory(new
> LocalizedMessageFactory(myLocale));
>
> This would work even if its locale is not supported as its factory would
> always fail but the following ones would be triggered as needed.
>
> I think an appropriate policy would be to always use US-english patterns
> as keys as it would allow to get meaningful messages even if everything
> else fails, and as it would help the translators tasks.

---------------------------------------------------------------------
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