private List parseMethodParameters()

in lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java [500:676]


  private List<Expression> parseMethodParameters(final MethodKind methodKind)
      throws UriParserException, UriValidationException {
    List<Expression> parameters = new ArrayList<>();
    switch (methodKind) {
    // Must have no parameter.
    case NOW:
    case MAXDATETIME:
    case MINDATETIME:
      ParserHelper.bws(tokenizer);
      break;

    // Must have one parameter.
    case LENGTH:
    case TOLOWER:
    case TOUPPER:
    case TRIM:
      ParserHelper.bws(tokenizer);
      final Expression stringParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(stringParameter, EdmPrimitiveTypeKind.String);
      checkNoCollection(stringParameter);
      parameters.add(stringParameter);
      break;
    case YEAR:
    case MONTH:
    case DAY:
      ParserHelper.bws(tokenizer);
      final Expression dateParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(dateParameter, EdmPrimitiveTypeKind.Date, EdmPrimitiveTypeKind.DateTimeOffset);
      checkNoCollection(dateParameter);
      parameters.add(dateParameter);
      break;
    case HOUR:
    case MINUTE:
    case SECOND:
    case FRACTIONALSECONDS:
      ParserHelper.bws(tokenizer);
      final Expression timeParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(timeParameter, EdmPrimitiveTypeKind.TimeOfDay, EdmPrimitiveTypeKind.DateTimeOffset);
      checkNoCollection(timeParameter);
      parameters.add(timeParameter);
      break;
    case DATE:
    case TIME:
    case TOTALOFFSETMINUTES:
      ParserHelper.bws(tokenizer);
      final Expression dateTimeParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(dateTimeParameter, EdmPrimitiveTypeKind.DateTimeOffset);
      checkNoCollection(dateTimeParameter);
      parameters.add(dateTimeParameter);
      break;
    case TOTALSECONDS:
      ParserHelper.bws(tokenizer);
      final Expression durationParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(durationParameter, EdmPrimitiveTypeKind.Duration);
      checkNoCollection(durationParameter);
      parameters.add(durationParameter);
      break;
    case ROUND:
    case FLOOR:
    case CEILING:
      ParserHelper.bws(tokenizer);
      final Expression decimalParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(decimalParameter,
          EdmPrimitiveTypeKind.Decimal, EdmPrimitiveTypeKind.Single, EdmPrimitiveTypeKind.Double);
      checkNoCollection(decimalParameter);
      parameters.add(decimalParameter);
      break;
    case GEOLENGTH:
      ParserHelper.bws(tokenizer);
      final Expression geoParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(geoParameter,
          EdmPrimitiveTypeKind.GeographyLineString, EdmPrimitiveTypeKind.GeometryLineString);
      checkNoCollection(geoParameter);
      parameters.add(geoParameter);
      break;

    // Must have two parameters.
    case CONTAINS:
    case ENDSWITH:
    case STARTSWITH:
    case INDEXOF:
    case CONCAT:
    case SUBSTRINGOF:
      ParserHelper.bws(tokenizer);
      final Expression stringParameter1 = parseExpression();
      checkType(stringParameter1, EdmPrimitiveTypeKind.String);
      checkNoCollection(stringParameter1);
      parameters.add(stringParameter1);
      ParserHelper.bws(tokenizer);
      ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
      ParserHelper.bws(tokenizer);
      final Expression stringParameter2 = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(stringParameter2, EdmPrimitiveTypeKind.String);
      checkNoCollection(stringParameter2);
      parameters.add(stringParameter2);
      break;
    case GEODISTANCE:
      ParserHelper.bws(tokenizer);
      final Expression geoParameter1 = parseExpression();
      checkType(geoParameter1, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint);
      checkNoCollection(geoParameter1);
      parameters.add(geoParameter1);
      ParserHelper.bws(tokenizer);
      ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
      ParserHelper.bws(tokenizer);
      final Expression geoParameter2 = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(geoParameter2, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint);
      checkNoCollection(geoParameter2);
      parameters.add(geoParameter2);
      break;
    case GEOINTERSECTS:
      ParserHelper.bws(tokenizer);
      final Expression geoPointParameter = parseExpression();
      checkType(geoPointParameter,
          EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint);
      checkNoCollection(geoPointParameter);
      parameters.add(geoPointParameter);
      ParserHelper.bws(tokenizer);
      ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
      ParserHelper.bws(tokenizer);
      final Expression geoPolygonParameter = parseExpression();
      ParserHelper.bws(tokenizer);
      checkType(geoPolygonParameter,
          EdmPrimitiveTypeKind.GeographyPolygon, EdmPrimitiveTypeKind.GeometryPolygon);
      checkNoCollection(geoPolygonParameter);
      parameters.add(geoPolygonParameter);
      break;

    // Can have two or three parameters.
    case SUBSTRING:
      ParserHelper.bws(tokenizer);
      final Expression parameterFirst = parseExpression();
      checkType(parameterFirst, EdmPrimitiveTypeKind.String);
      checkNoCollection(parameterFirst);
      parameters.add(parameterFirst);
      ParserHelper.bws(tokenizer);
      ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
      ParserHelper.bws(tokenizer);
      final Expression parameterSecond = parseExpression();
      ParserHelper.bws(tokenizer);
      checkIntegerType(parameterSecond);
      parameters.add(parameterSecond);
      ParserHelper.bws(tokenizer);
      if (tokenizer.next(TokenKind.COMMA)) {
        ParserHelper.bws(tokenizer);
        final Expression parameterThird = parseExpression();
        ParserHelper.bws(tokenizer);
        checkIntegerType(parameterThird);
        parameters.add(parameterThird);
      }
      break;

    // Can have one or two parameters.  These methods are handled elsewhere.
    case CAST:
    case ISOF:
      break;
      
    case COMPUTE_AGGREGATE:
      ApplyParser ap = new ApplyParser(edm, odata);
      AggregateExpression aggrExpr = ap.parseAggregateMethodCallExpr(tokenizer,
          (EdmStructuredType) referringType);
      parameters.add(aggrExpr);
      
    }
    ParserHelper.requireNext(tokenizer, TokenKind.CLOSE);
    
    return parameters;
  }