You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by jw...@apache.org on 2008/12/15 22:58:02 UTC
svn commit: r726828 - in /myfaces/trinidad/branches/1.2.10.1-branch:
trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/DateTimeConverter.java
trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js
Author: jwaldman
Date: Mon Dec 15 13:58:01 2008
New Revision: 726828
URL: http://svn.apache.org/viewvc?rev=726828&view=rev
Log:
TRINIDAD-1344 fixed multiple issues with convertDateTime's handling of convenience patterns
patch by Cale Scholl
Modified:
myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/DateTimeConverter.java
myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js
Modified: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/DateTimeConverter.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/DateTimeConverter.java?rev=726828&r1=726827&r2=726828&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/DateTimeConverter.java (original)
+++ myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/DateTimeConverter.java Mon Dec 15 13:58:01 2008
@@ -1330,6 +1330,8 @@
// 03.Oct.99 --> 03-Oct-99
List<String> patterns = new ArrayList<String>();
+ // Don't forget to add the actual pattern.
+ patterns.add(pattern);
String[] leniencyApplicablePatterns = new String[1];
leniencyApplicablePatterns[0] = pattern;
@@ -1348,26 +1350,34 @@
patterns.add(str2);
}
- // Apply the leninecy to the above obtained patterns which was obtained
+ // Apply the leninecy (German for leniency?) to the above obtained patterns which was obtained
// after replacing MMM -> MM and MMM -> M and the actual pattern
- for (int i = 0; i < leniencyApplicablePatterns.length ; i++)
+ int len = leniencyApplicablePatterns.length;
+ if (pattern.indexOf('/') != -1)
{
- if (leniencyApplicablePatterns[i].indexOf('/') != -1)
- {
+ for (int i = 0; i < len; i++)
patterns.add(leniencyApplicablePatterns[i].replaceAll("/", "-"));
+
+ for (int i = 0; i < len; i++)
patterns.add(leniencyApplicablePatterns[i].replaceAll("/", "."));
- }
- if (leniencyApplicablePatterns[i].indexOf('-') != -1)
- {
- patterns.add(leniencyApplicablePatterns[i].replaceAll("-","/"));
- patterns.add(leniencyApplicablePatterns[i].replaceAll("-","."));
- }
- if (leniencyApplicablePatterns[i].indexOf('.') != -1)
- {
- patterns.add(leniencyApplicablePatterns[i].replaceAll("\\.","/"));
+ }
+ else if (pattern.indexOf('-') != -1)
+ {
+ for (int i = 0; i < len; i++)
+ patterns.add(leniencyApplicablePatterns[i].replaceAll("-", "/"));
+
+ for (int i = 0; i < len; i++)
+ patterns.add(leniencyApplicablePatterns[i].replaceAll("-", "."));
+ }
+ else if (pattern.indexOf('.') != -1)
+ {
+ for (int i = 0; i < len; i++)
+ patterns.add(leniencyApplicablePatterns[i].replaceAll("\\.", "/"));
+
+ for (int i = 0; i < len; i++)
patterns.add(leniencyApplicablePatterns[i].replaceAll("\\.", "-"));
- }
}
+
return patterns;
}
@@ -1879,16 +1889,25 @@
private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(DateTimeConverter.class);
private static final Date _EXAMPLE_DATE;
+ /**
+ * All entries added to this map MUST also be added to the client map:
+ * trinidad-impl\src\main\javascript\META-INF\adf\jsLibs\DateFormat.js->_CONVENIENCE_PATTERNS
+ * (in TrDateTimeConverter.prototype._initConveniencePatterns)
+ */
private static final Map<Locale, List<String>> _CONVENIENCE_PATTERNS =
new HashMap<Locale, List<String>>();
private static final List<String> _US_CONVENIENCE_PATTERNS =
- Arrays.asList("MMMM dd, yy", "dd-MMMM-yy", "MMMM/dd/yy");
+ Arrays.asList("MMMM dd, yy", "MMMM/dd/yy", "dd-MMMM-yy");
static
{
Calendar dateFactory = Calendar.getInstance();
dateFactory.set(1998, 10, 29, 15, 45);
_EXAMPLE_DATE = dateFactory.getTime();
+
+ // All entries added to this map MUST also be added to the client map:
+ // trinidad-impl\src\main\javascript\META-INF\adf\jsLibs\DateFormat.js->_CONVENIENCE_PATTERNS
+ // (in TrDateTimeConverter.prototype._initConveniencePatterns)
_CONVENIENCE_PATTERNS.put(Locale.US, _US_CONVENIENCE_PATTERNS);
}
}
Modified: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js?rev=726828&r1=726827&r2=726828&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js (original)
+++ myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js Mon Dec 15 13:58:01 2008
@@ -1023,6 +1023,12 @@
/**
+ * External variable for TrDateTimeConverter. Maps locales to lists of
+ * convenience patterns.
+ */
+var _CONVENIENCE_PATTERNS = null;
+
+/**
* Construct a TrDateTimeConverter with the specifed date pattern for
* the specified locale.
*/
@@ -1050,7 +1056,7 @@
if (pattern == null)
pattern = this._localeSymbols.getShortDatePatternString();
- var patterns = this._initPatterns(pattern);
+ var patterns = this._initPatterns(pattern, locale);
// Stash away the patterns for later use.
this._pattern = patterns;
@@ -1202,7 +1208,7 @@
TrDateTimeConverter.prototype._initPatterns = function(
- pattern)
+ pattern, locale)
{
// We need to build up an Array of all acceptable patterns,
// which we'll stash away for later use. If we do lenient
@@ -1220,54 +1226,125 @@
// Note that concat() will do the right thing whether "pattern"
// is a string or an Array of strings.
if (pattern)
+ {
patterns = patterns.concat(pattern);
-
- //see TRINIDAD-859
- patterns = patterns.concat(["MMMM dd, yy", "dd-MMMM-yy", "MMMM/dd/yy"]);
-
- // Bug 2002065:
- // Be forgiving of users who prefer a different separator
- // and alternative month styles. We are be lenient by default with ADF Faces
- // now we have guaranteed an array, we can extend it to include
- // more forgiving patterns
-
- // first add in replacements for month parsing
- var baseCount = patterns.length;
- for (var i=0; i < baseCount; i++)
- {
- if (patterns[i].indexOf('MMM') != -1)
+ // Bug 2002065:
+ // Be forgiving of users who prefer a different separator and alternative
+ // month styles. We are to be lenient by default with ADF Faces.
+
+ // We should add all the leniency patterns for this default pattern first.
+ // First add in replacements for month parsing.
+ if (pattern.indexOf('MMM') != -1)
+ {
+ patterns[1] = pattern.replace(/MMM/g, 'MM');
+ patterns[2] = pattern.replace(/MMM/g, 'M');
+ }
+
+ // Now add support for all of the above with any of the separators below.
+ // The separator is the same for all patterns since we only replaced month.
+ var baseCount = patterns.length;
+ if (pattern.indexOf('/') != - 1)
+ {
+ for (var i = 0; i < baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\//g, '-');
+
+ for (var i = 0; i < baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\//g, '.');
+ }
+ else if (pattern.indexOf('-') != - 1)
+ {
+ for (var i = 0; i < baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/-/g, '/');
+
+ for (var i = 0; i < baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/-/g, '.');
+ }
+ else if (pattern.indexOf('.') != - 1)
{
- patterns[patterns.length] = patterns[i].replace(/MMM/g, 'MM');
- patterns[patterns.length] = patterns[i].replace(/MMM/g, 'M');
+ for (var i = 0; i < baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\./g, '/');
+
+ for (var i = 0; i < baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\./g, '-');
}
}
- // now add support for all of the above with any of
- // the separators below.
- var baseCount = patterns.length;
- for (var i=0; i < baseCount; i++)
+ // At this point 'locale' is the value of the locale attribute; if 'locale' is
+ // null, we should make sure to grab the same locale that was grabbed by getLocaleSymbols() (i.e.,getJavaLanguage)
+ if (!locale)
+ locale = getJavaLanguage(locale);
+
+ // Make sure the static map of convenience patterns has been initialized.
+ if (!_CONVENIENCE_PATTERNS)
+ this._initConveniencePatterns();
+
+ // see TRINIDAD-859
+ var convPatterns = _CONVENIENCE_PATTERNS[locale];
+
+ if (!convPatterns)
+ return patterns;
+
+ // Add the convenience patterns and all their lenient pattern variants.
+ var len = convPatterns.length;
+ for (var c = 0; c < len; c++)
{
- if (patterns[i].indexOf('/') != -1)
+ var convPattern = convPatterns[c];
+ patterns[patterns.length] = convPattern;
+ var baseCount = 1;
+
+ if (convPattern.indexOf('MMM') != -1)
+ {
+ patterns[patterns.length] = convPattern.replace(/MMM/g, 'MM');
+ patterns[patterns.length] = convPattern.replace(/MMM/g, 'M');
+ baseCount = 3;
+ }
+
+ var idx = patterns.length - baseCount;
+ if (convPattern.indexOf('/') != - 1)
{
- patterns[patterns.length] = patterns[i].replace(/\//g, '-');
- patterns[patterns.length] = patterns[i].replace(/\//g, '.');
+ for (var i = idx; i < idx + baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\//g, '-');
+
+ for (var i = idx; i < idx + baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\//g, '.');
}
- if (patterns[i].indexOf('-') != -1)
+ else if (convPattern.indexOf('-') != - 1)
{
- patterns[patterns.length] = patterns[i].replace(/-/g, '/');
- patterns[patterns.length] = patterns[i].replace(/-/g, '.');
+ for (var i = idx; i < idx + baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/-/g, '/');
+
+ for (var i = idx; i < idx + baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/-/g, '.');
}
- if (patterns[i].indexOf('.') != -1)
+ else if (convPattern.indexOf('.') != - 1)
{
- patterns[patterns.length] = patterns[i].replace(/\./g, '-');
- patterns[patterns.length] = patterns[i].replace(/\./g, '/');
+ for (var i = idx; i < idx + baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\./g, '-');
+
+ for (var i = idx; i < idx + baseCount; i++)
+ patterns[patterns.length] = patterns[i].replace(/\./g, '/');
}
}
return patterns;
}
+/**
+ * Initialize the static map of convenience patterns. This should only be called
+ * if _CONVENIENCE_PATTERNS is null (so that this map is recreated only when the
+ * page is reloaded). All map entries MUST match those of the server map:
+ * trinidad-api\src\main\java\org\apache\myfaces\trinidad\convert\DateTimeConverter.java->_CONVENIENCE_PATTERNS
+ */
+TrDateTimeConverter.prototype._initConveniencePatterns = function()
+{
+ _CONVENIENCE_PATTERNS = new Object();
+
+ // All map entries added here MUST match the entries added to the server map:
+ // trinidad-api\src\main\java\org\apache\myfaces\trinidad\convert\DateTimeConverter.java->_CONVENIENCE_PATTERNS
+ _CONVENIENCE_PATTERNS.en_US = ["MMMM dd, yy", "MMMM/dd/yy", "dd-MMMM-yy"];
+}
+
TrDateTimeConverter.prototype._simpleDateParseImpl = function(
parseString,
parsePattern,