[OLINGO-1367]OData V2: Issue with EdmTime
diff --git a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/JsonPropertyDeserializerTest.java b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/JsonPropertyDeserializerTest.java
index 3a89af0..8054475 100644
--- a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/JsonPropertyDeserializerTest.java
+++ b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/JsonPropertyDeserializerTest.java
@@ -180,7 +180,7 @@
     resultMap = execute(edmProperty, reader);
     assertTrue(Arrays.equals(new byte[] { (byte) 0xAA, (byte) 0xBB, (byte) 0xCC },
         (byte[]) resultMap.get("Name")));
-    // Time
+ // Time
     simplePropertyJson = "{\"d\":{\"Name\":\"PT23H32M3S\"}}";
     reader = prepareReader(simplePropertyJson);
     when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Time.getEdmSimpleTypeInstance());
@@ -190,6 +190,9 @@
     dateTime.set(Calendar.HOUR_OF_DAY, 23);
     dateTime.set(Calendar.MINUTE, 32);
     dateTime.set(Calendar.SECOND, 3);
+    dateTime.set(Calendar.YEAR, 0);
+    dateTime.set(Calendar.MONTH, 0);
+    dateTime.set(Calendar.DAY_OF_YEAR, 0);
     assertEquals(dateTime, resultMap.get("Name"));
   }
 
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmTime.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmTime.java
index 22f3cc8..740e1e7 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmTime.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmTime.java
@@ -39,9 +39,11 @@
  * 
  */
 public class EdmTime extends AbstractSimpleType {
-
+  
   private static final Pattern PATTERN = Pattern.compile(
-      "PT(?:(\\p{Digit}{1,2})H)?(?:(\\p{Digit}{1,4})M)?(?:(\\p{Digit}{1,5})(?:\\.(\\p{Digit}+?)0*)?S)?");
+      "P(?:(\\p{Digit}{1,2})Y)?(?:(\\p{Digit}{1,2})M)?(?:(\\p{Digit}{1,2})D)?"
+      + "T(?:(\\p{Digit}{1,2})H)?(?:(\\p{Digit}{1,4})M)?(?:(\\p{Digit}{1,5})(?:\\.(\\p{Digit}+?)0*)?S)?");
+  
   private static final EdmTime instance = new EdmTime();
   private static final TimeZone TIME_ZONE_GMT = TimeZone.getTimeZone("GMT");
 
@@ -67,23 +69,30 @@
     final Matcher matcher = PATTERN.matcher(
         literalKind == EdmLiteralKind.URI ? value.substring(5, value.length() - 1) : value);
     if (!matcher.matches()
-        || (matcher.group(1) == null && matcher.group(2) == null && matcher.group(3) == null)) {
+        || (matcher.group(1) == null && matcher.group(2) == null && matcher.group(3) == null 
+        && matcher.group(4) == null && matcher.group(5) == null && matcher.group(6) == null)) {
       throw new EdmSimpleTypeException(EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(value));
     }
 
     Calendar dateTimeValue = Calendar.getInstance();
     dateTimeValue.clear();
 
-    dateTimeValue.set(Calendar.HOUR_OF_DAY,
+    dateTimeValue.set(Calendar.YEAR, 
         matcher.group(1) == null ? 0 : Integer.parseInt(matcher.group(1)));
-    dateTimeValue.set(Calendar.MINUTE,
+    dateTimeValue.set(Calendar.MONTH, 
         matcher.group(2) == null ? 0 : Integer.parseInt(matcher.group(2)));
-    dateTimeValue.set(Calendar.SECOND,
+    dateTimeValue.set(Calendar.DAY_OF_YEAR, 
         matcher.group(3) == null ? 0 : Integer.parseInt(matcher.group(3)));
+    dateTimeValue.set(Calendar.HOUR_OF_DAY,
+        matcher.group(4) == null ? 0 : Integer.parseInt(matcher.group(4)));
+    dateTimeValue.set(Calendar.MINUTE,
+        matcher.group(5) == null ? 0 : Integer.parseInt(matcher.group(5)));
+    dateTimeValue.set(Calendar.SECOND,
+        matcher.group(6) == null ? 0 : Integer.parseInt(matcher.group(6)));
 
     int nanoSeconds = 0;
-    if (matcher.group(4) != null) {
-      final String decimals = matcher.group(4);
+    if (matcher.group(7) != null) {
+      final String decimals = matcher.group(7);
       if (facets == null || facets.getPrecision() == null || facets.getPrecision() >= decimals.length()) {
         nanoSeconds = Integer.parseInt(decimals + "000000000".substring(decimals.length()));
         if (!(returnType.isAssignableFrom(Timestamp.class))) {
@@ -98,10 +107,6 @@
       }
     }
 
-    if (dateTimeValue.get(Calendar.DAY_OF_YEAR) != 1) {
-      throw new EdmSimpleTypeException(EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(value));
-    }
-
     if (returnType.isAssignableFrom(Calendar.class)) {
       return returnType.cast(dateTimeValue);
     } else if (returnType.isAssignableFrom(Long.class)) {
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 ebe6211..bab2d91 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
@@ -1655,6 +1655,9 @@
     dateTime.set(Calendar.HOUR_OF_DAY, 23);
     dateTime.set(Calendar.MINUTE, 32);
     dateTime.set(Calendar.SECOND, 3);
+    dateTime.set(Calendar.YEAR, 0);
+    dateTime.set(Calendar.MONTH, 0);
+    dateTime.set(Calendar.DAY_OF_YEAR, 0);
     assertEquals(dateTime, instance.valueOfString("PT23H32M3S", EdmLiteralKind.DEFAULT, null, Calendar.class));
     assertEquals(Long.valueOf(dateTime.getTimeInMillis()), instance.valueOfString("PT84723S", EdmLiteralKind.DEFAULT,
         null, Long.class));
@@ -1709,12 +1712,41 @@
         EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED);
     expectErrorInValueOfString(instance, "P2012Y2M29DT23H32M2S", EdmLiteralKind.DEFAULT, null,
         EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT);
-    expectErrorInValueOfString(instance, "PT24H", EdmLiteralKind.DEFAULT, null,
-        EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT);
-    expectErrorInValueOfString(instance, "PT99999S", EdmLiteralKind.JSON, null,
-        EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT);
+    dateTime.clear();
+    dateTime.set(Calendar.MINUTE, 0);
+    dateTime.set(Calendar.SECOND, 0);
+    dateTime.set(Calendar.YEAR, 0);
+    dateTime.set(Calendar.MONTH, 0);
+    dateTime.set(Calendar.DAY_OF_YEAR, 0);
+    dateTime.set(Calendar.HOUR_OF_DAY, 24);
+    assertEquals(dateTime.getTimeInMillis(),
+        instance.valueOfString("PT24H", EdmLiteralKind.DEFAULT, null, Time.class).getTime());
+    dateTime.clear();
+    dateTime.set(Calendar.MINUTE, 0);
+    dateTime.set(Calendar.SECOND, 99999);
+    dateTime.set(Calendar.YEAR, 0);
+    dateTime.set(Calendar.MONTH, 0);
+    dateTime.set(Calendar.DAY_OF_YEAR, 0);
+    dateTime.set(Calendar.HOUR_OF_DAY, 0);
+    assertEquals(dateTime.getTimeInMillis(),
+        instance.valueOfString("PT99999S", EdmLiteralKind.DEFAULT, null, Time.class).getTime());
+    dateTime.clear();
+    dateTime.set(Calendar.MINUTE, 10);
+    dateTime.set(Calendar.SECOND, 10);
+    dateTime.set(Calendar.YEAR, 0);
+    dateTime.set(Calendar.MONTH, 0);
+    dateTime.set(Calendar.DAY_OF_YEAR, 10);
+    dateTime.set(Calendar.HOUR_OF_DAY, 10);
+    assertEquals(dateTime.getTimeInMillis(),
+        instance.valueOfString("P10DT10H10M10S", EdmLiteralKind.DEFAULT, null, Time.class).getTime());
+    assertEquals(dateTime,
+        instance.valueOfString("P10DT10H10M10S", EdmLiteralKind.DEFAULT, null, Calendar.class));
+    assertEquals(200800000,
+        instance.valueOfString("P10DT10H10M10.2008S", EdmLiteralKind.DEFAULT, null, Timestamp.class).getNanos());
     expectErrorInValueOfString(instance, "PT999H", EdmLiteralKind.DEFAULT, null,
         EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT);
+    expectErrorInValueOfString(instance, "P0D", EdmLiteralKind.DEFAULT, null,
+        EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT);
     expectErrorInValueOfString(instance, "PT", EdmLiteralKind.DEFAULT, null,
         EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT);
     expectErrorInValueOfString(instance, "datetime'PT23H32M2S'", EdmLiteralKind.URI, null,
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
index 36b1cca..09dd38a 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
@@ -185,6 +185,9 @@
     dateTime.set(Calendar.HOUR_OF_DAY, 23);
     dateTime.set(Calendar.MINUTE, 32);
     dateTime.set(Calendar.SECOND, 3);
+    dateTime.set(Calendar.YEAR, 0);
+    dateTime.set(Calendar.MONTH, 0);
+    dateTime.set(Calendar.DAY_OF_YEAR, 0);
     assertEquals(dateTime, resultMap.get("Name"));
   }