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,