*/
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 */
// 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
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
--- /dev/null
+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