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-odata2.git
The following commit(s) were added to refs/heads/master by this push: new d310611 [OLINGO-1496]Fix handling of Timestamp values in serialization d310611 is described below commit d310611c33aa2d3781b785d1e758efd44f3275e5 Author: ramya vasanth <ramya.vasa...@sap.com> AuthorDate: Tue Nov 24 16:25:56 2020 +0530 [OLINGO-1496]Fix handling of Timestamp values in serialization --- .../olingo/odata2/core/edm/EdmDateTimeOffset.java | 23 ++------------- .../olingo/odata2/core/edm/EdmSimpleTypeTest.java | 34 ++++++++++++++-------- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmDateTimeOffset.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmDateTimeOffset.java index b2c4321..07695eb 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmDateTimeOffset.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmDateTimeOffset.java @@ -143,45 +143,26 @@ public class EdmDateTimeOffset extends AbstractSimpleType { protected <T> String internalValueToString(final T value, final EdmLiteralKind literalKind, final EdmFacets facets) throws EdmSimpleTypeException { Long milliSeconds; // number of milliseconds since 1970-01-01T00:00:00Z - int offset; // offset in milliseconds from GMT to the requested time zone if (value instanceof Date) { milliSeconds = ((Date) value).getTime(); - // Although java.util.Date, as stated in its documentation, - // "is intended to reflect coordinated universal time (UTC)", - // its toString() method uses the default time zone. And so do we. - Calendar dateTimeValue = Calendar.getInstance(); - dateTimeValue.setTime((Date) value); - offset = dateTimeValue.get(Calendar.ZONE_OFFSET) + dateTimeValue.get(Calendar.DST_OFFSET); } else if (value instanceof Calendar) { final Calendar dateTimeValue = (Calendar) ((Calendar) value).clone(); milliSeconds = dateTimeValue.getTimeInMillis(); - offset = dateTimeValue.get(Calendar.ZONE_OFFSET) + dateTimeValue.get(Calendar.DST_OFFSET); } else if (value instanceof Long) { milliSeconds = (Long) value; - offset = 0; } else { throw new EdmSimpleTypeException(EdmSimpleTypeException.VALUE_TYPE_NOT_SUPPORTED.addContent(value.getClass())); } - milliSeconds += offset; // Convert from UTC to local time. - final int offsetInMinutes = offset / 60 / 1000; if (literalKind == EdmLiteralKind.JSON) { - if (value instanceof Timestamp && ((Timestamp) value).getNanos() % (1000 * 1000) != 0) { - throw new EdmSimpleTypeException(EdmSimpleTypeException.VALUE_ILLEGAL_CONTENT.addContent(value)); - } else { - return "/Date(" + milliSeconds + (offset == 0 ? "" : String.format("%+05d", offsetInMinutes)) + ")/"; - } - + return "/Date(" + milliSeconds + ")/"; } else { final String localTimeString = EdmDateTime.getInstance().valueToString( value instanceof Timestamp ? value : milliSeconds, EdmLiteralKind.DEFAULT, facets); - final int offsetHours = offsetInMinutes / 60; - final int offsetMinutes = Math.abs(offsetInMinutes % 60); - final String offsetString = offset == 0 ? "Z" : String.format("%+03d:%02d", offsetHours, offsetMinutes); - return localTimeString + offsetString; + return localTimeString + "Z"; } } diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java index 0908e1d..602d70b 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java @@ -621,19 +621,19 @@ public class EdmSimpleTypeTest extends BaseTest { assertEquals("datetimeoffset'2012-02-29T01:02:03Z'", instance.valueToString(dateTime, EdmLiteralKind.URI, null)); dateTime.setTimeZone(TimeZone.getTimeZone("GMT-1:30")); - assertEquals("2012-02-29T01:02:03-01:30", instance.valueToString(dateTime, EdmLiteralKind.DEFAULT, null)); - assertEquals("/Date(1330477323000-0090)/", instance.valueToString(dateTime, EdmLiteralKind.JSON, null)); - assertEquals("datetimeoffset'2012-02-29T01:02:03-01:30'", instance + assertEquals("2012-02-29T02:32:03Z", instance.valueToString(dateTime, EdmLiteralKind.DEFAULT, null)); + assertEquals("/Date(1330482723000)/", instance.valueToString(dateTime, EdmLiteralKind.JSON, null)); + assertEquals("datetimeoffset'2012-02-29T02:32:03Z'", instance .valueToString(dateTime, EdmLiteralKind.URI, null)); dateTime.setTimeZone(TimeZone.getTimeZone("GMT+11:00")); - assertEquals("2012-02-29T01:02:03+11:00", instance.valueToString(dateTime, EdmLiteralKind.DEFAULT, null)); - assertEquals("/Date(1330477323000+0660)/", instance.valueToString(dateTime, EdmLiteralKind.JSON, null)); - assertEquals("datetimeoffset'2012-02-29T01:02:03+11:00'", instance + assertEquals("2012-02-28T14:02:03Z", instance.valueToString(dateTime, EdmLiteralKind.DEFAULT, null)); + assertEquals("/Date(1330437723000)/", instance.valueToString(dateTime, EdmLiteralKind.JSON, null)); + assertEquals("datetimeoffset'2012-02-28T14:02:03Z'", instance .valueToString(dateTime, EdmLiteralKind.URI, null)); dateTime.set(1969, 11, 30, 11, 59, 58); - assertEquals("/Date(-129602000+0660)/", instance.valueToString(dateTime, EdmLiteralKind.JSON, null)); + assertEquals("/Date(-169202000)/", instance.valueToString(dateTime, EdmLiteralKind.JSON, null)); final Long millis = 1330558323007L; assertEquals("2012-02-29T23:32:03.007Z", instance.valueToString(millis, EdmLiteralKind.DEFAULT, null)); @@ -641,22 +641,32 @@ public class EdmSimpleTypeTest extends BaseTest { assertEquals("datetimeoffset'2012-02-29T23:32:03.007Z'", instance.valueToString(millis, EdmLiteralKind.URI, null)); final Date date = new Date(millis); - final String time = date.toString().substring(11, 19); - assertTrue(instance.valueToString(date, EdmLiteralKind.DEFAULT, null).contains(time)); + assertEquals("2012-02-29T23:32:03.007Z", instance.valueToString(date, EdmLiteralKind.DEFAULT, null)); + assertEquals("/Date(" + millis + ")/", instance.valueToString(date, EdmLiteralKind.JSON, null)); + assertEquals("datetimeoffset'2012-02-29T23:32:03.007Z'", instance.valueToString(date, EdmLiteralKind.URI, null)); Timestamp timestamp = new Timestamp(millis); + assertEquals("2012-02-29T23:32:03.007Z", instance.valueToString(timestamp, EdmLiteralKind.DEFAULT, null)); + assertEquals("/Date(" + millis + ")/", instance.valueToString(timestamp, EdmLiteralKind.JSON, null)); + assertEquals("datetimeoffset'2012-02-29T23:32:03.007Z'" + , instance.valueToString(timestamp, EdmLiteralKind.URI, null)); assertTrue(instance.valueToString(timestamp, EdmLiteralKind.JSON, null).contains("007")); + timestamp.setNanos(7111000); + assertEquals("2012-02-29T23:32:03.007111Z", instance.valueToString(timestamp, EdmLiteralKind.DEFAULT, null)); + assertEquals("/Date(" + millis + ")/" + , instance.valueToString(timestamp, EdmLiteralKind.JSON, null)); + assertEquals("datetimeoffset'2012-02-29T23:32:03.007111Z'" + , instance.valueToString(timestamp, EdmLiteralKind.URI, null)); + timestamp.setNanos(42); expectErrorInValueToString(instance, timestamp, EdmLiteralKind.DEFAULT, getPrecisionScaleFacets(8, null), EdmSimpleTypeException.VALUE_FACETS_NOT_MATCHED); - expectErrorInValueToString(instance, timestamp, EdmLiteralKind.JSON, null, - EdmSimpleTypeException.VALUE_ILLEGAL_CONTENT); expectErrorInValueToString(instance, 0, EdmLiteralKind.DEFAULT, null, EdmSimpleTypeException.VALUE_TYPE_NOT_SUPPORTED); expectErrorInValueToString(instance, dateTime, null, null, EdmSimpleTypeException.LITERAL_KIND_MISSING); } - + @Test public void valueToStringDecimal() throws Exception { final EdmSimpleType instance = EdmSimpleTypeKind.Decimal.getEdmSimpleTypeInstance();