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