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 2015/02/17 10:53:34 UTC
[20/35] olingo-odata4 git commit: [OLINGO-575] Removed V4 server code
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
deleted file mode 100644
index 5db1d11..0000000
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
+++ /dev/null
@@ -1,694 +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.validator;
-
-import java.util.HashMap;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.EdmAction;
-import org.apache.olingo.commons.api.edm.EdmActionImport;
-import org.apache.olingo.commons.api.edm.EdmEntityType;
-import org.apache.olingo.commons.api.edm.EdmFunction;
-import org.apache.olingo.commons.api.edm.EdmFunctionImport;
-import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
-import org.apache.olingo.commons.api.edm.EdmProperty;
-import org.apache.olingo.commons.api.edm.EdmReturnType;
-import org.apache.olingo.commons.api.edm.EdmSingleton;
-import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
-import org.apache.olingo.commons.api.http.HttpMethod;
-import org.apache.olingo.server.api.uri.UriInfo;
-import org.apache.olingo.server.api.uri.UriParameter;
-import org.apache.olingo.server.api.uri.UriResource;
-import org.apache.olingo.server.api.uri.UriResourceAction;
-import org.apache.olingo.server.api.uri.UriResourceEntitySet;
-import org.apache.olingo.server.api.uri.UriResourceFunction;
-import org.apache.olingo.server.api.uri.UriResourceKind;
-import org.apache.olingo.server.api.uri.UriResourceNavigation;
-import org.apache.olingo.server.api.uri.UriResourcePartTyped;
-import org.apache.olingo.server.api.uri.UriResourceProperty;
-import org.apache.olingo.server.api.uri.UriResourceSingleton;
-import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
-import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
-
-public class UriValidator {
-
- //@formatter:off (Eclipse formatter)
- //CHECKSTYLE:OFF (Maven checkstyle)
- private boolean[][] decisionMatrix =
- {
- /* 0-FILTER 1-FORMAT 2-EXPAND 3-ID 4-COUNT 5-ORDERBY 6-SEARCH 7-SELECT 8-SKIP 9-SKIPTOKEN 10-LEVELS 11-TOP */
- /* all 0 */ { true , true , true , false, true , true , true , true , true , true , true , false },
- /* batch 1 */ { false, false, false, false, false, false, false, false, false, false, false, false },
- /* crossjoin 2 */ { true , true , true , false, true , true , true , true , true , true , true , true },
- /* entityId 3 */ { false, true , true , true , false, false, false, true , false, false, true , false },
- /* metadata 4 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- /* resource 5 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- /* service 6 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- /* entitySet 7 */ { true , true , true , false, true , true , true , true , true , true , true , true },
- /* entitySetCount 8 */ { true, false, false, false, false, false, true, false, false, false, false, false },
- /* entity 9 */ { false, true , true , false, false, false, false, true , false, false, true , false },
- /* mediaStream 10 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- /* references 11 */ { true , true , false, false, false, true , true , false, true , true , false, true },
- /* reference 12 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- /* propertyComplex 13 */ { false, true , true , false, false, false, false, true , false, false, true , false },
- /* propertyComplexCollection 14 */ { true , true , true , false, true , true , false, false, true , true , true , true },
- /* propertyComplexCollectionCount 15 */ { true, false, false, false, false, false, true, false, false, false, false, false },
- /* propertyPrimitive 16 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- /* propertyPrimitiveCollection 17 */ { true , true , false, false, false, true , false, false, true , true , false, true },
- /* propertyPrimitiveCollectionCount 18 */ { true, false, false, false, false, false, true, false, false, false, false, false },
- /* propertyPrimitiveValue 19 */ { false, true , false, false, false, false, false, false, false, false, false, false },
- };
-
- private boolean[][] decisionMatrixForHttpMethod =
- {
- /* 0-FILTER 1-FORMAT 2-EXPAND 3-ID 4-COUNT 5-ORDERBY 6-SEARCH 7-SELECT 8-SKIP 9-SKIPTOKEN 10-LEVELS 11-TOP */
- /* GET 0 */ { true , true , true , true, true , true , true , true , true , true , true , true },
- /* POST 0 */ { true , false , true , false, false , true , false , true , false , false , true , false },
- /* PUT 0 */ { false , false , false , false, false , false , false , false , false , false , false , false },
- /* DELETE 0 */ { false , false , false , false, false , false, false , false, false , false , false, false },
- /* PATCH 0 */ { false , false , false , false, false , false , false , false , false , false , false , false },
- };
-
- //CHECKSTYLE:ON
- //@formatter:on
-
- private enum RowIndexForUriType {
- all(0),
- batch(1),
- crossjoin(2),
- entityId(3),
- metadata(4),
- resource(5),
- service(6),
- entitySet(7),
- entitySetCount(8),
- entity(9),
- mediaStream(10),
- references(11),
- reference(12),
- propertyComplex(13),
- propertyComplexCollection(14),
- propertyComplexCollectionCount(15),
- propertyPrimitive(16),
- propertyPrimitiveCollection(17),
- propertyPrimitiveCollectionCount(18),
- propertyPrimitiveValue(19);
-
- private int idx;
-
- RowIndexForUriType(final int i) {
- idx = i;
- }
-
- public int getIndex() {
- return idx;
- }
- }
-
- private enum ColumnIndex {
- filter(0),
- format(1),
- expand(2),
- id(3),
- count(4),
- orderby(5),
- search(6),
- select(7),
- skip(8),
- skiptoken(9),
- levels(10),
- top(11);
-
- private int idx;
-
- ColumnIndex(final int i) {
- idx = i;
- }
-
- public int getIndex() {
- return idx;
- }
-
- }
-
- private enum RowIndexForHttpMethod {
- GET(0),
- POST(1),
- PUT(2),
- DELETE(3),
- PATCH(4);
-
- private int idx;
-
- RowIndexForHttpMethod(final int i) {
- idx = i;
- }
-
- public int getIndex() {
- return idx;
- }
-
- }
-
- public UriValidator() {
- super();
- }
-
- public void validate(final UriInfo uriInfo, final HttpMethod httpMethod) throws UriValidationException {
- validateForHttpMethod(uriInfo, httpMethod);
- validateQueryOptions(uriInfo);
- validateKeyPredicates(uriInfo);
- validatePropertyOperations(uriInfo, httpMethod);
- }
-
- private ColumnIndex colIndex(final SystemQueryOptionKind queryOptionKind) throws UriValidationException {
- ColumnIndex idx;
- switch (queryOptionKind) {
- case FILTER:
- idx = ColumnIndex.filter;
- break;
- case FORMAT:
- idx = ColumnIndex.format;
- break;
- case EXPAND:
- idx = ColumnIndex.expand;
- break;
- case ID:
- idx = ColumnIndex.id;
- break;
- case COUNT:
- idx = ColumnIndex.count;
- break;
- case ORDERBY:
- idx = ColumnIndex.orderby;
- break;
- case SEARCH:
- idx = ColumnIndex.search;
- break;
- case SELECT:
- idx = ColumnIndex.select;
- break;
- case SKIP:
- idx = ColumnIndex.skip;
- break;
- case SKIPTOKEN:
- idx = ColumnIndex.skiptoken;
- break;
- case LEVELS:
- idx = ColumnIndex.levels;
- break;
- case TOP:
- idx = ColumnIndex.top;
- break;
- default:
- throw new UriValidationException("Unsupported option: " + queryOptionKind.toString(),
- UriValidationException.MessageKeys.UNSUPPORTED_QUERY_OPTION, queryOptionKind.toString());
- }
-
- return idx;
- }
-
- private RowIndexForUriType rowIndexForUriType(final UriInfo uriInfo) throws UriValidationException {
- RowIndexForUriType idx;
-
- switch (uriInfo.getKind()) {
- case all:
- idx = RowIndexForUriType.all;
- break;
- case batch:
- idx = RowIndexForUriType.batch;
- break;
- case crossjoin:
- idx = RowIndexForUriType.crossjoin;
- break;
- case entityId:
- idx = RowIndexForUriType.entityId;
- break;
- case metadata:
- idx = RowIndexForUriType.metadata;
- break;
- case resource:
- idx = rowIndexForResourceKind(uriInfo);
- break;
- case service:
- idx = RowIndexForUriType.service;
- break;
- default:
- throw new UriValidationException("Unsupported uriInfo kind: " + uriInfo.getKind(),
- UriValidationException.MessageKeys.UNSUPPORTED_URI_KIND, uriInfo.getKind().toString());
- }
-
- return idx;
- }
-
- private RowIndexForUriType rowIndexForResourceKind(final UriInfo uriInfo) throws UriValidationException {
- RowIndexForUriType idx;
-
- int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
- UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
-
- switch (lastPathSegment.getKind()) {
- case count:
- idx = rowIndexForCount(uriInfo);
- break;
- case action:
- idx = rowIndexForAction(lastPathSegment);
- break;
- case complexProperty:
- idx = rowIndexForComplexProperty(lastPathSegment);
- break;
- case entitySet:
- idx = rowIndexForEntitySet(lastPathSegment);
- break;
- case function:
- idx = rowIndexForFunction(lastPathSegment);
- break;
- case navigationProperty:
- idx =
- ((UriResourceNavigation) lastPathSegment).isCollection() ? RowIndexForUriType.entitySet
- : RowIndexForUriType.entity;
- break;
- case primitiveProperty:
- idx = rowIndexForPrimitiveProperty(lastPathSegment);
- break;
- case ref:
- idx = rowIndexForRef(uriInfo, lastPathSegment);
- break;
- case root:
- idx = RowIndexForUriType.service;
- break;
- case singleton:
- idx = RowIndexForUriType.entity;
- break;
- case value:
- idx = rowIndexForValue(uriInfo);
- break;
- default:
- throw new UriValidationException("Unsupported uriResource kind: " + lastPathSegment.getKind(),
- UriValidationException.MessageKeys.UNSUPPORTED_URI_RESOURCE_KIND, lastPathSegment.getKind().toString());
- }
-
- return idx;
- }
-
- private RowIndexForUriType rowIndexForValue(final UriInfo uriInfo) throws UriValidationException {
- RowIndexForUriType idx;
- int secondLastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 2;
- UriResource secondLastPathSegment = uriInfo.getUriResourceParts().get(secondLastPathSegmentIndex);
-
- switch (secondLastPathSegment.getKind()) {
- case primitiveProperty:
- idx = RowIndexForUriType.propertyPrimitiveValue;
- break;
- case entitySet:
- idx = RowIndexForUriType.mediaStream;
- break;
- case function:
- UriResourceFunction uriFunction = (UriResourceFunction) secondLastPathSegment;
-
- EdmFunction function;
- EdmFunctionImport functionImport = uriFunction.getFunctionImport();
- if (functionImport != null) {
- List<EdmFunction> functions = functionImport.getUnboundFunctions();
- function = functions.get(0);
- } else {
- function = uriFunction.getFunction();
- }
-
- EdmTypeKind functionReturnTypeKind = function.getReturnType().getType().getKind();
- boolean isFunctionCollection = function.getReturnType().isCollection();
- idx = determineReturnType(functionReturnTypeKind, isFunctionCollection);
- break;
- case action:
- UriResourceAction uriAction = (UriResourceAction) secondLastPathSegment;
- EdmActionImport actionImport = uriAction.getActionImport();
-
- EdmAction action;
- if (actionImport != null) {
- action = actionImport.getUnboundAction();
- } else {
- action = uriAction.getAction();
- }
-
- EdmTypeKind actionReturnTypeKind = action.getReturnType().getType().getKind();
- boolean isActionCollection = action.getReturnType().isCollection();
- idx = determineReturnType(actionReturnTypeKind, isActionCollection);
-
- break;
- case navigationProperty:
- UriResourceNavigation uriNavigation = (UriResourceNavigation) secondLastPathSegment;
-
- if (uriNavigation.isCollection()) {
- idx = RowIndexForUriType.entitySet;
- } else {
- idx = RowIndexForUriType.entity;
- }
- break;
- case singleton:
- UriResourceSingleton uriSingleton = (UriResourceSingleton) secondLastPathSegment;
- EdmSingleton singleton = uriSingleton.getSingleton();
- EdmTypeKind singletonReturnTypeKind = singleton.getEntityType().getKind();
- idx = determineReturnType(singletonReturnTypeKind, false);
- break;
- default:
- throw new UriValidationException("Unexpected kind in path segment before $value: "
- + secondLastPathSegment.getKind(), UriValidationException.MessageKeys.UNALLOWED_KIND_BEFORE_VALUE,
- secondLastPathSegment.toString());
- }
- return idx;
- }
-
- private RowIndexForUriType determineReturnType(final EdmTypeKind functionReturnTypeKind,
- final boolean isCollection) throws UriValidationException {
- RowIndexForUriType idx;
- switch (functionReturnTypeKind) {
- case COMPLEX:
- idx = isCollection ? RowIndexForUriType.propertyComplexCollection : RowIndexForUriType.propertyComplex;
- break;
- case ENTITY:
- idx = isCollection ? RowIndexForUriType.entitySet : RowIndexForUriType.entity;
- break;
- case PRIMITIVE:
- case ENUM:
- case DEFINITION:
- idx = isCollection ? RowIndexForUriType.propertyPrimitiveCollection : RowIndexForUriType.propertyPrimitive;
- break;
- default:
- throw new UriValidationException("Unsupported function return type: " + functionReturnTypeKind,
- UriValidationException.MessageKeys.UNSUPPORTED_FUNCTION_RETURN_TYPE, functionReturnTypeKind.toString());
- }
- return idx;
- }
-
- private RowIndexForUriType rowIndexForRef(final UriInfo uriInfo, final UriResource lastPathSegment)
- throws UriValidationException {
- RowIndexForUriType idx;
- int secondLastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 2;
- UriResource secondLastPathSegment = uriInfo.getUriResourceParts().get(secondLastPathSegmentIndex);
-
- if (secondLastPathSegment instanceof UriResourcePartTyped) {
- idx =
- ((UriResourcePartTyped) secondLastPathSegment).isCollection() ? RowIndexForUriType.references
- : RowIndexForUriType.reference;
- } else {
- throw new UriValidationException("secondLastPathSegment not a class of UriResourcePartTyped: "
- + lastPathSegment.getClass(), UriValidationException.MessageKeys.LAST_SEGMENT_NOT_TYPED, lastPathSegment
- .toString());
- }
-
- return idx;
- }
-
- private RowIndexForUriType rowIndexForPrimitiveProperty(final UriResource lastPathSegment)
- throws UriValidationException {
- RowIndexForUriType idx;
- if (lastPathSegment instanceof UriResourcePartTyped) {
- idx =
- ((UriResourcePartTyped) lastPathSegment).isCollection() ? RowIndexForUriType.propertyPrimitiveCollection
- : RowIndexForUriType.propertyPrimitive;
- } else {
- throw new UriValidationException("lastPathSegment not a class of UriResourcePartTyped: "
- + lastPathSegment.getClass(), UriValidationException.MessageKeys.LAST_SEGMENT_NOT_TYPED, lastPathSegment
- .toString());
- }
- return idx;
- }
-
- private RowIndexForUriType rowIndexForFunction(final UriResource lastPathSegment) throws UriValidationException {
- RowIndexForUriType idx;
- UriResourceFunction urf = (UriResourceFunction) lastPathSegment;
- EdmReturnType rt = urf.getFunction().getReturnType();
- switch (rt.getType().getKind()) {
- case ENTITY:
- if (((EdmEntityType) rt.getType()).hasStream()) {
- idx = RowIndexForUriType.mediaStream;
- } else {
- idx = rt.isCollection() ? RowIndexForUriType.entitySet : RowIndexForUriType.entity;
- }
- break;
- case PRIMITIVE:
- idx = rt.isCollection() ? RowIndexForUriType.propertyPrimitiveCollection : RowIndexForUriType.propertyPrimitive;
- break;
- case COMPLEX:
- idx = rt.isCollection() ? RowIndexForUriType.propertyComplexCollection : RowIndexForUriType.propertyComplex;
- break;
- default:
- throw new UriValidationException("Unsupported function return type: " + rt.getType().getKind(),
- UriValidationException.MessageKeys.UNSUPPORTED_FUNCTION_RETURN_TYPE,
- rt.getType().getKind().toString());
- }
-
- return idx;
- }
-
- private RowIndexForUriType rowIndexForEntitySet(final UriResource lastPathSegment) throws UriValidationException {
- RowIndexForUriType idx;
- if (lastPathSegment instanceof UriResourcePartTyped) {
- idx =
- ((UriResourcePartTyped) lastPathSegment).isCollection() ? RowIndexForUriType.entitySet
- : RowIndexForUriType.entity;
- } else {
- throw new UriValidationException("lastPathSegment not a class of UriResourcePartTyped: "
- + lastPathSegment.getClass(), UriValidationException.MessageKeys.LAST_SEGMENT_NOT_TYPED, lastPathSegment
- .toString());
- }
- return idx;
- }
-
- private RowIndexForUriType rowIndexForComplexProperty(final UriResource lastPathSegment)
- throws UriValidationException {
- RowIndexForUriType idx;
- if (lastPathSegment instanceof UriResourcePartTyped) {
- idx =
- ((UriResourcePartTyped) lastPathSegment).isCollection() ? RowIndexForUriType.propertyComplexCollection
- : RowIndexForUriType.propertyComplex;
- } else {
- throw new UriValidationException("lastPathSegment not a class of UriResourcePartTyped: "
- + lastPathSegment.getClass(), UriValidationException.MessageKeys.LAST_SEGMENT_NOT_TYPED, lastPathSegment
- .toString());
- }
- return idx;
- }
-
- private RowIndexForUriType rowIndexForAction(final UriResource lastPathSegment) throws UriValidationException {
- RowIndexForUriType idx;
- UriResourceAction ura = (UriResourceAction) lastPathSegment;
- EdmReturnType rt = ura.getAction().getReturnType();
- switch (rt.getType().getKind()) {
- case ENTITY:
- if (((EdmEntityType) rt.getType()).hasStream()) {
- idx = RowIndexForUriType.mediaStream;
- } else {
- idx = rt.isCollection() ? RowIndexForUriType.entitySet : RowIndexForUriType.entity;
- }
- break;
- case PRIMITIVE:
- idx = rt.isCollection() ? RowIndexForUriType.propertyPrimitiveCollection : RowIndexForUriType.propertyPrimitive;
- break;
- case COMPLEX:
- idx = rt.isCollection() ? RowIndexForUriType.propertyComplexCollection : RowIndexForUriType.propertyComplex;
- break;
- default:
- throw new UriValidationException("Unsupported action return type: " + rt.getType().getKind(),
- UriValidationException.MessageKeys.UNSUPPORTED_ACTION_RETURN_TYPE, rt.getType().getKind().toString());
- }
-
- return idx;
- }
-
- private RowIndexForUriType rowIndexForCount(final UriInfo uriInfo) throws UriValidationException {
-
- RowIndexForUriType idx;
- int secondLastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 2;
- UriResource secondLastPathSegment = uriInfo.getUriResourceParts().get(secondLastPathSegmentIndex);
- switch (secondLastPathSegment.getKind()) {
- case entitySet:
- case navigationProperty:
- idx = RowIndexForUriType.entitySetCount;
- break;
- case complexProperty:
- idx = RowIndexForUriType.propertyComplexCollectionCount;
- break;
- case primitiveProperty:
- idx = RowIndexForUriType.propertyPrimitiveCollectionCount;
- break;
- case function:
- UriResourceFunction uriFunction = (UriResourceFunction) secondLastPathSegment;
-
- EdmFunction function;
- List<EdmFunction> functions;
- EdmFunctionImport functionImport = uriFunction.getFunctionImport();
- if (functionImport != null) {
- functions = functionImport.getUnboundFunctions();
- function = functions.get(0);
- } else {
- function = uriFunction.getFunction();
- }
-
- EdmTypeKind functionReturnTypeKind = function.getReturnType().getType().getKind();
- boolean isCollection = function.getReturnType().isCollection();
- idx = determineReturnType(functionReturnTypeKind, isCollection);
- break;
- default:
- throw new UriValidationException("Illegal path part kind before $count: " + secondLastPathSegment.getKind(),
- UriValidationException.MessageKeys.UNALLOWED_KIND_BEFORE_COUNT, secondLastPathSegment.toString());
- }
-
- return idx;
- }
-
- private void validateQueryOptions(final UriInfo uriInfo) throws UriValidationException {
- RowIndexForUriType row = rowIndexForUriType(uriInfo);
-
- for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
- ColumnIndex col = colIndex(option.getKind());
-
- if (!decisionMatrix[row.getIndex()][col.getIndex()]) {
- throw new UriValidationException("System query option not allowed: " + option.getName(),
- UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED, option.getName());
- }
- }
-
- }
-
- private void validateForHttpMethod(final UriInfo uriInfo, final HttpMethod httpMethod) throws UriValidationException {
- RowIndexForHttpMethod row = rowIndexForHttpMethod(httpMethod);
-
- for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
- ColumnIndex col = colIndex(option.getKind());
- if (!decisionMatrixForHttpMethod[row.getIndex()][col.getIndex()]) {
- throw new UriValidationException("System query option " + option.getName() + " not allowed for method "
- + httpMethod, UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, option
- .getName(), httpMethod.toString());
- }
- }
-
- }
-
- private RowIndexForHttpMethod rowIndexForHttpMethod(final HttpMethod httpMethod) throws UriValidationException {
- RowIndexForHttpMethod idx;
-
- switch (httpMethod) {
- case GET:
- idx = RowIndexForHttpMethod.GET;
- break;
- case POST:
- idx = RowIndexForHttpMethod.POST;
- break;
- case PUT:
- idx = RowIndexForHttpMethod.PUT;
- break;
- case DELETE:
- idx = RowIndexForHttpMethod.DELETE;
- break;
- case PATCH:
- idx = RowIndexForHttpMethod.PATCH;
- break;
- default:
- throw new UriValidationException("HTTP method not supported: " + httpMethod,
- UriValidationException.MessageKeys.UNSUPPORTED_HTTP_METHOD, httpMethod.toString());
- }
-
- return idx;
- }
-
- private void validateKeyPredicates(final UriInfo uriInfo) throws UriValidationException {
- for (UriResource pathSegment : uriInfo.getUriResourceParts()) {
- if (pathSegment.getKind() == UriResourceKind.entitySet) {
- UriResourceEntitySet pathEntitySet = (UriResourceEntitySet) pathSegment;
- List<UriParameter> keyPredicates = pathEntitySet.getKeyPredicates();
-
- if (keyPredicates != null) {
-
- final List<String> keyPredicateNames = pathEntitySet.getEntityType().getKeyPredicateNames();
- HashMap<String, EdmKeyPropertyRef> edmKeys = new HashMap<String, EdmKeyPropertyRef>();
- for (EdmKeyPropertyRef key : pathEntitySet.getEntityType().getKeyPropertyRefs()) {
- edmKeys.put(key.getKeyPropertyName(), key);
- final String alias = key.getAlias();
- if (alias != null) {
- edmKeys.put(alias, key);
- }
- }
-
- for (UriParameter keyPredicate : keyPredicates) {
- final String name = keyPredicate.getName();
- final String alias = keyPredicate.getAlias();
- final String value = alias == null ?
- keyPredicate.getText() :
- uriInfo.getValueForAlias(alias);
-
- EdmKeyPropertyRef edmKey = edmKeys.get(name);
- if (edmKey == null) {
- if (keyPredicateNames.contains(name)) {
- throw new UriValidationException("Double key property: " + name,
- UriValidationException.MessageKeys.DOUBLE_KEY_PROPERTY, name);
- } else {
- throw new UriValidationException("Unknown key property: " + name,
- UriValidationException.MessageKeys.INVALID_KEY_PROPERTY, name);
- }
- }
-
- final EdmProperty property = edmKey.getProperty();
- final EdmPrimitiveType edmPrimitiveType = (EdmPrimitiveType) property.getType();
- try {
- if (!edmPrimitiveType.validate(edmPrimitiveType.fromUriLiteral(value),
- property.isNullable(), property.getMaxLength(),
- property.getPrecision(), property.getScale(), property.isUnicode())) {
- // TODO: Check exception here
- throw new UriValidationException("PrimitiveTypeException",
- UriValidationException.MessageKeys.INVALID_KEY_PROPERTY, name);
- }
- } catch (EdmPrimitiveTypeException e) {
- // TODO: Check exception here
- throw new UriValidationException("PrimitiveTypeException", e,
- UriValidationException.MessageKeys.INVALID_KEY_PROPERTY, name);
- }
-
- edmKeys.remove(name);
- edmKeys.remove(alias);
- }
- }
- }
- }
- }
-
- private void validatePropertyOperations(final UriInfo uriInfo, final HttpMethod method)
- throws UriValidationException {
- final List<UriResource> parts = uriInfo.getUriResourceParts();
- final UriResource last = parts.size() > 0 ? parts.get(parts.size() - 1) : null;
- final UriResource previous = parts.size() > 1 ? parts.get(parts.size() - 2) : null;
- if (last != null
- && (last.getKind() == UriResourceKind.primitiveProperty
- || last.getKind() == UriResourceKind.complexProperty
- || last.getKind() == UriResourceKind.value && previous.getKind() == UriResourceKind.primitiveProperty)) {
- final EdmProperty property = ((UriResourceProperty)
- (last.getKind() == UriResourceKind.value ? previous : last)).getProperty();
- if (method == HttpMethod.PATCH && property.isCollection()) {
- throw new UriValidationException("Attempt to patch collection property.",
- UriValidationException.MessageKeys.UNSUPPORTED_HTTP_METHOD, method.toString());
- }
- if (method == HttpMethod.DELETE && property.isNullable() != null && !property.isNullable()) {
- throw new UriValidationException("Attempt to delete non-nullable property.",
- UriValidationException.MessageKeys.UNSUPPORTED_HTTP_METHOD, method.toString());
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
deleted file mode 100644
index 98259b6..0000000
--- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
+++ /dev/null
@@ -1,140 +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.
-#-------------------------------------------------------------------------------
-# Basic Apache Olingo exception messages
-#
-ODataHandlerException.AMBIGUOUS_XHTTP_METHOD=x-http-method header '%1$s' and x-http-method-override header '%2$s' are not the same.
-ODataHandlerException.INVALID_HTTP_METHOD=Invalid HTTP method given: '%1$s'.
-ODataHandlerException.HTTP_METHOD_NOT_ALLOWED=HTTP method '%1$s' not allowed for this resource.
-ODataHandlerException.PROCESSOR_NOT_IMPLEMENTED=No processor for interface '%1$s' registered.
-ODataHandlerException.FUNCTIONALITY_NOT_IMPLEMENTED=The requested functionality has not been implemented (yet).
-ODataHandlerException.ODATA_VERSION_NOT_SUPPORTED=OData version '%1$s' is not supported.
-ODataHandlerException.UNSUPPORTED_CONTENT_TYPE=The content type '%1$s' is not supported for this request.
-
-UriParserSyntaxException.MUST_BE_LAST_SEGMENT=The segment '%1$s' must be the last segment.
-UriParserSyntaxException.UNKNOWN_SYSTEM_QUERY_OPTION=The system query option '%1$s' is not defined.
-UriParserSyntaxException.DOUBLE_SYSTEM_QUERY_OPTION=The system query option '%1$s' can be specified only once.
-UriParserSyntaxException.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION=The system query option '%1$s' has the not-allowed value '%2$s'.
-UriParserSyntaxException.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT=The system query option '$format' must be either 'json', 'xml', 'atom', or a valid content type; the value '%1$s' is neither.
-UriParserSyntaxException.SYSTEM_QUERY_OPTION_LEVELS_NOT_ALLOWED_HERE=The system query option '$levels' is not allowed here.
-UriParserSyntaxException.SYNTAX=The URI is malformed.
-
-UriParserSemanticException.FUNCTION_NOT_FOUND=The function import '%1$s' has no function with parameters '%2$s'.
-UriParserSemanticException.RESOURCE_PART_ONLY_FOR_TYPED_PARTS='%1$s' is only allowed for typed parts.
-UriParserSemanticException.RESOURCE_PART_MUST_BE_PRECEDED_BY_STRUCTURAL_TYPE=The resource part '%1$s' must be preceded by a structural type.
-UriParserSemanticException.PROPERTY_AFTER_COLLECTION=The property '%1$s' must not follow a collection.
-UriParserSemanticException.PROPERTY_NOT_IN_TYPE=The type '%1$s' has no property '%2$s'.
-UriParserSemanticException.EXPRESSION_PROPERTY_NOT_IN_TYPE=The property '%2$s', used in a query expression, is not defined in type '%1$s'.
-UriParserSemanticException.UNKNOWN_PROPERTY_TYPE=The type of the property '%1$s' is unknown.
-UriParserSemanticException.INCOMPATIBLE_TYPE_FILTER=The type filter '%1$s' is incompatible.
-UriParserSemanticException.TYPE_FILTER_NOT_CHAINABLE=The type filter '%2$s' can not be chained with '%1$s'.
-UriParserSemanticException.PREVIOUS_PART_NOT_TYPED=The previous part of the type filter '%1$s' is not typed.
-UriParserSemanticException.FUNCTION_PARAMETERS_EXPECTED=Function parameters expected for type '%1$s'.
-UriParserSemanticException.UNKNOWN_PART=The part '%1$s' is not defined.
-UriParserSemanticException.ONLY_FOR_TYPED_PARTS='%1$s' is only allowed for typed parts.
-UriParserSemanticException.UNKNOWN_ENTITY_TYPE=The entity type '%1$s' is not defined.
-UriParserSemanticException.ONLY_FOR_COLLECTIONS='%1$s' is only allowed for collections.
-UriParserSemanticException.ONLY_FOR_ENTITY_TYPES='%1$s' is only allowed for entity types.
-UriParserSemanticException.ONLY_FOR_STRUCTURAL_TYPES='%1$s' is only allowed for structural types.
-UriParserSemanticException.ONLY_FOR_TYPED_PROPERTIES='%1$s' is only allowed for typed properties.
-UriParserSemanticException.INVALID_KEY_VALUE=The key value '%1$s' is invalid.
-UriParserSemanticException.PARAMETERS_LIST_ONLY_FOR_TYPED_PARTS=A list of parameters is only allowed for typed parts.
-UriParserSemanticException.WRONG_NUMBER_OF_KEY_PROPERTIES=There are %2$s key properties instead of the expected %1$s.
-UriParserSemanticException.NOT_ENOUGH_REFERENTIAL_CONSTRAINTS=There are not enough referential constraints.
-UriParserSemanticException.KEY_NOT_ALLOWED=A key is not allowed.
-UriParserSemanticException.RESOURCE_PATH_NOT_TYPED=The resource path is not typed.
-UriParserSemanticException.ONLY_SIMPLE_AND_COMPLEX_PROPERTIES_IN_SELECT=Only simple and complex properties are allowed in selection.
-UriParserSemanticException.COMPLEX_PROPERTY_OF_ENTITY_TYPE_EXPECTED=A complex property of an entity type is expected.
-UriParserSemanticException.NOT_FOR_ENTITY_TYPE=Not allowed for entity type.
-UriParserSemanticException.PREVIOUS_PART_TYPED=The previous part is typed.
-UriParserSemanticException.RESOURCE_NOT_FOUND=Cannot find EntitySet, Singleton, ActionImport or FunctionImport with name '%1$s'.
-
-UriValidationException.UNSUPPORTED_QUERY_OPTION=The query option '%1$s' is not supported.
-UriValidationException.UNSUPPORTED_URI_KIND=The URI kind '%1$s' is not supported.
-UriValidationException.UNSUPPORTED_URI_RESOURCE_KIND=The URI resource kind '%1$s' is not supported.
-UriValidationException.UNSUPPORTED_FUNCTION_RETURN_TYPE=The function return type '%1$s' is not supported.
-UriValidationException.UNSUPPORTED_ACTION_RETURN_TYPE=The action return type '%1$s' is not supported.
-UriValidationException.UNSUPPORTED_HTTP_METHOD=The HTTP method '%1$s' is not supported.
-UriValidationException.SYSTEM_QUERY_OPTION_NOT_ALLOWED=The system query option '%1$s' is not allowed.
-UriValidationException.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD=The system query option '%1$s' is not allowed for HTTP method '%2$s'.
-UriValidationException.INVALID_KEY_PROPERTY=The key property '%1$s' is invalid.
-UriValidationException.DOUBLE_KEY_PROPERTY=The key property '%1$s' has been specified twice.
-UriValidationException.LAST_SEGMENT_NOT_TYPED=The last segment '%1$s' is not typed.
-UriValidationException.SECOND_LAST_SEGMENT_NOT_TYPED=The second last segment '%1$s' is not typed.
-UriValidationException.UNALLOWED_KIND_BEFORE_VALUE=The kind '%1$s' is not allowed before '$value'.
-UriValidationException.UNALLOWED_KIND_BEFORE_COUNT=The kind '%1$s' is not allowed before '$count'.
-
-ContentNegotiatorException.WRONG_CHARSET_IN_HEADER=The HTTP header '%1$s' with value '%2$s' contains an invalid character-set specification.
-ContentNegotiatorException.UNSUPPORTED_CONTENT_TYPES=The content-type range '%1$s' is not supported.
-ContentNegotiatorException.UNSUPPORTED_CONTENT_TYPE=The content type '%1$s' is not supported.
-ContentNegotiatorException.NO_CONTENT_TYPE_SUPPORTED=No content type has been specified as supported.
-ContentNegotiatorException.UNSUPPORTED_FORMAT_OPTION=The $format option '%1$s' is not supported.
-
-SerializerException.NOT_IMPLEMENTED=The requested serialization method has not been implemented yet.
-SerializerException.UNSUPPORTED_FORMAT=The format '%1$s' is not supported.
-SerializerException.JSON_METADATA=The metadata document cannot be provided in JSON format.
-SerializerException.IO_EXCEPTION=An I/O exception occurred.
-SerializerException.NULL_INPUT=The input 'null' is not allowed here.
-SerializerException.NO_CONTEXT_URL=No context URL has been provided.
-SerializerException.UNSUPPORTED_PROPERTY_TYPE=The type of the property '%1$s' is not yet supported.
-SerializerException.INCONSISTENT_PROPERTY_TYPE=An inconsistency has been detected in the type definition of property '%1$s'.
-SerializerException.MISSING_PROPERTY=The non-nullable property '%1$s' is missing.
-SerializerException.WRONG_PROPERTY_VALUE=The value '%2$s' is not valid for property '%1$s'.
-SerializerException.WRONG_PRIMITIVE_VALUE=The value '%2$s' is not valid for the primitive type '%1$s' and the given facets.
-
-DeserializerException.NOT_IMPLEMENTED=The requested deserialization method has not been implemented yet.
-DeserializerException.IO_EXCEPTION=An I/O exception occurred.
-DeserializerException.UNSUPPORTED_FORMAT=The format '%1$s' is not supported.
-DeserializerException.JSON_SYNTAX_EXCEPTION=The syntax of the JSON document is not valid.
-DeserializerException.INVALID_NULL_PROPERTY=The property '%1$s' must not be null.
-DeserializerException.UNKOWN_CONTENT='%1$s' can not be mapped as a property or an annotation.
-DeserializerException.INVALID_VALUE_FOR_PROPERTY=Invalid value for property '%1$s'.
-DeserializerException.INVALID_TYPE_FOR_PROPERTY=Invalid JSON type for property '%1$s'.
-DeserializerException.VALUE_ARRAY_NOT_PRESENT=Cannot find the value array. A collection needs at least an empty array.
-DeserializerException.VALUE_TAG_MUST_BE_AN_ARRAY=Invalid JSON type for the value tag. Must be an Array.
-DeserializerException.INVALID_ENTITY=Invalid JSON type for an entity. Must be a JSON object.
-DeserializerException.INVALID_VALUE_FOR_NAVIGATION_PROPERTY=Invalid value for navigation property '%1$s'. Must be an array for collections or for an entity either null or an object.
-DeserializerException.DUPLICATE_PROPERTY="Edm Properties must not appear twice within the same object."
-DeserializerException.DUPLICATE_JSON_PROPERTY="JSON properties must not appear twice within the same object."
-DeserializerException.UNKNOWN_PRIMITIVE_TYPE=Unknown primitive type '%1$s' for property '%2$s';
-DeserializerException.NAVIGATION_PROPERTY_NOT_FOUND=Can`t find navigation property with name: '%1$s'.
-DeserializerException.INVALID_ANNOTATION_TYPE=The annotation '%1$s' has the wrong JSON type.
-
-BatchDeserializerException.INVALID_BOUNDARY=Invalid boundary at line '%1$s'.
-BatchDeserializerException.INVALID_CHANGESET_METHOD=Invalid method: a ChangeSet cannot contain retrieve requests at line '%1$s'.
-BatchDeserializerException.INVALID_CONTENT=Retrieve requests must not contain any body content '%1$s'.
-BatchDeserializerException.INVALID_CONTENT_LENGTH=Invalid content length: content length have to be an integer and positive at line '%1$s'.
-BatchDeserializerException.INVALID_CONTENT_TRANSFER_ENCODING=The Content-Transfer-Encoding should be binary: line '%1$s'.
-BatchDeserializerException.INVALID_CONTENT_TYPE=Content-Type should be '%1$s'.
-BatchDeserializerException.INVALID_HEADER=Invalid header: '%1$s' at line '%2$s'.
-BatchDeserializerException.INVALID_HTTP_VERSION=Invalid HTTP version: The version have to be HTTP/1.1 at line '%1$s'.
-BatchDeserializerException.INVALID_METHOD=Invalid HTTP method at line '%1$s'.
-BatchDeserializerException.INVALID_QUERY_OPERATION_METHOD=Invalid method: a query operation can only contain retrieve requests at line '%1$s'.
-BatchDeserializerException.INVALID_STATUS_LINE=Invalid HTTP status line at line '%1$s'.
-BatchDeserializerException.INVALID_URI=Invalid URI at line '%1$s'.
-BatchDeserializerException.FORBIDDEN_HEADER=Forbidden header at line '%1$s'.
-BatchDeserializerException.MISSING_BLANK_LINE=Missing blank line at line '%1$s'.
-BatchDeserializerException.MISSING_BOUNDARY_DELIMITER=Missing boundary delimiter at line '%1$s'.
-BatchDeserializerException.MISSING_CLOSE_DELIMITER=Missing close delimiter at line '%1$s'.
-BatchDeserializerException.MISSING_CONTENT_ID=Missing content-id at line '%1$s'.
-BatchDeserializerException.MISSING_CONTENT_TRANSFER_ENCODING=Missing content transfer encoding at line '%1$s'.
-BatchDeserializerException.MISSING_CONTENT_TYPE=Missing content-type at line '%1$s'.
-BatchDeserializerException.MISSING_MANDATORY_HEADER=Missing mandatory header at line '%1$s'.
-BatchDeserializerException.INVALID_BASE_URI=The base URI do not match the service base URI at line '%1$s'.
-
-BatchSerializerExecption.MISSING_CONTENT_ID=Each request within a change set required exactly one content id.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
deleted file mode 100644
index 972432d..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
+++ /dev/null
@@ -1,212 +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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyListOf;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
-import org.apache.olingo.commons.api.format.ContentType;
-import org.apache.olingo.commons.api.format.ODataFormat;
-import org.apache.olingo.commons.api.http.HttpContentType;
-import org.apache.olingo.commons.api.http.HttpHeader;
-import org.apache.olingo.server.api.ODataRequest;
-import org.apache.olingo.server.api.serializer.CustomContentTypeSupport;
-import org.apache.olingo.server.api.serializer.RepresentationType;
-import org.apache.olingo.server.api.uri.queryoption.FormatOption;
-import org.junit.Test;
-
-public class ContentNegotiatorTest {
-
- static final private String ACCEPT_CASE_MIN = "application/json;odata.metadata=minimal";
- static final private String ACCEPT_CASE_MIN_UTF8 = "application/json;charset=UTF-8;odata.metadata=minimal";
- static final private String ACCEPT_CASE_FULL = "application/json;odata.metadata=full";
- static final private String ACCEPT_CASE_NONE = "application/json;odata.metadata=none";
- static final private String ACCEPT_CASE_JSONQ = "application/json;q=0.2";
- static final private String ACCEPT_CASE_XML = HttpContentType.APPLICATION_XML;
- static final private String ACCEPT_CASE_WILDCARD1 = HttpContentType.WILDCARD;
- static final private String ACCEPT_CASE_WILDCARD2 = "application/*";
-
- //@formatter:off (Eclipse formatter)
- //CHECKSTYLE:OFF (Maven checkstyle)
-
- String[][] casesServiceDocument = {
- /* expected $format accept modified content types */
- { ACCEPT_CASE_MIN, null, null, null },
- { ACCEPT_CASE_MIN, "json", null, null },
- { ACCEPT_CASE_MIN, "json", ACCEPT_CASE_JSONQ, null },
- { ACCEPT_CASE_NONE, ACCEPT_CASE_NONE, null, null },
- { "a/a", "a/a", null, "a/a" },
- { ACCEPT_CASE_MIN, null, ACCEPT_CASE_JSONQ, null },
- { ACCEPT_CASE_MIN, null, ACCEPT_CASE_WILDCARD1, null },
- { ACCEPT_CASE_MIN, null, ACCEPT_CASE_WILDCARD2, null },
- { ACCEPT_CASE_MIN, null, null, ACCEPT_CASE_MIN },
- { "a/a", "a/a", null, "a/a,b/b" },
- { "a/a;x=y", "a/a", ACCEPT_CASE_WILDCARD1, "a/a;x=y" },
- { "a/a;v=w;x=y", null, "a/a;x=y", "a/a;b=c,a/a;v=w;x=y" },
- { "a/a;v=w;x=y", "a/a;x=y", null, "a/a;b=c,a/a;v=w;x=y" },
- { ACCEPT_CASE_MIN, "json", ACCEPT_CASE_MIN, null },
- { ACCEPT_CASE_FULL, null, ACCEPT_CASE_FULL, ACCEPT_CASE_FULL },
- { ACCEPT_CASE_MIN_UTF8, null, ACCEPT_CASE_MIN_UTF8, null }
- };
-
- String[][] casesMetadata = {
- /* expected $format accept modified content types */
- { ACCEPT_CASE_XML, null, null, null },
- { ACCEPT_CASE_XML, "xml", null, null },
- { ACCEPT_CASE_XML, "xml", ACCEPT_CASE_XML, null },
- { "a/a", "a/a", null, "a/a" },
- { ACCEPT_CASE_XML, null, ACCEPT_CASE_XML, null },
- { ACCEPT_CASE_XML, null, ACCEPT_CASE_WILDCARD1, null },
- { ACCEPT_CASE_XML, null, ACCEPT_CASE_WILDCARD2, null },
- { "a/a", "a/a", null, "a/a,b/b" },
- { "a/a;x=y", "a/a", ACCEPT_CASE_WILDCARD1, "a/a;x=y" }
- };
-
- String[][] casesFail = {
- /* expected $format accept modified content types */
- { null, "xxx/yyy", null, null },
- { null, "a/a", null, "b/b" },
- { null, "a/a;x=y", null, "a/a;v=w" },
- { null, null, "a/a;x=y", "a/a;v=w" },
- { null, "atom", null, null }, // not yet supported
- { null, null, ACCEPT_CASE_FULL, null }, // not yet supported
- { null, "a/b;charset=ISO-8859-1", null, "a/b" },
- { null, null, "a/b;charset=ISO-8859-1", "a/b" },
- { null, null, null, "text/plain" }
- };
- //CHECKSTYLE:ON
- //@formatter:on
-
- @Test
- public void serviceDocumentSingleCase() throws Exception {
- testContentNegotiation(
- new String[] { ACCEPT_CASE_MIN_UTF8, null, ACCEPT_CASE_MIN_UTF8, null },
- RepresentationType.SERVICE);
- }
-
- @Test
- public void serviceDocument() throws Exception {
- for (String[] useCase : casesServiceDocument) {
- testContentNegotiation(useCase, RepresentationType.SERVICE);
- }
- }
-
- @Test
- public void metadataSingleCase() throws Exception {
- testContentNegotiation(new String[] { ACCEPT_CASE_XML, null, null, null }, RepresentationType.METADATA);
- }
-
- @Test(expected = ContentNegotiatorException.class)
- public void metadataJsonFail() throws Exception {
- testContentNegotiation(new String[] { null, "json", null, null }, RepresentationType.METADATA);
- }
-
- @Test
- public void metadata() throws Exception {
- for (String[] useCase : casesMetadata) {
- testContentNegotiation(useCase, RepresentationType.METADATA);
- }
- }
-
- @Test
- public void entityCollectionFail() throws Exception {
- for (String[] useCase : casesFail) {
- try {
- testContentNegotiation(useCase, RepresentationType.COLLECTION_ENTITY);
- fail("Exception expected for '" + useCase[1] + '|' + useCase[2] + '|' + useCase[3] + "'!");
- } catch (final ContentNegotiatorException e) {}
- }
- }
-
- @Test
- public void checkSupport() throws Exception {
- ContentNegotiator.checkSupport(ODataFormat.JSON.getContentType(ODataServiceVersion.V40), null,
- RepresentationType.ENTITY);
- ContentNegotiator.checkSupport(ContentType.TEXT_PLAIN, null, RepresentationType.VALUE);
- try {
- ContentNegotiator.checkSupport(ContentType.APPLICATION_SVG_XML, null, RepresentationType.ENTITY);
- fail("Exception expected.");
- } catch (final ContentNegotiatorException e) {
- assertEquals(ContentNegotiatorException.MessageKeys.UNSUPPORTED_CONTENT_TYPE, e.getMessageKey());
- }
-
- ContentNegotiator.checkSupport(ContentType.create("a/b"), createCustomContentTypeSupport("a/b"),
- RepresentationType.ENTITY);
- ContentNegotiator.checkSupport(ContentType.create("a/b", "c=d"), createCustomContentTypeSupport("a/b"),
- RepresentationType.ENTITY);
- try {
- ContentNegotiator.checkSupport(ContentType.create("a/b"), createCustomContentTypeSupport("a/b;c=d"),
- RepresentationType.ENTITY);
- fail("Exception expected.");
- } catch (final ContentNegotiatorException e) {
- assertEquals(ContentNegotiatorException.MessageKeys.UNSUPPORTED_CONTENT_TYPE, e.getMessageKey());
- }
- }
-
- private void testContentNegotiation(final String[] useCase, final RepresentationType representationType)
- throws ContentNegotiatorException {
-
- FormatOption formatOption = null;
- if (useCase[1] != null) {
- formatOption = mock(FormatOption.class);
- when(formatOption.getFormat()).thenReturn(useCase[1]);
- }
-
- ODataRequest request = new ODataRequest();
- if (useCase[2] != null) {
- request.addHeader(HttpHeader.ACCEPT, Arrays.asList(useCase[2]));
- }
-
- final CustomContentTypeSupport customContentTypeSupport = useCase[3] == null ? null :
- createCustomContentTypeSupport(useCase[3]);
-
- final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(
- formatOption, request, customContentTypeSupport, representationType);
-
- assertNotNull(requestedContentType);
- if (useCase[0] != null) {
- assertEquals(ContentType.create(useCase[0]), requestedContentType);
- }
- }
-
- private CustomContentTypeSupport createCustomContentTypeSupport(final String contentTypeString) {
- final String[] contentTypes = contentTypeString.split(",");
-
- List<ContentType> types = new ArrayList<ContentType>();
- for (int i = 0; i < contentTypes.length; i++) {
- types.add(ContentType.create(contentTypes[i]));
- }
-
- CustomContentTypeSupport customContentTypeSupport = mock(CustomContentTypeSupport.class);
- when(customContentTypeSupport.modifySupportedContentTypes(
- anyListOf(ContentType.class), any(RepresentationType.class)))
- .thenReturn(types);
- return customContentTypeSupport;
- }
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
deleted file mode 100644
index 8200c32..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
+++ /dev/null
@@ -1,169 +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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.olingo.commons.api.http.HttpMethod;
-import org.apache.olingo.server.api.ODataRequest;
-import org.apache.olingo.server.api.ODataTranslatedException;
-import org.junit.Test;
-
-public class ODataHttpHandlerImplTest {
-
- @Test
- public void extractMethod() throws Exception {
- String[][] mm = {
- { "GET", null, null, "GET" },
- { "GET", "xxx", "yyy", "GET" },
- { "PUT", "xxx", "yyy", "PUT" },
- { "DELETE", "xxx", "yyy", "DELETE" },
- { "PATCH", "xxx", "yyy", "PATCH" },
-
- { "POST", null, null, "POST" },
- { "POST", null, "GET", "GET" },
- { "POST", null, "PATCH", "PATCH" },
-
- { "POST", "GET", null, "GET" },
- { "POST", "PATCH", null, "PATCH" },
-
- { "POST", "GET", "GET", "GET" },
- };
-
- for (String[] m : mm) {
-
- HttpServletRequest hr = mock(HttpServletRequest.class);
-
- when(hr.getMethod()).thenReturn(m[0]);
- when(hr.getHeader("X-HTTP-Method")).thenReturn(m[1]);
- when(hr.getHeader("X-HTTP-Method-Override")).thenReturn(m[2]);
-
- ODataRequest odr = new ODataRequest();
- ODataHttpHandlerImpl.extractMethod(odr, hr);
-
- assertEquals(HttpMethod.valueOf(m[3]), odr.getMethod());
- }
- }
-
- @Test
- public void extractMethodFail() throws Exception {
- String[][] mm = {
- { "POST", "bla", null },
- { "POST", "PUT", "PATCH" },
- { "OPTIONS", null, null },
- { "HEAD", null, null },
- };
-
- for (String[] m : mm) {
-
- HttpServletRequest hr = mock(HttpServletRequest.class);
-
- when(hr.getMethod()).thenReturn(m[0]);
- when(hr.getHeader("X-HTTP-Method")).thenReturn(m[1]);
- when(hr.getHeader("X-HTTP-Method-Override")).thenReturn(m[2]);
-
- ODataRequest odr = new ODataRequest();
- try {
- ODataHttpHandlerImpl.extractMethod(odr, hr);
- fail();
- } catch (ODataTranslatedException e) {}
- }
- }
-
- @Test
- public void extractUri() {
-
- //@formatter:off (Eclipse formatter)
- //CHECKSTYLE:OFF (Maven checkstyle)
- String [][] uris = {
- /* 0: host 1: cp 2: sp 3: sr 4: od 5: qp 6: spl */
- { "http://localhost", "", "", "", "", "", "0"},
- { "http://localhost", "", "", "", "/", "", "0"},
- { "http://localhost", "", "", "", "/od", "", "0"},
- { "http://localhost", "", "", "", "/od/", "", "0"},
-
- { "http://localhost", "/cp", "", "", "", "", "0"},
- { "http://localhost", "/cp", "", "", "/", "", "0"},
- { "http://localhost", "/cp", "", "", "/od", "", "0"},
- { "http://localhost", "", "/sp", "", "", "", "0"},
- { "http://localhost", "", "/sp", "", "/", "", "0"},
- { "http://localhost", "", "/sp", "", "/od", "", "0"},
- { "http://localhost", "", "", "/sr", "", "", "1"},
- { "http://localhost", "", "", "/sr", "/", "", "1"},
- { "http://localhost", "", "", "/sr", "/od", "", "1"},
- { "http://localhost", "", "", "/sr/sr", "", "", "2"},
- { "http://localhost", "", "", "/sr/sr", "/", "", "2"},
- { "http://localhost", "", "", "/sr/sr", "/od", "", "2"},
-
- { "http://localhost", "/cp", "/sp", "", "", "", "0"},
- { "http://localhost", "/cp", "/sp", "", "/", "", "0"},
- { "http://localhost", "/cp", "/sp", "", "/od", "", "0"},
- { "http://localhost", "/cp", "", "/sr", "/", "", "1"},
- { "http://localhost", "/cp", "", "/sr", "/od", "", "1"},
- { "http://localhost", "", "/sp", "/sr", "", "", "1"},
- { "http://localhost", "", "/sp", "/sr", "/", "", "1"},
- { "http://localhost", "", "/sp", "/sr", "/od", "", "1"},
- { "http://localhost", "/cp", "/sp", "/sr", "", "", "1"},
- { "http://localhost", "/cp", "/sp", "/sr", "/", "", "1"},
- { "http://localhost", "/cp", "/sp", "/sr", "/od", "", "1"},
-
- { "http://localhost", "", "", "", "", "qp", "0"},
- { "http://localhost", "", "", "", "/", "qp", "0"},
- { "http://localhost", "/cp", "/sp", "/sr", "/od", "qp", "1"},
-
- { "http://localhost:8080", "/c%20p", "/s%20p", "/s%20r", "/o%20d", "p+q", "1"},
- };
- //@formatter:on
- // CHECKSTYLE:on
-
- for (String[] p : uris) {
- HttpServletRequest hr = mock(HttpServletRequest.class);
-
- String requestUrl = p[0] + p[1] + p[2] + p[3] + p[4];
- String requestUri = p[1] + p[2] + p[3] + p[4];
- String queryString = p[5].isEmpty() ? null : p[5];
-
- when(hr.getRequestURL()).thenReturn(new StringBuffer(requestUrl));
- when(hr.getRequestURI()).thenReturn(requestUri);
- when(hr.getQueryString()).thenReturn(queryString);
- when(hr.getContextPath()).thenReturn(p[1]);
- when(hr.getServletPath()).thenReturn(p[2]);
-
- ODataRequest odr = new ODataRequest();
- ODataHttpHandlerImpl.extractUri(odr, hr, Integer.parseInt(p[6]));
-
- String rawBaseUri = p[0] + p[1] + p[2] + p[3];
- String rawODataPath = p[4];
- String rawQueryPath = "".equals(p[5]) ? null : p[5];
- String rawRequestUri = requestUrl + (queryString == null ? "" : "?" + queryString);
- String rawServiceResolutionUri = "".equals(p[3]) ? null : p[3];
-
- assertEquals(rawBaseUri, odr.getRawBaseUri());
- assertEquals(rawODataPath, odr.getRawODataPath());
- assertEquals(rawQueryPath, odr.getRawQueryPath());
- assertEquals(rawRequestUri, odr.getRawRequestUri());
- assertEquals(rawServiceResolutionUri, odr.getRawServiceResolutionUri());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/TranslatedExceptionSubclassesTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/TranslatedExceptionSubclassesTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/TranslatedExceptionSubclassesTest.java
deleted file mode 100644
index 5460d9f..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/TranslatedExceptionSubclassesTest.java
+++ /dev/null
@@ -1,103 +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;
-
-import org.apache.olingo.server.api.ODataTranslatedException;
-import org.apache.olingo.server.api.serializer.SerializerException;
-import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
-import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException;
-import org.apache.olingo.server.core.uri.validator.UriValidationException;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.util.Formatter;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.UUID;
-
-/**
- * Generic test for all exceptions which inherit from ODataTranslatedException
- * if their MessageKeys are available in the resource bundle and the parameters are replaced.
- */
-public class TranslatedExceptionSubclassesTest {
-
- private final Properties properties;
-
- public TranslatedExceptionSubclassesTest() throws IOException {
- properties = new Properties();
- properties.load(Thread.currentThread().getContextClassLoader()
- .getResourceAsStream("server-core-exceptions-i18n.properties"));
- Locale.setDefault(Locale.ENGLISH);
- }
-
- @Test
- public void messageKeysValid() throws Exception {
- testException(ODataHandlerException.class, ODataHandlerException.MessageKeys.values());
- testException(UriParserSemanticException.class, UriParserSemanticException.MessageKeys.values());
- testException(UriParserSyntaxException.class, UriParserSyntaxException.MessageKeys.values());
- testException(ContentNegotiatorException.class, ContentNegotiatorException.MessageKeys.values());
- testException(SerializerException.class, SerializerException.MessageKeys.values());
- testException(UriValidationException.class, UriValidationException.MessageKeys.values());
- testException(UriParserSyntaxException.class, UriParserSyntaxException.MessageKeys.values());
- }
-
- private void testException(final Class<? extends ODataTranslatedException> clazz,
- final ODataTranslatedException.MessageKey[] messageKeys) throws Exception {
-
- for (ODataTranslatedException.MessageKey messageKey : messageKeys) {
- String propKey = clazz.getSimpleName() + "." + messageKey.toString();
- String value = properties.getProperty(propKey);
- Assert.assertNotNull("No value found for message key '" + propKey + "'", value);
- //
- int paraCount = countParameters(value);
- Constructor<? extends ODataTranslatedException> ctor =
- clazz.getConstructor(String.class, ODataTranslatedException.MessageKey.class, String[].class);
- String[] paras = new String[paraCount];
- for (int i = 0; i < paras.length; i++) {
- paras[i] = "470" + i;
- }
- String developerMessage = UUID.randomUUID().toString();
- ODataTranslatedException e = ctor.newInstance(developerMessage, messageKey, paras);
- try {
- throw e;
- } catch (ODataTranslatedException translatedException) {
- Formatter formatter = new Formatter();
- String formattedValue = formatter.format(value, (Object[]) paras).toString();
- formatter.close();
- Assert.assertEquals(formattedValue, translatedException.getTranslatedMessage(null).getMessage());
- Assert.assertEquals(formattedValue, translatedException.getLocalizedMessage());
- Assert.assertEquals(developerMessage, translatedException.getMessage());
- }
- }
- }
-
-
- private int countParameters(String value) {
- char[] chars = value.toCharArray();
- int count = 0;
- for (char aChar : chars) {
- if(aChar == '%') {
- count++;
- }
- }
- return count;
- }
-}