Reinhard Poetz wrote:
If I use a pattern convertor according to the documentation
<fd:convertor type="formatting"> <fd:patterns> <fd:pattern>MM/dd/yyyy</fd:pattern> <fd:pattern locale="nl-BE">dd/MM/yyyy</fd:pattern> <fd:pattern locale="fr">dd-MM-yyyy</fd:pattern> </fd:patterns> </fd:convertor>
I get following exception:
java.lang.IllegalArgumentException: Illegal pattern character 'd'
at java.text.SimpleDateFormat.translatePattern(SimpleDateFormat.java:1737)
at java.text.SimpleDateFormat.applyLocalizedPattern(SimpleDateFormat.java:1792)
at org.outerj.i18n.JdkDateFormat.applyLocalizedPattern(JdkDateFormat.java:23)
at org.apache.cocoon.forms.datatype.convertor.FormattingDateConvertor.getDateFormat(FormattingDateConvertor.java:109)
(I've modified the birthday widget of our 'form1'-example and I'm using trunk checked-out yesterday. I've noticed the same problem in a 4 weeks old 2.2 checkout too.)
Any ideas what's wrong here? Is it a bug or my mistake?
I spent some time on this and finally found its cause.
The problem is that locale-specific patterns are applied using SimpleDateFormat.applyLocalizedPattern(). The difference between this method and applyPattern() is that the pattern is - as its name implies - localized and thus can potentially use other characters than the one specified in SimpleDateFormat's javadoc which describes only en-US.
icu4j has the same problem, but uses a different set of localized patterns. For example, icu4j patterns in the "fr" locale use "a" instead of "y" (ann�e/year) and "j" instead of "d" (jour/day).
Weird thing is that contrarily to icu4j, the JDK localized pattern for "fr" is the same as "en-us", thus leading to a different behaviour as CForms automatically switches to icu4j if present in the classpath.
So we have here two problems:
- locale-specific patterns use a locale-specific syntax which may not be the one documented in the Javadocs (and I don't know where to find the locale-specific documentation)
- automatically switching to icu4j leads to a changing behaviour depending on the presence of a specific jar file in the classpath.
To solve this, I propose:
- always use applyPattern() instead of applyLocalizedPattern()
- disable the automatic switching to icu4j, and provide an additional "Icu4jDateConvertor".
BTW, what is the real added value of icu4j compared to java.text classes?
Sylvain
-- Sylvain Wallez Anyware Technologies http://www.apache.org/~sylvain http://www.anyware-tech.com { XML, Java, Cocoon, OpenSource }*{ Training, Consulting, Projects }
