You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2017/04/27 13:41:49 UTC
[1/2] olingo-odata4 git commit: OLINGO-1046: allowing bad white space
where OData specificationa allows during the URL parsing
Repository: olingo-odata4
Updated Branches:
refs/heads/master 74a2da7d5 -> 4a51d1642
OLINGO-1046: allowing bad white space where OData specificationa allows during the URL parsing
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/2751c130
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/2751c130
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/2751c130
Branch: refs/heads/master
Commit: 2751c130e24506ccd1ba5da14b7eeef1863a0fc3
Parents: 7e262c8
Author: Ramesh Reddy <ra...@jboss.org>
Authored: Thu Apr 20 11:07:26 2017 -0500
Committer: Ramesh Reddy <ra...@jboss.org>
Committed: Thu Apr 20 11:07:26 2017 -0500
----------------------------------------------------------------------
.../server/core/uri/parser/ExpandParser.java | 1 +
.../core/uri/parser/ExpressionParser.java | 41 +++++++++++++++++++-
.../server/core/uri/parser/ParserHelper.java | 4 ++
.../server/core/uri/parser/SearchParser.java | 2 +
.../server/core/uri/parser/UriTokenizer.java | 2 +-
.../core/uri/parser/ExpressionParserTest.java | 10 +++++
6 files changed, 58 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2751c130/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpandParser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpandParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpandParser.java
index 53a14d7..60e858d 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpandParser.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpandParser.java
@@ -251,6 +251,7 @@ public class ExpandParser {
} 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)) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2751c130/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
index 7a34095..29ef5cb 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
@@ -254,12 +254,15 @@ public class ExpressionParser {
// The TokenKind 'IsOfMethod' consumes also the opening parenthesis.
// The first parameter could be an expression or a type literal.
List<Expression> parameters = new ArrayList<Expression>();
+ ParserHelper.bws(tokenizer);
parameters.add(parseExpression());
if (!(parameters.get(0) instanceof TypeLiteral)) {
// The first parameter is not a type literal, so there must be a second parameter.
+ ParserHelper.bws(tokenizer);
ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
+ ParserHelper.bws(tokenizer);
parameters.add(parseExpression());
-
+ ParserHelper.bws(tokenizer);
// The second parameter must be a type literal.
if (!(parameters.get(1) instanceof TypeLiteral)) {
throw new UriParserSemanticException("Type literal expected.",
@@ -335,7 +338,9 @@ public class ExpressionParser {
private Expression parseExprValue() throws UriParserException, UriValidationException {
if (tokenizer.next(TokenKind.OPEN)) {
+ ParserHelper.bws(tokenizer);
final Expression expression = parseExpression();
+ ParserHelper.bws(tokenizer);
ParserHelper.requireNext(tokenizer, TokenKind.CLOSE);
return expression;
}
@@ -441,6 +446,7 @@ public class ExpressionParser {
case NOW:
case MAXDATETIME:
case MINDATETIME:
+ ParserHelper.bws(tokenizer);
break;
// Must have one parameter.
@@ -448,7 +454,9 @@ public class ExpressionParser {
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);
@@ -456,7 +464,9 @@ public class ExpressionParser {
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);
@@ -465,7 +475,9 @@ public class ExpressionParser {
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);
@@ -473,13 +485,17 @@ public class ExpressionParser {
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);
@@ -487,14 +503,18 @@ public class ExpressionParser {
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);
@@ -507,35 +527,47 @@ public class ExpressionParser {
case STARTSWITH:
case INDEXOF:
case CONCAT:
+ 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);
@@ -544,16 +576,23 @@ public class ExpressionParser {
// 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);
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2751c130/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java
index 498ba18..edaabae 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java
@@ -108,6 +108,10 @@ public class ParserHelper {
requireNext(tokenizer, TokenKind.EOF);
}
+ protected static boolean bws(UriTokenizer tokenizer) {
+ return tokenizer.nextWhitespace();
+ }
+
protected static TokenKind next(UriTokenizer tokenizer, final TokenKind... kinds) {
for (final TokenKind kind : kinds) {
if (tokenizer.next(kind)) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2751c130/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/SearchParser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/SearchParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/SearchParser.java
index 8d046a5..2a6800e 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/SearchParser.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/SearchParser.java
@@ -71,7 +71,9 @@ public class SearchParser {
private SearchExpression processTerm(UriTokenizer tokenizer) throws SearchParserException {
if (tokenizer.next(TokenKind.OPEN)) {
+ ParserHelper.bws(tokenizer);
final SearchExpression expr = processExprOr(tokenizer);
+ ParserHelper.bws(tokenizer);
if (!tokenizer.next(TokenKind.CLOSE)) {
throw new SearchParserException("Missing close parenthesis after open parenthesis.",
SearchParserException.MessageKeys.MISSING_CLOSE);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2751c130/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
index 6654df9..37d49ca 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
@@ -801,7 +801,7 @@ public class UriTokenizer {
* otherwise leaves the index unchanged.
* @return whether whitespace characters have been found at the current index
*/
- private boolean nextWhitespace() {
+ boolean nextWhitespace() {
int count = 0;
while (nextCharacter(' ') || nextCharacter('\t')) {
count++;
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2751c130/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
index 1fce7b5..5646a4e 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
@@ -149,6 +149,10 @@ public class ExpressionParserTest {
expression = parseExpression("-(5 add 5)");
assertEquals("{MINUS {5 ADD 5}}", expression.toString());
+
+ expression = parseExpression("-( 5 add 5\t)");
+ assertEquals("{MINUS {5 ADD 5}}", expression.toString());
+
}
@Test
@@ -191,6 +195,8 @@ public class ExpressionParserTest {
wrongExpression("trim()");
wrongExpression("trim(1)");
wrongExpression("ceiling('1.2')");
+
+ assertEquals("{trim ['abc']}", parseExpression("trim( 'abc' )").toString());
}
@Test
@@ -209,6 +215,8 @@ public class ExpressionParserTest {
wrongExpression("concat('a')");
wrongExpression("endswith('a',1)");
+
+ assertEquals("{concat ['a', 'b']}", parseExpression("concat( 'a' ,\t'b' )").toString());
}
@Test
@@ -227,6 +235,8 @@ public class ExpressionParserTest {
wrongExpression("substring(1,2)");
wrongExpression("cast(1,2)");
wrongExpression("isof(Edm.Int16,2)");
+
+ assertEquals("{cast [42, Edm.SByte]}", parseExpression("cast( 42\t, Edm.SByte )").toString());
}
private void parseMethod(TokenKind kind, String... parameters) throws UriParserException, UriValidationException {
[2/2] olingo-odata4 git commit: Merge branch 'OLINGO-1046'
Posted by ra...@apache.org.
Merge branch 'OLINGO-1046'
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/4a51d164
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/4a51d164
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/4a51d164
Branch: refs/heads/master
Commit: 4a51d16425144a7de0be0f9dcd01c667bed322df
Parents: 74a2da7 2751c13
Author: Ramesh Reddy <ra...@jboss.org>
Authored: Thu Apr 27 08:36:56 2017 -0500
Committer: Ramesh Reddy <ra...@jboss.org>
Committed: Thu Apr 27 08:36:56 2017 -0500
----------------------------------------------------------------------
.../server/core/uri/parser/ExpandParser.java | 1 +
.../core/uri/parser/ExpressionParser.java | 41 +++++++++++++++++++-
.../server/core/uri/parser/ParserHelper.java | 4 ++
.../server/core/uri/parser/SearchParser.java | 2 +
.../server/core/uri/parser/UriTokenizer.java | 2 +-
.../core/uri/parser/ExpressionParserTest.java | 10 +++++
6 files changed, 58 insertions(+), 2 deletions(-)
----------------------------------------------------------------------