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/01/12 10:36:12 UTC

olingo-odata4 git commit: [OLINGO-507] Changes and test for FunctionImports support

Repository: olingo-odata4
Updated Branches:
  refs/heads/OLINGO-507_MinorRefactoring b441a524b -> 186d67241


[OLINGO-507] Changes and test for FunctionImports support


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/186d6724
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/186d6724
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/186d6724

Branch: refs/heads/OLINGO-507_MinorRefactoring
Commit: 186d67241da3501fe3577eca3ac42d025a48ff5a
Parents: b441a52
Author: Michael Bolz <mi...@sap.com>
Authored: Mon Jan 12 10:15:06 2015 +0100
Committer: Michael Bolz <mi...@sap.com>
Committed: Mon Jan 12 10:15:06 2015 +0100

----------------------------------------------------------------------
 .../apache/olingo/server/core/ODataHandler.java | 54 +++++++++++---------
 .../olingo/server/core/ODataHandlerTest.java    | 37 +++++++++++---
 .../server/sample/processor/CarsProcessor.java  | 18 +++++++
 3 files changed, 77 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/186d6724/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 89f6d63..dc78647 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
@@ -273,8 +273,8 @@ public class ODataHandler {
     }
   }
 
-  private void handleFunctionDispatching(ODataRequest request, ODataResponse response,
-                                         UriResourceFunction uriResourceFunction)
+  private void handleFunctionDispatching(final ODataRequest request, final ODataResponse response,
+                                         final UriResourceFunction uriResourceFunction)
           throws ODataHandlerException, SerializerException, ContentNegotiatorException,
           ODataApplicationException, DeserializerException {
     final HttpMethod method = request.getMethod();
@@ -286,10 +286,9 @@ public class ODataHandler {
     EdmFunctionImport functionImport = uriResourceFunction.getFunctionImport();
     // could be null for bound functions
     if(functionImport == null) {
-      throw new ODataHandlerException("not implemented",
+      throw new ODataHandlerException("Bound functions are not implemented yet",
               ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
     }
-    //
 
     List<EdmFunction> unboundFunctions = functionImport.getUnboundFunctions();
     if(unboundFunctions == null || unboundFunctions.isEmpty()) {
@@ -297,11 +296,11 @@ public class ODataHandler {
               ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
     }
     EdmReturnType returnType = unboundFunctions.get(0).getReturnType();
-    handleOperationDispatching(request, response, uriResourceFunction, false, returnType);
+    handleOperationDispatching(request, response, false, returnType);
   }
 
-  private void handleActionDispatching(ODataRequest request, ODataResponse response,
-                                       UriResourceAction uriResourceAction)
+  private void handleActionDispatching(final ODataRequest request, final ODataResponse response,
+                                       final UriResourceAction uriResourceAction)
           throws ODataHandlerException, SerializerException, ContentNegotiatorException,
           ODataApplicationException, DeserializerException {
 
@@ -311,37 +310,38 @@ public class ODataHandler {
               ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
     }
 
-    EdmActionImport functionImport = uriResourceAction.getActionImport();
-    // could be null for bound functions
-    if(functionImport == null) {
-      throw new ODataHandlerException("not implemented",
+    EdmActionImport actionImport = uriResourceAction.getActionImport();
+    // could be null for bound actions
+    if(actionImport == null) {
+      throw new ODataHandlerException("Bound actions are not implemented yet",
               ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
     }
-    //
 
-    EdmAction unboundFunctions = functionImport.getUnboundAction();
-    if(unboundFunctions == null) {
+    EdmAction unboundActions = actionImport.getUnboundAction();
+    if(unboundActions == null) {
       throw new ODataHandlerException("No unbound function defined for function import",
               ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
     }
-    EdmReturnType returnType = unboundFunctions.getReturnType();
-    handleOperationDispatching(request, response, uriResourceAction, true, returnType);
+    EdmReturnType returnType = unboundActions.getReturnType();
+    handleOperationDispatching(request, response, true, returnType);
   }
 
 
-  private void handleOperationDispatching(ODataRequest request, ODataResponse response,
-                                          UriResourcePartTyped uriResource,
-                                          boolean isAction, EdmReturnType edmReturnTypeKind)
+  private void handleOperationDispatching(final ODataRequest request, final ODataResponse response,
+                                          final boolean isAction, final EdmReturnType edmReturnTypeKind)
           throws ODataHandlerException, SerializerException, ContentNegotiatorException,
           ODataApplicationException, DeserializerException {
 
     switch (edmReturnTypeKind.getType().getKind()) {
       case ENTITY:
-        handleEntityDispatching(request, response, uriResource);
+        handleEntityDispatching(request, response, edmReturnTypeKind.isCollection(), false);
         break;
       case PRIMITIVE:
         handlePrimitivePropertyDispatching(request, response, isAction, edmReturnTypeKind.isCollection());
         break;
+      case COMPLEX:
+        handleComplexPropertyDispatching(request, response, isAction, edmReturnTypeKind.isCollection());
+        break;
       default:
         throw new ODataHandlerException("not implemented",
                 ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
@@ -349,7 +349,6 @@ public class ODataHandler {
   }
 
 
-
   private void handleReferenceDispatching(final ODataRequest request, final ODataResponse response,
                                           final int lastPathSegmentIndex)
           throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
@@ -575,9 +574,16 @@ public class ODataHandler {
                                        final UriResourcePartTyped uriResourcePart)
           throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
           DeserializerException {
+    handleEntityDispatching(request, response, uriResourcePart.isCollection(), isMedia(uriResourcePart));
+  }
+
+  private void handleEntityDispatching(final ODataRequest request, final ODataResponse response,
+                                       final boolean isCollection, final boolean isMedia)
+          throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
+          DeserializerException {
 
     final HttpMethod method = request.getMethod();
-    if (uriResourcePart.isCollection()) {
+    if (isCollection) {
       if (method == HttpMethod.GET) {
         final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
                 request, customContentTypeSupport, RepresentationType.COLLECTION_ENTITY);
@@ -585,7 +591,7 @@ public class ODataHandler {
         selectProcessor(EntityCollectionProcessor.class)
                 .readEntityCollection(request, response, uriInfo, requestedContentType);
       } else if (method == HttpMethod.POST) {
-        if (isMedia(uriResourcePart)) {
+        if (isMedia) {
           final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
           final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
                   request, customContentTypeSupport, RepresentationType.ENTITY);
@@ -616,7 +622,7 @@ public class ODataHandler {
                 request, customContentTypeSupport, RepresentationType.ENTITY);
         selectProcessor(EntityProcessor.class).updateEntity(request, response, uriInfo, requestFormat, responseFormat);
       } else if (method == HttpMethod.DELETE) {
-        selectProcessor(isMedia(uriResourcePart) ? MediaEntityProcessor.class : EntityProcessor.class)
+        selectProcessor(isMedia ? MediaEntityProcessor.class : EntityProcessor.class)
                 .deleteEntity(request, response, uriInfo);
       } else {
         throw new ODataHandlerException("HTTP method " + method + " is not allowed.",

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/186d6724/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 b32af89..03e5213 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
@@ -280,18 +280,39 @@ public class ODataHandlerTest {
 
   @Test
   public void dispatchFunction() throws Exception {
-    final String uri = "FICRTCollString()";
-    final PrimitiveCollectionProcessor processor = mock(PrimitiveCollectionProcessor.class);
+    EntityProcessor entityProcessor = mock(EntityProcessor.class);
+    dispatch(HttpMethod.GET, "FICRTETKeyNav()", entityProcessor);
+    verify(entityProcessor).readEntity(
+            any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
 
-    dispatch(HttpMethod.GET, uri, processor);
-    verify(processor).readPrimitiveCollection(
+    EntityCollectionProcessor entityCollectionProcessor = mock(EntityCollectionProcessor.class);
+    dispatch(HttpMethod.GET, "FICRTESTwoKeyNavParam(ParameterInt16=123)", entityCollectionProcessor);
+    verify(entityCollectionProcessor).readEntityCollection(
             any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
 
-//    dispatch(HttpMethod.GET, uri, processor);
-//    verify(processor).readEntity(
-//            any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
+    PrimitiveProcessor primitiveProcessor = mock(PrimitiveProcessor.class);
+    dispatch(HttpMethod.GET, "FICRTString()", primitiveProcessor);
+    verify(primitiveProcessor).readPrimitive(
+            any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
 
-    dispatchMethodNotAllowed(HttpMethod.POST, uri, processor);
+    PrimitiveCollectionProcessor primitiveCollectionProcessor = mock(PrimitiveCollectionProcessor.class);
+    dispatch(HttpMethod.GET, "FICRTCollString()", primitiveCollectionProcessor);
+    verify(primitiveCollectionProcessor).readPrimitiveCollection(
+            any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
+
+    ComplexProcessor complexProcessor = mock(ComplexProcessor.class);
+    dispatch(HttpMethod.GET, "FICRTCTTwoPrim()", complexProcessor);
+    verify(complexProcessor).readComplex(
+            any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
+
+    ComplexCollectionProcessor complexCollectionProcessor = mock(ComplexCollectionProcessor.class);
+    dispatch(HttpMethod.GET, "FICRTCollCTTwoPrim()", complexCollectionProcessor);
+    verify(complexCollectionProcessor).readComplexCollection(
+            any(ODataRequest.class), any(ODataResponse.class), any(UriInfo.class), any(ContentType.class));
+
+    dispatchMethodNotAllowed(HttpMethod.POST, "FICRTCollString()", mock(Processor.class));
+    dispatchMethodNotAllowed(HttpMethod.PUT, "FICRTCollString()", mock(Processor.class));
+    dispatchMethodNotAllowed(HttpMethod.DELETE, "FICRTCollString()", mock(Processor.class));
   }
 
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/186d6724/samples/server/src/main/java/org/apache/olingo/server/sample/processor/CarsProcessor.java
----------------------------------------------------------------------
diff --git a/samples/server/src/main/java/org/apache/olingo/server/sample/processor/CarsProcessor.java b/samples/server/src/main/java/org/apache/olingo/server/sample/processor/CarsProcessor.java
index 3f15483..f3747dc 100644
--- a/samples/server/src/main/java/org/apache/olingo/server/sample/processor/CarsProcessor.java
+++ b/samples/server/src/main/java/org/apache/olingo/server/sample/processor/CarsProcessor.java
@@ -337,6 +337,15 @@ public class CarsProcessor implements EntityCollectionProcessor, EntityProcessor
   }
 
   @Override
+  public void processPrimitive(final ODataRequest request, final ODataResponse response,
+                             final UriInfo uriInfo, final ContentType requestFormat,
+                             final ContentType responseFormat)
+          throws ODataApplicationException, DeserializerException, SerializerException {
+    throw new ODataApplicationException("Process Primitive property update is not supported yet.",
+            HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
+  }
+
+  @Override
   public void updateComplex(final ODataRequest request, final ODataResponse response,
                             final UriInfo uriInfo, final ContentType requestFormat,
                             final ContentType responseFormat)
@@ -346,6 +355,15 @@ public class CarsProcessor implements EntityCollectionProcessor, EntityProcessor
   }
 
   @Override
+  public void processComplex(final ODataRequest request, final ODataResponse response,
+                             final UriInfo uriInfo, final ContentType requestFormat,
+                             final ContentType responseFormat)
+          throws ODataApplicationException, DeserializerException, SerializerException {
+    throw new ODataApplicationException("Process Complex property update is not supported yet.",
+            HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
+  }
+
+  @Override
   public void deleteComplex(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo)
           throws ODataApplicationException {
     throw new ODataApplicationException("Complex property delete is not supported yet.",