diff --git a/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/SelectItem.java b/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/SelectItem.java
index 14640b6a4..5616b5295 100644
--- a/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/SelectItem.java
+++ b/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/SelectItem.java
@@ -30,9 +30,6 @@ public interface SelectItem {
FullQualifiedName getAllOperationsInSchemaNameSpace();
- EdmEntityType getEntityTypeCast();
-
-
UriInfoResource getResourceInfo();
}
diff --git a/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedBinaryOperators.java b/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedBinaryOperators.java
index 7d16673f3..ce52f7670 100644
--- a/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedBinaryOperators.java
+++ b/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedBinaryOperators.java
@@ -28,8 +28,6 @@ public enum SupportedBinaryOperators {
ADD("add"), SUB("sub"),
// comparism
GT("gt"), GE("ge"), LT("lt"), LE("le"),
- // isof
- ISOF("isof"),
// equality
EQ("eq"), NE("ne"),
// and/or
diff --git a/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedMethodCalls.java b/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedMethodCalls.java
index f8228cc4a..b3e7804de 100644
--- a/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedMethodCalls.java
+++ b/odata4-lib/odata4-producer-api/src/main/java/org/apache/olingo/odata4/producer/api/uri/queryoption/expression/SupportedMethodCalls.java
@@ -29,7 +29,8 @@ public enum SupportedMethodCalls {
ROUND("round"), FLOOR("floor"),
- CEILING("ceiling"), DISTANCE("distance"), GEOLENGTH("geolength"), INTERSECTS("intersects"), CAST("cast"),
+ CEILING("ceiling"), GEODISTANCE("geo.distance"), GEOLENGTH("geo.length"), GEOINTERSECTS("geo.intersects"),
+ CAST("cast"),
ISOF("isof");
private String syntax;
diff --git a/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/odata4/producer/core/uri/antlr/UriParser.g4 b/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/odata4/producer/core/uri/antlr/UriParser.g4
index c0f0fe866..82d2d6007 100644
--- a/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/odata4/producer/core/uri/antlr/UriParser.g4
+++ b/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/odata4/producer/core/uri/antlr/UriParser.g4
@@ -268,7 +268,7 @@ commonExpr : OPEN commonExpr CLOSE
| vE1=commonExpr (WSP vO=MUL WSP | WSP vO=DIV WSP | WSP vO=MOD WSP ) vE2=commonExpr #altMult
| vE1=commonExpr (WSP vO=ADD WSP | WSP vO=SUB WSP) vE2=commonExpr #altAdd
| vE1=commonExpr (WSP vO=GT WSP | WSP vO=GE WSP | WSP vO=LT WSP
- | WSP vO=LE WSP | WSP vO=ISOF WSP) vE2=commonExpr #altComparism
+ | WSP vO=LE WSP ) vE2=commonExpr #altComparism
| vE1=commonExpr (WSP vO=EQ_ALPHA WSP | WSP vO=NE WSP) vE2=commonExpr #altEquality
| vE1=commonExpr (WSP AND WSP) vE2=commonExpr #altAnd
| vE1=commonExpr (WSP OR WSP) vE2=commonExpr #altOr
@@ -307,7 +307,7 @@ methodCallExpr : indexOfMethodCallExpr
| roundMethodCallExpr
| floorMethodCallExpr
| ceilingMethodCallExpr
- | distanceMethodCallExpr
+ | geoDistanceMethodCallExpr
| geoLengthMethodCallExpr
| totalOffsetMinutesMethodCallExpr
| minDateTimeMethodCallExpr
@@ -319,7 +319,7 @@ methodCallExpr : indexOfMethodCallExpr
| endsWithMethodCallExpr
| startsWithMethodCallExpr
| containsMethodCallExpr
- | intersectsMethodCallExpr
+ | geoIntersectsMethodCallExpr
;
@@ -354,9 +354,9 @@ roundMethodCallExpr : ROUND_WORD WSP? vE1=commonExpr WSP? CLOSE;
floorMethodCallExpr : FLOOR_WORD WSP? vE1=commonExpr WSP? CLOSE;
ceilingMethodCallExpr : CEILING_WORD WSP? vE1=commonExpr WSP? CLOSE;
-distanceMethodCallExpr : GEO_DISTANCE_WORD WSP? vE1=commonExpr WSP? COMMA WSP? vE2=commonExpr WSP? CLOSE;
+geoDistanceMethodCallExpr : GEO_DISTANCE_WORD WSP? vE1=commonExpr WSP? COMMA WSP? vE2=commonExpr WSP? CLOSE;
geoLengthMethodCallExpr : GEO_LENGTH_WORD WSP? vE1=commonExpr WSP? CLOSE;
-intersectsMethodCallExpr : GEO_INTERSECTS_WORD WSP? vE1=commonExpr WSP? COMMA WSP? vE2=commonExpr WSP? CLOSE;
+geoIntersectsMethodCallExpr : GEO_INTERSECTS_WORD WSP? vE1=commonExpr WSP? COMMA WSP? vE2=commonExpr WSP? CLOSE;
isofExpr : ISOF_WORD WSP? ( vE1=commonExpr WSP? COMMA WSP? )? vNS=namespace vODI=odataIdentifier WSP? CLOSE;
castExpr : CAST_WORD WSP? ( vE1=commonExpr WSP? COMMA WSP? )? vNS=namespace vODI=odataIdentifier WSP? CLOSE;
diff --git a/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/Parser.java b/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/Parser.java
index e1708698b..631914847 100644
--- a/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/Parser.java
+++ b/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/Parser.java
@@ -18,6 +18,7 @@
******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri;
+import org.antlr.v4.runtime.ANTLRErrorListener;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.BailErrorStrategy;
import org.antlr.v4.runtime.CommonTokenStream;
@@ -30,27 +31,29 @@ import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.OdataRelativeUriEOFContext;
public class Parser {
- static public UriInfo parseUri(final String input, final UriParseTreeVisitor uriParseTreeVisitor)
+ public UriInfo parseUri(final String input, final UriParseTreeVisitor uriParseTreeVisitor)
throws UriParserException {
try {
OdataRelativeUriEOFContext parseTree = parseInput(input, true);
- //reset visitor
+
+ // reset visitor
uriParseTreeVisitor.init();
parseTree.accept(uriParseTreeVisitor);
UriInfoImpl uriInput = uriParseTreeVisitor.getUriInfo();
+
return uriInput;
+
} catch (ParseCancellationException e) {
Throwable cause = e.getCause();
if (cause instanceof UriParserException) {
throw (UriParserException) cause;
}
}
- return null;
+ throw new UriParserSyntaxException("unknown syntax error");
}
-
- static private OdataRelativeUriEOFContext parseInput(final String input, boolean onResource)
+ private OdataRelativeUriEOFContext parseInput(final String input, boolean onResource)
throws UriParserSyntaxException {
UriParserParser parser = null;
UriLexer lexer = null;
@@ -65,11 +68,11 @@ public class Parser {
lexer = new UriLexer(new ANTLRInputStream(input));
parser = new UriParserParser(new CommonTokenStream(lexer));
- // TODO create better error collector
- parser.addErrorListener(new ErrorCollector());
+ // Set error strategy
+ addStage1ErrorStategy(parser);
- // bail out of parser at first syntax error. --> proceeds in catch block with step 2
- parser.setErrorHandler(new BailErrorStrategy());
+ // Set error collector
+ addStage1ErrorListener(parser);
// user the faster LL parsing
parser.getInterpreter().setPredictionMode(PredictionMode.SLL);
@@ -80,13 +83,16 @@ public class Parser {
} catch (ParseCancellationException hardException) {
// stage = 2
try {
-
+
// create parser
lexer = new UriLexer(new ANTLRInputStream(input));
parser = new UriParserParser(new CommonTokenStream(lexer));
- // Used default error strategy
- parser.setErrorHandler(new DefaultErrorStrategy());
+ // Set error strategy
+ addStage2ErrorStategy(parser);
+
+ // Set error collector
+ addStage2ErrorListener(parser);
// Use the slower SLL parsing
parser.getInterpreter().setPredictionMode(PredictionMode.LL);
@@ -106,4 +112,25 @@ public class Parser {
return ret;
}
+ protected void addStage1ErrorStategy(UriParserParser parser) {
+ // Throw exception at first syntax error
+ parser.setErrorHandler(new BailErrorStrategy());
+
+ }
+
+ protected void addStage2ErrorStategy(UriParserParser parser) {
+ // Throw exception at first syntax error
+ parser.setErrorHandler(new BailErrorStrategy());
+ }
+
+ protected void addStage1ErrorListener(UriParserParser parser) {
+ // No error logging to System.out or System.err, only exceptions used (depending on ErrorStrategy)
+ parser.removeErrorListeners();
+ }
+
+ protected void addStage2ErrorListener(UriParserParser parser) {
+ // No error logging to System.out or System.err, only exceptions used (depending on ErrorStrategy)
+ parser.removeErrorListeners();
+ }
+
}
diff --git a/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/UriParseTreeVisitor.java b/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/UriParseTreeVisitor.java
index 1e6c794cd..a66b711f8 100644
--- a/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/UriParseTreeVisitor.java
+++ b/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/odata4/producer/core/uri/UriParseTreeVisitor.java
@@ -80,7 +80,6 @@ import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.Crossjoi
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.CustomQueryOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.DateMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.DayMethodCallExprContext;
-import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.DistanceMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EndsWithMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EntityOptionCastContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EntityOptionContext;
@@ -98,12 +97,13 @@ import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FilterCo
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FloorMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FormatContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FractionalsecondsMethodCallExprContext;
+import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.GeoDistanceMethodCallExprContext;
+import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.GeoIntersectsMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.GeoLengthMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.HourMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IdContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IndexOfMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.InlinecountContext;
-import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IntersectsMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IsofExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.LengthMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.LevelsContext;
@@ -186,9 +186,8 @@ import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.TypeLit
* - Whenever it is possible to move edm validation to the AST classes then
* this should be done ( see visit {@link #visitSelectSegment} for example)
*
- * Not supported (TODO)
+ * Not supported
*
Parsing the context of $metadata
- * Evaluation of referential constrains for key predicates
*
* TODO
* clean up
@@ -382,6 +381,9 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor