5 Replies Latest reply on Apr 8, 2006 6:35 AM by dimitris

    JBAS-2774 - Date Property Editor

      The user is correct that Date.toString() returns the date in "English".

      The user's solution looks like a kludge on top of another kludge.

      The whole basis of the DateEditor looks flawed to me.
      It wants to treat the Date as a piece of Text.

      A more "normal" editor would looks like this, where it converts the
      String to a Date during setAsText() and it uses DateFormat.format()
      to format using the current Locale.

      /*
       * JBoss, Home of Professional Open Source
       * Copyright 2005, JBoss Inc., and individual contributors as indicated
       * by the @authors tag. See the copyright.txt in the distribution for a
       * full listing of individual contributors.
       *
       * This is free software; you can redistribute it and/or modify it
       * under the terms of the GNU Lesser General Public License as
       * published by the Free Software Foundation; either version 2.1 of
       * the License, or (at your option) any later version.
       *
       * This software is distributed in the hope that it will be useful,
       * but WITHOUT ANY WARRANTY; without even the implied warranty of
       * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
       * Lesser General Public License for more details.
       *
       * You should have received a copy of the GNU Lesser General Public
       * License along with this software; if not, write to the Free
       * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
       * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
       */
      package org.jboss.util.propertyeditor;
      
      import java.beans.PropertyEditorSupport;
      import java.security.AccessController;
      import java.security.PrivilegedAction;
      import java.text.DateFormat;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      import org.jboss.util.NestedRuntimeException;
      
      /**
       * A property editor for {@link java.util.Date}.
       *
       * @version <tt>$Revision: 1.8 $</tt>
       * @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
       * @author <a href="mailto:d_jencks@users.sourceforge.net">David Jencks</a>
       * @author Scott.Stark@jboss.org
       */
      public class DateEditor2 extends PropertyEditorSupport
      {
       static DateFormat[] formats;
      
       /** The text version of the date */
       private String text;
      
       static
       {
       PrivilegedAction action = new PrivilegedAction()
       {
       public Object run()
       {
       String defaultFormat = System.getProperty("org.jboss.util.propertyeditor.DateEditor.format",
       "MMM d, yyyy");
       formats = new DateFormat[]
       {
       new SimpleDateFormat(defaultFormat),
       // Tue Jan 04 00:00:00 PST 2005
       new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy"),
       // Wed, 4 Jul 2001 12:08:56 -0700
       new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")
       };
       return null;
       }
       };
       AccessController.doPrivileged(action);
       }
      
       public void setAsText(String text)
       {
       int n = 0;
       ParseException ex = null;
       do
       {
       try
       {
       DateFormat df = formats[n];
       Date date = df.parse(text);
       this.text = text;
       setValue(date);
       return;
       }
       catch (ParseException e)
       {
       ex = e;
       }
       n ++;
       } while( n < formats.length );
       throw new NestedRuntimeException(ex);
       }
      
       public void setValue(Object value)
       {
       text = null;
       super.setValue(value);
       }
      
       public String getAsText()
       {
       if (text != null)
       return text;
      
       DateFormat df = formats[2];
       Date date = (Date) getValue();
       return df.format(date);
       }
      }
      


        • 1. Re: JBAS-2774 - Date Property Editor

          Here's a simple test that shows it working:

          import java.text.DateFormat;
          import java.text.SimpleDateFormat;
          import java.util.Date;
          import java.util.Locale;
          
          import org.jboss.util.propertyeditor.DateEditor2;
          
          public class LocaleTest
          {
           public static void main(String[] args) throws Exception
           {
           Locale.setDefault(Locale.FRANCE);
           String text = "mar., 11 sept. 2001 18:14:16 +0100";
           DateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
           Date date = format.parse(text);
          
           DateEditor2 editor = new DateEditor2();
           System.out.println("Locale=" + Locale.getDefault());
           editor.setAsText(text);
           System.out.println("setAsText/getValue =" + editor.getValue());
           editor.setValue(date);
           System.out.println("setAsValue/getAsText=" + editor.getAsText());
           }
          }
          


          • 2. Re: JBAS-2774 - Date Property Editor

             

            Locale=fr_FR
            setAsText/getValue =Tue Sep 11 18:14:16 BST 2001
            setAsValue/getAsText=mar., 11 sept. 2001 18:14:16 +0100
            


            • 3. Re: JBAS-2774 - Date Property Editor
              dimitris

              Adrian, you are too fast, I assigned JBAS-2774 to me to look at it later as I was browsing the unassigned issues, but if you want to finish it off go ahead (if not, I'll do it).

              • 4. Re: JBAS-2774 - Date Property Editor

                I was testing the Date.toString() stuff as you assigned it yourself
                and what the fix might be.

                I haven't looked at whether my alternative breaks other stuff in the
                testsuite.

                • 5. Re: JBAS-2774 - Date Property Editor
                  dimitris

                  I believe I've fixed it based on Adrian suggestions.

                  I've added a public static DateEditor.initialize() and moved the SimpleDateFormat initialization there. This can be used to recreate the SimpleDateFormat(s) used for parsing dates. This is needed to test changing the locale, since at construction time the SimpleDateFormat will pick and use the default locale.