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 12:11:27 UTC
[myfaces] branch 2.0.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.0.x
in repository https://gitbox.apache.org/repos/asf/myfaces.git
The following commit(s) were added to refs/heads/2.0.x by this push:
new 9b9e8fb MYFACES-4293: handle BigInteger in NumberConverter
new 58a8b58 Merge pull request #64 from trettstadtnlb/2.0.x
9b9e8fb is described below
commit 9b9e8fb4768ee32089376e1b50cca39b3ddcc57b
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)
---
.../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 b2402db..b11519a 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;
@@ -118,10 +119,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);
}
@@ -141,7 +144,7 @@ public class NumberConverter
try
{
- return format.parse(value);
+ return parse(value, format, destType);
}
catch (ParseException e)
{
@@ -152,7 +155,7 @@ public class NumberConverter
}
try
{
- return format.parse(value);
+ return parse(value, format, destType);
}
catch (ParseException pe)
{
@@ -180,6 +183,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) throw new NullPointerException("facesContext");
diff --git a/api/src/test/java/javax/faces/convert/NumberConverterTest.java b/api/src/test/java/javax/faces/convert/NumberConverterTest.java
index 2dbcf6f..2a13f77 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;
@@ -167,4 +167,24 @@ public class NumberConverterTest extends AbstractJsfTestCase
assertEquals(testValue, 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);
+ }
}