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 <[email protected]>
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();