]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merged: Test case and fix for
authorArtur Signell <artur.signell@itmill.com>
Fri, 12 Mar 2010 13:43:52 +0000 (13:43 +0000)
committerArtur Signell <artur.signell@itmill.com>
Fri, 12 Mar 2010 13:43:52 +0000 (13:43 +0000)
 * #4263 DateField - returning valid Date in handleUnparsableDateString method works only at the first attempt
and
 * #4304 Resetting the value in DateField.handleUnparsableDate does not update the client side text

svn changeset:11821/svn branch:6.2

src/com/vaadin/ui/DateField.java
tests/src/com/vaadin/tests/components/datefield/DateFieldUnparsableDate.java [new file with mode: 0644]

index 0800537fae0e0b3d72fcf1a02eac3e28432fefce..3c21630f0efd25d074191e56e9ea986deeb7c19e 100644 (file)
@@ -120,12 +120,6 @@ public class DateField extends AbstractField implements
      */
     private String dateFormat;
 
-    /**
-     * Read-only content of an VTextualDate field - null for other types of date
-     * fields.
-     */
-    private String dateString;
-
     private boolean lenient = false;
 
     /* Constructors */
@@ -280,15 +274,13 @@ public class DateField extends AbstractField implements
 
             // Old and new dates
             final Date oldDate = (Date) getValue();
-            final String oldDateString = dateString;
             Date newDate = null;
 
             // this enables analyzing invalid input on the server
             Object o = variables.get("dateString");
+            String dateString = null;
             if (o != null) {
                 dateString = o.toString();
-            } else {
-                dateString = null;
             }
 
             // Gets the new date in parts
@@ -348,9 +340,22 @@ public class DateField extends AbstractField implements
                 newDate = cal.getTime();
             }
 
-            if (newDate == null && dateString != null && !"".equals(dateString)
-                    && !dateString.equals(oldDateString)) {
-                setValue(handleUnparsableDateString(dateString));
+            if (newDate == null && dateString != null && !"".equals(dateString)) {
+                try {
+                    setValue(handleUnparsableDateString(dateString));
+                    /*
+                     * Ensure the value is sent to the client if the value is
+                     * set to the same as the previous (#4304). Does not repaint
+                     * if handleUnparsableDateString throws an exception. In
+                     * this case the invalid text remains in the DateField.
+                     */
+                    requestRepaint();
+                } catch (ConversionException e) {
+                    // FIXME: Should not throw the exception but set an error
+                    // message for the field. And should retain the entered
+                    // value.
+                    throw e;
+                }
             } else if (newDate != oldDate
                     && (newDate == null || !newDate.equals(oldDate))) {
                 setValue(newDate, true); // Don't require a repaint, client
diff --git a/tests/src/com/vaadin/tests/components/datefield/DateFieldUnparsableDate.java b/tests/src/com/vaadin/tests/components/datefield/DateFieldUnparsableDate.java
new file mode 100644 (file)
index 0000000..b0c06ac
--- /dev/null
@@ -0,0 +1,92 @@
+package com.vaadin.tests.components.datefield;\r
+\r
+import java.util.Date;\r
+\r
+import com.vaadin.tests.components.TestBase;\r
+import com.vaadin.ui.DateField;\r
+\r
+public class DateFieldUnparsableDate extends TestBase {\r
+\r
+    public class MyDateField extends DateField {\r
+        public MyDateField(String caption) {\r
+            super(caption);\r
+        }\r
+\r
+        @Override\r
+        protected Date handleUnparsableDateString(String dateString)\r
+                throws ConversionException {\r
+            return (Date) getValue();\r
+        }\r
+    }\r
+\r
+    public class MyDateField2 extends DateField {\r
+        public MyDateField2(String caption) {\r
+            super(caption);\r
+        }\r
+\r
+        @Override\r
+        protected Date handleUnparsableDateString(String dateString)\r
+                throws ConversionException {\r
+            return null;\r
+        }\r
+    }\r
+\r
+    public class MyDateField3 extends DateField {\r
+        public MyDateField3(String caption) {\r
+            super(caption);\r
+        }\r
+\r
+        @Override\r
+        protected Date handleUnparsableDateString(String dateString)\r
+                throws ConversionException {\r
+            throw new ConversionException("You should not enter invalid dates!");\r
+        }\r
+    }\r
+\r
+    public class MyDateField4 extends DateField {\r
+        public MyDateField4(String caption) {\r
+            super(caption);\r
+        }\r
+\r
+        @Override\r
+        protected Date handleUnparsableDateString(String dateString)\r
+                throws ConversionException {\r
+            if (dateString != null && dateString.equals("today")) {\r
+                return new Date();\r
+            }\r
+            throw new ConversionException("You should not enter invalid dates!");\r
+        }\r
+    }\r
+\r
+    @Override\r
+    protected void setup() {\r
+        MyDateField df = new MyDateField(\r
+                "Returns the old value for invalid dates");\r
+        df.setImmediate(true);\r
+        addComponent(df);\r
+\r
+        MyDateField2 df2 = new MyDateField2("Returns empty for invalid dates");\r
+        df2.setImmediate(true);\r
+        addComponent(df2);\r
+\r
+        MyDateField3 df3 = new MyDateField3(\r
+                "Throws an exception for invalid dates");\r
+        df3.setImmediate(true);\r
+        addComponent(df3);\r
+\r
+        MyDateField4 df4 = new MyDateField4("Can convert 'today'");\r
+        df4.setImmediate(true);\r
+        addComponent(df4);\r
+\r
+    }\r
+\r
+    @Override\r
+    protected String getDescription() {\r
+        return "DateFields in various configurations (according to caption). All handle unparsable dates differently";\r
+    }\r
+\r
+    @Override\r
+    protected Integer getTicketNumber() {\r
+        return 4236;\r
+    }\r
+}\r