[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"));
}