@Override protected <T> T internalValueOfString( final String value, final EdmLiteralKind literalKind, final EdmFacets facets, final Class<T> returnType) throws EdmSimpleTypeException { Calendar valueCalendar; if (literalKind == EdmLiteralKind.URI) { if (value.length() > 6 && value.startsWith("time'") && value.endsWith("'")) { valueCalendar = parseLiteral(value.substring(5, value.length() - 1), facets); } else { throw new EdmSimpleTypeException( EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(value)); } } else { valueCalendar = parseLiteral(value, facets); } if (returnType.isAssignableFrom(Calendar.class)) { return returnType.cast(valueCalendar); } else if (returnType.isAssignableFrom(Long.class)) { return returnType.cast(valueCalendar.getTimeInMillis()); } else if (returnType.isAssignableFrom(Date.class)) { return returnType.cast(valueCalendar.getTime()); } else { throw new EdmSimpleTypeException( EdmSimpleTypeException.VALUE_TYPE_NOT_SUPPORTED.addContent(returnType)); } }
private Calendar parseLiteral(final String literal, final EdmFacets facets) throws EdmSimpleTypeException { final Matcher matcher = PATTERN.matcher(literal); if (!matcher.matches() || (matcher.group(1) == null && matcher.group(2) == null && matcher.group(3) == null)) { throw new EdmSimpleTypeException( EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(literal)); } Calendar dateTimeValue = Calendar.getInstance(); dateTimeValue.clear(); dateTimeValue.set( Calendar.HOUR_OF_DAY, matcher.group(1) == null ? 0 : Integer.parseInt(matcher.group(1))); dateTimeValue.set( Calendar.MINUTE, matcher.group(2) == null ? 0 : Integer.parseInt(matcher.group(2))); dateTimeValue.set( Calendar.SECOND, matcher.group(3) == null ? 0 : Integer.parseInt(matcher.group(3))); if (matcher.group(4) != null) { if (facets == null || facets.getPrecision() == null || facets.getPrecision() >= matcher.group(4).length()) { if (matcher.group(4).length() <= 3) { dateTimeValue.set( Calendar.MILLISECOND, Short.parseShort( matcher.group(4) + "000".substring(0, 3 - matcher.group(4).length()))); } else { throw new EdmSimpleTypeException( EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(literal)); } } else { throw new EdmSimpleTypeException( EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED.addContent(literal, facets)); } } if (dateTimeValue.get(Calendar.DAY_OF_YEAR) == 1) { return dateTimeValue; } else { throw new EdmSimpleTypeException( EdmSimpleTypeException.LITERAL_ILLEGAL_CONTENT.addContent(literal)); } }