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);
+    }
 }