jmix-framework / jmix

Jmix framework
https://www.jmix.io
Apache License 2.0
561 stars 118 forks source link

Validate data format strings on application start #88

Closed alexbudarov closed 5 months ago

alexbudarov commented 3 years ago

Often users modify data format strings in such a way that backoffice-ui components can't use them.

But developer gets a warning very late in the running application - only when the string is used by the component (e.g. by dateField).

Example project attached. moifr.zip

I modified:

dateTimeFormat=dd.MM.yyyy HH:mm:ss z
Caused by: java.time.DateTimeException: Unable to extract value: class java.time.LocalTime
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:282) ~[na:1.8.0_282]
    at java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.format(DateTimeFormatterBuilder.java:3693) ~[na:1.8.0_282]
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2190) ~[na:1.8.0_282]
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746) ~[na:1.8.0_282]
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) ~[na:1.8.0_282]
    at java.time.LocalTime.format(LocalTime.java:1413) ~[na:1.8.0_282]
    at io.jmix.ui.widget.JmixTimeField.formatValue(JmixTimeField.java:218) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.widget.JmixTimeField.doSetValue(JmixTimeField.java:99) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.widget.JmixTimeField.doSetValue(JmixTimeField.java:39) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at com.vaadin.ui.AbstractField.setValue(AbstractField.java:140) ~[vaadin-server-8.9.2-6-jmix.jar:8.9.2-6-jmix]
    at io.jmix.ui.widget.JmixTimeField.setValue(JmixTimeField.java:92) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.widget.JmixTimeField.setValue(JmixTimeField.java:39) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at com.vaadin.ui.AbstractField.setValue(AbstractField.java:53) ~[vaadin-server-8.9.2-6-jmix.jar:8.9.2-6-jmix]
    at io.jmix.ui.widget.JmixTimeFieldWrapper.setValueToPresentation(JmixTimeFieldWrapper.java:228) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.widget.JmixTimeFieldWrapper.doSetValue(JmixTimeFieldWrapper.java:151) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.widget.JmixTimeFieldWrapper.doSetValue(JmixTimeFieldWrapper.java:36) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at com.vaadin.ui.AbstractField.setValue(AbstractField.java:140) ~[vaadin-server-8.9.2-6-jmix.jar:8.9.2-6-jmix]
    at com.vaadin.ui.AbstractField.setValue(AbstractField.java:53) ~[vaadin-server-8.9.2-6-jmix.jar:8.9.2-6-jmix]
    at io.jmix.ui.component.impl.DateFieldImpl.setValueToPresentation(DateFieldImpl.java:403) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.component.impl.DateFieldImpl.setValueToPresentation(DateFieldImpl.java:60) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.component.impl.AbstractViewComponent.setValue(AbstractViewComponent.java:108) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.ui.component.data.value.ValueBinder$ValueBindingImpl.valueSourceStateChanged(ValueBinder.java:269) ~[jmix-ui-0.3.0-SNAPSHOT.jar:na]
    at io.jmix.core.common.event.EventHub.publish(EventHub.java:170) ~[jmix-core-0.3.0-SNAPSHOT.jar:na]

So we have two problems:

Suggestion Validate data format strings on project start. What to check:

If such formats as above are acceptable - then we should improve DateField to consume formats as presented above.

alexbudarov commented 3 years ago

Example forum topics with invalid strings:

alexbudarov commented 3 years ago

When we have logic for runtime validation, we will be able to include it to Studio also.