This is an automated email from the ASF dual-hosted git repository. mibo pushed a commit to branch OLINGO-1568 in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git
commit 6bf69a44da53d8e4a8907ca43b65cbe0d0aab0d6 Author: mibo <[email protected]> AuthorDate: Sun Sep 24 07:14:21 2023 +0200 [OLINGO-1568] Add handling of special case precision/scale --- .../core/domain/ClientPrimitiveValueImpl.java | 6 ++++- .../client/core/serialization/JsonSerializer.java | 12 ++++++---- .../olingo/client/core/PrimitiveValueTest.java | 13 ++++++++++ .../core/serialization/JsonSerializerTest.java | 28 ++++++++++++++++++++++ 4 files changed, 54 insertions(+), 5 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 d42126863..04a6063d3 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 @@ -206,12 +206,16 @@ public class ClientPrimitiveValueImpl extends AbstractClientValue implements Cli return value.toString(); } else { try { - // TODO: set facets 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(); + if (precision == 0) { + precision = null; + } else if (scale > precision) { + precision = scale; + } } return type.valueToString(value, null, null, precision, scale, null); } catch (EdmPrimitiveTypeException e) { 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 f13e87284..50f09c575 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 @@ -296,16 +296,20 @@ public class JsonSerializer implements ODataSerializer { jgen.writeString(value.toString()); // This might not be valid OData. } } else { - // TODO: add facets - Integer precesion = Constants.DEFAULT_PRECISION; + Integer precision = Constants.DEFAULT_PRECISION; Integer scale = Constants.DEFAULT_SCALE; if(kind == EdmPrimitiveTypeKind.Decimal && value instanceof BigDecimal){ BigDecimal bigDecimal = (BigDecimal)value; - precesion = bigDecimal.precision(); + precision = bigDecimal.precision(); scale = bigDecimal.scale(); + if (precision == 0) { + precision = null; + } else if (scale > precision) { + precision = scale; + } } final String serialized = EdmPrimitiveTypeFactory.getInstance(kind) - .valueToString(value, null, null, precesion, scale, null); + .valueToString(value, null, null, precision, scale, null); if (isIEEE754Compatible && (kind == EdmPrimitiveTypeKind.Int64 || kind == EdmPrimitiveTypeKind.Decimal) || !NUMBER_TYPES.contains(kind)) { diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java index 3c31b551a..bcd4ae5fd 100644 --- a/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java +++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java @@ -20,6 +20,7 @@ package org.apache.olingo.client.core; import static org.junit.Assert.assertEquals; +import java.math.BigDecimal; import java.util.Calendar; import org.apache.olingo.client.api.domain.ClientValue; @@ -64,4 +65,16 @@ public class PrimitiveValueTest extends AbstractTest { assertEquals("2013-01-10", value.asPrimitive().toString()); } + + @Test + public void testBigDecimalToStringConversion() throws EdmPrimitiveTypeException { + final ClientValue leadingZerosDecimalValue = client.getObjectFactory().newPrimitiveValueBuilder() + .setType(EdmPrimitiveTypeKind.Decimal).setValue(new BigDecimal("0.01")).build(); + final ClientValue arbitraryPrecisionDecimalValue = client.getObjectFactory().newPrimitiveValueBuilder() + .setType(EdmPrimitiveTypeKind.Decimal).setValue(new BigDecimal(0.01)).build(); + + assertEquals("0.01", leadingZerosDecimalValue.asPrimitive().toString()); + assertEquals("0.01000000000000000020816681711721685132943093776702880859375", + arbitraryPrecisionDecimalValue.asPrimitive().toString()); + } } diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java index 99f026d4b..057c1d85f 100644 --- a/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java +++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java @@ -19,6 +19,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.io.StringWriter; +import java.math.BigDecimal; import org.apache.olingo.client.api.ODataClient; import org.apache.olingo.client.api.domain.ClientEntity; @@ -66,6 +67,33 @@ public class JsonSerializerTest { JsonSerializer jsonSerializer = new JsonSerializer(false, ContentType.JSON_FULL_METADATA); + StringWriter writer = new StringWriter(); + jsonSerializer.write(writer, odataClient.getBinder().getEntity(clientEntity)); + assertThat(writer.toString(), is(expectedJson)); + } + @Test + public void testClientEntityJSONWithBigDecimal() throws ODataSerializerException { + String expectedJson = "{\"@odata.type\":\"#test.testClientEntity\"," + + "\"[email protected]\":\"Decimal\"," + + "\"testLeadingZerosDecimal\":0.01," + + "\"[email protected]\":\"Decimal\"," + + "\"testArbitraryPrecisionDecimal\":0.01000000000000000020816681711721685132943093776702880859375}"; + + ODataClient odataClient = ODataClientFactory.getClient(); + ClientObjectFactory objFactory = odataClient.getObjectFactory(); + ClientEntity clientEntity = objFactory.newEntity(new FullQualifiedName("test", "testClientEntity")); + + clientEntity.getProperties().add( + objFactory.newPrimitiveProperty( + "testLeadingZerosDecimal", + objFactory.newPrimitiveValueBuilder().buildDecimal(new BigDecimal("0.01")))); + clientEntity.getProperties().add( + objFactory.newPrimitiveProperty( + "testArbitraryPrecisionDecimal", + objFactory.newPrimitiveValueBuilder().buildDecimal(new BigDecimal(0.01)))); + + JsonSerializer jsonSerializer = new JsonSerializer(false, ContentType.JSON_FULL_METADATA); + StringWriter writer = new StringWriter(); jsonSerializer.write(writer, odataClient.getBinder().getEntity(clientEntity)); assertThat(writer.toString(), is(expectedJson));
