This is an automated email from the ASF dual-hosted git repository. ramyav pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git
The following commit(s) were added to refs/heads/master by this push: new 79bd10f [OLINGO-1480]Client error when reading Decimal literal 79bd10f is described below commit 79bd10f430a8edf26c0a38c556f5a1d370efc079 Author: ramya vasanth <ramya.vasa...@sap.com> AuthorDate: Thu Nov 19 14:11:38 2020 +0530 [OLINGO-1480]Client error when reading Decimal literal --- .../olingo/client/core/domain/ClientPrimitiveValueImpl.java | 8 +++++++- .../olingo/client/core/serialization/JsonDeserializer.java | 13 +++++++++---- .../olingo/client/core/serialization/JsonSerializer.java | 10 +++++++++- .../olingo/commons/core/edm/primitivetype/EdmDecimal.java | 5 +++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java index 4824632..d421268 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java @@ -207,7 +207,13 @@ public class ClientPrimitiveValueImpl extends AbstractClientValue implements Cli } else { try { // TODO: set facets - return type.valueToString(value, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null); + Integer precision = Constants.DEFAULT_PRECISION; + Integer scale = Constants.DEFAULT_SCALE; + if (typeKind.equals(EdmPrimitiveTypeKind.Decimal) && value instanceof BigDecimal) { + precision = ((BigDecimal) value).precision(); + scale = ((BigDecimal) value).scale(); + } + return type.valueToString(value, null, null, precision, scale, null); } catch (EdmPrimitiveTypeException e) { throw new IllegalArgumentException(e); } diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java index efd2963..ddde0af 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java @@ -289,10 +289,15 @@ public class JsonDeserializer implements ODataDeserializer { : typeInfo == null ? node.asText() : typeInfo.getPrimitiveTypeKind().isGeospatial() ? getGeoDeserializer().deserialize(node, typeInfo) - : ((EdmPrimitiveType) typeInfo.getType()) - .valueOfString(node.asText(), true, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, true, - ((EdmPrimitiveType) typeInfo.getType()).getDefaultType()); + : node.isBigDecimal() + ?((EdmPrimitiveType) typeInfo.getType()) + .valueOfString(node.asText(), true, null, + node.decimalValue().precision(), node.decimalValue().scale(), true, + ((EdmPrimitiveType) typeInfo.getType()).getDefaultType()) + :((EdmPrimitiveType) typeInfo.getType()) + .valueOfString(node.asText(), true, null, + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, true, + ((EdmPrimitiveType) typeInfo.getType()).getDefaultType()); } private Object fromComplex(final ObjectNode node, final ObjectCodec codec) diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java index bd983a5..f13e872 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java @@ -20,6 +20,7 @@ package org.apache.olingo.client.core.serialization; import java.io.IOException; import java.io.Writer; +import java.math.BigDecimal; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -296,8 +297,15 @@ public class JsonSerializer implements ODataSerializer { } } else { // TODO: add facets + Integer precesion = Constants.DEFAULT_PRECISION; + Integer scale = Constants.DEFAULT_SCALE; + if(kind == EdmPrimitiveTypeKind.Decimal && value instanceof BigDecimal){ + BigDecimal bigDecimal = (BigDecimal)value; + precesion = bigDecimal.precision(); + scale = bigDecimal.scale(); + } final String serialized = EdmPrimitiveTypeFactory.getInstance(kind) - .valueToString(value, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null); + .valueToString(value, null, null, precesion, scale, null); if (isIEEE754Compatible && (kind == EdmPrimitiveTypeKind.Int64 || kind == EdmPrimitiveTypeKind.Decimal) || !NUMBER_TYPES.contains(kind)) { diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDecimal.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDecimal.java index e177d7d..86033b8 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDecimal.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDecimal.java @@ -85,9 +85,10 @@ public final class EdmDecimal extends SingletonPrimitiveType { final int decimals = matcher.group(2) == null ? 0 : matcher.group(2).length(); return (precision == null || (significantIntegerDigits >= 0 && significantIntegerDigits <= precision - ((scale == null) ? 0 : scale))) && - (decimals >= 0 && decimals <= ((scale == null) ? 0 : scale)); + (( decimals == 0 && ((scale == null) ? 0 : scale) < 0) || + (decimals >= 0 && decimals <= ((scale == null) ? 0 : scale))); } - + @Override public boolean validateDecimals(final String value, final Boolean isNullable, final Integer maxLength, final Integer precision,