Updated Branches: refs/heads/master c3addb515 -> a5368b3a9
ISIS-396: fix for parsing of BigDecimal values. was truncating in some situations... fixed impl. Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/a5368b3a Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/a5368b3a Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/a5368b3a Branch: refs/heads/master Commit: a5368b3a997432b0e7adfa1f2c84f22f4d9c51bf Parents: c3addb5 Author: Dan Haywood <[email protected]> Authored: Thu May 9 12:11:43 2013 +0200 Committer: Dan Haywood <[email protected]> Committed: Thu May 9 12:11:43 2013 +0200 ---------------------------------------------------------------------- .../scalars/jdkmath/BigDecimalConverter.java | 29 ++++++++ .../scalars/jdkmath/BigDecimalTextField.java | 30 ++++++++ .../scalars/jdkmath/JavaMathBigDecimalPanel.java | 56 +-------------- .../valuechoices/ValueChoicesSelect2Panel.java | 16 +---- .../scalars/jdkmath/BigDecimalConverterTest.java | 36 +++++++++ 5 files changed, 98 insertions(+), 69 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/a5368b3a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter.java new file mode 100644 index 0000000..e66e167 --- /dev/null +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverter.java @@ -0,0 +1,29 @@ +package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath; + +import java.math.BigDecimal; +import java.util.Locale; + +import org.apache.wicket.util.convert.IConverter; + +final class BigDecimalConverter implements IConverter<BigDecimal> { + private final Integer scale; + private static final long serialVersionUID = 1L; + + BigDecimalConverter(Integer scale) { + this.scale = scale; + } + + @Override + public BigDecimal convertToObject(String value, Locale locale) { + try { + return new BigDecimal(value).setScale(scale); + } catch (Exception e) { + return null; + } + } + + @Override + public String convertToString(BigDecimal value, Locale locale) { + return value.toPlainString(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/a5368b3a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalTextField.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalTextField.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalTextField.java new file mode 100644 index 0000000..bbbee7c --- /dev/null +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalTextField.java @@ -0,0 +1,30 @@ +package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath; + +import java.math.BigDecimal; + +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.model.IModel; +import org.apache.wicket.util.convert.IConverter; + +import org.apache.isis.viewer.wicket.model.models.ScalarModel; + +final class BigDecimalTextField extends TextField<BigDecimal> { + + private final ScalarModel model; + private static final long serialVersionUID = 1L; + + BigDecimalTextField(String id, IModel<BigDecimal> model, Class<BigDecimal> type, ScalarModel model2) { + super(id, model, type); + this.model = model2; + } + + @SuppressWarnings("unchecked") + @Override + public <C> IConverter<C> getConverter(Class<C> type) { + + final Integer scale = model.getScale(); + return type == BigDecimal.class + ? (IConverter<C>) new BigDecimalConverter(scale) + : super.getConverter(type); + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/a5368b3a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java index 2380da2..5096f44 100644 --- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java @@ -20,15 +20,8 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath; import java.math.BigDecimal; -import java.math.MathContext; -import java.math.RoundingMode; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.text.ParseException; -import java.util.Locale; import org.apache.wicket.markup.html.form.TextField; -import org.apache.wicket.util.convert.IConverter; import org.apache.isis.viewer.wicket.model.models.ScalarModel; import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric; @@ -53,54 +46,7 @@ public class JavaMathBigDecimalPanel extends ScalarPanelTextFieldNumeric<BigDeci final ScalarModel model = getModel(); - final TextField<BigDecimal> textField = new TextField<BigDecimal>(id, newTextFieldValueModel(), cls) { - - private static final long serialVersionUID = 1L; - - @SuppressWarnings("unchecked") - @Override - public <C> IConverter<C> getConverter(Class<C> type) { - - Integer scale = model.getScale(); - final MathContext mathContext = new MathContext(scale+1, RoundingMode.HALF_UP); - -// final NumberFormat numberFormat = NumberFormat.getInstance(); -// numberFormat.setMinimumFractionDigits(scale); -// numberFormat.setMaximumFractionDigits(scale); -// numberFormat.setMaximumIntegerDigits(model.getLength()); - - if(type == BigDecimal.class) { - return (IConverter<C>) new IConverter<BigDecimal>() { - - private static final long serialVersionUID = 1L; - - @Override - public BigDecimal convertToObject(String value, Locale locale) { - try { - return new BigDecimal(value, mathContext); -// final Number parsed = numberFormat.parse(value); -// return (BigDecimal) parsed; - } catch (Exception e) { - return null; - } - } - - @Override - public String convertToString(BigDecimal value, Locale locale) { - //return numberFormat.format(value); - return value.toPlainString(); - }}; - } else { - return super.getConverter(type); - } - } - }; - - - return textField; + return new BigDecimalTextField(id, newTextFieldValueModel(), cls, model); } - - - } http://git-wip-us.apache.org/repos/asf/isis/blob/a5368b3a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java index 79a9b29..b550d1f 100644 --- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java @@ -55,7 +55,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan private static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular"; private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact"; - private static final String ID_FEEDBACK = "feedback"; private static final String ID_SCALAR_NAME = "scalarName"; @@ -124,9 +123,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan } scalarModel.setObject(pending.getObjectAdapter(ConcurrencyChecking.NO_CHECK)); } - } - }; } @@ -181,7 +178,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan protected String getDisplayText(ObjectAdapterMemento choice) { final ObjectAdapter objectAdapter = choice.getObjectAdapter(ConcurrencyChecking.NO_CHECK); - return objectAdapter.titleString(); + return objectAdapter.titleString(null); } @Override @@ -210,16 +207,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan } }; - return new Select2Choice<ObjectAdapterMemento>(id, modelObject, provider) { - - private static final long serialVersionUID = 1L; - -// @Override -// protected void convertInput() { -// super.convertInput(); -// modelObject.setObject(getConvertedInput()); -// } - }; + return new Select2Choice<ObjectAdapterMemento>(id, modelObject, provider); } @Override http://git-wip-us.apache.org/repos/asf/isis/blob/a5368b3a/component/viewer/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterTest.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterTest.java b/component/viewer/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterTest.java new file mode 100644 index 0000000..8b6e1c6 --- /dev/null +++ b/component/viewer/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterTest.java @@ -0,0 +1,36 @@ +package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath; + +import java.math.BigDecimal; + +import org.junit.Assert; +import org.junit.Test; + +public class BigDecimalConverterTest { + + final BigDecimal bd_123_45_scale2 = new BigDecimal("123.45").setScale(2); + final BigDecimal bd_123_45_scale4 = new BigDecimal("123.45").setScale(4); + final BigDecimal bd_123_4500_scale2 = new BigDecimal("123.4500").setScale(2); + final BigDecimal bd_123_4500_scale4 = new BigDecimal("123.4500").setScale(4); + + @Test + public void test_scale2() { + final BigDecimal actual = new BigDecimalConverter(2).convertToObject("123.45", null); + Assert.assertEquals(bd_123_4500_scale2, actual); + Assert.assertEquals(bd_123_45_scale2, actual); + + Assert.assertNotEquals(bd_123_4500_scale4, actual); + Assert.assertNotEquals(bd_123_45_scale4, actual); + } + + @Test + public void test_scale4() { + final BigDecimal actual = new BigDecimalConverter(4).convertToObject("123.45", null); + Assert.assertNotEquals(bd_123_4500_scale2, actual); + Assert.assertNotEquals(bd_123_45_scale2, actual); + + Assert.assertEquals(bd_123_4500_scale4, actual); + Assert.assertEquals(bd_123_45_scale4, actual); + } + + +}
