http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java deleted file mode 100644 index 0a582dc..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java +++ /dev/null @@ -1,2204 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.server.core.uri.parser; - -import org.antlr.v4.runtime.misc.NotNull; -import org.antlr.v4.runtime.misc.ParseCancellationException; -import org.antlr.v4.runtime.tree.ParseTree; -import org.apache.olingo.commons.api.edm.Edm; -import org.apache.olingo.commons.api.edm.EdmAction; -import org.apache.olingo.commons.api.edm.EdmActionImport; -import org.apache.olingo.commons.api.edm.EdmComplexType; -import org.apache.olingo.commons.api.edm.EdmElement; -import org.apache.olingo.commons.api.edm.EdmEntityContainer; -import org.apache.olingo.commons.api.edm.EdmEntitySet; -import org.apache.olingo.commons.api.edm.EdmEntityType; -import org.apache.olingo.commons.api.edm.EdmEnumType; -import org.apache.olingo.commons.api.edm.EdmFunction; -import org.apache.olingo.commons.api.edm.EdmFunctionImport; -import org.apache.olingo.commons.api.edm.EdmNavigationProperty; -import org.apache.olingo.commons.api.edm.EdmPrimitiveType; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.EdmProperty; -import org.apache.olingo.commons.api.edm.EdmSingleton; -import org.apache.olingo.commons.api.edm.EdmStructuredType; -import org.apache.olingo.commons.api.edm.EdmType; -import org.apache.olingo.commons.api.edm.FullQualifiedName; -import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; -import org.apache.olingo.server.api.uri.UriInfoKind; -import org.apache.olingo.server.api.uri.UriResource; -import org.apache.olingo.server.api.uri.UriResourcePartTyped; -import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; -import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind; -import org.apache.olingo.server.api.uri.queryoption.expression.UnaryOperatorKind; -import org.apache.olingo.server.core.uri.UriInfoImpl; -import org.apache.olingo.server.core.uri.UriParameterImpl; -import org.apache.olingo.server.core.uri.UriResourceActionImpl; -import org.apache.olingo.server.core.uri.UriResourceComplexPropertyImpl; -import org.apache.olingo.server.core.uri.UriResourceCountImpl; -import org.apache.olingo.server.core.uri.UriResourceEntitySetImpl; -import org.apache.olingo.server.core.uri.UriResourceFunctionImpl; -import org.apache.olingo.server.core.uri.UriResourceImpl; -import org.apache.olingo.server.core.uri.UriResourceItImpl; -import org.apache.olingo.server.core.uri.UriResourceLambdaAllImpl; -import org.apache.olingo.server.core.uri.UriResourceLambdaAnyImpl; -import org.apache.olingo.server.core.uri.UriResourceLambdaVarImpl; -import org.apache.olingo.server.core.uri.UriResourceNavigationPropertyImpl; -import org.apache.olingo.server.core.uri.UriResourcePrimitivePropertyImpl; -import org.apache.olingo.server.core.uri.UriResourceRefImpl; -import org.apache.olingo.server.core.uri.UriResourceRootImpl; -import org.apache.olingo.server.core.uri.UriResourceSingletonImpl; -import org.apache.olingo.server.core.uri.UriResourceStartingTypeFilterImpl; -import org.apache.olingo.server.core.uri.UriResourceTypedImpl; -import org.apache.olingo.server.core.uri.UriResourceValueImpl; -import org.apache.olingo.server.core.uri.UriResourceWithKeysImpl; -import org.apache.olingo.server.core.uri.antlr.UriLexer; -import org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor; -import org.apache.olingo.server.core.uri.antlr.UriParserParser; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AllEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AllExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltAddContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltAllContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltAndContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltAnyContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltComparismContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltEqualityContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltHasContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltMultContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltOrContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.AnyExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.BatchEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.BooleanNonCaseContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.CastExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.CeilingMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ConcatMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ConstSegmentContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ContainsMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.CrossjoinEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.DateMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.DayMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.EndsWithMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.EntityEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.EnumLitContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandCountOptionContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandItemContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandItemsContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandOptionContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandPathContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandPathExtensionContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandRefOptionContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.FilterContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.FilterExpressionEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.FloorMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.FractionalsecondsMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.GeoDistanceMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.GeoIntersectsMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.GeoLengthMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.HourMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.IndexOfMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.InlinecountContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.IsofExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.LengthMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.LevelsContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.MaxDateTimeMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.MemberExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.MetadataEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.MinDateTimeMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.MinuteMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.MonthMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.NameValueOptListContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.NameValuePairContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.NamespaceContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.NaninfinityContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.NowMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.NullruleContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.OdataIdentifierContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.OrderByContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.OrderByEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.OrderByItemContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.OrderListContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.PathSegmentContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.PathSegmentsContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.PrimitiveLiteralContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.QueryOptionContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.QueryOptionsContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.RootExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.RoundMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SecondMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectEOFContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectItemContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectSegmentContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SkipContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SkiptokenContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.StartsWithMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.SubstringMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.TimeMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ToLowerMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.ToUpperMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.TopContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.TotalOffsetMinutesMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.TotalsecondsMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.TrimMethodCallExprContext; -import org.apache.olingo.server.core.uri.antlr.UriParserParser.YearMethodCallExprContext; -import org.apache.olingo.server.core.uri.queryoption.CountOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.ExpandItemImpl; -import org.apache.olingo.server.core.uri.queryoption.ExpandOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.FilterOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.LevelsOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.OrderByItemImpl; -import org.apache.olingo.server.core.uri.queryoption.OrderByOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.QueryOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.SelectItemImpl; -import org.apache.olingo.server.core.uri.queryoption.SelectOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.SkipOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.SkipTokenOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.SystemQueryOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.AliasImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.BinaryImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.EnumerationImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.LiteralImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.MemberImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.MethodImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.TypeLiteralImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.UnaryImpl; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * UriVisitor - * - * Converts the URI parse tree the generated by ANTLR into an internal representation which maybe is given to the - * application. While converting the tree is only validated against the EDM if necessary. - * - * Attention: - * <li> This UriVisitor is at somes point more lax than the original ABNF - * <li> It is more tolerable against additional white spaces Currently not supported - * <li>Parsing the context of $metadata</li> - * <li>Parsing $search</li> - */ -public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> { - - public class TypeInformation { - - boolean isCollection; - - EdmType type; - - TypeInformation(final EdmType type, final boolean isCollection) { - this.type = type; - this.isCollection = isCollection; - } - - public TypeInformation() {} - } - - public UriContext context = null; - - public Edm edm; - - public EdmEntityContainer edmEntityContainer; - - // --- class --- - public UriParseTreeVisitor(final Edm edm, final UriContext context) { - this.edm = edm; - this.context = context; - edmEntityContainer = edm.getEntityContainer(null); - } - - @Override - protected Object aggregateResult(final Object aggregate, final Object nextResult) { - if (aggregate != null) { - return aggregate; - } else { - return nextResult; - } - } - - private FullQualifiedName getFullNameFromContext(final NamespaceContext vNS, final String odi) { - String namespace = vNS.getText(); - namespace = namespace.substring(0, namespace.length() - 1); // vNS contains a trailing point that has to be removed - return new FullQualifiedName(namespace, odi); - } - - private UriContext.LambdaVariables getLambdaVar(final String odi) { - for (UriContext.LambdaVariables item : context.allowedLambdaVariables) { - if (item.name.equals(odi)) { - return item; - } - } - return null; - } - - TypeInformation getTypeInformation(final UriResource lastResourcePart) { - - TypeInformation typeInformation = new TypeInformation(); - if (lastResourcePart instanceof UriResourceWithKeysImpl) { - UriResourceWithKeysImpl lastPartWithKeys = (UriResourceWithKeysImpl) lastResourcePart; - - if (lastPartWithKeys.getTypeFilterOnEntry() != null) { - typeInformation.type = lastPartWithKeys.getTypeFilterOnEntry(); - } else if (lastPartWithKeys.getTypeFilterOnCollection() != null) { - typeInformation.type = lastPartWithKeys.getTypeFilterOnCollection(); - } else { - typeInformation.type = lastPartWithKeys.getType(); - } - typeInformation.isCollection = lastPartWithKeys.isCollection(); - - } else if (lastResourcePart instanceof UriResourceTypedImpl) { - UriResourceTypedImpl lastPartTyped = (UriResourceTypedImpl) lastResourcePart; - - if (lastPartTyped.getTypeFilter() != null) { - typeInformation.type = lastPartTyped.getTypeFilter(); - } else { - typeInformation.type = lastPartTyped.getType(); - } - - typeInformation.isCollection = lastPartTyped.isCollection(); - } - - return typeInformation; - } - - public UriResourceTypedImpl readResourcePathSegment(final PathSegmentContext ctx) { - - final boolean checkFirst = - context.contextUriInfo.getLastResourcePart() == null - || context.contextUriInfo.getLastResourcePart() instanceof UriResourceRootImpl; - - String odi = ctx.vODI.getText(); - - if (checkFirst && ctx.vNS == null) { - - // check EntitySet - EdmEntitySet edmEntitySet = edmEntityContainer.getEntitySet(odi); - if (edmEntitySet != null) { - UriResourceEntitySetImpl uriResource = new UriResourceEntitySetImpl() - .setEntitSet(edmEntitySet); - context.contextUriInfo.addResourcePart(uriResource); - return null; - } - - // check Singleton - EdmSingleton edmSingleton = edmEntityContainer.getSingleton(odi); - if (edmSingleton != null) { - UriResourceSingletonImpl uriResource = new UriResourceSingletonImpl() - .setSingleton(edmSingleton); - context.contextUriInfo.addResourcePart(uriResource); - return null; - } - - // check ActionImport - EdmActionImport edmActionImport = edmEntityContainer.getActionImport(odi); - if (edmActionImport != null) { - UriResourceActionImpl uriResource = new UriResourceActionImpl() - .setActionImport(edmActionImport); - context.contextUriInfo.addResourcePart(uriResource); - return null; - } - - // check FunctionImport - EdmFunctionImport edmFunctionImport = edmEntityContainer.getFunctionImport(odi); - if (edmFunctionImport != null) { - - // read the URI parameters - context.contextReadingFunctionParameters = true; - @SuppressWarnings("unchecked") - List<UriParameterImpl> parameters = (List<UriParameterImpl>) ctx.vlNVO.get(0).accept(this); - context.contextReadingFunctionParameters = false; - - // mark parameters as consumed - ctx.vlNVO.remove(0); - - UriResourceFunctionImpl uriResource = new UriResourceFunctionImpl() - .setFunctionImport(edmFunctionImport, parameters); - - // collect parameter names - List<String> names = new ArrayList<String>(); - for (UriParameterImpl item : parameters) { - names.add(item.getName()); - } - - // get function from function import - EdmFunction function = edmFunctionImport.getUnboundFunction(names); - if (function == null) { - String tmp = ""; - for (String name : names) { - tmp += (tmp.length() != 0 ? "," : "") + name; - } - throw wrap(new UriParserSemanticException("Function of functionimport '" + edmFunctionImport.getName() - + "' with parameters [" + tmp + "] not found", - UriParserSemanticException.MessageKeys.FUNCTION_NOT_FOUND, edmFunctionImport.getName(), tmp)); - } - - uriResource.setFunction(edmFunctionImport.getUnboundFunction(names)); - context.contextUriInfo.addResourcePart(uriResource); - return null; - } - } - - TypeInformation source = null; - UriResource lastResourcePart = context.contextUriInfo.getLastResourcePart(); - - if (lastResourcePart == null) { - if (context.contextTypes.size() == 0) { - if(checkFirst && ctx.vNS == null){ - throw wrap(new UriParserSemanticException( - "Cannot find EntitySet, Singleton, ActionImport or FunctionImport with name '" + odi + "'.", - UriParserSemanticException.MessageKeys.RESOURCE_NOT_FOUND, odi)); - } - throw wrap(new UriParserSemanticException("Resource part '" + odi + "' can only applied on typed " - + "resource parts", - UriParserSemanticException.MessageKeys.RESOURCE_PART_ONLY_FOR_TYPED_PARTS, odi)); - } - source = context.contextTypes.peek(); - } else { - source = getTypeInformation(lastResourcePart); - - if (source.type == null) { - throw wrap(new UriParserSemanticException("Resource part '" + odi + "' can only be applied on typed " - + "resource parts.", UriParserSemanticException.MessageKeys.RESOURCE_PART_ONLY_FOR_TYPED_PARTS, odi)); - } - } - - if (ctx.vNS == null) { // without namespace - - // first check for lambda variable because a newly add property should not shadow a long used lambda variable - UriContext.LambdaVariables lVar = getLambdaVar(odi); - if (lVar != null) { - UriResourceLambdaVarImpl lambdaResource = new UriResourceLambdaVarImpl(); - lambdaResource.setVariableText(lVar.name); - lambdaResource.setType(lVar.type); - lambdaResource.setCollection(lVar.isCollection); - context.contextUriInfo.addResourcePart(lambdaResource); - return null; - } - - if (!(source.type instanceof EdmStructuredType)) { - throw wrap(new UriParserSemanticException("Cannot parse '" + odi - + "'; previous path segment is not a structural type.", - UriParserSemanticException.MessageKeys.RESOURCE_PART_MUST_BE_PRECEDED_BY_STRUCTURAL_TYPE, odi)); - } - - if (ctx.depth() <= 2 // path evaluation for the resource path - && source.isCollection) { - throw wrap(new UriParserSemanticException("Property '" + odi + "' is not allowed after collection.", - UriParserSemanticException.MessageKeys.PROPERTY_AFTER_COLLECTION, odi)); - } - - EdmStructuredType structType = (EdmStructuredType) source.type; - - EdmElement property = structType.getProperty(odi); - if (property == null) { - throw wrap(new UriParserSemanticException("Property '" + odi + "' not found in type '" - + structType.getNamespace() + "." + structType.getName() + "'", - ctx.depth() > 2 ? // path evaluation inside an expression or for the resource path? - UriParserSemanticException.MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE : - UriParserSemanticException.MessageKeys.PROPERTY_NOT_IN_TYPE, - structType.getFullQualifiedName().toString(), odi)); - } - - if (property instanceof EdmProperty) { - if (((EdmProperty) property).isPrimitive() == true) { - // create simple property - UriResourcePrimitivePropertyImpl simpleResource = new UriResourcePrimitivePropertyImpl() - .setProperty((EdmProperty) property); - context.contextUriInfo.addResourcePart(simpleResource); - return null; - } else { - // create complex property - UriResourceComplexPropertyImpl complexResource = new UriResourceComplexPropertyImpl() - .setProperty((EdmProperty) property); - context.contextUriInfo.addResourcePart(complexResource); - return null; - } - } else if (property instanceof EdmNavigationProperty) { - // create navigation property - UriResourceNavigationPropertyImpl navigationResource = new UriResourceNavigationPropertyImpl() - .setNavigationProperty((EdmNavigationProperty) property); - context.contextUriInfo.addResourcePart(navigationResource); - return null; - } else { - throw wrap(new UriParserSemanticException("Unkown type for property '" + property + "'", - UriParserSemanticException.MessageKeys.UNKNOWN_PROPERTY_TYPE, property.getName())); - } - - } else { // with namespace - - FullQualifiedName fullFilterName = getFullNameFromContext(ctx.vNS, odi); - - // EdmType lastType = getLastType(lastTyped); - if (source.type instanceof EdmEntityType) { - - EdmEntityType filterEntityType = edm.getEntityType(fullFilterName); - if (filterEntityType != null) { - // is entity type cast - if (!(filterEntityType.compatibleTo(source.type))) { - throw wrap(new UriParserSemanticException( - "Entity typefilter not compatible to previous path segment: " + fullFilterName.toString(), - UriParserSemanticException.MessageKeys.INCOMPATIBLE_TYPE_FILTER, fullFilterName.toString())); - } - - if (lastResourcePart == null) { - // this may be the case if a member expression within a filter starts with a typeCast - UriResourceStartingTypeFilterImpl uriResource = new UriResourceStartingTypeFilterImpl() - .setType(filterEntityType) - .setCollection(source.isCollection); - if (source.isCollection) { - uriResource.setCollectionTypeFilter(filterEntityType); - } else { - uriResource.setEntryTypeFilter(filterEntityType); - } - context.contextUriInfo.addResourcePart(uriResource); - return null; - } else { - - // check if last segment may contain key properties - if (lastResourcePart instanceof UriResourceWithKeysImpl) { - UriResourceWithKeysImpl lastPartWithKeys = (UriResourceWithKeysImpl) lastResourcePart; - - if (lastPartWithKeys.isCollection() == false) { - if (lastPartWithKeys.getTypeFilterOnEntry() != null) { - throw wrap(new UriParserSemanticException("Entry typefilters are not chainable, used '" - + getName(filterEntityType) + "' behind '" - + getName(lastPartWithKeys.getTypeFilterOnEntry()) + "'", - UriParserSemanticException.MessageKeys.TYPE_FILTER_NOT_CHAINABLE, - getName(lastPartWithKeys.getTypeFilterOnEntry()), getName(filterEntityType))); - } - lastPartWithKeys.setEntryTypeFilter(filterEntityType); - return null; - } else { - if (lastPartWithKeys.getTypeFilterOnCollection() != null) { - throw wrap(new UriParserSemanticException("Collection typefilters are not chainable, used '" - + getName(filterEntityType) + "' behind '" - + getName(lastPartWithKeys.getTypeFilterOnCollection()) + "'", - UriParserSemanticException.MessageKeys.TYPE_FILTER_NOT_CHAINABLE, - getName(lastPartWithKeys.getTypeFilterOnCollection()), getName(filterEntityType))); - } - lastPartWithKeys.setCollectionTypeFilter(filterEntityType); - return null; - } - } else if (lastResourcePart instanceof UriResourceTypedImpl) { - UriResourceTypedImpl lastPartTyped = (UriResourceTypedImpl) lastResourcePart; - if (lastPartTyped.getTypeFilter() != null) { - throw wrap(new UriParserSemanticException("Typefilters are not chainable, used '" - + getName(filterEntityType) + "' behind '" - + getName(lastPartTyped.getTypeFilter()) + "'", - UriParserSemanticException.MessageKeys.TYPE_FILTER_NOT_CHAINABLE, - getName(lastPartTyped.getTypeFilter()), getName(filterEntityType))); - } - - lastPartTyped.setTypeFilter(filterEntityType); - return null; - } else { - throw wrap(new UriParserSemanticException("Path segment before '" + getName(filterEntityType) - + "' not typed", - UriParserSemanticException.MessageKeys.PREVIOUS_PART_NOT_TYPED, getName(filterEntityType))); - } - } - } - - } else if (source.type instanceof EdmComplexType) { - - EdmComplexType filterComplexType = edm.getComplexType(fullFilterName); - - if (filterComplexType != null) { - - // is complex type cast - if (!(filterComplexType.compatibleTo(source.type))) { - throw wrap(new UriParserSemanticException( - "Complex typefilter '" + getName(source.type) + "'not compatible type of previous path segment '" - + getName(filterComplexType) + "'", - UriParserSemanticException.MessageKeys.INCOMPATIBLE_TYPE_FILTER, getName(source.type))); - } - - // is simple complex type cast - if (lastResourcePart == null) { - // this may be the case if a member expression within a filter starts with a typeCast - UriResourceStartingTypeFilterImpl uriResource = new UriResourceStartingTypeFilterImpl() - .setType(filterComplexType) - .setCollection(source.isCollection); - - if (source.isCollection) { - uriResource.setCollectionTypeFilter(filterComplexType); - } else { - uriResource.setEntryTypeFilter(filterComplexType); - } - context.contextUriInfo.addResourcePart(uriResource); - return null; - } else { - if (lastResourcePart instanceof UriResourceWithKeysImpl) { - // e.g. in case of function returning complex data or a list of complex data - UriResourceWithKeysImpl lastPartWithKeys = (UriResourceWithKeysImpl) lastResourcePart; - - if (lastPartWithKeys.isCollection() == false) { - if (lastPartWithKeys.getTypeFilterOnEntry() != null) { - throw wrap(new UriParserSemanticException("Entry typefilters are not chainable, used '" - + getName(filterComplexType) + "' behind '" - + getName(lastPartWithKeys.getTypeFilterOnEntry()) + "'", - UriParserSemanticException.MessageKeys.TYPE_FILTER_NOT_CHAINABLE, - getName(lastPartWithKeys.getTypeFilterOnEntry()), getName(filterComplexType))); - } - lastPartWithKeys.setEntryTypeFilter(filterComplexType); - return null; - } else { - if (lastPartWithKeys.getTypeFilterOnCollection() != null) { - throw wrap(new UriParserSemanticException("Collection typefilters are not chainable, used '" - + getName(filterComplexType) + "' behind '" - + getName(lastPartWithKeys.getTypeFilterOnCollection()) + "'", - UriParserSemanticException.MessageKeys.TYPE_FILTER_NOT_CHAINABLE, - getName(lastPartWithKeys.getTypeFilterOnCollection()), getName(filterComplexType))); - } - lastPartWithKeys.setCollectionTypeFilter(filterComplexType); - return null; - } - - } else if (lastResourcePart instanceof UriResourceTypedImpl) { - UriResourceTypedImpl lastPartTyped = (UriResourceTypedImpl) lastResourcePart; - if (lastPartTyped.getTypeFilter() != null) { - throw wrap(new UriParserSemanticException("Typefilters are not chainable, used '" - + getName(filterComplexType) + "' behind '" - + getName(lastPartTyped.getTypeFilter()) + "'", - UriParserSemanticException.MessageKeys.TYPE_FILTER_NOT_CHAINABLE, - getName(lastPartTyped.getTypeFilter()), getName(filterComplexType))); - } - - lastPartTyped.setTypeFilter(filterComplexType); - return null; - } else { - throw wrap(new UriParserSemanticException("Path segment before '" + getName(filterComplexType) - + "' not typed", - UriParserSemanticException.MessageKeys.PREVIOUS_PART_NOT_TYPED, getName(filterComplexType))); - } - } - } - } - - FullQualifiedName fullBindingTypeName = new FullQualifiedName(source.type.getNamespace(), source.type.getName()); - - // check for action - EdmAction action = edm.getBoundAction(fullFilterName, fullBindingTypeName, source.isCollection); - if (action != null) { - UriResourceActionImpl pathInfoAction = new UriResourceActionImpl(); - pathInfoAction.setAction(action); - context.contextUriInfo.addResourcePart(pathInfoAction); - return null; - } - - // do a check for bound functions (which requires a parameter list) - if (ctx.vlNVO.size() == 0) { - throw wrap(new UriParserSemanticException("Expected function parameters for '" + fullBindingTypeName.toString() - + "'", - UriParserSemanticException.MessageKeys.FUNCTION_PARAMETERS_EXPECTED, fullBindingTypeName.toString())); - } - - context.contextReadingFunctionParameters = true; - @SuppressWarnings("unchecked") - List<UriParameterImpl> parameters = (List<UriParameterImpl>) ctx.vlNVO.get(0).accept(this); - context.contextReadingFunctionParameters = false; - - // get names of function parameters - List<String> names = new ArrayList<String>(); - for (UriParameterImpl item : parameters) { - names.add(item.getName()); - } - - EdmFunction function = edm.getBoundFunction(fullFilterName, fullBindingTypeName, source.isCollection, names); - - if (function != null) { - UriResourceFunctionImpl pathInfoFunction = new UriResourceFunctionImpl() - .setFunction(function) - .setParameters(parameters); - context.contextUriInfo.addResourcePart(pathInfoFunction); - - // mark parameters as consumed - ctx.vlNVO.remove(0); - return null; - } - - // check for unbound function in the $filter case ( where the previous resource segment is a $it) - function = edm.getUnboundFunction(fullFilterName, names); - - if (function != null) { - UriResourceFunctionImpl pathInfoFunction = new UriResourceFunctionImpl() - .setFunction(function) - .setParameters(parameters); - context.contextUriInfo.addResourcePart(pathInfoFunction); - - // mark parameters as consumed - ctx.vlNVO.remove(0); - return null; - } - - throw wrap(new UriParserSemanticException("Unknown resource path segment:" + fullFilterName.toString(), - UriParserSemanticException.MessageKeys.UNKNOWN_PART, fullFilterName.toString())); - } - } - - private String getName(final EdmType type) { - return type.getFullQualifiedName().getFullQualifiedNameAsString(); - } - - @Override - public Object visitAllEOF(final AllEOFContext ctx) { - UriInfoImpl crossJoin = new UriInfoImpl().setKind(UriInfoKind.all); - context.contextUriInfo = crossJoin; - return null; - } - - @Override - public Object visitAllExpr(final AllExprContext ctx) { - UriResourceLambdaAllImpl all = new UriResourceLambdaAllImpl(); - - UriResource obj = context.contextUriInfo.getLastResourcePart(); - if (!(obj instanceof UriResourcePartTyped)) { - throw wrap(new UriParserSemanticException("all only allowed on typed path segments", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "all")); - } - - UriContext.LambdaVariables var = new UriContext.LambdaVariables(); - var.name = ctx.vLV.getText(); - var.type = getTypeInformation(obj).type; - var.isCollection = false; - - all.setLamdaVariable(ctx.vLV.getText()); - context.allowedLambdaVariables.push(var); - all.setExpression((ExpressionImpl) ctx.vLE.accept(this)); - context.allowedLambdaVariables.pop(); - return all; - } - - @Override - public ExpressionImpl visitAltAdd(final AltAddContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - int tokenIndex = ctx.vO.getType(); - - if (tokenIndex == UriLexer.ADD) { - binary.setOperator(BinaryOperatorKind.ADD); - } else if (tokenIndex == UriLexer.SUB) { - binary.setOperator(BinaryOperatorKind.SUB); - } - - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - return binary; - } - - @Override - public Object visitAltAll(final AltAllContext ctx) { - - UriInfoImpl uriInfoImplpath = new UriInfoImpl().setKind(UriInfoKind.resource); - - uriInfoImplpath.addResourcePart((UriResourceImpl) super.visitAltAll(ctx)); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfoImplpath); - - MemberImpl ret = new MemberImpl(); - - ret.setResourcePath(uriInfoImplpath); - if (startType != null) { - ret.setTypeFilter(startType); - } - - return ret; - } - - private EdmType removeUriResourceStartingTypeFilterImpl(final UriInfoImpl uriInfoImplpath) { - - List<UriResource> segments = uriInfoImplpath.getUriResourceParts(); - if (segments.size() == 0) { - return null; - } - - UriResource segment = segments.get(0); - if (segment instanceof UriResourceStartingTypeFilterImpl) { - UriResourceStartingTypeFilterImpl startingTypeFilter = (UriResourceStartingTypeFilterImpl) segment; - - EdmType type = null; - if (startingTypeFilter.getTypeFilterOnEntry() != null) { - type = startingTypeFilter.getTypeFilterOnEntry(); - } else if (startingTypeFilter.getTypeFilterOnCollection() != null) { - type = startingTypeFilter.getTypeFilterOnCollection(); - } else { - type = startingTypeFilter.getType(); - } - - uriInfoImplpath.removeResourcePart(0); - return type; - } - - return null; - } - - @Override - public ExpressionImpl visitAltAnd(final AltAndContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - binary.setOperator(BinaryOperatorKind.AND); - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - - return binary; - } - - @Override - public Object visitAltAny(final AltAnyContext ctx) { - UriInfoImpl uriInfoImplpath = new UriInfoImpl().setKind(UriInfoKind.resource); - - uriInfoImplpath.addResourcePart((UriResourceImpl) super.visitAltAny(ctx)); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfoImplpath); - - MemberImpl ret = new MemberImpl(); - ret.setResourcePath(uriInfoImplpath); - if (startType != null) { - ret.setTypeFilter(startType); - } - return ret; - } - - @Override - public Object visitBatchEOF(final BatchEOFContext ctx) { - context.contextUriInfo = new UriInfoImpl().setKind(UriInfoKind.batch); - return null; - } - - @Override - public ExpressionImpl visitAltComparism(final AltComparismContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - int tokenIndex = ctx.vO.getType(); - - if (tokenIndex == UriLexer.GT) { - binary.setOperator(BinaryOperatorKind.GT); - } else if (tokenIndex == UriLexer.GE) { - binary.setOperator(BinaryOperatorKind.GE); - } else if (tokenIndex == UriLexer.LT) { - binary.setOperator(BinaryOperatorKind.LT); - } else if (tokenIndex == UriLexer.LE) { - binary.setOperator(BinaryOperatorKind.LE); - } - - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - return binary; - } - - @Override - public Object visitEntityEOF(final EntityEOFContext ctx) { - String odi = ctx.vODI.getText(); - FullQualifiedName fullName = getFullNameFromContext(ctx.vNS, odi); - - EdmEntityType type = edm.getEntityType(fullName); - if (type == null) { - throw wrap(new UriParserSemanticException("Expected EntityTypeName", - UriParserSemanticException.MessageKeys.UNKNOWN_ENTITY_TYPE, fullName.toString())); - } - context.contextUriInfo.setEntityTypeCast(type); - - // contextUriInfo = uriInfo; - context.contextTypes.push(new TypeInformation(context.contextUriInfo.getEntityTypeCast(), true)); - - // @SuppressWarnings("unchecked") - // List<QueryOptionImpl> list = (List<QueryOptionImpl>) ctx.vEO.accept(this); - // uriInfo.setQueryOptions(list); - return null; - } - - @Override - public ExpressionImpl visitAltEquality(final AltEqualityContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - int tokenIndex = ctx.vO.getType(); - - if (tokenIndex == UriLexer.EQ_ALPHA) { - binary.setOperator(BinaryOperatorKind.EQ); - } else { - binary.setOperator(BinaryOperatorKind.NE); - } - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - - return binary; - } - - @Override - public Object visitAltHas(final AltHasContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - binary.setOperator(BinaryOperatorKind.HAS); - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - - return binary; - } - - @Override - public Object visitMetadataEOF(final MetadataEOFContext ctx) { - UriInfoImpl uriInfo = new UriInfoImpl().setKind(UriInfoKind.metadata); - - context.contextUriInfo = uriInfo; - return null; - } - - @Override - public ExpressionImpl visitAltMult(final AltMultContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - int tokenIndex = ctx.vO.getType(); - - if (tokenIndex == UriLexer.MUL) { - binary.setOperator(BinaryOperatorKind.MUL); - } else if (tokenIndex == UriLexer.DIV) { - binary.setOperator(BinaryOperatorKind.DIV); - } else { - binary.setOperator(BinaryOperatorKind.MOD); - } - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - - return binary; - } - - @Override - public ExpressionImpl visitAltOr(final AltOrContext ctx) { - BinaryImpl binary = new BinaryImpl(); - - binary.setOperator(BinaryOperatorKind.OR); - binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this)); - binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this)); - - return binary; - } - - @Override - public Object visitAnyExpr(final AnyExprContext ctx) { - UriResourceLambdaAnyImpl any = new UriResourceLambdaAnyImpl(); - if (ctx.vLV != null) { - UriResourceImpl lastResourcePart = (UriResourceImpl) context.contextUriInfo.getLastResourcePart(); - if (!(lastResourcePart instanceof UriResourcePartTyped)) { - throw wrap(new UriParserSemanticException("any only allowed on typed path segments", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "any")); - } - - UriContext.LambdaVariables var = new UriContext.LambdaVariables(); - var.name = ctx.vLV.getText(); - var.type = getTypeInformation(lastResourcePart).type; - var.isCollection = false; - - any.setLamdaVariable(ctx.vLV.getText()); - context.allowedLambdaVariables.push(var); - any.setExpression((ExpressionImpl) ctx.vLE.accept(this)); - context.allowedLambdaVariables.pop(); - } - return any; - } - - @Override - public Object visitBooleanNonCase(final BooleanNonCaseContext ctx) { - String text = ctx.getText().toLowerCase(); - - if (text.equals("false")) { - return new LiteralImpl().setText("false").setType( - EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean)); - } - return new LiteralImpl().setText("true").setType( - EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean)); - } - - @Override - public ExpressionImpl visitCastExpr(final CastExprContext ctx) { - MethodImpl method = new MethodImpl(); - if (ctx.vE1 != null) { - // is optional parameter - ExpressionImpl onExpression = (ExpressionImpl) ctx.vE1.accept(this); - method.addParameter(onExpression); - } - - String namespace = ctx.vNS.getText(); - namespace = namespace.substring(0, namespace.length() - 1); - - FullQualifiedName fullName = new FullQualifiedName(namespace, ctx.vODI.getText()); - EdmType type = getType(fullName); - method.setMethod(MethodKind.CAST); - method.addParameter(new TypeLiteralImpl().setType(type)); - return method; - } - - private EdmType getType(final FullQualifiedName fullName) { - EdmType type = null; - - type = edm.getEntityType(fullName); - if (type != null) { - return type; - } - - type = edm.getComplexType(fullName); - if (type != null) { - return type; - } - - type = edm.getEnumType(fullName); - if (type != null) { - return type; - } - - if (fullName.getNamespace().equals(EdmPrimitiveType.EDM_NAMESPACE)) { - final EdmPrimitiveTypeKind typeKind = EdmPrimitiveTypeKind.valueOf(fullName.getName()); - type = EdmPrimitiveTypeFactory.getInstance(typeKind); - if (type != null) { - return type; - } - } - - return null; - - } - - @Override - public ExpressionImpl visitCeilingMethodCallExpr(final CeilingMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.CEILING) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitConcatMethodCallExpr(final ConcatMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.CONCAT) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public Object visitConstSegment(final ConstSegmentContext ctx) { - UriInfoImpl uriInfoResource = context.contextUriInfo; - UriResource pathInfo = uriInfoResource.getLastResourcePart(); - - if (ctx.vV != null) { - if (pathInfo instanceof UriResourcePartTyped) { - if (!((UriResourcePartTyped) pathInfo).isCollection()) { - context.contextUriInfo.addResourcePart(new UriResourceValueImpl()); - } else { - throw wrap(new UriParserSemanticException("$value only allowed on typed path segments", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "$value")); - } - return null; - } else { - throw wrap(new UriParserSemanticException("$value only allowed on typed path segments", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "$value")); - } - - } else if (ctx.vC != null) { - if (pathInfo instanceof UriResourcePartTyped) { - if (((UriResourcePartTyped) pathInfo).isCollection()) { - context.contextUriInfo.addResourcePart(new UriResourceCountImpl()); - } else { - throw wrap(new UriParserSemanticException("$count only allowed on collection properties", - UriParserSemanticException.MessageKeys.ONLY_FOR_COLLECTIONS, "$count")); - } - } else { - throw wrap(new UriParserSemanticException("$count only allowed on typed properties", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "$count")); - } - } else if (ctx.vR != null) { - if (pathInfo instanceof UriResourcePartTyped) { - EdmType type = ((UriResourcePartTyped) pathInfo).getType(); - if (type instanceof EdmEntityType) { - context.contextUriInfo.addResourcePart(new UriResourceRefImpl()); - } else { - throw wrap(new UriParserSemanticException("$ref only allowed on entity types", - UriParserSemanticException.MessageKeys.ONLY_FOR_ENTITY_TYPES, "$ref")); - } - } else { - throw wrap(new UriParserSemanticException("$ref only allowed on typed properties", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PROPERTIES, "$ref")); - } - - } else if (ctx.vAll != null) { - context.contextUriInfo.addResourcePart((UriResourceLambdaAllImpl) ctx.vAll.accept(this)); - } else if (ctx.vAny != null) { - context.contextUriInfo.addResourcePart((UriResourceLambdaAnyImpl) ctx.vAny.accept(this)); - } - return null; - } - - @Override - public ExpressionImpl visitContainsMethodCallExpr(final ContainsMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.CONTAINS) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public Object visitCrossjoinEOF(final CrossjoinEOFContext ctx) { - UriInfoImpl crossJoin = new UriInfoImpl().setKind(UriInfoKind.crossjoin); - - for (OdataIdentifierContext obj : ctx.vlODI) { - crossJoin.addEntitySetName(obj.getText()); - } - - context.contextUriInfo = crossJoin; - return null; - } - - @Override - public Object visitDateMethodCallExpr(final DateMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.DATE) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitDayMethodCallExpr(final DayMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.DAY) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitGeoDistanceMethodCallExpr(final GeoDistanceMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.GEODISTANCE) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public Object visitEndsWithMethodCallExpr(final EndsWithMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.ENDSWITH) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public Object visitEnumLit(final EnumLitContext ctx) { - EnumerationImpl enum1 = new EnumerationImpl(); - - // get type - String odi = ctx.vODI.getText(); - - FullQualifiedName fullName = getFullNameFromContext(ctx.vNS, odi); - EdmEnumType edmEnumType = edm.getEnumType(fullName); - - enum1.setType(edmEnumType); - - String valueString = ctx.vValues.getText(); - valueString = valueString.substring(1, valueString.length() - 1); - - String[] values = valueString.split(","); - for (String item : values) { - enum1.addValue(item); - } - - return enum1; - } - - @Override - public Object visitExpandItems(final ExpandItemsContext ctx) { - ExpandOptionImpl expand = new ExpandOptionImpl(); - expand.setText(ctx.getText()); - for (ExpandItemContext eI : ctx.vlEI) { - expand.addExpandItem((ExpandItemImpl) eI.accept(this)); - } - - return expand; - } - - @Override - public Object visitExpandItem(final ExpandItemContext ctx) { - - ExpandItemImpl expandItem = null; - if (ctx.vS != null) { - expandItem = new ExpandItemImpl().setIsStar(true); - if (ctx.vR != null) { - expandItem.setIsRef(true); - } else if (ctx.vM != null) { - LevelsOptionImpl levels = new LevelsOptionImpl().setMax(); - levels.setText(ctx.vM.getText()); - expandItem.setSystemQueryOption(levels); - } else if (ctx.vL != null) { - LevelsOptionImpl levels = new LevelsOptionImpl(); - String text = ctx.vL.getText(); - levels.setText(text); - levels.setValue(Integer.parseInt(text)); - expandItem.setSystemQueryOption(levels); - } - - } else if (ctx.vEP != null) { - expandItem = (ExpandItemImpl) ctx.vEP.accept(this); - - if (ctx.vEPE != null) { - ExpandItemImpl contextExpandItemPathBU = context.contextExpandItemPath; - context.contextExpandItemPath = expandItem; - - @SuppressWarnings("unchecked") - List<SystemQueryOptionImpl> list = (List<SystemQueryOptionImpl>) ctx.vEPE.accept(this); - for (SystemQueryOptionImpl option : list) { - expandItem.setSystemQueryOption(option); - } - context.contextExpandItemPath = contextExpandItemPathBU; - } - } - - return expandItem; - - } - - @Override - public Object visitExpandPath(final ExpandPathContext ctx) { - ExpandItemImpl expandItem = new ExpandItemImpl(); - - // UriResourceItImpl pathInfoIT = new UriResourceItImpl(); - context.contextUriInfo.getLastResourcePart(); - - // save context - ExpandItemImpl contextExpandItemPathBU = context.contextExpandItemPath; - UriInfoImpl uriInfoResourceBU = context.contextUriInfo; - - // set tmp context - context.contextExpandItemPath = expandItem; - context.contextUriInfo = new UriInfoImpl().setKind(UriInfoKind.resource); - // contextUriInfo.addPathInfo(pathInfoIT); - - super.visitExpandPath(ctx); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(context.contextUriInfo); - expandItem.setResourcePath(context.contextUriInfo); - if (startType != null) { - expandItem.setTypeFilter(startType); - } - - // reset context - context.contextUriInfo = uriInfoResourceBU; - context.contextExpandItemPath = contextExpandItemPathBU; - - return expandItem; - } - - @Override - public Object visitExpandPathExtension(final ExpandPathExtensionContext ctx) { - List<SystemQueryOptionImpl> list = new ArrayList<SystemQueryOptionImpl>(); - - EdmType targetType = null; - boolean isColl = false; - if (context.contextExpandItemPath == null) { - // use the type of the last resource path segement - UriResourceTypedImpl lastSegment = (UriResourceTypedImpl) context.contextUriInfo.getLastResourcePart(); - targetType = getTypeInformation(lastSegment).type; - isColl = lastSegment.isCollection(); - } else { - if (context.contextExpandItemPath.getResourcePath() == null) { - // use the type of the last resource path segement - UriResourceTypedImpl lastSegment = (UriResourceTypedImpl) context.contextUriInfo.getLastResourcePart(); - targetType = getTypeInformation(lastSegment).type; - isColl = lastSegment.isCollection(); - } else { - // use the type of the last ''expand'' path segement - UriInfoImpl info = (UriInfoImpl) context.contextExpandItemPath.getResourcePath(); - targetType = getTypeInformation(info.getLastResourcePart()).type; - isColl = ((UriResourcePartTyped) info.getLastResourcePart()).isCollection(); - } - } - - context.contextTypes.push(new TypeInformation(targetType, isColl)); - - if (ctx.vC != null) { - UriInfoImpl resourcePath = (UriInfoImpl) context.contextExpandItemPath.getResourcePath(); - resourcePath.addResourcePart(new UriResourceCountImpl()); - - for (ExpandCountOptionContext s : ctx.vlEOC) { - list.add((SystemQueryOptionImpl) s.accept(this)); - } - } else if (ctx.vR != null) { - UriInfoImpl resourcePath = (UriInfoImpl) context.contextExpandItemPath.getResourcePath(); - resourcePath.addResourcePart(new UriResourceRefImpl()); - - for (ExpandRefOptionContext s : ctx.vlEOR) { - list.add((SystemQueryOptionImpl) s.accept(this)); - } - } else { - for (ExpandOptionContext s : ctx.vlEO) { - list.add((SystemQueryOptionImpl) s.accept(this)); - } - } - - context.contextTypes.pop(); - return list; - - } - - @Override - public Object visitFilter(final FilterContext ctx) { - - FilterOptionImpl filter = new FilterOptionImpl().setExpression((ExpressionImpl) ctx.children.get(2).accept(this)); - return filter; - } - - @Override - public Object visitFilterExpressionEOF(final FilterExpressionEOFContext ctx) { - - FilterOptionImpl filter = new FilterOptionImpl().setExpression((ExpressionImpl) ctx.children.get(0).accept(this)); - return filter; - } - - @Override - public ExpressionImpl visitFloorMethodCallExpr(final FloorMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.FLOOR) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitFractionalsecondsMethodCallExpr(final FractionalsecondsMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.FRACTIONALSECONDS) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitGeoLengthMethodCallExpr(final GeoLengthMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.GEOLENGTH) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitHourMethodCallExpr(final HourMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.HOUR) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitIndexOfMethodCallExpr(final IndexOfMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.INDEXOF) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public Object visitInlinecount(final InlinecountContext ctx) { - CountOptionImpl inlineCount = new CountOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return inlineCount.setValue(text.toLowerCase().equals("true") ? true : false).setText(text); - } - - @Override - public ExpressionImpl visitGeoIntersectsMethodCallExpr(final GeoIntersectsMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.GEOINTERSECTS) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public ExpressionImpl visitIsofExpr(final IsofExprContext ctx) { - MethodImpl method = new MethodImpl(); - if (ctx.vE1 != null) { - ExpressionImpl onExpression = (ExpressionImpl) ctx.vE1.accept(this); - method.addParameter(onExpression); - } - - String namespace = ctx.vNS.getText(); - namespace = namespace.substring(0, namespace.length() - 1); - - FullQualifiedName fullName = new FullQualifiedName(namespace, ctx.vODI.getText()); - EdmType type = getType(fullName); - method.setMethod(MethodKind.ISOF); - method.addParameter(new TypeLiteralImpl().setType(type)); - - return method; - } - - @Override - public ExpressionImpl visitLengthMethodCallExpr(final LengthMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.LENGTH) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public Object visitLevels(final LevelsContext ctx) { - - LevelsOptionImpl levels = new LevelsOptionImpl(); - - String text = ctx.children.get(2).getText(); - - if (text.equals("max")) { - levels.setMax(); - } else { - levels.setValue(Integer.parseInt(text)); - } - levels.setText(text); - - return levels; - - } - - @Override - public ExpressionImpl visitMaxDateTimeMethodCallExpr(final MaxDateTimeMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.MAXDATETIME); - } - - @Override - public Object visitMemberExpr(final MemberExprContext ctx) { - - UriInfoImpl uriInfoImplpath = new UriInfoImpl().setKind(UriInfoKind.resource); - - if (context.contextTypes.isEmpty()) { - throw wrap(new UriParserSemanticException("Expression '" + ctx.getText() + "' is not allowed as key value.", - UriParserSemanticException.MessageKeys.INVALID_KEY_VALUE, ctx.getText())); - } - TypeInformation lastTypeInfo = context.contextTypes.peek(); - - if (ctx.vIt != null || ctx.vIts != null) { - UriResourceItImpl pathInfoIT = new UriResourceItImpl(); - pathInfoIT.setType(lastTypeInfo.type); - pathInfoIT.setCollection(lastTypeInfo.isCollection); - uriInfoImplpath.addResourcePart(pathInfoIT); - } - - if (ctx.vPs != null) { - // save the context - UriInfoImpl backupUriInfoPath = context.contextUriInfo; - - // set temporary uriInfoPath - context.contextUriInfo = uriInfoImplpath; - - ctx.vPs.accept(this); - - // reset context - context.contextUriInfo = backupUriInfoPath; - } - - if (ctx.vALL != null) { - uriInfoImplpath.addResourcePart((UriResourceImpl) ctx.vALL.accept(this)); - } - if (ctx.vANY != null) { - uriInfoImplpath.addResourcePart((UriResourceImpl) ctx.vANY.accept(this)); - } - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfoImplpath); - - MemberImpl ret = new MemberImpl(); - ret.setResourcePath(uriInfoImplpath); - if (startType != null) { - ret.setTypeFilter(startType); - } - - return ret; - } - - @Override - public ExpressionImpl visitMinDateTimeMethodCallExpr(final MinDateTimeMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.MINDATETIME); - } - - @Override - public ExpressionImpl visitMinuteMethodCallExpr(final MinuteMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.MINUTE) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitMonthMethodCallExpr(final MonthMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.MONTH) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public Object visitNameValueOptList(final NameValueOptListContext ctx) { - if (ctx.vVO != null) { - - // is single key predicate without a name - String valueText = ctx.vVO.getText(); - ExpressionImpl expression = null; - try { - expression = (ExpressionImpl) ctx.vVO.accept(this); - } catch (final RuntimeException e) { - throw wrap(new UriParserSemanticException("Invalid key value: " + valueText, e, - UriParserSemanticException.MessageKeys.INVALID_KEY_VALUE, valueText)); - } - - // get type of last resource part - UriResource last = context.contextUriInfo.getLastResourcePart(); - if (!(last instanceof UriResourcePartTyped)) { - throw wrap(new UriParserSemanticException("Parameters list on untyped resource path segment not allowed", - UriParserSemanticException.MessageKeys.PARAMETERS_LIST_ONLY_FOR_TYPED_PARTS)); - } - EdmEntityType lastType = (EdmEntityType) ((UriResourcePartTyped) last).getType(); - - // get list of keys for lastType - List<String> lastKeyPredicates = lastType.getKeyPredicateNames(); - - // If there is exactly one key defined in the EDM, then this key is the key written in the URI, - // so fill the keylist with this key and return. - if (lastKeyPredicates.size() == 1) { - return Collections.singletonList(new UriParameterImpl() - .setName(lastKeyPredicates.get(0)) - .setText(valueText) - .setExpression(expression)); - } - - // There are more keys defined in the EDM, but only one is written in the URI. This is allowed only if - // referential constraints are defined on this navigation property which can be used to fill up all - // required keys. - // For using referential constraints the last resource part must be a navigation property. - if (!(context.contextUriInfo.getLastResourcePart() instanceof UriResourceNavigationPropertyImpl)) { - throw wrap(new UriParserSemanticException("Wrong number of key properties.", - UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, - Integer.toString(lastKeyPredicates.size()), "1")); - } - UriResourceNavigationPropertyImpl lastNav = (UriResourceNavigationPropertyImpl) last; - - // get the partner of the navigation property - EdmNavigationProperty partner = lastNav.getProperty().getPartner(); - if (partner == null) { - throw wrap(new UriParserSemanticException("Wrong number of key properties.", - UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, - Integer.toString(lastKeyPredicates.size()), "1")); - } - - // create the keylist - List<UriParameterImpl> list = new ArrayList<UriParameterImpl>(); - - // Find the keys not filled by referential constraints - // and collect the other keys filled by referential constraints. - String missedKey = null; - for (String item : lastKeyPredicates) { - String property = partner.getReferencingPropertyName(item); - if (property != null) { - list.add(new UriParameterImpl().setName(item).setRefencedProperty(property)); - } else { - if (missedKey == null) { - missedKey = item; - } else { - // two of more keys are missing - throw wrap(new UriParserSemanticException("Not enough referential constraints defined", - UriParserSemanticException.MessageKeys.NOT_ENOUGH_REFERENTIAL_CONSTRAINTS)); - } - } - } - - // the missing key is the one which is defined in the URI - list.add(new UriParameterImpl().setName(missedKey).setText(valueText).setExpression(expression)); - - return list; - } else if (ctx.vNVL != null) { - - List<UriParameterImpl> list = new ArrayList<UriParameterImpl>(); - - for (ParseTree c : ctx.vNVL.vlNVP) { - list.add((UriParameterImpl) c.accept(this)); - } - - if (context.contextReadingFunctionParameters) { - return list; - } - - UriResource last = context.contextUriInfo.getLastResourcePart(); - // if the last resource part is a function - /* - * if (last instanceof UriResourceFunctionImpl) { - * UriResourceFunctionImpl function = (UriResourceFunctionImpl) last; - * if (!function.isParameterListFilled()) { - * return list; - * } - * } - */ - - // get type of last resource part - if (!(last instanceof UriResourcePartTyped)) { - throw wrap(new UriParserSemanticException("Parameters list on untyped resource path segment not allowed", - UriParserSemanticException.MessageKeys.PARAMETERS_LIST_ONLY_FOR_TYPED_PARTS)); - } - EdmEntityType lastType = (EdmEntityType) ((UriResourcePartTyped) last).getType(); - - // get list of keys for lastType - List<String> lastKeyPredicates = lastType.getKeyPredicateNames(); - - // check if all key are filled from the URI - if (list.size() == lastKeyPredicates.size()) { - return list; - } - - // if not, check if the missing key predicates can be satisfied with help of the defined - // referential constraints - // for using referential constraints the last resource part must be a navigation property - if (!(context.contextUriInfo.getLastResourcePart() instanceof UriResourceNavigationPropertyImpl)) { - throw wrap(new UriParserSemanticException("Wrong number of key properties.", - UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, - Integer.toString(lastKeyPredicates.size()), Integer.toString(list.size()))); - } - UriResourceNavigationPropertyImpl lastNav = (UriResourceNavigationPropertyImpl) last; - - // get the partner of the navigation property - EdmNavigationProperty partner = lastNav.getProperty().getPartner(); - if (partner == null) { - throw wrap(new UriParserSemanticException("Wrong number of key properties.", - UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, - Integer.toString(lastKeyPredicates.size()), Integer.toString(list.size()))); - } - - // fill missing keys from referential constraints - for (String key : lastKeyPredicates) { - boolean found = false; - for (UriParameterImpl item : list) { - if (item.getName().equals(key)) { - found = true; - break; - } - } - - if (!found) { - String property = partner.getReferencingPropertyName(key); - if (property != null) { - // store the key name as referenced property - list.add(0, new UriParameterImpl().setName(key).setRefencedProperty(property)); - } - } - } - - // check again if all key predicates are filled from the URI - if (list.size() == lastKeyPredicates.size()) { - return list; - } else { - throw wrap(new UriParserSemanticException("Wrong number of key properties.", - UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, - Integer.toString(lastKeyPredicates.size()), Integer.toString(list.size()))); - } - } else { - if (context.contextReadingFunctionParameters) { - return Collections.emptyList(); - } else { - final UriResource last = context.contextUriInfo.getLastResourcePart(); - final int number = last instanceof UriResourcePartTyped ? - ((EdmEntityType) ((UriResourcePartTyped) last).getType()).getKeyPredicateNames().size() : 0; - throw wrap(new UriParserSemanticException("Wrong number of key properties.", - UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, Integer.toString(number), "0")); - } - } - } - - @Override - public UriParameterImpl visitNameValuePair(final NameValuePairContext ctx) { - UriParameterImpl uriParameter = new UriParameterImpl(); - uriParameter.setName(ctx.vODI.getText()); - - if (ctx.vCOM != null) { - uriParameter.setText(ctx.vCOM.getText()); - uriParameter.setExpression((ExpressionImpl) ctx.vCOM.accept(this)); - } else { - uriParameter.setAlias("@" + ctx.vALI.getText()); - } - - return uriParameter; - } - - @Override - public Object visitNaninfinity(final NaninfinityContext ctx) { - return new LiteralImpl().setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal)). - setText(ctx.getText()); - } - - @Override - public ExpressionImpl visitNowMethodCallExpr(final NowMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.NOW); - } - - @Override - public Object visitNullrule(final NullruleContext ctx) { - return new LiteralImpl().setText("null"); - } - - /* - * @Override - * public Object visitOdataRelativeUriEOF(final OdataRelativeUriEOFContext ctx) { - * contextUriInfo = null; - * super.visitOdataRelativeUriEOF(ctx); - * return contextUriInfo; - * } - */ - @Override - public Object visitOrderBy(final OrderByContext ctx) { - - OrderByOptionImpl orderBy = new OrderByOptionImpl(); - - for (OrderByItemContext item : ((OrderListContext) ctx.getChild(2)).vlOI) { - OrderByItemImpl oItem = (OrderByItemImpl) item.accept(this); - orderBy.addOrder(oItem); - } - - return orderBy; - } - - @Override - public Object visitOrderByEOF(final OrderByEOFContext ctx) { - - OrderByOptionImpl orderBy = new OrderByOptionImpl(); - - for (OrderByItemContext item : ((OrderListContext) ctx.getChild(0)).vlOI) { - OrderByItemImpl oItem = (OrderByItemImpl) item.accept(this); - orderBy.addOrder(oItem); - } - - return orderBy; - } - - @Override - public Object visitOrderByItem(final OrderByItemContext ctx) { - OrderByItemImpl oItem = new OrderByItemImpl(); - if (ctx.vD != null) { - oItem.setDescending(true); - } - - oItem.setExpression((ExpressionImpl) ctx.vC.accept(this)); - return oItem; - } - - @Override - public Object visitPathSegment(final PathSegmentContext ctx) { - readResourcePathSegment(ctx); - /* - * if (contextUriInfo.getLastResourcePart() == null || - * contextUriInfo.getLastResourcePart() instanceof UriResourceRootImpl) { - * - * } else { - * readNextPathInfoSegment(ctx); - * } - */ - UriResourceImpl pathInfoSegment = (UriResourceImpl) context.contextUriInfo.getLastResourcePart(); - - if (ctx.vlNVO.size() > 0) { - // check for keyPredicates - if (pathInfoSegment instanceof UriResourceWithKeysImpl) { - @SuppressWarnings("unchecked") - List<UriParameterImpl> list = (List<UriParameterImpl>) ctx.vlNVO.get(0).accept(this); - ((UriResourceWithKeysImpl) pathInfoSegment) - .setKeyPredicates(list); - } else { - throw wrap(new UriParserSemanticException("Key properties not allowed", - UriParserSemanticException.MessageKeys.KEY_NOT_ALLOWED)); - } - } - - return pathInfoSegment; - } - - @Override - public Object visitPathSegments(final PathSegmentsContext ctx) { - // path segment - for (PathSegmentContext it : ctx.vlPS) { - it.accept(this); - } - - // const segment - if (ctx.vCS != null) { - ctx.vCS.accept(this); - } - return null; - } - - @Override - public Object visitPrimitiveLiteral(final PrimitiveLiteralContext ctx) { - ParseTree child1 = ctx.children.get(0); - - if (child1 instanceof EnumLitContext - || child1 instanceof BooleanNonCaseContext - || child1 instanceof NullruleContext - || child1 instanceof NaninfinityContext) { - return child1.accept(this); - } - return new LiteralImpl().setText(ctx.getText()); - } - - @Override - public Object visitQueryOptions(final QueryOptionsContext ctx) { - - List<QueryOptionImpl> qpList = new ArrayList<QueryOptionImpl>(); - for (QueryOptionContext entityOption : ctx.vlQO) { - qpList.add((QueryOptionImpl) entityOption.accept(this)); - } - - return qpList; - } - - /* - * @Override - * public Object visitResourcePath(final ResourcePathContext ctx) { - * if (ctx.vAll != null) { - * contextUriInfo = new UriInfoImpl().setKind(UriInfoKind.all); - * } else if (ctx.vCJ != null) { - * ctx.vCJ.accept(this); - * } else if (ctx.vlPS != null) { - * UriInfoImpl uriInfoPath = new UriInfoImpl().setKind(UriInfoKind.resource); - * contextUriInfo = uriInfoPath; - * super.visitResourcePath(ctx); // visit all children of ctx - * } - * return contextUriInfo; - * } - */ - @Override - public Object visitRootExpr(final RootExprContext ctx) { - - UriResource lastResource = context.contextUriInfo.getLastResourcePart(); - - if (!(lastResource instanceof UriResourcePartTyped)) { - throw wrap(new UriParserSemanticException("Resource path not typed", - UriParserSemanticException.MessageKeys.RESOURCE_PATH_NOT_TYPED)); - } - - UriResourcePartTyped lastType = (UriResourcePartTyped) lastResource; - - UriResourceRootImpl pathInfoRoot = new UriResourceRootImpl(); - pathInfoRoot.setCollection(lastType.isCollection()); - pathInfoRoot.setType(getTypeInformation(lastType).type); - - UriInfoImpl uriInfoImplpath = new UriInfoImpl().setKind(UriInfoKind.resource); - uriInfoImplpath.addResourcePart(pathInfoRoot); - - if (ctx.vPs != null) { - // store the context uriInfoPath - UriInfoImpl backupUriInfoPath = context.contextUriInfo; - - // set temporary uriInfoPath to collect the path information of the memberExpression - context.contextUriInfo = uriInfoImplpath; - - ctx.vPs.accept(this); - - context.contextUriInfo = backupUriInfoPath; - - } - return new MemberImpl() - .setResourcePath(uriInfoImplpath); - - } - - @Override - public ExpressionImpl visitRoundMethodCallExpr(final RoundMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.ROUND) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitSecondMethodCallExpr(final SecondMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.SECOND) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public Object visitSelect(final SelectContext ctx) { - List<SelectItemImpl> selectItems = new ArrayList<SelectItemImpl>(); - - for (SelectItemContext si : ctx.vlSI) { - selectItems.add((SelectItemImpl) si.accept(this)); - } - - return new SelectOptionImpl().setSelectItems(selectItems).setText(ctx.children.get(2).getText()); - } - - @Override - public Object visitSelectEOF(final SelectEOFContext ctx) { - List<SelectItemImpl> selectItems = new ArrayList<SelectItemImpl>(); - - for (SelectItemContext si : ctx.vlSI) { - selectItems.add((SelectItemImpl) si.accept(this)); - } - - return new SelectOptionImpl().setSelectItems(selectItems).setText(ctx.getText()); - } - - @Override - public Object visitSelectItem(final SelectItemContext ctx) { - SelectItemImpl selectItem = new SelectItemImpl(); - - context.contextSelectItem = selectItem; - for (SelectSegmentContext si : ctx.vlSS) { - si.accept(this); - } - context.contextSelectItem = null; - - return selectItem; - } - - @Override - public Object visitSelectSegment(final SelectSegmentContext ctx) { - - if (ctx.vS != null) { - if (ctx.vNS != null) { - String namespace = ctx.vNS.getText(); - namespace = namespace.substring(0, namespace.length() - 1); - FullQualifiedName fullName = new FullQualifiedName(namespace, "*"); - context.contextSelectItem.addAllOperationsInSchema(fullName); - } else { - context.contextSelectItem.setStar(true); - } - return null; - } - - String odi = ctx.vODI.getText(); - if (ctx.vNS == null) { - - EdmType prevType = null; - if (context.contextSelectItem.getResourcePath() == null) { - prevType = context.contextTypes.peek().type; - } else { - UriInfoImpl uriInfo = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - UriResource last = uriInfo.getLastResourcePart(); - - prevType = getTypeInformation(last).type; - if (prevType == null) { - throw wrap(new UriParserSemanticException("prev segment not typed", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "select")); - } - } - - if (!(prevType instanceof EdmStructuredType)) { - throw wrap(new UriParserSemanticException("Previous select item is not a structural type", - UriParserSemanticException.MessageKeys.ONLY_FOR_STRUCTURAL_TYPES, "select")); - } - - EdmStructuredType structType = (EdmStructuredType) prevType; - EdmElement element = structType.getProperty(odi); - if (element == null) { - throw wrap(new UriParserSemanticException("Previous select item has not property: " + odi, - UriParserSemanticException.MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE, structType.getName(), odi)); - } - - // create new segment - // SelectSegmentImpl newSegment = new SelectSegmentImpl().setProperty(property); - // contextSelectItem.addSegment(newSegment); - if (element instanceof EdmProperty) { - EdmProperty property = (EdmProperty) element; - if (property.isPrimitive()) { - - UriResourcePrimitivePropertyImpl simple = new UriResourcePrimitivePropertyImpl(); - simple.setProperty(property); - - UriInfoImpl uriInfo = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - if (uriInfo == null) { - uriInfo = new UriInfoImpl().setKind(UriInfoKind.resource); - uriInfo.addResourcePart(simple); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfo); - if (startType != null) { - context.contextSelectItem.setTypeFilter(startType); - } - - context.contextSelectItem.setResourcePath(uriInfo); - } else { - uriInfo.addResourcePart(simple); - } - return this; - } else { - UriInfoImpl uriInfo = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - - UriResourceComplexPropertyImpl complex = new UriResourceComplexPropertyImpl(); - complex.setProperty(property); - - if (uriInfo == null) { - uriInfo = new UriInfoImpl().setKind(UriInfoKind.resource); - uriInfo.addResourcePart(complex); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfo); - if (startType != null) { - context.contextSelectItem.setTypeFilter(startType); - } - - context.contextSelectItem.setResourcePath(uriInfo); - } else { - uriInfo.addResourcePart(complex); - } - return this; - } - } else { - throw wrap(new UriParserSemanticException("Only Simple and Complex properties within select allowed", - UriParserSemanticException.MessageKeys.ONLY_SIMPLE_AND_COMPLEX_PROPERTIES_IN_SELECT)); - } - } else { - String namespace = ctx.vNS.getText(); - namespace = namespace.substring(0, namespace.length() - 1); - - FullQualifiedName fullName = new FullQualifiedName(namespace, odi); - // contextSelectItem.addQualifiedThing(fullName); - - if (context.contextSelectItem.getResourcePath() == null) { - EdmType prevType = context.contextTypes.peek().type; - - // check for complex type cast - if (prevType instanceof EdmComplexType) { - EdmComplexType ct = edm.getComplexType(fullName); - if (ct != null) { - if ((ct.compatibleTo(prevType))) { - UriResourceStartingTypeFilterImpl resourcePart = new UriResourceStartingTypeFilterImpl(); - resourcePart.setCollectionTypeFilter(ct); - - UriInfoImpl uriInfo = new UriInfoImpl().setKind(UriInfoKind.resource); - uriInfo.addResourcePart(resourcePart); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfo); - if (startType != null) { - context.contextSelectItem.setTypeFilter(startType); - } - - context.contextSelectItem.setResourcePath(uriInfo); - return this; - } - } - } else if (prevType instanceof EdmEntityType) { - EdmEntityType et = edm.getEntityType(fullName); - if (et != null) { - if ((et.compatibleTo(prevType))) { - UriResourceStartingTypeFilterImpl resourcePart = new UriResourceStartingTypeFilterImpl(); - resourcePart.setCollectionTypeFilter(et); - - UriInfoImpl uriInfo = new UriInfoImpl().setKind(UriInfoKind.resource); - uriInfo.addResourcePart(resourcePart); - - EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfo); - if (startType != null) { - context.contextSelectItem.setTypeFilter(startType); - } - - context.contextSelectItem.setResourcePath(uriInfo); - return this; - } - } - } else { - throw wrap(new UriParserSemanticException("prev segment must be complex of entity type", - UriParserSemanticException.MessageKeys.COMPLEX_PROPERTY_OF_ENTITY_TYPE_EXPECTED)); - } - - } else { - UriInfoImpl uriInfo = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - UriResource last = uriInfo.getLastResourcePart(); - if (!(last instanceof UriResourceTypedImpl)) { - throw wrap(new UriParserSemanticException("prev segment typed", - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS, "select")); - } - EdmType prevType = getTypeInformation(last).type; - - if (prevType instanceof EdmComplexType) { - EdmComplexType ct = edm.getComplexType(fullName); - if (ct != null) { - if ((ct.compatibleTo(prevType))) { - UriResourceStartingTypeFilterImpl resourcePart = new UriResourceStartingTypeFilterImpl(); - resourcePart.setCollectionTypeFilter(ct); - - uriInfo.addResourcePart(resourcePart); - return this; - } - } - } else if (prevType instanceof EdmEntityType) { - throw wrap(new UriParserSemanticException("Error", - UriParserSemanticException.MessageKeys.NOT_FOR_ENTITY_TYPE)); - /* - * EdmEntityType et = edm.getEntityType(fullName); - * if (et != null) { - * if ((et.compatibleTo((EdmStructuralType) prevType))) { - * UriResourceStartingTypeFilterImpl resourcePart = new UriResourceStartingTypeFilterImpl(); - * resourcePart.setEntryTypeFilter(et); - * - * uriInfo.addResourcePart(resourcePart); - * return this; - * } - * } - */ - } else { - throw wrap(new UriParserSemanticException("prev segment must be complex of entity type", - UriParserSemanticException.MessageKeys.COMPLEX_PROPERTY_OF_ENTITY_TYPE_EXPECTED)); - } - } - - EdmType prevType = null; - if (context.contextSelectItem.getResourcePath() == null) { - prevType = context.contextTypes.peek().type; - } else { - UriInfoImpl uriInfo = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - UriResource last = uriInfo.getLastResourcePart(); - if (!(last instanceof UriResourceTypedImpl)) { - throw wrap(new UriParserSemanticException("prev segment typed", - UriParserSemanticException.MessageKeys.PREVIOUS_PART_TYPED)); - } - prevType = getTypeInformation(last).type; - } - - FullQualifiedName finalTypeName = new FullQualifiedName(prevType.getNamespace(), prevType.getName()); - - // check for action - EdmAction action = edm.getBoundAction(fullName, finalTypeName, null); - - if (action != null) { - UriResourceActionImpl uriAction = new UriResourceActionImpl(); - uriAction.setAction(action); - - UriInfoImpl resourcePath = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - resourcePath.addResourcePart(uriAction); - } - - // check for function - EdmFunction function = edm.getBoundFunction(fullName, finalTypeName, null, null); - - if (function != null) { - UriResourceFunctionImpl uriFunction = new UriResourceFunctionImpl(); - uriFunction.setFunction(function); - - UriInfoImpl resourcePath = (UriInfoImpl) context.contextSelectItem.getResourcePath(); - resourcePath.addResourcePart(uriFunction); - } - } - return null; - } - - @Override - public Object visitSkip(final SkipContext ctx) { - SkipOptionImpl skiptoken = new SkipOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return skiptoken.setValue(Integer.parseInt(text)).setText(text); - } - - @Override - public Object visitSkiptoken(final SkiptokenContext ctx) { - SkipTokenOptionImpl skiptoken = new SkipTokenOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return skiptoken.setValue(text).setText(text); - } - - @Override - public ExpressionImpl visitStartsWithMethodCallExpr(final StartsWithMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.STARTSWITH) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)) - .addParameter((ExpressionImpl) ctx.vE2.accept(this)); - } - - @Override - public ExpressionImpl visitSubstringMethodCallExpr(final SubstringMethodCallExprContext ctx) { - MethodImpl ret = new MethodImpl(); - ret.setMethod(MethodKind.SUBSTRING); - ret.addParameter((ExpressionImpl) ctx.vE1.accept(this)); - ret.addParameter((ExpressionImpl) ctx.vE2.accept(this)); - - if (ctx.vE3 != null) { - ret.addParameter((ExpressionImpl) ctx.vE3.accept(this)); - } - - return ret; - - } - - @Override - public ExpressionImpl visitTimeMethodCallExpr(final TimeMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.TIME) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public Object visitTop(final TopContext ctx) { - TopOptionImpl top = new TopOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return top.setValue(Integer.parseInt(text)).setText(text); - } - - @Override - public ExpressionImpl visitToLowerMethodCallExpr(final ToLowerMethodCallExprContext ctx) { - return new MethodImpl() - .setMethod(MethodKind.TOLOWER) - .addParameter((ExpressionImpl) ctx.vE1.accept(this)); - } - - @Override - public ExpressionImpl visitTotalOffs
<TRUNCATED>
