You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2019/06/18 11:23:10 UTC
[myfaces] branch 2.1.x updated: MYFACES-4293: handle BigInteger in
NumberConverter
This is an automated email from the ASF dual-hosted git repository.
tandraschko pushed a commit to branch 2.1.x
in repository https://gitbox.apache.org/repos/asf/myfaces.git
The following commit(s) were added to refs/heads/2.1.x by this push:
new 43739d4 MYFACES-4293: handle BigInteger in NumberConverter
new fd8c399 Merge pull request #61 from trettstadtnlb/2.1.x
43739d4 is described below
commit 43739d43109c41cfa3ffc77a7f1df7c37dddd213
Author: Tobias Rettstadt <gl...@nordlb.de>
AuthorDate: Fri Jun 14 14:49:07 2019 +0200
MYFACES-4293: handle BigInteger in NumberConverter
(cherry picked from commit d6b197f75e3369d54eb4e939b4b56f725ffe3a25)
Change-Id: I302afeac54cd9bcefc151b16b639a87303f61990
---
.../java/javax/faces/convert/NumberConverter.java | 24 ++++++++++++++++++----
.../javax/faces/convert/NumberConverterTest.java | 24 ++++++++++++++++++++--
2 files changed, 42 insertions(+), 6 deletions(-)
diff --git a/api/src/main/java/javax/faces/convert/NumberConverter.java b/api/src/main/java/javax/faces/convert/NumberConverter.java
index 264f013..d863759 100755
--- a/api/src/main/java/javax/faces/convert/NumberConverter.java
+++ b/api/src/main/java/javax/faces/convert/NumberConverter.java
@@ -19,6 +19,7 @@
package javax.faces.convert;
import java.math.BigDecimal;
+import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
@@ -124,10 +125,12 @@ public class NumberConverter
// in those cases it is expected to return Double). See MYFACES-1890 and TRINIDAD-1124
// for details
ValueExpression valueBinding = uiComponent.getValueExpression("value");
+ Class<?> destType = null;
if (valueBinding != null)
{
- Class<?> destType = valueBinding.getType(facesContext.getELContext());
- if (destType != null && BigDecimal.class.isAssignableFrom(destType))
+ destType = valueBinding.getType(facesContext.getELContext());
+ if (destType != null
+ && (BigDecimal.class.isAssignableFrom(destType) || BigInteger.class.isAssignableFrom(destType)))
{
df.setParseBigDecimal(true);
}
@@ -147,7 +150,7 @@ public class NumberConverter
try
{
- return format.parse(value);
+ return parse(value, format, destType);
}
catch (ParseException e)
{
@@ -158,7 +161,7 @@ public class NumberConverter
}
try
{
- return format.parse(value);
+ return parse(value, format, destType);
}
catch (ParseException pe)
{
@@ -197,6 +200,19 @@ public class NumberConverter
return null;
}
+ private Object parse(String value, NumberFormat format, Class<?> destType)
+ throws ParseException
+ {
+ if (destType == BigInteger.class)
+ {
+ return ((BigDecimal) format.parse(value)).toBigInteger();
+ }
+ else
+ {
+ return format.parse(value);
+ }
+ }
+
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
{
if (facesContext == null)
diff --git a/api/src/test/java/javax/faces/convert/NumberConverterTest.java b/api/src/test/java/javax/faces/convert/NumberConverterTest.java
index 0c18e28..d98eb04 100644
--- a/api/src/test/java/javax/faces/convert/NumberConverterTest.java
+++ b/api/src/test/java/javax/faces/convert/NumberConverterTest.java
@@ -19,11 +19,11 @@
package javax.faces.convert;
+import java.math.BigInteger;
import java.util.Locale;
-
+import javax.el.ValueExpression;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
-
import org.apache.myfaces.test.base.AbstractJsfTestCase;
import org.junit.Ignore;
import org.junit.Test;
@@ -183,4 +183,24 @@ public class NumberConverterTest extends AbstractJsfTestCase
assertEquals(new Long(7000), number);
}
+ @Test
+ public void testGetAsObjectWithBigInteger()
+ {
+ facesContext.getViewRoot().setLocale(Locale.US);
+ mock.setLocale(Locale.GERMANY);
+ mock.setIntegerOnly(true);
+ mock.setGroupingUsed(false);
+ UIInput input = new UIInput();
+ facesContext.getELContext().getELResolver().setValue(facesContext.getELContext(), null,
+ "bigInteger", BigInteger.ONE);
+ ValueExpression valueExpression =
+ application
+ .getExpressionFactory()
+ .createValueExpression(facesContext.getELContext(), "#{bigInteger}", BigInteger.class);
+ input.setValueExpression("value", valueExpression);
+ Number number = (Number) mock.getAsObject(FacesContext.getCurrentInstance(), input, "1");
+ assertNotNull(number);
+ assertTrue(number instanceof BigInteger);
+ assertEquals(BigInteger.ONE, number);
+ }
}