Repository: olingo-odata4 Updated Branches: refs/heads/master c8d49029f -> 926373bcd
[OLINGO-603] new ActionVoidProcessor for actions with no return type Change-Id: Icc9d05bbc33f1449bc43fd1c82677cd0500ce00f Signed-off-by: Christian Amend <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/926373bc Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/926373bc Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/926373bc Branch: refs/heads/master Commit: 926373bcd497a5f28cf5a9b021eadacfa642c1eb Parents: c8d4902 Author: Klaus Straubinger <[email protected]> Authored: Fri Mar 20 16:32:23 2015 +0100 Committer: Christian Amend <[email protected]> Committed: Tue Mar 24 10:33:47 2015 +0100 ---------------------------------------------------------------------- .../ActionComplexCollectionProcessor.java | 21 ++--- .../api/processor/ActionComplexProcessor.java | 25 +++-- .../ActionEntityCollectionProcessor.java | 23 +++-- .../api/processor/ActionEntityProcessor.java | 23 +++-- .../ActionPrimitiveCollectionProcessor.java | 19 ++-- .../api/processor/ActionPrimitiveProcessor.java | 21 ++--- .../api/processor/ActionVoidProcessor.java | 43 +++++++++ .../apache/olingo/server/core/ODataHandler.java | 97 ++++++++++---------- .../server/core/uri/UriResourceActionImpl.java | 11 +-- .../processor/TechnicalEntityProcessor.java | 12 ++- .../server/tecsvc/provider/ActionProvider.java | 24 +++++ .../tecsvc/provider/ContainerProvider.java | 21 +++++ .../server/tecsvc/provider/SchemaProvider.java | 3 + .../olingo/server/core/ODataHandlerTest.java | 16 +++- .../server/core/uri/UriResourceImplTest.java | 6 ++ .../core/uri/antlr/TestFullResourcePath.java | 5 + 16 files changed, 243 insertions(+), 127 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexCollectionProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexCollectionProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexCollectionProcessor.java index 31c525f..5f0c663 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexCollectionProcessor.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexCollectionProcessor.java @@ -27,22 +27,21 @@ import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; /** - * Processor interface for handling an action import request which has a - * return type of ComplexCollection. + * Processor interface for handling an action request with a return type of ComplexCollection. */ public interface ActionComplexCollectionProcessor extends ComplexCollectionProcessor { /** * Process an action which has as return type a complex-type collection. - * @param request OData request object containing raw HTTP information - * @param response OData response object for collecting response data - * @param uriInfo information of a parsed OData URI - * @param requestFormat content type of body sent with request + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information about a parsed OData URI + * @param requestFormat content type of body sent with request * @param responseFormat requested content type after content negotiation - * @throws org.apache.olingo.server.api.ODataApplicationException if the service implementation encounters a failure - * @throws org.apache.olingo.server.api.deserializer.DeserializerException if deserialization failed - * @throws org.apache.olingo.server.api.serializer.SerializerException if serialization failed + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + * @throws SerializerException if serialization failed */ void processActionComplexCollection(ODataRequest request, ODataResponse response, UriInfo uriInfo, - ContentType requestFormat, ContentType responseFormat) - throws ODataApplicationException, DeserializerException, SerializerException; + ContentType requestFormat, ContentType responseFormat) + throws ODataApplicationException, DeserializerException, SerializerException; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexProcessor.java index 11e8345..3acec8d 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexProcessor.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionComplexProcessor.java @@ -27,22 +27,21 @@ import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; /** - * Processor interface for handling an action import request which has a - * return type of Complex. + * Processor interface for handling an action request with a return type of Complex. */ public interface ActionComplexProcessor extends ComplexProcessor { /** - * Process an action which has as return type a complex-type. - * @param request OData request object containing raw HTTP information - * @param response OData response object for collecting response data - * @param uriInfo information of a parsed OData URI - * @param requestFormat content type of body sent with request + * Process an action which has as return type a complex type. + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information about a parsed OData URI + * @param requestFormat content type of body sent with request * @param responseFormat requested content type after content negotiation - * @throws org.apache.olingo.server.api.ODataApplicationException if the service implementation encounters a failure - * @throws org.apache.olingo.server.api.deserializer.DeserializerException if deserialization failed - * @throws org.apache.olingo.server.api.serializer.SerializerException if serialization failed + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + * @throws SerializerException if serialization failed */ - void processActionComplex(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat, - ContentType responseFormat) - throws ODataApplicationException, DeserializerException, SerializerException; + void processActionComplex(ODataRequest request, ODataResponse response, UriInfo uriInfo, + ContentType requestFormat, ContentType responseFormat) + throws ODataApplicationException, DeserializerException, SerializerException; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityCollectionProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityCollectionProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityCollectionProcessor.java index edabfce..82d776a 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityCollectionProcessor.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityCollectionProcessor.java @@ -27,22 +27,21 @@ import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; /** - * Processor interface for handling an action import request which has a - * return type of Entity Collection. + * Processor interface for handling an action request with a return type of Entity Collection. */ public interface ActionEntityCollectionProcessor extends EntityCollectionProcessor { /** * Process an action which has as return type a collection of entities. - * @param request OData request object containing raw HTTP information - * @param response OData response object for collecting response data - * @param uriInfo information of a parsed OData URI + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information of a parsed OData URI * @param requestFormat content type of body sent with request - * @param responseFormat requested content type after content negotiation - * @throws org.apache.olingo.server.api.ODataApplicationException if the service implementation encounters a failure - * @throws org.apache.olingo.server.api.deserializer.DeserializerException if deserialization failed - * @throws org.apache.olingo.server.api.serializer.SerializerException if serialization failed + * @param responseFormat requested content type after content negotiation + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + * @throws SerializerException if serialization failed */ - void processActionEntityCollection(ODataRequest request, ODataResponse response, - UriInfo uriInfo, ContentType requestFormat, ContentType responseFormat) - throws ODataApplicationException, DeserializerException, SerializerException; + void processActionEntityCollection(ODataRequest request, ODataResponse response, UriInfo uriInfo, + ContentType requestFormat, ContentType responseFormat) + throws ODataApplicationException, DeserializerException, SerializerException; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityProcessor.java index 8a2043e..ec564d2 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityProcessor.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionEntityProcessor.java @@ -27,22 +27,21 @@ import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; /** - * Processor interface for handling an action import request which has a - * return type of Entity. + * Processor interface for handling an action request with a return type of Entity. */ public interface ActionEntityProcessor extends EntityProcessor { /** * Process an action which has as return type an entity. - * @param request OData request object containing raw HTTP information - * @param response OData response object for collecting response data - * @param uriInfo information of a parsed OData URI - * @param requestFormat content type of body sent with request + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information about a parsed OData URI + * @param requestFormat content type of body sent with request * @param responseFormat requested content type after content negotiation - * @throws org.apache.olingo.server.api.ODataApplicationException if the service implementation encounters a failure - * @throws org.apache.olingo.server.api.deserializer.DeserializerException if deserialization failed - * @throws org.apache.olingo.server.api.serializer.SerializerException if serialization failed + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + * @throws SerializerException if serialization failed */ - void processActionEntity(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat, - ContentType responseFormat) - throws ODataApplicationException, DeserializerException, SerializerException; + void processActionEntity(ODataRequest request, ODataResponse response, UriInfo uriInfo, + ContentType requestFormat, ContentType responseFormat) + throws ODataApplicationException, DeserializerException, SerializerException; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveCollectionProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveCollectionProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveCollectionProcessor.java index 9fd7549..ace9ff9 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveCollectionProcessor.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveCollectionProcessor.java @@ -27,22 +27,21 @@ import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; /** - * Processor interface for handling an action import request which has a - * return type of Primitive Collection. + * Processor interface for handling an action request with a return type of Primitive Collection. */ public interface ActionPrimitiveCollectionProcessor extends PrimitiveCollectionProcessor { /** * Process an action which has as return type a primitive-type collection. - * @param request OData request object containing raw HTTP information - * @param response OData response object for collecting response data - * @param uriInfo information of a parsed OData URI + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information about a parsed OData URI * @param requestFormat content type of body sent with request * @param responseFormat requested content type after content negotiation - * @throws org.apache.olingo.server.api.ODataApplicationException if the service implementation encounters a failure - * @throws org.apache.olingo.server.api.deserializer.DeserializerException if deserialization failed - * @throws org.apache.olingo.server.api.serializer.SerializerException if serialization failed + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + * @throws SerializerException if serialization failed */ void processActionPrimitiveCollection(ODataRequest request, ODataResponse response, UriInfo uriInfo, - ContentType requestFormat, ContentType responseFormat) - throws ODataApplicationException, DeserializerException, SerializerException; + ContentType requestFormat, ContentType responseFormat) + throws ODataApplicationException, DeserializerException, SerializerException; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveProcessor.java index 362621b..8c11eb7 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveProcessor.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionPrimitiveProcessor.java @@ -27,22 +27,21 @@ import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; /** - * Processor interface for handling an action import request which has a - * return type of Primitive. + * Processor interface for handling an action request with a return type of Primitive. */ public interface ActionPrimitiveProcessor extends PrimitiveProcessor { /** * Process an action which has as return type a primitive-type. - * @param request OData request object containing raw HTTP information - * @param response OData response object for collecting response data - * @param uriInfo information of a parsed OData URI + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information about a parsed OData URI * @param requestFormat content type of body sent with request - * @param responseFormat requested content type after content negotiation - * @throws org.apache.olingo.server.api.ODataApplicationException if the service implementation encounters a failure - * @throws org.apache.olingo.server.api.deserializer.DeserializerException if deserialization failed - * @throws org.apache.olingo.server.api.serializer.SerializerException if serialization failed + * @param responseFormat requested content type after content negotiation + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + * @throws SerializerException if serialization failed */ void processActionPrimitive(ODataRequest request, ODataResponse response, UriInfo uriInfo, - ContentType requestFormat, ContentType responseFormat) - throws ODataApplicationException, DeserializerException, SerializerException; + ContentType requestFormat, ContentType responseFormat) + throws ODataApplicationException, DeserializerException, SerializerException; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionVoidProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionVoidProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionVoidProcessor.java new file mode 100644 index 0000000..2798132 --- /dev/null +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ActionVoidProcessor.java @@ -0,0 +1,43 @@ +/* + * 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.api.processor; + +import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataRequest; +import org.apache.olingo.server.api.ODataResponse; +import org.apache.olingo.server.api.deserializer.DeserializerException; +import org.apache.olingo.server.api.uri.UriInfo; + +/** + * Processor interface for handling an action request with no return type. + */ +public interface ActionVoidProcessor extends Processor { + /** + * Process an action which has no return type. + * @param request OData request object containing raw HTTP information + * @param response OData response object for collecting response data + * @param uriInfo information about a parsed OData URI + * @param requestFormat content type of body sent with request + * @throws ODataApplicationException if the service implementation encounters a failure + * @throws DeserializerException if deserialization failed + */ + void processActionVoid(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat) + throws ODataApplicationException, DeserializerException; +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java index bafc231..6d98b5e 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java @@ -22,7 +22,6 @@ import java.util.LinkedList; 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; @@ -49,6 +48,7 @@ import org.apache.olingo.server.api.processor.ActionEntityCollectionProcessor; import org.apache.olingo.server.api.processor.ActionEntityProcessor; import org.apache.olingo.server.api.processor.ActionPrimitiveCollectionProcessor; import org.apache.olingo.server.api.processor.ActionPrimitiveProcessor; +import org.apache.olingo.server.api.processor.ActionVoidProcessor; import org.apache.olingo.server.api.processor.BatchProcessor; import org.apache.olingo.server.api.processor.ComplexCollectionProcessor; import org.apache.olingo.server.api.processor.ComplexProcessor; @@ -318,20 +318,20 @@ public class ODataHandler { ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString()); } - EdmActionImport actionImport = uriResourceAction.getActionImport(); - // could be null for bound actions - if (actionImport == null) { - throw new ODataHandlerException("Bound actions are not implemented yet", + final EdmAction action = uriResourceAction.getAction(); + if (action == null) { + throw new ODataHandlerException("No action defined for action import.", ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED); } - - EdmAction unboundActions = actionImport.getUnboundAction(); - if (unboundActions == null) { - throw new ODataHandlerException("No unbound function defined for function import", - ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED); + final EdmReturnType returnType = action.getReturnType(); + if (returnType == null) { + final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE)); + checkContentTypeSupport(requestFormat, RepresentationType.ACTION_PARAMETERS); + selectProcessor(ActionVoidProcessor.class) + .processActionVoid(request, response, uriInfo, requestFormat); + } else { + handleOperationDispatching(request, response, true, returnType); } - EdmReturnType returnType = unboundActions.getReturnType(); - handleOperationDispatching(request, response, true, returnType); } private void handleOperationDispatching(final ODataRequest request, final ODataResponse response, @@ -460,42 +460,44 @@ public class ODataHandler { if (method == HttpMethod.GET) { final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, complexRepresentationType); - if (complexRepresentationType == RepresentationType.COMPLEX) { - selectProcessor(ComplexProcessor.class) - .readComplex(request, response, uriInfo, requestedContentType); - } else { + if (isCollection) { selectProcessor(ComplexCollectionProcessor.class) .readComplexCollection(request, response, uriInfo, requestedContentType); + } else { + selectProcessor(ComplexProcessor.class) + .readComplex(request, response, uriInfo, requestedContentType); } } else if (method == HttpMethod.PUT || method == HttpMethod.PATCH) { final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE)); checkContentTypeSupport(requestFormat, complexRepresentationType); final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, complexRepresentationType); - if (complexRepresentationType == RepresentationType.COMPLEX) { - selectProcessor(ComplexProcessor.class) - .updateComplex(request, response, uriInfo, requestFormat, responseFormat); - } else { + if (isCollection) { selectProcessor(ComplexCollectionProcessor.class) .updateComplexCollection(request, response, uriInfo, requestFormat, responseFormat); + } else { + selectProcessor(ComplexProcessor.class) + .updateComplex(request, response, uriInfo, requestFormat, responseFormat); } } else if (method == HttpMethod.POST && isAction) { final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE)); - checkContentTypeSupport(requestFormat, complexRepresentationType); + checkContentTypeSupport(requestFormat, RepresentationType.ACTION_PARAMETERS); final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, complexRepresentationType); - if (complexRepresentationType == RepresentationType.COMPLEX) { - selectProcessor(ActionComplexProcessor.class) - .processActionComplex(request, response, uriInfo, requestFormat, responseFormat); - } else { + if (isCollection) { selectProcessor(ActionComplexCollectionProcessor.class) .processActionComplexCollection(request, response, uriInfo, requestFormat, responseFormat); + } else { + selectProcessor(ActionComplexProcessor.class) + .processActionComplex(request, response, uriInfo, requestFormat, responseFormat); } } else if (method == HttpMethod.DELETE) { - if (complexRepresentationType == RepresentationType.COMPLEX) { - selectProcessor(ComplexProcessor.class).deleteComplex(request, response, uriInfo); + if (isCollection) { + selectProcessor(ComplexCollectionProcessor.class) + .deleteComplexCollection(request, response, uriInfo); } else { - selectProcessor(ComplexCollectionProcessor.class).deleteComplexCollection(request, response, uriInfo); + selectProcessor(ComplexProcessor.class) + .deleteComplex(request, response, uriInfo); } } else { throw new ODataHandlerException("HTTP method " + method + " is not allowed.", @@ -514,41 +516,44 @@ public class ODataHandler { if (method == HttpMethod.GET) { final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, representationType); - if (representationType == RepresentationType.PRIMITIVE) { - selectProcessor(PrimitiveProcessor.class).readPrimitive(request, response, uriInfo, requestedContentType); - } else { + if (isCollection) { selectProcessor(PrimitiveCollectionProcessor.class) .readPrimitiveCollection(request, response, uriInfo, requestedContentType); + } else { + selectProcessor(PrimitiveProcessor.class) + .readPrimitive(request, response, uriInfo, requestedContentType); } } else if (method == HttpMethod.PUT || method == HttpMethod.PATCH) { final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE)); checkContentTypeSupport(requestFormat, representationType); final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, representationType); - if (representationType == RepresentationType.PRIMITIVE) { - selectProcessor(PrimitiveProcessor.class) - .updatePrimitive(request, response, uriInfo, requestFormat, responseFormat); - } else { + if (isCollection) { selectProcessor(PrimitiveCollectionProcessor.class) .updatePrimitiveCollection(request, response, uriInfo, requestFormat, responseFormat); + } else { + selectProcessor(PrimitiveProcessor.class) + .updatePrimitive(request, response, uriInfo, requestFormat, responseFormat); } } else if (method == HttpMethod.DELETE) { - if (representationType == RepresentationType.PRIMITIVE) { - selectProcessor(PrimitiveProcessor.class).deletePrimitive(request, response, uriInfo); + if (isCollection) { + selectProcessor(PrimitiveCollectionProcessor.class) + .deletePrimitiveCollection(request, response, uriInfo); } else { - selectProcessor(PrimitiveCollectionProcessor.class).deletePrimitiveCollection(request, response, uriInfo); + selectProcessor(PrimitiveProcessor.class) + .deletePrimitive(request, response, uriInfo); } } else if (method == HttpMethod.POST && isAction) { final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE)); - checkContentTypeSupport(requestFormat, representationType); + checkContentTypeSupport(requestFormat, RepresentationType.ACTION_PARAMETERS); final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, representationType); - if (representationType == RepresentationType.PRIMITIVE) { - selectProcessor(ActionPrimitiveProcessor.class) - .processActionPrimitive(request, response, uriInfo, requestFormat, responseFormat); - } else { + if (isCollection) { selectProcessor(ActionPrimitiveCollectionProcessor.class) .processActionPrimitiveCollection(request, response, uriInfo, requestFormat, responseFormat); + } else { + selectProcessor(ActionPrimitiveProcessor.class) + .processActionPrimitive(request, response, uriInfo, requestFormat, responseFormat); } } else { throw new ODataHandlerException("HTTP method " + method + " is not allowed.", @@ -612,9 +617,9 @@ public class ODataHandler { selectProcessor(MediaEntityProcessor.class) .createMediaEntity(request, response, uriInfo, requestFormat, responseFormat); } else if (isAction) { - checkContentTypeSupport(requestFormat, RepresentationType.ENTITY); + checkContentTypeSupport(requestFormat, RepresentationType.ACTION_PARAMETERS); final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), - request, customContentTypeSupport, RepresentationType.ENTITY); + request, customContentTypeSupport, RepresentationType.COLLECTION_ENTITY); selectProcessor(ActionEntityCollectionProcessor.class) .processActionEntityCollection(request, response, uriInfo, requestFormat, responseFormat); } else { @@ -642,7 +647,7 @@ public class ODataHandler { selectProcessor(EntityProcessor.class).updateEntity(request, response, uriInfo, requestFormat, responseFormat); } else if (method == HttpMethod.POST && isAction) { final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE)); - checkContentTypeSupport(requestFormat, RepresentationType.ENTITY); + checkContentTypeSupport(requestFormat, RepresentationType.ACTION_PARAMETERS); final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, customContentTypeSupport, RepresentationType.ENTITY); selectProcessor(ActionEntityProcessor.class).processActionEntity( http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java index 4ca162c..82fe743 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java @@ -56,22 +56,17 @@ public class UriResourceActionImpl extends UriResourceTypedImpl implements UriRe @Override public boolean isCollection() { - return action.getReturnType().isCollection(); + return action.getReturnType() !=null && action.getReturnType().isCollection(); } @Override public EdmType getType() { - return action.getReturnType().getType(); + return action.getReturnType() == null ? null : action.getReturnType().getType(); } @Override public String toString() { - if (actionImport != null) { - return actionImport.getName(); - } else if (action != null) { - return action.getName(); - } - return ""; + return actionImport == null ? (action == null ? "" : action.getName()) : actionImport.getName(); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java index b66482a..ff7bd5f 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java @@ -41,6 +41,7 @@ import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.ODataDeserializer; import org.apache.olingo.server.api.processor.ActionEntityCollectionProcessor; import org.apache.olingo.server.api.processor.ActionEntityProcessor; +import org.apache.olingo.server.api.processor.ActionVoidProcessor; import org.apache.olingo.server.api.processor.CountEntityCollectionProcessor; import org.apache.olingo.server.api.processor.EntityCollectionProcessor; import org.apache.olingo.server.api.processor.EntityProcessor; @@ -68,7 +69,8 @@ import org.apache.olingo.server.tecsvc.processor.queryoptions.options.TopHandler */ public class TechnicalEntityProcessor extends TechnicalProcessor implements EntityCollectionProcessor, ActionEntityCollectionProcessor, CountEntityCollectionProcessor, - EntityProcessor, ActionEntityProcessor, MediaEntityProcessor { + EntityProcessor, ActionEntityProcessor, MediaEntityProcessor, + ActionVoidProcessor { public TechnicalEntityProcessor(final DataProvider dataProvider) { super(dataProvider); @@ -271,13 +273,19 @@ public class TechnicalEntityProcessor extends TechnicalProcessor } @Override - public void processActionEntity(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo, + public void processActionEntity(final ODataRequest request, ODataResponse response, final UriInfo uriInfo, final ContentType requestFormat, final ContentType responseFormat) throws ODataApplicationException, DeserializerException, SerializerException { throw new ODataApplicationException("Process entity is not supported yet.", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT); } + @Override + public void processActionVoid(final ODataRequest request, ODataResponse response, final UriInfo uriInfo, + final ContentType requestFormat) throws ODataApplicationException, DeserializerException { + response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); + } + private void setCount(EntitySet entitySet) { if (entitySet.getCount() == null) { entitySet.setCount(entitySet.getEntities().size()); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ActionProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ActionProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ActionProvider.java index 9226e13..78ada0a 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ActionProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ActionProvider.java @@ -19,6 +19,7 @@ package org.apache.olingo.server.tecsvc.provider; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.apache.olingo.commons.api.ODataException; @@ -62,6 +63,11 @@ public class ActionProvider { new FullQualifiedName(SchemaProvider.NAMESPACE, "UARTETAllPrimParam"); public static final FullQualifiedName nameUARTCollETAllPrimParam = new FullQualifiedName(SchemaProvider.NAMESPACE, "UARTCollETAllPrimParam"); + public static final FullQualifiedName nameUART = new FullQualifiedName(SchemaProvider.NAMESPACE, "UART"); + public static final FullQualifiedName nameUARTParam = + new FullQualifiedName(SchemaProvider.NAMESPACE, "UARTParam"); + public static final FullQualifiedName nameUARTTwoParam = + new FullQualifiedName(SchemaProvider.NAMESPACE, "UARTTwoParam"); public List<Action> getActions(final FullQualifiedName actionName) throws ODataException { @@ -132,6 +138,24 @@ public class ActionProvider { new ReturnType().setType(EntityTypeProvider.nameETAllPrim).setCollection(true)) ); + } else if (actionName.equals(nameUART)) { + return Collections.singletonList(new Action().setName(nameUART.getName())); + + } else if (actionName.equals(nameUARTParam)) { + return Collections.singletonList( + new Action() + .setName(nameUARTParam.getName()) + .setParameters(Collections.singletonList( + new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))); + + } else if (actionName.equals(nameUARTTwoParam)) { + return Collections.singletonList( + new Action() + .setName(nameUARTTwoParam.getName()) + .setParameters(Arrays.asList( + new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16), + new Parameter().setName("ParameterDuration").setType(PropertyProvider.nameDuration)))); + } else if (actionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) { return Arrays.asList( new Action().setName("BAETTwoKeyNavRTETTwoKeyNav") http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java index aa8b60a..3882705 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java @@ -44,6 +44,9 @@ public class ContainerProvider { public static final String AIRT_COLL_ET_KEY_NAV_PARAM = "AIRTCollETKeyNavParam"; public static final String AIRTES_ALL_PRIM_PARAM = "AIRTESAllPrimParam"; public static final String AIRT_COLL_ES_ALL_PRIM_PARAM = "AIRTCollESAllPrimParam"; + public static final String AIRT = "AIRT"; + public static final String AIRT_PARAM = "AIRTParam"; + public static final String AIRT_TWO_PARAM = "AIRTTwoParam"; EntityContainerInfo entityContainerInfoTest1 = new EntityContainerInfo().setContainerName(nameContainer); @@ -115,6 +118,9 @@ public class ContainerProvider { actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, AIRT_COLL_ET_KEY_NAV_PARAM)); actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, AIRTES_ALL_PRIM_PARAM)); actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, AIRT_COLL_ES_ALL_PRIM_PARAM)); + actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, AIRT)); + actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, AIRT_PARAM)); + actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, AIRT_TWO_PARAM)); // FunctionImports List<FunctionImport> functionImports = new ArrayList<FunctionImport>(); @@ -434,6 +440,21 @@ public class ContainerProvider { return new ActionImport() .setName(AIRT_COLL_ES_ALL_PRIM_PARAM) .setAction(ActionProvider.nameUARTCollETAllPrimParam); + + } else if (name.equals(AIRT)) { + return new ActionImport() + .setName(AIRT) + .setAction(ActionProvider.nameUART); + + } else if (name.equals(AIRT_PARAM)) { + return new ActionImport() + .setName(AIRT_PARAM) + .setAction(ActionProvider.nameUARTParam); + + } else if (name.equals(AIRT_TWO_PARAM)) { + return new ActionImport() + .setName(AIRT_TWO_PARAM) + .setAction(ActionProvider.nameUARTTwoParam); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java index 04e5060..057f4c9 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java @@ -120,6 +120,9 @@ public class SchemaProvider { actions.addAll(prov.getActions(ActionProvider.nameUARTCollETKeyNavParam)); actions.addAll(prov.getActions(ActionProvider.nameUARTETAllPrimParam)); actions.addAll(prov.getActions(ActionProvider.nameUARTCollETAllPrimParam)); + actions.addAll(prov.getActions(ActionProvider.nameUART)); + actions.addAll(prov.getActions(ActionProvider.nameUARTParam)); + actions.addAll(prov.getActions(ActionProvider.nameUARTTwoParam)); // Functions List<Function> functions = new ArrayList<Function>(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java ---------------------------------------------------------------------- diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java index 5424fda..45728e1 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java @@ -60,6 +60,7 @@ import org.apache.olingo.server.api.processor.ActionEntityCollectionProcessor; import org.apache.olingo.server.api.processor.ActionEntityProcessor; import org.apache.olingo.server.api.processor.ActionPrimitiveCollectionProcessor; import org.apache.olingo.server.api.processor.ActionPrimitiveProcessor; +import org.apache.olingo.server.api.processor.ActionVoidProcessor; import org.apache.olingo.server.api.processor.BatchProcessor; import org.apache.olingo.server.api.processor.ComplexCollectionProcessor; import org.apache.olingo.server.api.processor.ComplexProcessor; @@ -381,11 +382,15 @@ public class ODataHandlerTest { @Test public void dispatchAction() throws Exception { - ActionPrimitiveProcessor primitiveProcessor = mock(ActionPrimitiveProcessor.class); + final ActionPrimitiveProcessor primitiveProcessor = mock(ActionPrimitiveProcessor.class); dispatch(HttpMethod.POST, ContainerProvider.AIRT_STRING, primitiveProcessor); verify(primitiveProcessor).processActionPrimitive( any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class), any(ContentType.class)); + dispatchMethodNotAllowed(HttpMethod.GET, ContainerProvider.AIRT_STRING, primitiveProcessor); + dispatchMethodNotAllowed(HttpMethod.PATCH, ContainerProvider.AIRT_STRING, primitiveProcessor); + dispatchMethodNotAllowed(HttpMethod.PUT, ContainerProvider.AIRT_STRING, primitiveProcessor); + dispatchMethodNotAllowed(HttpMethod.DELETE, ContainerProvider.AIRT_STRING, primitiveProcessor); ActionPrimitiveCollectionProcessor primitiveCollectionProcessor = mock(ActionPrimitiveCollectionProcessor.class); dispatch(HttpMethod.POST, ContainerProvider.AIRT_COLL_STRING_TWO_PARAM, primitiveCollectionProcessor); @@ -429,7 +434,14 @@ public class ODataHandlerTest { any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class), any(ContentType.class)); - dispatchMethodNotAllowed(HttpMethod.GET, "AIRTString", mock(Processor.class)); + final ActionVoidProcessor voidProcessor = mock(ActionVoidProcessor.class); + dispatch(HttpMethod.POST, ContainerProvider.AIRT, voidProcessor); + verify(voidProcessor).processActionVoid( + any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class)); + dispatchMethodNotAllowed(HttpMethod.GET, ContainerProvider.AIRT, voidProcessor); + dispatchMethodNotAllowed(HttpMethod.PATCH, ContainerProvider.AIRT, voidProcessor); + dispatchMethodNotAllowed(HttpMethod.PUT, ContainerProvider.AIRT, voidProcessor); + dispatchMethodNotAllowed(HttpMethod.DELETE, ContainerProvider.AIRT, voidProcessor); } @Test http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java ---------------------------------------------------------------------- diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java index 6c72a0f..ab197e7 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java @@ -48,6 +48,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; public class UriResourceImplTest { @@ -90,6 +91,11 @@ public class UriResourceImplTest { assertEquals(false, impl.isCollection()); assertEquals("AIRTCTTwoPrimParam", impl.toString()); assertEquals(actionImport.getUnboundAction().getReturnType().getType(), impl.getType()); + + actionImport = edm.getEntityContainer(null).getActionImport("AIRT"); + impl.setActionImport(actionImport); + assertEquals(false, impl.isCollection()); + assertNull(impl.getType()); } @Test http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/926373bc/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java ---------------------------------------------------------------------- diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java index 6019218..3ace90e 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java @@ -2728,6 +2728,11 @@ public class TestFullResourcePath { .goPath().first() .isActionImport(ContainerProvider.AIRT_COLL_ES_ALL_PRIM_PARAM); + testUri.run(ContainerProvider.AIRT) + .isKind(UriInfoKind.resource) + .goPath().first() + .isActionImport(ContainerProvider.AIRT); + testUri.run("ESKeyNav/$count") .isKind(UriInfoKind.resource) .goPath().first()
