in odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/EdmTime.java [60:128]
protected <T> T internalValueOfString(final String value, final EdmLiteralKind literalKind, final EdmFacets facets,
final Class<T> returnType) throws EdmSimpleTypeException {
//OLINGO-883 prefix is case insensitve so we need to check with lower case if we want to use startsWith()
if (literalKind == EdmLiteralKind.URI
&& (value.length() <= 6 || !value.toLowerCase().startsWith("time'") || !value.endsWith("'"))) {
throw new EdmSimpleTypeException(EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(value));
}
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(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();
if (matcher.group(1) != null) {
dateTimeValue.set(Calendar.YEAR, Integer.parseInt(matcher.group(1)));
}
if (matcher.group(2) != null) {
dateTimeValue.set(Calendar.MONTH, Integer.parseInt(matcher.group(2)));
}
if (matcher.group(3) != null) {
dateTimeValue.set(Calendar.DAY_OF_YEAR, 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(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))) {
if (nanoSeconds % (1000 * 1000) == 0) {
dateTimeValue.set(Calendar.MILLISECOND, nanoSeconds / (1000 * 1000));
} else {
throw new EdmSimpleTypeException(EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(value));
}
}
} else {
throw new EdmSimpleTypeException(EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED.addContent(value, facets));
}
}
if (returnType.isAssignableFrom(Calendar.class)) {
return returnType.cast(dateTimeValue);
} else if (returnType.isAssignableFrom(Long.class)) {
return returnType.cast(dateTimeValue.getTimeInMillis());
} else if (returnType.isAssignableFrom(Date.class)) {
return returnType.cast(dateTimeValue.getTime());
} else if (returnType.isAssignableFrom(Time.class)) {
return returnType.cast(new Time(dateTimeValue.getTimeInMillis()));
} else if (returnType.isAssignableFrom(Timestamp.class)) {
Timestamp timestamp = new Timestamp(dateTimeValue.getTimeInMillis());
timestamp.setNanos(nanoSeconds);
return returnType.cast(timestamp);
} else {
throw new EdmSimpleTypeException(EdmSimpleTypeException.VALUE_TYPE_NOT_SUPPORTED.addContent(returnType));
}
}