MYFACES-3196
diff --git a/api/src/main/java/javax/faces/convert/NumberConverter.java b/api/src/main/java/javax/faces/convert/NumberConverter.java
index 51efe3f..4df5673 100755
--- a/api/src/main/java/javax/faces/convert/NumberConverter.java
+++ b/api/src/main/java/javax/faces/convert/NumberConverter.java
@@ -24,6 +24,7 @@
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
+import java.text.ParsePosition;
import java.util.Currency;
import java.util.Locale;
@@ -154,27 +155,27 @@
}
catch (ParseException pe)
{
- if(getPattern() != null)
+ if (getPattern() != null)
{
throw new ConverterException(_MessageUtils.getErrorMessage(facesContext,
PATTERN_ID,
new Object[]{value, "$###,###", _MessageUtils.getLabel(facesContext, uiComponent)}));
}
- else if(getType().equals("number"))
+ else if (getType().equals("number"))
{
throw new ConverterException(_MessageUtils.getErrorMessage(facesContext,
NUMBER_ID,
new Object[]{value, format.format(21),
_MessageUtils.getLabel(facesContext, uiComponent)}));
}
- else if(getType().equals("currency"))
+ else if (getType().equals("currency"))
{
throw new ConverterException(_MessageUtils.getErrorMessage(facesContext,
CURRENCY_ID,
new Object[]{value, format.format(42.25),
_MessageUtils.getLabel(facesContext, uiComponent)}));
}
- else if(getType().equals("percent"))
+ else if (getType().equals("percent"))
{
throw new ConverterException(_MessageUtils.getErrorMessage(facesContext,
PERCENT_ID,
@@ -190,14 +191,24 @@
private Object parse(String value, NumberFormat format, Class<?> destType)
throws ParseException
{
+ Object parsed = null;
+
+ ParsePosition parsePosition = new ParsePosition(0);
if (destType == BigInteger.class)
{
- return ((BigDecimal) format.parse(value)).toBigInteger();
+ parsed = ((BigDecimal) format.parse(value, parsePosition)).toBigInteger();
}
else
{
- return format.parse(value);
+ parsed = format.parse(value, parsePosition);
}
+
+ if (parsePosition.getIndex() != value.length())
+ {
+ throw new ParseException(value, parsePosition.getIndex());
+ }
+
+ return parsed;
}
@Override
diff --git a/impl/src/test/java/javax/faces/convert/NumberConverterTest.java b/impl/src/test/java/javax/faces/convert/NumberConverterTest.java
index edc6b83..72d2643 100644
--- a/impl/src/test/java/javax/faces/convert/NumberConverterTest.java
+++ b/impl/src/test/java/javax/faces/convert/NumberConverterTest.java
@@ -202,4 +202,25 @@
assertTrue(number instanceof BigInteger);
assertEquals(BigInteger.ONE, number);
}
+
+ @Test(expected = ConverterException.class)
+ public void testGetAsObjectWithBigIntegerAndParsePosition()
+ {
+ 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,0.0,00.00");
+ assertNotNull(number);
+ assertTrue(number instanceof BigInteger);
+ assertEquals(BigInteger.ONE, number);
+ }
}