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();

Reply via email to