in lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpandParser.java [233:312]
private void parseOptions(UriTokenizer tokenizer,
final EdmStructuredType referencedType, final boolean referencedIsCollection,
ExpandItemImpl item,
final boolean forRef, final boolean forCount) throws UriParserException, UriValidationException {
if (tokenizer.next(TokenKind.OPEN)) {
do {
SystemQueryOption systemQueryOption;
if (!forCount && tokenizer.next(TokenKind.COUNT)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
ParserHelper.requireNext(tokenizer, TokenKind.BooleanValue);
CountOptionImpl countOption = new CountOptionImpl();
countOption.setText(tokenizer.getText());
countOption.setValue(Boolean.parseBoolean(tokenizer.getText()));
systemQueryOption = countOption;
} else if (!forRef && !forCount && tokenizer.next(TokenKind.EXPAND)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
systemQueryOption = new ExpandParser(edm, odata, aliases, null).parse(tokenizer, referencedType);
} else if (tokenizer.next(TokenKind.FILTER)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
systemQueryOption = new FilterParser(edm, odata).parse(tokenizer, referencedType, null, aliases);
} else if (!forRef && !forCount && tokenizer.next(TokenKind.LEVELS)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
systemQueryOption = (SystemQueryOption) parseLevels(tokenizer);
} else if (!forCount && tokenizer.next(TokenKind.ORDERBY)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
systemQueryOption = new OrderByParser(edm, odata).parse(tokenizer, referencedType, null, aliases);
} else if (tokenizer.next(TokenKind.SEARCH)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
ParserHelper.bws(tokenizer);
systemQueryOption = new SearchParser().parse(tokenizer);
} else if (!forRef && !forCount && tokenizer.next(TokenKind.SELECT)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
systemQueryOption = new SelectParser(edm).parse(tokenizer, referencedType, referencedIsCollection);
} else if (!forCount && tokenizer.next(TokenKind.SKIP)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
ParserHelper.requireNext(tokenizer, TokenKind.IntegerValue);
final int value = ParserHelper.parseNonNegativeInteger(SystemQueryOptionKind.SKIP.toString(),
tokenizer.getText(), true);
SkipOptionImpl skipOption = new SkipOptionImpl();
skipOption.setText(tokenizer.getText());
skipOption.setValue(value);
systemQueryOption = skipOption;
} else if (!forCount && tokenizer.next(TokenKind.TOP)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
ParserHelper.requireNext(tokenizer, TokenKind.IntegerValue);
final int value = ParserHelper.parseNonNegativeInteger(SystemQueryOptionKind.TOP.toString(),
tokenizer.getText(), true);
TopOptionImpl topOption = new TopOptionImpl();
topOption.setText(tokenizer.getText());
topOption.setValue(value);
systemQueryOption = topOption;
} else if (!forRef && !forCount && tokenizer.next(TokenKind.APPLY)) {
ParserHelper.requireNext(tokenizer, TokenKind.EQ);
systemQueryOption = new ApplyParser(edm, odata).parse(tokenizer,
// Data aggregation may change the structure of the result, so we create a new dynamic type.
new DynamicStructuredType(referencedType), null, aliases);
} else {
throw new UriParserSyntaxException("Allowed query option expected.",
UriParserSyntaxException.MessageKeys.SYNTAX);
}
try {
item.setSystemQueryOption(systemQueryOption);
} catch (final ODataRuntimeException e) {
throw new UriParserSyntaxException("Double system query option '" + systemQueryOption.getName() + "'.", e,
UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION, systemQueryOption.getName());
}
} while (tokenizer.next(TokenKind.SEMI));
ParserHelper.requireNext(tokenizer, TokenKind.CLOSE);
}
}