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 <[email protected]>
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,