protected T internalValueOfString()

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