in lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java [300:403]
private QueryOption parseOption(final String optionName, final String optionValue)
throws UriParserException, UriValidationException {
if (optionName.startsWith(DOLLAR)) {
final SystemQueryOptionKind kind = SystemQueryOptionKind.get(optionName);
if (kind == null) {
throw new UriParserSyntaxException("Unknown system query option!",
UriParserSyntaxException.MessageKeys.UNKNOWN_SYSTEM_QUERY_OPTION, optionName);
}
SystemQueryOptionImpl systemOption;
switch (kind) {
case SEARCH:
SearchOption searchOption = new SearchParser().parse(optionValue);
SearchOptionImpl tmp = new SearchOptionImpl();
tmp.setSearchExpression(searchOption.getSearchExpression());
systemOption = tmp;
break;
case FILTER:
systemOption = new FilterOptionImpl();
break;
case COUNT:
if ("true".equals(optionValue) || "false".equals(optionValue)) {
systemOption = new CountOptionImpl().setValue(Boolean.parseBoolean(optionValue));
} else {
throw new UriParserSyntaxException("Illegal value of $count option!",
UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION,
optionName, optionValue);
}
break;
case ORDERBY:
systemOption = new OrderByOptionImpl();
break;
case SKIP:
systemOption = new SkipOptionImpl()
.setValue(ParserHelper.parseNonNegativeInteger(optionName, optionValue, true));
break;
case SKIPTOKEN:
if (optionValue.isEmpty()) {
throw new UriParserSyntaxException("Illegal value of $skiptoken option!",
UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION,
optionName, optionValue);
}
systemOption = new SkipTokenOptionImpl().setValue(optionValue);
break;
case DELTATOKEN:
if (optionValue.isEmpty()) {
throw new UriParserSyntaxException("Illegal value of $deltatoken option!",
UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION,
optionName, optionValue);
}
systemOption = new DeltaTokenOptionImpl().setValue(optionValue);
break;
case TOP:
systemOption = new TopOptionImpl()
.setValue(ParserHelper.parseNonNegativeInteger(optionName, optionValue, true));
break;
case EXPAND:
systemOption = new ExpandOptionImpl();
break;
case SELECT:
systemOption = new SelectOptionImpl();
break;
case FORMAT:
if (optionValue.equalsIgnoreCase(JSON)
|| optionValue.equalsIgnoreCase(XML)
|| optionValue.equalsIgnoreCase(ATOM)
|| isFormatSyntaxValid(optionValue)) {
systemOption = new FormatOptionImpl().setFormat(optionValue);
} else {
throw new UriParserSyntaxException("Illegal value of $format option!",
UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT, optionValue);
}
break;
case ID:
if (optionValue.isEmpty()) {
throw new UriParserSyntaxException("Illegal value of $id option!",
UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION,
optionName, optionValue);
}
systemOption = new IdOptionImpl().setValue(optionValue);
break;
case LEVELS:
throw new UriParserSyntaxException("System query option '$levels' is allowed only inside '$expand'!",
UriParserSyntaxException.MessageKeys.SYSTEM_QUERY_OPTION_LEVELS_NOT_ALLOWED_HERE);
case APPLY:
systemOption = new ApplyOptionImpl();
break;
default:
throw new UriParserSyntaxException("System query option '" + kind + "' is not known!",
UriParserSyntaxException.MessageKeys.UNKNOWN_SYSTEM_QUERY_OPTION, optionName);
}
systemOption.setText(optionValue);
return systemOption;
} else if (optionName.startsWith(AT)) {
// Aliases can only be parsed in the context of their usage, so the value is not checked here.
return new AliasQueryOptionImpl()
.setName(optionName)
.setText(NULL.equals(optionValue) ? null : optionValue);
} else {
// The option is a custom query option; the caller can re-use its query option.
return null;
}
}