You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2013/09/24 14:42:37 UTC
[10/51] [partial] Refactored project structure
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
deleted file mode 100644
index f6ae572..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
+++ /dev/null
@@ -1,856 +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.odata2.core.uri;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.olingo.odata2.api.commons.InlineCount;
-import org.apache.olingo.odata2.api.edm.Edm;
-import org.apache.olingo.odata2.api.edm.EdmComplexType;
-import org.apache.olingo.odata2.api.edm.EdmEntityContainer;
-import org.apache.olingo.odata2.api.edm.EdmEntitySet;
-import org.apache.olingo.odata2.api.edm.EdmEntityType;
-import org.apache.olingo.odata2.api.edm.EdmException;
-import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
-import org.apache.olingo.odata2.api.edm.EdmLiteral;
-import org.apache.olingo.odata2.api.edm.EdmLiteralException;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
-import org.apache.olingo.odata2.api.edm.EdmNavigationProperty;
-import org.apache.olingo.odata2.api.edm.EdmParameter;
-import org.apache.olingo.odata2.api.edm.EdmProperty;
-import org.apache.olingo.odata2.api.edm.EdmSimpleType;
-import org.apache.olingo.odata2.api.edm.EdmSimpleTypeFacade;
-import org.apache.olingo.odata2.api.edm.EdmType;
-import org.apache.olingo.odata2.api.edm.EdmTypeKind;
-import org.apache.olingo.odata2.api.edm.EdmTyped;
-import org.apache.olingo.odata2.api.exception.MessageReference;
-import org.apache.olingo.odata2.api.exception.ODataBadRequestException;
-import org.apache.olingo.odata2.api.exception.ODataMessageException;
-import org.apache.olingo.odata2.api.uri.ExpandSelectTreeNode;
-import org.apache.olingo.odata2.api.uri.KeyPredicate;
-import org.apache.olingo.odata2.api.uri.NavigationPropertySegment;
-import org.apache.olingo.odata2.api.uri.PathSegment;
-import org.apache.olingo.odata2.api.uri.SelectItem;
-import org.apache.olingo.odata2.api.uri.UriInfo;
-import org.apache.olingo.odata2.api.uri.UriNotMatchingException;
-import org.apache.olingo.odata2.api.uri.UriParser;
-import org.apache.olingo.odata2.api.uri.UriSyntaxException;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionParserException;
-import org.apache.olingo.odata2.api.uri.expression.FilterExpression;
-import org.apache.olingo.odata2.api.uri.expression.OrderByExpression;
-import org.apache.olingo.odata2.core.commons.Decoder;
-import org.apache.olingo.odata2.core.edm.EdmSimpleTypeFacadeImpl;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
-import org.apache.olingo.odata2.core.uri.expression.FilterParserImpl;
-import org.apache.olingo.odata2.core.uri.expression.OrderByParserImpl;
-
-/**
- * Parser for the OData part of the URL.
- *
- */
-public class UriParserImpl extends UriParser {
-
- private static final Pattern INITIAL_SEGMENT_PATTERN = Pattern
- .compile("(?:([^.()]+)\\.)?([^.()]+)(?:\\((.+)\\)|(\\(\\)))?");
- private static final Pattern NAVIGATION_SEGMENT_PATTERN = Pattern.compile("([^()]+)(?:\\((.+)\\)|(\\(\\)))?");
- private static final Pattern NAMED_VALUE_PATTERN = Pattern.compile("(?:([^=]+)=)?([^=]+)");
-
- private final Edm edm;
- private final EdmSimpleTypeFacade simpleTypeFacade;
- private List<String> pathSegments;
- private String currentPathSegment;
- private UriInfoImpl uriResult;
- private Map<SystemQueryOption, String> systemQueryOptions;
- private Map<String, String> otherQueryParameters;
-
- public UriParserImpl(final Edm edm) {
- this.edm = edm;
- simpleTypeFacade = new EdmSimpleTypeFacadeImpl();
- }
-
- /**
- * Parse the URI part after an OData service root,
- * already splitted into path segments and query parameters.
- * @param pathSegments the {@link PathSegment}s of the resource path,
- * potentially percent-encoded
- * @param queryParameters the query parameters, already percent-decoded
- * @return a {@link UriInfoImpl} instance containing the parsed information
- */
- @Override
- public UriInfo parse(final List<PathSegment> pathSegments, final Map<String, String> queryParameters)
- throws UriSyntaxException, UriNotMatchingException, EdmException {
- this.pathSegments = copyPathSegmentList(pathSegments);
- systemQueryOptions = new HashMap<SystemQueryOption, String>();
- otherQueryParameters = new HashMap<String, String>();
- uriResult = new UriInfoImpl();
-
- preparePathSegments();
-
- handleResourcePath();
-
- distributeQueryParameters(queryParameters);
- checkSystemQueryOptionsCompatibility();
- handleSystemQueryOptions();
- handleOtherQueryParameters();
-
- return uriResult;
- }
-
- private void preparePathSegments() throws UriSyntaxException {
- // Remove an empty path segment at the start of the OData part of the resource path.
- if (!pathSegments.isEmpty() && pathSegments.get(0).equals("")) {
- pathSegments.remove(0);
- }
-
- // Remove an empty path segment at the end of the resource path,
- // although there is nothing in the OData specification that would allow that.
- if (!pathSegments.isEmpty() && pathSegments.get(pathSegments.size() - 1).equals("")) {
- pathSegments.remove(pathSegments.size() - 1);
- }
-
- // Intermediate empty path segments are an error, however.
- for (String pathSegment : pathSegments) {
- if (pathSegment.equals("")) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
- }
- }
-
- private void handleResourcePath() throws UriSyntaxException, UriNotMatchingException, EdmException {
- if (pathSegments.isEmpty()) {
- uriResult.setUriType(UriType.URI0);
- } else {
-
- currentPathSegment = pathSegments.remove(0);
-
- if ("$metadata".equals(currentPathSegment)) {
- ensureLastSegment();
- uriResult.setUriType(UriType.URI8);
-
- } else if ("$batch".equals(currentPathSegment)) {
- ensureLastSegment();
- uriResult.setUriType(UriType.URI9);
-
- } else {
- handleNormalInitialSegment();
- }
- }
- }
-
- private void handleNormalInitialSegment() throws UriSyntaxException, UriNotMatchingException, EdmException {
- final Matcher matcher = INITIAL_SEGMENT_PATTERN.matcher(currentPathSegment);
- if (!matcher.matches()) {
- throw new UriNotMatchingException(UriNotMatchingException.MATCHPROBLEM.addContent(currentPathSegment));
- }
-
- final String entityContainerName = percentDecode(matcher.group(1));
- final String segmentName = percentDecode(matcher.group(2));
- final String keyPredicate = matcher.group(3);
- final String emptyParentheses = matcher.group(4);
-
- final EdmEntityContainer entityContainer =
- entityContainerName == null ? edm.getDefaultEntityContainer() : edm.getEntityContainer(entityContainerName);
- if (entityContainer == null) {
- throw new UriNotMatchingException(UriNotMatchingException.CONTAINERNOTFOUND.addContent(entityContainerName));
- }
- uriResult.setEntityContainer(entityContainer);
-
- final EdmEntitySet entitySet = entityContainer.getEntitySet(segmentName);
- if (entitySet != null) {
- uriResult.setStartEntitySet(entitySet);
- handleEntitySet(entitySet, keyPredicate);
- } else {
- final EdmFunctionImport functionImport = entityContainer.getFunctionImport(segmentName);
- if (functionImport == null) {
- throw new UriNotMatchingException(UriNotMatchingException.NOTFOUND.addContent(segmentName));
- }
- uriResult.setFunctionImport(functionImport);
- handleFunctionImport(functionImport, emptyParentheses, keyPredicate);
- }
- }
-
- private void handleEntitySet(final EdmEntitySet entitySet, final String keyPredicate) throws UriSyntaxException,
- UriNotMatchingException, EdmException {
- final EdmEntityType entityType = entitySet.getEntityType();
-
- uriResult.setTargetType(entityType);
- uriResult.setTargetEntitySet(entitySet);
-
- if (keyPredicate == null) {
- if (pathSegments.isEmpty()) {
- uriResult.setUriType(UriType.URI1);
- } else {
- currentPathSegment = pathSegments.remove(0);
- checkCount();
- if (uriResult.isCount()) {
- uriResult.setUriType(UriType.URI15);
- } else {
- throw new UriSyntaxException(UriSyntaxException.ENTITYSETINSTEADOFENTITY.addContent(entitySet.getName()));
- }
- }
- } else {
- uriResult.setKeyPredicates(parseKey(keyPredicate, entityType));
- if (pathSegments.isEmpty()) {
- uriResult.setUriType(UriType.URI2);
- } else {
- handleNavigationPathOptions();
- }
- }
- }
-
- private void handleNavigationPathOptions() throws UriSyntaxException, UriNotMatchingException, EdmException {
- currentPathSegment = pathSegments.remove(0);
-
- checkCount();
- if (uriResult.isCount()) {
- uriResult.setUriType(UriType.URI16); // Count of multiple entities is handled elsewhere
-
- } else if ("$value".equals(currentPathSegment)) {
- if (uriResult.getTargetEntitySet().getEntityType().hasStream()) {
- ensureLastSegment();
- uriResult.setUriType(UriType.URI17);
- uriResult.setValue(true);
- } else {
- throw new UriSyntaxException(UriSyntaxException.NOMEDIARESOURCE);
- }
-
- } else if ("$links".equals(currentPathSegment)) {
- uriResult.setLinks(true);
- if (pathSegments.isEmpty()) {
- throw new UriSyntaxException(UriSyntaxException.MUSTNOTBELASTSEGMENT.addContent(currentPathSegment));
- }
- currentPathSegment = pathSegments.remove(0);
- handleNavigationProperties();
-
- } else {
- handleNavigationProperties();
- }
- }
-
- private void handleNavigationProperties() throws UriSyntaxException, UriNotMatchingException, EdmException {
-
- final Matcher matcher = NAVIGATION_SEGMENT_PATTERN.matcher(currentPathSegment);
- if (!matcher.matches()) {
- throw new UriNotMatchingException(UriNotMatchingException.MATCHPROBLEM.addContent(currentPathSegment));
- }
-
- final String navigationPropertyName = percentDecode(matcher.group(1));
- final String keyPredicateName = matcher.group(2);
- final String emptyParentheses = matcher.group(3);
-
- final EdmTyped property = uriResult.getTargetEntitySet().getEntityType().getProperty(navigationPropertyName);
- if (property == null) {
- throw new UriNotMatchingException(UriNotMatchingException.PROPERTYNOTFOUND.addContent(navigationPropertyName));
- }
-
- switch (property.getType().getKind()) {
- case SIMPLE:
- case COMPLEX:
- if (keyPredicateName != null || emptyParentheses != null) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
- }
- if (uriResult.isLinks()) {
- throw new UriSyntaxException(UriSyntaxException.NONAVIGATIONPROPERTY.addContent(property));
- }
-
- handlePropertyPath((EdmProperty) property);
- break;
-
- case ENTITY: // navigation properties point to entities
- final EdmNavigationProperty navigationProperty = (EdmNavigationProperty) property;
- if (keyPredicateName != null || emptyParentheses != null) {
- if (navigationProperty.getMultiplicity() != EdmMultiplicity.MANY) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
- }
- }
-
- addNavigationSegment(keyPredicateName, navigationProperty);
-
- boolean many = false;
- if (navigationProperty.getMultiplicity() == EdmMultiplicity.MANY) {
- many = keyPredicateName == null;
- }
-
- if (pathSegments.isEmpty()) {
- if (many) {
- if (uriResult.isLinks()) {
- uriResult.setUriType(UriType.URI7B);
- } else {
- uriResult.setUriType(UriType.URI6B);
- }
- } else if (uriResult.isLinks()) {
- uriResult.setUriType(UriType.URI7A);
- } else {
- uriResult.setUriType(UriType.URI6A);
- }
- } else if (many || uriResult.isLinks()) {
- currentPathSegment = pathSegments.remove(0);
- checkCount();
- if (!uriResult.isCount()) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
- }
- if (many) {
- if (uriResult.isLinks()) {
- uriResult.setUriType(UriType.URI50B);
- } else {
- uriResult.setUriType(UriType.URI15);
- }
- } else {
- uriResult.setUriType(UriType.URI50A);
- }
- } else {
- handleNavigationPathOptions();
- }
- break;
-
- default:
- throw new UriSyntaxException(UriSyntaxException.INVALIDPROPERTYTYPE.addContent(property.getType().getKind()));
- }
- }
-
- private void addNavigationSegment(final String keyPredicateName, final EdmNavigationProperty navigationProperty)
- throws UriSyntaxException, EdmException {
- final EdmEntitySet targetEntitySet = uriResult.getTargetEntitySet().getRelatedEntitySet(navigationProperty);
- final EdmEntityType targetEntityType = targetEntitySet.getEntityType();
- uriResult.setTargetEntitySet(targetEntitySet);
- uriResult.setTargetType(targetEntityType);
-
- NavigationSegmentImpl navigationSegment = new NavigationSegmentImpl();
- navigationSegment.setEntitySet(targetEntitySet);
- navigationSegment.setNavigationProperty(navigationProperty);
- if (keyPredicateName != null) {
- navigationSegment.setKeyPredicates(parseKey(keyPredicateName, targetEntityType));
- }
- uriResult.addNavigationSegment(navigationSegment);
- }
-
- private void handlePropertyPath(final EdmProperty property) throws UriSyntaxException, UriNotMatchingException,
- EdmException {
- uriResult.addProperty(property);
- final EdmType type = property.getType();
-
- if (pathSegments.isEmpty()) {
- if (type.getKind() == EdmTypeKind.SIMPLE) {
- if (uriResult.getPropertyPath().size() == 1) {
- uriResult.setUriType(UriType.URI5);
- } else {
- uriResult.setUriType(UriType.URI4);
- }
- } else if (type.getKind() == EdmTypeKind.COMPLEX) {
- uriResult.setUriType(UriType.URI3);
- } else {
- throw new UriSyntaxException(UriSyntaxException.INVALIDPROPERTYTYPE.addContent(type.getKind()));
- }
- uriResult.setTargetType(type);
- } else {
-
- currentPathSegment = percentDecode(pathSegments.remove(0));
- switch (type.getKind()) {
- case SIMPLE:
- if ("$value".equals(currentPathSegment)) {
- ensureLastSegment();
- uriResult.setValue(true);
- if (uriResult.getPropertyPath().size() == 1) {
- uriResult.setUriType(UriType.URI5);
- } else {
- uriResult.setUriType(UriType.URI4);
- }
- } else {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
- }
- uriResult.setTargetType(type);
- break;
-
- case COMPLEX:
- final EdmProperty nextProperty = (EdmProperty) ((EdmComplexType) type).getProperty(currentPathSegment);
- if (nextProperty == null) {
- throw new UriNotMatchingException(UriNotMatchingException.PROPERTYNOTFOUND.addContent(currentPathSegment));
- }
-
- handlePropertyPath(nextProperty);
- break;
-
- default:
- throw new UriSyntaxException(UriSyntaxException.INVALIDPROPERTYTYPE.addContent(type.getKind()));
- }
- }
- }
-
- private void ensureLastSegment() throws UriSyntaxException {
- if (!pathSegments.isEmpty()) {
- throw new UriSyntaxException(UriSyntaxException.MUSTBELASTSEGMENT.addContent(currentPathSegment));
- }
- }
-
- private void checkCount() throws UriSyntaxException {
- if ("$count".equals(currentPathSegment)) {
- if (pathSegments.isEmpty()) {
- uriResult.setCount(true);
- } else {
- throw new UriSyntaxException(UriSyntaxException.MUSTBELASTSEGMENT.addContent(currentPathSegment));
- }
- }
- }
-
- private ArrayList<KeyPredicate> parseKey(final String keyPredicate, final EdmEntityType entityType)
- throws UriSyntaxException, EdmException {
- final List<EdmProperty> keyProperties = entityType.getKeyProperties();
- ArrayList<EdmProperty> parsedKeyProperties = new ArrayList<EdmProperty>();
- ArrayList<KeyPredicate> keyPredicates = new ArrayList<KeyPredicate>();
-
- for (final String key : keyPredicate.split(",", -1)) {
-
- final Matcher matcher = NAMED_VALUE_PATTERN.matcher(key);
- if (!matcher.matches()) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDKEYPREDICATE.addContent(keyPredicate));
- }
-
- String name = percentDecode(matcher.group(1));
- final String value = percentDecode(matcher.group(2));
-
- if (name == null) {
- if (keyProperties.size() == 1) {
- name = keyProperties.get(0).getName();
- } else {
- throw new UriSyntaxException(UriSyntaxException.MISSINGKEYPREDICATENAME.addContent(key));
- }
- }
-
- EdmProperty keyProperty = null;
- for (final EdmProperty testKeyProperty : keyProperties) {
- if (testKeyProperty.getName().equals(name)) {
- keyProperty = testKeyProperty;
- break;
- }
- }
- if (keyProperty == null) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDKEYPREDICATE.addContent(keyPredicate));
- }
- if (parsedKeyProperties.contains(keyProperty)) {
- throw new UriSyntaxException(UriSyntaxException.DUPLICATEKEYNAMES.addContent(keyPredicate));
- }
- parsedKeyProperties.add(keyProperty);
-
- final EdmLiteral uriLiteral = parseLiteral(value, (EdmSimpleType) keyProperty.getType());
- keyPredicates.add(new KeyPredicateImpl(uriLiteral.getLiteral(), keyProperty));
- }
-
- if (parsedKeyProperties.size() != keyProperties.size()) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDKEYPREDICATE.addContent(keyPredicate));
- }
-
- return keyPredicates;
- }
-
- private void handleFunctionImport(final EdmFunctionImport functionImport, final String emptyParentheses,
- final String keyPredicate) throws UriSyntaxException, UriNotMatchingException, EdmException {
- final EdmTyped returnType = functionImport.getReturnType();
- final EdmType type = returnType.getType();
- final boolean isCollection = returnType.getMultiplicity() == EdmMultiplicity.MANY;
-
- if (type.getKind() == EdmTypeKind.ENTITY && isCollection) {
- handleEntitySet(functionImport.getEntitySet(), keyPredicate);
- return;
- }
-
- if (emptyParentheses != null) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(emptyParentheses));
- }
-
- uriResult.setTargetType(type);
- switch (type.getKind()) {
- case SIMPLE:
- uriResult.setUriType(isCollection ? UriType.URI13 : UriType.URI14);
- break;
- case COMPLEX:
- uriResult.setUriType(isCollection ? UriType.URI11 : UriType.URI12);
- break;
- case ENTITY:
- uriResult.setUriType(UriType.URI10);
- break;
- default:
- throw new UriSyntaxException(UriSyntaxException.INVALIDRETURNTYPE.addContent(type.getKind()));
- }
-
- if (!pathSegments.isEmpty()) {
- if (uriResult.getUriType() == UriType.URI14) {
- currentPathSegment = pathSegments.remove(0);
- if ("$value".equals(currentPathSegment)) {
- uriResult.setValue(true);
- } else {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
- }
- }
- }
- ensureLastSegment();
- }
-
- private void distributeQueryParameters(final Map<String, String> queryParameters) throws UriSyntaxException {
- for (final String queryOptionString : queryParameters.keySet()) {
- final String value = queryParameters.get(queryOptionString);
- if (queryOptionString.startsWith("$")) {
- SystemQueryOption queryOption;
- try {
- queryOption = SystemQueryOption.valueOf(queryOptionString);
- } catch (IllegalArgumentException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSYSTEMQUERYOPTION.addContent(queryOptionString), e);
- }
- if ("".equals(value)) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDNULLVALUE.addContent(queryOptionString));
- } else {
- systemQueryOptions.put(queryOption, value);
- }
- } else {
- otherQueryParameters.put(queryOptionString, value);
- }
- }
- }
-
- private void checkSystemQueryOptionsCompatibility() throws UriSyntaxException {
- final UriType uriType = uriResult.getUriType();
-
- for (SystemQueryOption queryOption : systemQueryOptions.keySet()) {
-
- if (queryOption == SystemQueryOption.$format && (uriType == UriType.URI4 || uriType == UriType.URI5)
- && uriResult.isValue()) {
- throw new UriSyntaxException(UriSyntaxException.INCOMPATIBLESYSTEMQUERYOPTION.addContent(queryOption));
- }
-
- if (!uriType.isCompatible(queryOption)) {
- throw new UriSyntaxException(UriSyntaxException.INCOMPATIBLESYSTEMQUERYOPTION.addContent(queryOption));
- }
- }
- }
-
- private void handleSystemQueryOptions() throws UriSyntaxException, UriNotMatchingException, EdmException {
-
- for (SystemQueryOption queryOption : systemQueryOptions.keySet()) {
- switch (queryOption) {
- case $format:
- handleSystemQueryOptionFormat(systemQueryOptions.get(SystemQueryOption.$format));
- break;
- case $filter:
- handleSystemQueryOptionFilter(systemQueryOptions.get(SystemQueryOption.$filter));
- break;
- case $inlinecount:
- handleSystemQueryOptionInlineCount(systemQueryOptions.get(SystemQueryOption.$inlinecount));
- break;
- case $orderby:
- handleSystemQueryOptionOrderBy(systemQueryOptions.get(SystemQueryOption.$orderby));
- break;
- case $skiptoken:
- handleSystemQueryOptionSkipToken(systemQueryOptions.get(SystemQueryOption.$skiptoken));
- break;
- case $skip:
- handleSystemQueryOptionSkip(systemQueryOptions.get(SystemQueryOption.$skip));
- break;
- case $top:
- handleSystemQueryOptionTop(systemQueryOptions.get(SystemQueryOption.$top));
- break;
- case $expand:
- handleSystemQueryOptionExpand(systemQueryOptions.get(SystemQueryOption.$expand));
- break;
- case $select:
- handleSystemQueryOptionSelect(systemQueryOptions.get(SystemQueryOption.$select));
- break;
- default:
- throw new ODataRuntimeException("Invalid System Query Option " + queryOption);
- }
- }
- }
-
- private void handleSystemQueryOptionFormat(final String format) throws UriSyntaxException {
- uriResult.setFormat(format);
- }
-
- private void handleSystemQueryOptionFilter(final String filter) throws UriSyntaxException {
- final EdmType targetType = uriResult.getTargetType();
- if (targetType instanceof EdmEntityType) {
- try {
- uriResult.setFilter(new FilterParserImpl((EdmEntityType) targetType).parseFilterString(filter, true));
- } catch (ExpressionParserException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDFILTEREXPRESSION.addContent(filter), e);
- } catch (ODataMessageException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDFILTEREXPRESSION.addContent(filter), e);
- }
- }
- }
-
- private void handleSystemQueryOptionOrderBy(final String orderBy) throws UriSyntaxException {
- final EdmType targetType = uriResult.getTargetType();
- if (targetType instanceof EdmEntityType) {
- try {
- uriResult.setOrderBy(parseOrderByString((EdmEntityType) targetType, orderBy));
- } catch (ExpressionParserException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDORDERBYEXPRESSION.addContent(orderBy), e);
- } catch (ODataMessageException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDORDERBYEXPRESSION.addContent(orderBy), e);
- }
- }
- }
-
- private void handleSystemQueryOptionInlineCount(final String inlineCount) throws UriSyntaxException {
- if ("allpages".equals(inlineCount)) {
- uriResult.setInlineCount(InlineCount.ALLPAGES);
- } else if ("none".equals(inlineCount)) {
- uriResult.setInlineCount(InlineCount.NONE);
- } else {
- throw new UriSyntaxException(UriSyntaxException.INVALIDVALUE.addContent(inlineCount));
- }
- }
-
- private void handleSystemQueryOptionSkipToken(final String skiptoken) throws UriSyntaxException {
- uriResult.setSkipToken(skiptoken);
- }
-
- private void handleSystemQueryOptionSkip(final String skip) throws UriSyntaxException {
- try {
- uriResult.setSkip(Integer.valueOf(skip));
- } catch (NumberFormatException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDVALUE.addContent(skip), e);
- }
-
- if (skip.startsWith("-")) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDNEGATIVEVALUE.addContent(skip));
- } else if (skip.startsWith("+")) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDVALUE.addContent(skip));
- }
- }
-
- private void handleSystemQueryOptionTop(final String top) throws UriSyntaxException {
- try {
- uriResult.setTop(Integer.valueOf(top));
- } catch (NumberFormatException e) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDVALUE.addContent(top), e);
- }
-
- if (top.startsWith("-")) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDNEGATIVEVALUE.addContent(top));
- } else if (top.startsWith("+")) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDVALUE.addContent(top));
- }
- }
-
- private void handleSystemQueryOptionExpand(final String expandStatement) throws UriSyntaxException,
- UriNotMatchingException, EdmException {
- ArrayList<ArrayList<NavigationPropertySegment>> expand = new ArrayList<ArrayList<NavigationPropertySegment>>();
-
- if (expandStatement.startsWith(",") || expandStatement.endsWith(",")) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
-
- for (String expandItemString : expandStatement.split(",")) {
- expandItemString = expandItemString.trim();
- if ("".equals(expandItemString)) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
- if (expandItemString.startsWith("/") || expandItemString.endsWith("/")) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
-
- ArrayList<NavigationPropertySegment> expandNavigationProperties = new ArrayList<NavigationPropertySegment>();
- EdmEntitySet fromEntitySet = uriResult.getTargetEntitySet();
-
- for (String expandPropertyName : expandItemString.split("/")) {
- if ("".equals(expandPropertyName)) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
-
- final EdmTyped property = fromEntitySet.getEntityType().getProperty(expandPropertyName);
- if (property == null) {
- throw new UriNotMatchingException(UriNotMatchingException.PROPERTYNOTFOUND.addContent(expandPropertyName));
- }
- if (property.getType().getKind() == EdmTypeKind.ENTITY) {
- final EdmNavigationProperty navigationProperty = (EdmNavigationProperty) property;
- fromEntitySet = fromEntitySet.getRelatedEntitySet(navigationProperty);
- NavigationPropertySegmentImpl propertySegment = new NavigationPropertySegmentImpl();
- propertySegment.setNavigationProperty(navigationProperty);
- propertySegment.setTargetEntitySet(fromEntitySet);
- expandNavigationProperties.add(propertySegment);
- } else {
- throw new UriSyntaxException(UriSyntaxException.NONAVIGATIONPROPERTY.addContent(expandPropertyName));
- }
- }
- expand.add(expandNavigationProperties);
- }
- uriResult.setExpand(expand);
- }
-
- private void handleSystemQueryOptionSelect(final String selectStatement) throws UriSyntaxException,
- UriNotMatchingException, EdmException {
- ArrayList<SelectItem> select = new ArrayList<SelectItem>();
-
- if (selectStatement.startsWith(",") || selectStatement.endsWith(",")) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
-
- for (String selectItemString : selectStatement.split(",")) {
- selectItemString = selectItemString.trim();
- if ("".equals(selectItemString)) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
- if (selectItemString.startsWith("/") || selectItemString.endsWith("/")) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
-
- SelectItemImpl selectItem = new SelectItemImpl();
- boolean exit = false;
- EdmEntitySet fromEntitySet = uriResult.getTargetEntitySet();
-
- for (String selectedPropertyName : selectItemString.split("/")) {
- if ("".equals(selectedPropertyName)) {
- throw new UriSyntaxException(UriSyntaxException.EMPTYSEGMENT);
- }
-
- if (exit) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(selectItemString));
- }
-
- if ("*".equals(selectedPropertyName)) {
- selectItem.setStar(true);
- exit = true;
- continue;
- }
-
- final EdmTyped property = fromEntitySet.getEntityType().getProperty(selectedPropertyName);
- if (property == null) {
- throw new UriNotMatchingException(UriNotMatchingException.PROPERTYNOTFOUND.addContent(selectedPropertyName));
- }
-
- switch (property.getType().getKind()) {
- case SIMPLE:
- case COMPLEX:
- selectItem.setProperty((EdmProperty) property);
- exit = true;
- break;
-
- case ENTITY: // navigation properties point to entities
- final EdmNavigationProperty navigationProperty = (EdmNavigationProperty) property;
- final EdmEntitySet targetEntitySet = fromEntitySet.getRelatedEntitySet(navigationProperty);
-
- NavigationPropertySegmentImpl navigationPropertySegment = new NavigationPropertySegmentImpl();
- navigationPropertySegment.setNavigationProperty(navigationProperty);
- navigationPropertySegment.setTargetEntitySet(targetEntitySet);
- selectItem.addNavigationPropertySegment(navigationPropertySegment);
-
- fromEntitySet = targetEntitySet;
- break;
-
- default:
- throw new UriSyntaxException(UriSyntaxException.INVALIDPROPERTYTYPE);
- }
- }
- select.add(selectItem);
- }
- uriResult.setSelect(select);
- }
-
- private void handleOtherQueryParameters() throws UriSyntaxException, EdmException {
- final EdmFunctionImport functionImport = uriResult.getFunctionImport();
- if (functionImport != null) {
- for (final String parameterName : functionImport.getParameterNames()) {
- final EdmParameter parameter = functionImport.getParameter(parameterName);
- final String value = otherQueryParameters.remove(parameterName);
-
- if (value == null) {
- if (parameter.getFacets() == null || parameter.getFacets().isNullable()) {
- continue;
- } else {
- throw new UriSyntaxException(UriSyntaxException.MISSINGPARAMETER);
- }
- }
-
- EdmLiteral uriLiteral = parseLiteral(value, (EdmSimpleType) parameter.getType());
- uriResult.addFunctionImportParameter(parameterName, uriLiteral);
- }
- }
-
- uriResult.setCustomQueryOptions(otherQueryParameters);
- }
-
- private EdmLiteral parseLiteral(final String value, final EdmSimpleType expectedType) throws UriSyntaxException {
- EdmLiteral literal;
- try {
- literal = simpleTypeFacade.parseUriLiteral(value);
- } catch (EdmLiteralException e) {
- throw convertEdmLiteralException(e);
- }
-
- if (expectedType.isCompatible(literal.getType())) {
- return literal;
- } else {
- throw new UriSyntaxException(UriSyntaxException.INCOMPATIBLELITERAL.addContent(value, expectedType));
- }
- }
-
- private static UriSyntaxException convertEdmLiteralException(final EdmLiteralException e) {
- final MessageReference messageReference = e.getMessageReference();
-
- if (EdmLiteralException.LITERALFORMAT.equals(messageReference)) {
- return new UriSyntaxException(UriSyntaxException.LITERALFORMAT.addContent(messageReference.getContent()), e);
- } else if (EdmLiteralException.NOTEXT.equals(messageReference)) {
- return new UriSyntaxException(UriSyntaxException.NOTEXT.addContent(messageReference.getContent()), e);
- } else if (EdmLiteralException.UNKNOWNLITERAL.equals(messageReference)) {
- return new UriSyntaxException(UriSyntaxException.UNKNOWNLITERAL.addContent(messageReference.getContent()), e);
- } else {
- return new UriSyntaxException(ODataBadRequestException.COMMON, e);
- }
- }
-
- private static List<String> copyPathSegmentList(final List<PathSegment> source) {
- List<String> copy = new ArrayList<String>();
-
- for (final PathSegment segment : source) {
- copy.add(segment.getPath());
- }
-
- return copy;
- }
-
- private static String percentDecode(final String value) throws UriSyntaxException {
- try {
- return Decoder.decode(value);
- } catch (RuntimeException e) {
- throw new UriSyntaxException(UriSyntaxException.URISYNTAX, e);
- }
- }
-
- @Override
- public FilterExpression parseFilterString(final EdmEntityType entityType, final String expression)
- throws ExpressionParserException, ODataMessageException {
- return new FilterParserImpl(entityType).parseFilterString(expression);
- }
-
- @Override
- public OrderByExpression parseOrderByString(final EdmEntityType entityType, final String expression)
- throws ExpressionParserException, ODataMessageException {
- return new OrderByParserImpl(entityType).parseOrderByString(expression);
- }
-
- @Override
- public ExpandSelectTreeNode buildExpandSelectTree(final List<SelectItem> select,
- final List<ArrayList<NavigationPropertySegment>> expand) throws EdmException {
- return new ExpandSelectTreeCreator(select, expand).create();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java
deleted file mode 100644
index 0983d08..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java
+++ /dev/null
@@ -1,133 +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.odata2.core.uri;
-
-import java.util.ArrayList;
-
-/**
- *
- */
-public enum UriType {
- /**
- * Service document
- */
- URI0(SystemQueryOption.$format),
- /**
- * Entity set
- */
- URI1(SystemQueryOption.$format, SystemQueryOption.$filter, SystemQueryOption.$inlinecount,
- SystemQueryOption.$orderby, SystemQueryOption.$skiptoken, SystemQueryOption.$skip, SystemQueryOption.$top,
- SystemQueryOption.$expand, SystemQueryOption.$select),
- /**
- * Entity set with key predicate
- */
- URI2(SystemQueryOption.$format, SystemQueryOption.$filter, SystemQueryOption.$expand, SystemQueryOption.$select),
- /**
- * Complex property of an entity
- */
- URI3(SystemQueryOption.$format),
- /**
- * Simple property of a complex property of an entity
- */
- URI4(SystemQueryOption.$format),
- /**
- * Simple property of an entity
- */
- URI5(SystemQueryOption.$format),
- /**
- * Navigation property of an entity with target multiplicity '1' or '0..1'
- */
- URI6A(SystemQueryOption.$format, SystemQueryOption.$filter, SystemQueryOption.$expand, SystemQueryOption.$select),
- /**
- * Navigation property of an entity with target multiplicity '*'
- */
- URI6B(SystemQueryOption.$format, SystemQueryOption.$filter, SystemQueryOption.$inlinecount,
- SystemQueryOption.$orderby, SystemQueryOption.$skiptoken, SystemQueryOption.$skip, SystemQueryOption.$top,
- SystemQueryOption.$expand, SystemQueryOption.$select),
- /**
- * Link to a single entity
- */
- URI7A(SystemQueryOption.$format, SystemQueryOption.$filter),
- /**
- * Link to multiple entities
- */
- URI7B(SystemQueryOption.$format, SystemQueryOption.$filter, SystemQueryOption.$inlinecount,
- SystemQueryOption.$orderby, SystemQueryOption.$skiptoken, SystemQueryOption.$skip, SystemQueryOption.$top),
- /**
- * Metadata document
- */
- URI8(),
- /**
- * Batch request
- */
- URI9(),
- /**
- * Function import returning a single instance of an entity type
- */
- URI10(SystemQueryOption.$format),
- /**
- * Function import returning a collection of complex-type instances
- */
- URI11(SystemQueryOption.$format),
- /**
- * Function import returning a single instance of a complex type
- */
- URI12(SystemQueryOption.$format),
- /**
- * Function import returning a collection of primitive-type instances
- */
- URI13(SystemQueryOption.$format),
- /**
- * Function import returning a single instance of a primitive type
- */
- URI14(SystemQueryOption.$format),
- /**
- * Count of an entity set
- */
- URI15(SystemQueryOption.$filter, SystemQueryOption.$orderby, SystemQueryOption.$skip, SystemQueryOption.$top),
- /**
- * Count of a single entity
- */
- URI16(SystemQueryOption.$filter),
- /**
- * Media resource of an entity
- */
- URI17(SystemQueryOption.$format, SystemQueryOption.$filter),
- /**
- * Count of link to a single entity
- */
- URI50A(SystemQueryOption.$filter),
- /**
- * Count of links to multiple entities
- */
- URI50B(SystemQueryOption.$filter, SystemQueryOption.$orderby, SystemQueryOption.$skip, SystemQueryOption.$top);
-
- private ArrayList<SystemQueryOption> whiteList = new ArrayList<SystemQueryOption>();
-
- private UriType(final SystemQueryOption... compatibleQueryOptions) {
- for (SystemQueryOption queryOption : compatibleQueryOptions) {
- whiteList.add(queryOption);
- }
- }
-
- public boolean isCompatible(final SystemQueryOption queryOption) {
- return whiteList.contains(queryOption);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ActualBinaryOperator.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ActualBinaryOperator.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ActualBinaryOperator.java
deleted file mode 100644
index f1b2f2b..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ActualBinaryOperator.java
+++ /dev/null
@@ -1,42 +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.odata2.core.uri.expression;
-
-public class ActualBinaryOperator {
- final protected InfoBinaryOperator operator;
- final protected Token token;
-
- public ActualBinaryOperator(final InfoBinaryOperator operatorInfo, final Token token) {
- if (operatorInfo == null) {
- throw new IllegalArgumentException("operatorInfo parameter must not be null");
- }
-
- operator = operatorInfo;
- this.token = token;
- }
-
- public Token getToken() {
- return token;
- }
-
- public InfoBinaryOperator getOP() {
- return operator;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/BinaryExpressionImpl.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/BinaryExpressionImpl.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/BinaryExpressionImpl.java
deleted file mode 100644
index 5243536..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/BinaryExpressionImpl.java
+++ /dev/null
@@ -1,97 +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.odata2.core.uri.expression;
-
-import org.apache.olingo.odata2.api.edm.EdmType;
-import org.apache.olingo.odata2.api.exception.ODataApplicationException;
-import org.apache.olingo.odata2.api.uri.expression.BinaryExpression;
-import org.apache.olingo.odata2.api.uri.expression.BinaryOperator;
-import org.apache.olingo.odata2.api.uri.expression.CommonExpression;
-import org.apache.olingo.odata2.api.uri.expression.ExceptionVisitExpression;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionKind;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionVisitor;
-
-/**
- *
- */
-public class BinaryExpressionImpl implements BinaryExpression {
- final protected InfoBinaryOperator operatorInfo;
- final protected CommonExpression leftSide;
- final protected CommonExpression rightSide;
- final protected Token token;
- protected EdmType edmType;
-
- public BinaryExpressionImpl(final InfoBinaryOperator operatorInfo, final CommonExpression leftSide,
- final CommonExpression rightSide, final Token token) {
- this.operatorInfo = operatorInfo;
- this.leftSide = leftSide;
- this.rightSide = rightSide;
- this.token = token;
- edmType = null;
- }
-
- @Override
- public BinaryOperator getOperator() {
- return operatorInfo.getOperator();
- }
-
- @Override
- public CommonExpression getLeftOperand() {
- return leftSide;
- }
-
- @Override
- public CommonExpression getRightOperand() {
- return rightSide;
- }
-
- @Override
- public EdmType getEdmType() {
- return edmType;
- }
-
- @Override
- public CommonExpression setEdmType(final EdmType edmType) {
- this.edmType = edmType;
- return this;
- }
-
- @Override
- public ExpressionKind getKind() {
- return ExpressionKind.BINARY;
- }
-
- @Override
- public String getUriLiteral() {
- return operatorInfo.getSyntax();
- }
-
- @Override
- public Object accept(final ExpressionVisitor visitor) throws ExceptionVisitExpression, ODataApplicationException {
- Object retLeftSide = leftSide.accept(visitor);
- Object retRightSide = rightSide.accept(visitor);
-
- return visitor.visitBinary(this, operatorInfo.getOperator(), retLeftSide, retRightSide);
- }
-
- public Token getToken() {
- return token;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ExpressionParserInternalError.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ExpressionParserInternalError.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ExpressionParserInternalError.java
deleted file mode 100644
index 62dcea1..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ExpressionParserInternalError.java
+++ /dev/null
@@ -1,133 +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.odata2.core.uri.expression;
-
-import org.apache.olingo.odata2.api.edm.EdmException;
-import org.apache.olingo.odata2.api.exception.MessageReference;
-import org.apache.olingo.odata2.api.exception.ODataMessageException;
-import org.apache.olingo.odata2.api.uri.expression.CommonExpression;
-
-/**
- * Internal error in the expression parser.
- *
- */
-public class ExpressionParserInternalError extends ODataMessageException {
-
- static final long serialVersionUID = 77L;
- public static final MessageReference ERROR_PARSING_METHOD = createMessageReference(
- ExpressionParserInternalError.class, "ERROR_PARSING_METHOD");
- public static final MessageReference ERROR_PARSING_PARENTHESIS = createMessageReference(
- ExpressionParserInternalError.class, "ERROR_PARSING_PARENTHESIS");
- public static final MessageReference ERROR_ACCESSING_EDM = createMessageReference(
- ExpressionParserInternalError.class, "ERROR_ACCESSING_EDM");
- public static final MessageReference INVALID_TYPE_COUNT = createMessageReference(ExpressionParserInternalError.class,
- "INVALID_TYPE_COUNT");;
- public static final MessageReference INVALID_TOKEN_AT = createMessageReference(ExpressionParserInternalError.class,
- "INVALID_TOKEN_AT");
- public static final MessageReference INVALID_TOKENKIND_AT = createMessageReference(
- ExpressionParserInternalError.class, "INVALID_TOKENKIND_AT");
-
- CommonExpression parenthesisExpression = null;
-
- public ExpressionParserInternalError(final MessageReference messageReference) {
- super(messageReference);
- }
-
- public ExpressionParserInternalError(final MessageReference messageReference, final Throwable cause) {
- super(messageReference, cause);
- }
-
- public ExpressionParserInternalError(final MessageReference messageReference, final TokenizerExpectError cause) {
- super(messageReference, cause);
- }
-
- public ExpressionParserInternalError(final MessageReference messageReference, final EdmException cause) {
- super(messageReference, cause);
- }
-
- public ExpressionParserInternalError setExpression(final CommonExpression parenthesisExpression) {
- this.parenthesisExpression = parenthesisExpression;
- return this;
- }
-
- public static ExpressionParserInternalError createERROR_PARSING_METHOD(final TokenizerExpectError cause) {
- return new ExpressionParserInternalError(ERROR_PARSING_METHOD, cause);
- }
-
- public static ExpressionParserInternalError createERROR_PARSING_PARENTHESIS(final TokenizerExpectError cause) {
- return new ExpressionParserInternalError(ERROR_PARSING_PARENTHESIS, cause);
- }
-
- public static ExpressionParserInternalError createERROR_PARSING_PARENTHESIS(
- final CommonExpression parenthesisExpression, final TokenizerExpectError cause) {
- return new ExpressionParserInternalError(ERROR_PARSING_PARENTHESIS, cause).setExpression(parenthesisExpression);
- }
-
- public static ExpressionParserInternalError createERROR_ACCESSING_EDM(final EdmException cause) {
- return new ExpressionParserInternalError(ERROR_ACCESSING_EDM, cause);
- }
-
- public static ExpressionParserInternalError createCOMMON() {
- return new ExpressionParserInternalError(COMMON);
- }
-
- public static ExpressionParserInternalError createCOMMON(final Throwable e) {
- return new ExpressionParserInternalError(COMMON, e);
- }
-
- public static ExpressionParserInternalError createINVALID_TYPE_COUNT() {
- return new ExpressionParserInternalError(INVALID_TYPE_COUNT);
- }
-
- public static ExpressionParserInternalError createERROR_ACCESSING_EDM() {
- return new ExpressionParserInternalError(ERROR_ACCESSING_EDM);
- }
-
- public static ExpressionParserInternalError
- createINVALID_TOKEN_AT(final String expectedToken, final Token actualToken) {
- MessageReference msgRef = ExpressionParserInternalError.INVALID_TOKEN_AT.create();
-
- msgRef.addContent(expectedToken);
- msgRef.addContent(actualToken.getUriLiteral());
- msgRef.addContent(actualToken.getPosition());
-
- return new ExpressionParserInternalError(msgRef);
- }
-
- public static ExpressionParserInternalError createINVALID_TOKENKIND_AT(final TokenKind expectedTokenKind,
- final Token actualToken) {
- MessageReference msgRef = ExpressionParserInternalError.INVALID_TOKEN_AT.create();
-
- msgRef.addContent(expectedTokenKind.toString());
- msgRef.addContent(actualToken.getKind().toString());
- msgRef.addContent(actualToken.getUriLiteral());
- msgRef.addContent(actualToken.getPosition());
-
- return new ExpressionParserInternalError(msgRef);
- }
-
- public static ExpressionParserInternalError createNO_TOKEN_AVAILABLE(final String expectedToken) {
- MessageReference msgRef = ExpressionParserInternalError.INVALID_TOKEN_AT.create();
-
- msgRef.addContent(expectedToken);
-
- return new ExpressionParserInternalError(msgRef);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterExpressionImpl.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterExpressionImpl.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterExpressionImpl.java
deleted file mode 100644
index 8d6ac2a..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterExpressionImpl.java
+++ /dev/null
@@ -1,84 +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.odata2.core.uri.expression;
-
-import org.apache.olingo.odata2.api.edm.EdmType;
-import org.apache.olingo.odata2.api.exception.ODataApplicationException;
-import org.apache.olingo.odata2.api.uri.expression.CommonExpression;
-import org.apache.olingo.odata2.api.uri.expression.ExceptionVisitExpression;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionKind;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionVisitor;
-import org.apache.olingo.odata2.api.uri.expression.FilterExpression;
-
-/**
- *
- */
-public class FilterExpressionImpl implements FilterExpression {
- private final String filterString;
- private EdmType edmType;
- private CommonExpression commonExpression;
-
- public FilterExpressionImpl(final String filterExpression) {
- filterString = filterExpression;
- }
-
- public FilterExpressionImpl(final String filterExpression, final CommonExpression childExpression) {
- filterString = filterExpression;
- commonExpression = childExpression;
- }
-
- @Override
- public String getExpressionString() {
- return filterString;
- }
-
- @Override
- public CommonExpression getExpression() {
- return commonExpression;
- }
-
- @Override
- public Object accept(final ExpressionVisitor visitor) throws ExceptionVisitExpression, ODataApplicationException {
- Object retCommonExpression = commonExpression.accept(visitor);
-
- return visitor.visitFilterExpression(this, filterString, retCommonExpression);
- }
-
- @Override
- public CommonExpression setEdmType(final EdmType edmType) {
- this.edmType = edmType;
- return this;
- }
-
- @Override
- public EdmType getEdmType() {
- return edmType;
- }
-
- @Override
- public ExpressionKind getKind() {
- return ExpressionKind.FILTER;
- }
-
- @Override
- public String getUriLiteral() {
- return getExpressionString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParser.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParser.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParser.java
deleted file mode 100644
index 972e3b3..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParser.java
+++ /dev/null
@@ -1,63 +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.odata2.core.uri.expression;
-
-import org.apache.olingo.odata2.api.exception.ODataMessageException;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionParserException;
-import org.apache.olingo.odata2.api.uri.expression.FilterExpression;
-
-/**
- * Interface which defines a method for parsing a $filter expression to allow different parser implementations
- * <p>
- * The current expression parser supports expressions as defined in the OData specification 2.0 with the following
- * restrictions
- * - the methods "cast", "isof" and "replace" are not supported
- *
- * The expression parser can be used with providing an Entity Data Model (EDM) an without providing it.
- * <p>When a EDM is provided the expression parser will be as strict as possible. That means:
- * <li>All properties used in the expression must be defined inside the EDM</li>
- * <li>The types of EDM properties will be checked against the lists of allowed type per method, binary- and unary
- * operator</li>
- * </p>
- * <p>If no EDM is provided the expression parser performs a lax validation
- * <li>The properties used in the expression are not looked up inside the EDM and the type of the expression node
- * representing the
- * property will be "null"</li>
- * <li>Expression node with EDM-types which are "null" are not considered during the parameter type validation, to the
- * return type of the parent expression node will
- * also become "null"</li>
- *
- *
- */
-public interface FilterParser {
- /**
- * Parses a $filter expression string and creates an $orderby expression tree.
- * @param expression
- * The $filter expression string ( for example "city eq 'Sydney'" ) to be parsed
- * @return
- * Expression tree which can be traversed with help of the interfaces
- * {@link org.apache.olingo.odata2.api.uri.expression.ExpressionVisitor} and
- * {@link org.apache.olingo.odata2.api.uri.expression.Visitable}
- * @throws ExpressionParserException
- * Exception thrown due to errors while parsing the $filter expression string
- * @throws ODataMessageException
- * Used for extensibility
- **/
- FilterExpression parseFilterString(String expression) throws ExpressionParserException, ODataMessageException;
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/57599da6/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParserExceptionImpl.java
----------------------------------------------------------------------
diff --git a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParserExceptionImpl.java b/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParserExceptionImpl.java
deleted file mode 100644
index 403fe2f..0000000
--- a/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/FilterParserExceptionImpl.java
+++ /dev/null
@@ -1,307 +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.odata2.core.uri.expression;
-
-import org.apache.olingo.odata2.api.edm.EdmException;
-import org.apache.olingo.odata2.api.edm.EdmStructuralType;
-import org.apache.olingo.odata2.api.edm.EdmType;
-import org.apache.olingo.odata2.api.exception.MessageReference;
-import org.apache.olingo.odata2.api.exception.ODataBadRequestException;
-import org.apache.olingo.odata2.api.uri.expression.BinaryOperator;
-import org.apache.olingo.odata2.api.uri.expression.CommonExpression;
-import org.apache.olingo.odata2.api.uri.expression.ExpressionParserException;
-import org.apache.olingo.odata2.api.uri.expression.PropertyExpression;
-
-/**
- * This class is used to create exceptions of type FilterParserException.
- * Because this class lies inside org.apache.olingo.odata2.core it is possible to define better/more detailed
- * input parameters for inserting into the exception text.<br>
- * The exception {@link ExpressionParserException} does not know the org.apache.olingo.odata2.core content
- *
- *
- */
-public class FilterParserExceptionImpl extends ExpressionParserException {
- private static final long serialVersionUID = 77L;
-
- static public ExpressionParserException createCOMMON() {
- return new ExpressionParserException(ODataBadRequestException.COMMON);
- }
-
- static public ExpressionParserException createERROR_IN_TOKENIZER(final TokenizerException exceptionTokenizer,
- final String expression) {
- Token token = exceptionTokenizer.getToken();
- MessageReference msgRef = ExpressionParserException.ERROR_IN_TOKENIZER.create();
-
- msgRef.addContent(token.getUriLiteral());
- msgRef.addContent(Integer.toString(token.getPosition() + 1));
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef, exceptionTokenizer);
- }
-
- static public ExpressionParserException createINVALID_TRAILING_TOKEN_DETECTED_AFTER_PARSING(final Token token,
- final String expression) {
- MessageReference msgRef = ExpressionParserException.INVALID_TRAILING_TOKEN_DETECTED_AFTER_PARSING.create();
-
- msgRef.addContent(token.getUriLiteral());
- msgRef.addContent(Integer.toString(token.getPosition() + 1));
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- static public ExpressionParserException
- createEXPRESSION_EXPECTED_AFTER_POS(final Token token, final String expression) {
- MessageReference msgRef = ExpressionParserException.EXPRESSION_EXPECTED_AFTER_POS.create();
-
- msgRef.addContent(Integer.toString(token.getPosition() + 1));
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- static public ExpressionParserException createEXPRESSION_EXPECTED_AFTER_POS(final int position,
- final String expression) {
- MessageReference msgRef = ExpressionParserException.EXPRESSION_EXPECTED_AFTER_POS.create();
-
- msgRef.addContent(position);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- static public ExpressionParserException
- createCOMMA_OR_END_EXPECTED_AT_POS(final Token token, final String expression) {
- MessageReference msgRef = ExpressionParserException.COMMA_OR_END_EXPECTED_AT_POS.create();
-
- msgRef.addContent(Integer.toString(token.getPosition() + 1));
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- static public ExpressionParserException createEXPRESSION_EXPECTED_AT_POS(final Token token, final String expression) {
- MessageReference msgRef = ExpressionParserException.EXPRESSION_EXPECTED_AT_POS.create();
-
- msgRef.addContent(Integer.toString(token.getPosition() + 1));
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- static public ExpressionParserException createCOMMA_OR_CLOSING_PHARENTHESIS_EXPECTED_AFTER_POS(final Token token,
- final String expression) {
- MessageReference msgRef = ExpressionParserException.COMMA_OR_CLOSING_PHARENTHESIS_EXPECTED_AFTER_POS.create();
-
- msgRef.addContent(Integer.toString(token.getPosition() + token.getUriLiteral().length()));
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createMETHOD_WRONG_ARG_COUNT(final MethodExpressionImpl methodExpression,
- final Token token, final String expression) {
- MessageReference msgRef = null;
- int minParam = methodExpression.getMethodInfo().getMinParameter();
- int maxParam = methodExpression.getMethodInfo().getMaxParameter();
-
- if ((minParam == -1) && (maxParam == -1)) {
- // no exception thrown in this case
- } else if ((minParam != -1) && (maxParam == -1)) {
- // Tested with TestParserExceptions.TestPMreadParameters CASE 7-1
- msgRef = ExpressionParserException.METHOD_WRONG_ARG_X_OR_MORE.create();
- msgRef.addContent(methodExpression.getMethod().toUriLiteral());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
- msgRef.addContent(minParam);
- } else if ((minParam == -1) && (maxParam != -1)) {
- // Tested with TestParserExceptions.TestPMreadParameters CASE 8-2
- msgRef = ExpressionParserException.METHOD_WRONG_ARG_X_OR_LESS.create();
- msgRef.addContent(methodExpression.getMethod().toUriLiteral());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
- msgRef.addContent(maxParam);
- } else if ((minParam != -1) && (maxParam != -1)) {
- if (minParam == maxParam) {
- // Tested with TestParserExceptions.TestPMreadParameters CASE 11-1
- msgRef = ExpressionParserException.METHOD_WRONG_ARG_EXACT.create();
- msgRef.addContent(methodExpression.getMethod().toUriLiteral());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
- msgRef.addContent(minParam);
- } else {
- // Tested with TestParserExceptions.TestPMreadParameters CASE 10-1
- msgRef = ExpressionParserException.METHOD_WRONG_ARG_BETWEEN.create();
- msgRef.addContent(methodExpression.getMethod().toUriLiteral());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
- msgRef.addContent(minParam);
- msgRef.addContent(maxParam);
- }
- }
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createMETHOD_WRONG_INPUT_TYPE(final MethodExpressionImpl methodExpression,
- final Token token, final String expression) {
- MessageReference msgRef = null;
-
- // Tested with TestParserExceptions.TestPMreadParameters CASE 7-1
- msgRef = ExpressionParserException.METHOD_WRONG_INPUT_TYPE.create();
- msgRef.addContent(methodExpression.getMethod().toUriLiteral());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createLEFT_SIDE_NOT_A_PROPERTY(final Token token, final String expression)
- throws ExpressionParserInternalError {
- MessageReference msgRef = ExpressionParserException.LEFT_SIDE_NOT_A_PROPERTY.create();
-
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createLEFT_SIDE_NOT_STRUCTURAL_TYPE(final EdmType parentType,
- final PropertyExpressionImpl property, final Token token, final String expression)
- throws ExpressionParserInternalError {
- MessageReference msgRef = ExpressionParserException.LEFT_SIDE_NOT_STRUCTURAL_TYPE.create();
-
- try {
- msgRef.addContent(property.getUriLiteral());
- msgRef.addContent(parentType.getNamespace() + "." + parentType.getName());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
- } catch (EdmException e) {
- throw ExpressionParserInternalError.createERROR_ACCESSING_EDM(e);
- }
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createPROPERTY_NAME_NOT_FOUND_IN_TYPE(final EdmStructuralType parentType,
- final PropertyExpression property, final Token token, final String expression)
- throws ExpressionParserInternalError {
- MessageReference msgRef = ExpressionParserException.PROPERTY_NAME_NOT_FOUND_IN_TYPE.create();
-
- try {
- msgRef.addContent(property.getUriLiteral());
- msgRef.addContent(parentType.getNamespace() + "." + parentType.getName());
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
- } catch (EdmException e) {
- throw ExpressionParserInternalError.createERROR_ACCESSING_EDM(e);
- }
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException
- createTOKEN_UNDETERMINATED_STRING(final int position, final String expression) {
- MessageReference msgRef = ExpressionParserException.TOKEN_UNDETERMINATED_STRING.create();
-
- msgRef.addContent(position + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createINVALID_TYPES_FOR_BINARY_OPERATOR(final BinaryOperator op,
- final EdmType left, final EdmType right, final Token token, final String expression) {
- MessageReference msgRef = ExpressionParserException.INVALID_TYPES_FOR_BINARY_OPERATOR.create();
-
- msgRef.addContent(op.toUriLiteral());
-
- try {
- msgRef.addContent(left.getNamespace() + "." + left.getName());
- } catch (EdmException e) {
- msgRef.addContent("");
- }
- try {
- msgRef.addContent(right.getNamespace() + "." + right.getName());
- } catch (EdmException e) {
- msgRef.addContent("");
- }
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createMISSING_CLOSING_PHARENTHESIS(final int position,
- final String expression, final TokenizerExpectError e) {
- MessageReference msgRef = ExpressionParserException.MISSING_CLOSING_PHARENTHESIS.create();
-
- msgRef.addContent(position + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef, e);
- }
-
- public static ExpressionParserException createINVALID_SORT_ORDER(final Token token, final String expression) {
- MessageReference msgRef = ExpressionParserException.INVALID_SORT_ORDER.create();
- msgRef.addContent(token.getPosition() + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
- }
-
- public static ExpressionParserException createINVALID_METHOD_CALL(final CommonExpression leftNode,
- final Token prevToken, final String expression) {
- final MessageReference msgRef = ExpressionParserException.INVALID_METHOD_CALL.create();
-
- msgRef.addContent(leftNode.getUriLiteral());
- msgRef.addContent(prevToken.getPosition() + 1);
- msgRef.addContent(expression);
-
- return new ExpressionParserException(msgRef);
-
- }
-
- public static ExpressionParserException createTYPE_EXPECTED_AT(final EdmType expectedType, final EdmType actualType,
- final int position, final String expression) {
- final MessageReference msgRef = ExpressionParserException.TYPE_EXPECTED_AT.create();
-
- try {
- msgRef.addContent(expectedType.getNamespace() + '.' + expectedType.getName());
- } catch (EdmException e) {
- msgRef.addContent("");
- }
-
- msgRef.addContent(position);
- msgRef.addContent(expression);
-
- if (actualType != null) {
- try {
- msgRef.addContent(actualType.getNamespace() + '.' + actualType.getName());
- } catch (EdmException e) {
- msgRef.addContent("");
- }
- } else {
- msgRef.addContent("null");
- }
-
- return new ExpressionParserException(msgRef);
-
- }
-}