In a DynamicForm we use some FormItems that have Long values;
The FormItem.setValue(Long longValue) method gets into the setValue(Object x) overload and gets into an if/elseif/... construct.
Because java.lang.Long is a java.lang.Number, we get into the corresponding branch and the value is stored as double into javascript's Number.
Which is fine.
However DynamicForm.getValues() returns a LinkedHashMap with unpredictable object types!!!
I expect that if I put a Long in the form, I'd get it back as a Long. I was prepared to loose precision after 2^53 or so, but the change of the value type got me unprepared.
If the original longValue is outside Integer, then the corresponding key holds a Long (as expected) but if the longValue is small, then the corresponding key holds Integer, which breaks our code.
In the above example form.getValues() has an Integer "smallLong" and a Long "bigLong". In particular:
throws a ClassCastException :(
We are using SmartClient Version: v10.0p_2015-01-26/LGPL Development Only (built 2015-01-26) and the issue is present in all browsers
Code:
DynamicForm form = new DynamicForm(); Long big = 56789012344L; Long small = 11L; HiddenItem bigLong = new HiddenItem("bigLong"); bigLong.setValue(big); HiddenItem smallLong = new HiddenItem("smallLong"); smallLong.setValue(small); form.setFields(smallLong, bigLong);
Because java.lang.Long is a java.lang.Number, we get into the corresponding branch and the value is stored as double into javascript's Number.
Code:
... //SmartGWT code else if (value instanceof Number) { setValue(JSOHelper.doubleValue((Number) value)); ...
However DynamicForm.getValues() returns a LinkedHashMap with unpredictable object types!!!
I expect that if I put a Long in the form, I'd get it back as a Long. I was prepared to loose precision after 2^53 or so, but the change of the value type got me unprepared.
If the original longValue is outside Integer, then the corresponding key holds a Long (as expected) but if the longValue is small, then the corresponding key holds Integer, which breaks our code.
In the above example form.getValues() has an Integer "smallLong" and a Long "bigLong". In particular:
Code:
(Long) form.getValues().get("smallLong");
We are using SmartClient Version: v10.0p_2015-01-26/LGPL Development Only (built 2015-01-26) and the issue is present in all browsers
Comment