You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dm...@apache.org on 2019/04/25 19:59:47 UTC

[camel] 01/02: CAMEL-13458: Support return of collection properties in Olingo4

This is an automated email from the ASF dual-hosted git repository.

dmvolod pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 422b8dcb025664c2de0f529dd460df857b619d80
Author: phantomjinx <p....@phantomjinx.co.uk>
AuthorDate: Thu Apr 25 10:42:40 2019 +0100

    CAMEL-13458: Support return of collection properties in Olingo4
    
    * Olingo4AppImpl
     * If property has collection then return it.
    
    * Tests to prove fix
    
    * Olingo2ComponentTest
     * Shore up tests to make them more reliable.
---
 .../component/olingo2/Olingo2ComponentTest.java    |  12 +--
 .../component/olingo4/api/impl/Olingo4AppImpl.java |   8 +-
 .../component/olingo4/Olingo4ComponentTest.java    | 107 +++++++++++++++++----
 3 files changed, 97 insertions(+), 30 deletions(-)

diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java
index cad6ecc..77d6b4e 100644
--- a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java
@@ -419,7 +419,7 @@ public class Olingo2ComponentTest extends AbstractOlingo2TestSupport {
 
         int expectedMsgCount = 2;
         MockEndpoint mockEndpoint = getMockEndpoint("mock:consumer-splitresult");
-        mockEndpoint.expectedMessageCount(expectedMsgCount);
+        mockEndpoint.expectedMinimumMessageCount(expectedMsgCount);
 
         final ODataFeed odataFeed = (ODataFeed)requestBodyAndHeaders(endpoint, null, headers);
         assertNotNull(odataFeed);
@@ -439,15 +439,7 @@ public class Olingo2ComponentTest extends AbstractOlingo2TestSupport {
 
             Object name = properties.get("Name");
             assertNotNull(name);
-            switch(i) {
-            case 0:
-                assertEquals("Star Powered Racing", name);
-                break;
-            case 1:
-                assertEquals("Horse Powered Racing", name);
-                break;
-            default:
-            }
+            assertTrue(name.toString().contains("Powered Racing"));
         }
     }
 
diff --git a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
index 7c5ad41..cb5b64e 100644
--- a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
+++ b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.olingo4.api.impl;
 
+import static org.apache.camel.component.olingo4.api.impl.Olingo4Helper.getContentTypeHeader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
@@ -29,7 +30,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-
 import org.apache.camel.component.olingo4.api.Olingo4App;
 import org.apache.camel.component.olingo4.api.Olingo4ResponseHandler;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchChangeRequest;
@@ -108,8 +108,6 @@ import org.apache.olingo.server.api.uri.UriResourceFunction;
 import org.apache.olingo.server.api.uri.UriResourceKind;
 import org.apache.olingo.server.core.uri.parser.Parser;
 
-import static org.apache.camel.component.olingo4.api.impl.Olingo4Helper.getContentTypeHeader;
-
 /**
  * Application API used by Olingo4 Component.
  */
@@ -406,6 +404,8 @@ public final class Olingo4AppImpl implements Olingo4App {
                     response = (T)property.getPrimitiveValue();
                 } else if (property.hasComplexValue()) {
                     response = (T)property.getComplexValue();
+                } else if (property.hasCollectionValue()) {
+                    response = (T)property.getCollectionValue();
                 } else {
                     throw new ODataException("Unsupported property: " + property.getName());
                 }
@@ -429,6 +429,8 @@ public final class Olingo4AppImpl implements Olingo4App {
                         response = (T)functionProperty.getPrimitiveValue();
                     } else if (functionProperty.hasComplexValue()) {
                         response = (T)functionProperty.getComplexValue();
+                    } else if (functionProperty.hasCollectionValue()) {
+                        response = (T)functionProperty.getCollectionValue();
                     } else {
                         throw new ODataException("Unsupported property: " + functionProperty.getName());
                     }
diff --git a/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java b/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
index f961cde..4fa0f5d 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.component.olingo4;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -29,6 +29,7 @@ import org.apache.camel.component.olingo4.api.batch.Olingo4BatchQueryRequest;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchRequest;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchResponse;
 import org.apache.camel.component.olingo4.api.batch.Operation;
+import org.apache.olingo.client.api.domain.ClientCollectionValue;
 import org.apache.olingo.client.api.domain.ClientComplexValue;
 import org.apache.olingo.client.api.domain.ClientEntity;
 import org.apache.olingo.client.api.domain.ClientEntitySet;
@@ -104,6 +105,15 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
         assertTrue(complexProperty.isComplex());
         assertEquals("San Francisco", complexProperty.get("City").getComplexValue().get("Name").getValue().toString());
 
+        final ClientCollectionValue<?> collectionProperty = (ClientCollectionValue<?>)requestBodyAndHeaders("direct:readcollectionprop", null, headers);
+        assertTrue(collectionProperty.isCollection());
+        assertEquals(1, collectionProperty.size());
+        Iterator<?> propIter = collectionProperty.iterator();
+        Object propValueObj = propIter.next();
+        assertIsInstanceOf(ClientComplexValue.class, propValueObj);
+        ClientComplexValue propValue = (ClientComplexValue) propValueObj;
+        assertEquals("Boise", propValue.get("City").getComplexValue().get("Name").getValue().toString());
+
         final ClientEntity entity = (ClientEntity)requestBodyAndHeaders("direct:readentitybyid", null, headers);
         assertNotNull(entity);
         assertEquals("Russell", entity.getProperty("FirstName").getValue().toString());
@@ -305,7 +315,7 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
     @Test
     public void testConsumerReadFilterAlreadySeen() throws Exception {
         final Map<String, Object> headers = new HashMap<>();
-        String endpoint = "olingo4://read/People?filterAlreadySeen=true&consumer.delay=2&consumer.sendEmptyMessageWhenIdle=true&consumer.splitResult=false";
+        String endpoint = "olingo4://read/" + PEOPLE + "?filterAlreadySeen=true&consumer.delay=2&consumer.sendEmptyMessageWhenIdle=true&consumer.splitResult=false";
         int expectedEntities = 20;
         int expectedMsgCount = 3;
         MockEndpoint mockEndpoint = getMockEndpoint("mock:consumer-alreadyseen");
@@ -420,7 +430,7 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
     @Test
     public void testConsumerReadSplitResults() throws Exception {
         final Map<String, Object> headers = new HashMap<>();
-        String endpoint = "olingo4://read/People?consumer.splitResult=true";
+        String endpoint = "olingo4://read/" + PEOPLE + "?consumer.splitResult=true";
         int expectedEntities = 20;
 
         int expectedMsgCount = 3;
@@ -457,6 +467,7 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
             }
         }
     }
+
     /**
      * Read value of the People object and split the results
      * into individual messages
@@ -464,7 +475,7 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
     @Test
     public void testConsumerReadClientValuesSplitResults() throws Exception {
         final Map<String, Object> headers = new HashMap<>();
-        String endpoint = "olingo4://read/People('russellwhyte')/FavoriteFeature?consumer.splitResult=true";
+        String endpoint = "olingo4://read/" + TEST_PEOPLE + "/FavoriteFeature?consumer.splitResult=true";
 
         MockEndpoint mockEndpoint = getMockEndpoint("mock:consumer-splitresult-value");
         mockEndpoint.expectedMinimumMessageCount(1);
@@ -482,6 +493,61 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
         assertEquals("Feature1", value.toString());
     }
 
+    /**
+     * Read value of the People object's AddressInfo collection value
+     * & split the results into individual messages for each address
+     */
+    @Test
+    public void testConsumerReadClientCollectionValuesSplitResults() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        String endpoint = "olingo4://read/" + TEST_PEOPLE + "/AddressInfo?consumer.splitResult=true";
+
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:consumer-splitresult-collection-value");
+        mockEndpoint.expectedMinimumMessageCount(1);
+
+        final ClientValue resultValue = requestBodyAndHeaders(endpoint, null, headers);
+        assertIsInstanceOf(ClientValue.class, resultValue);
+
+        mockEndpoint.assertIsSatisfied();
+        //
+        // 1 individual message in the exchange
+        //
+        Object body = mockEndpoint.getExchanges().get(0).getIn().getBody();
+        assertIsInstanceOf(ClientComplexValue.class, body);
+        ClientComplexValue value = (ClientComplexValue) body;
+        assertEquals("Boise", value.get("City").getComplexValue().get("Name").getValue().toString());
+    }
+
+    /**
+     * Read value of the People object's AddressInfo collection value
+     * & split the results into individual messages for each address
+     */
+    @Test
+    public void testConsumerReadClientCollectionValuesNoSplitResults() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        String endpoint = "olingo4://read/" + TEST_PEOPLE + "/AddressInfo?consumer.splitResult=false";
+
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:consumer-nosplitresult-colleciton-value");
+        mockEndpoint.expectedMinimumMessageCount(1);
+
+        final ClientValue resultValue = requestBodyAndHeaders(endpoint, null, headers);
+        assertIsInstanceOf(ClientValue.class, resultValue);
+
+        mockEndpoint.assertIsSatisfied();
+        //
+        // 1 individual collection value message in the exchange
+        //
+        Object body = mockEndpoint.getExchanges().get(0).getIn().getBody();
+        assertIsInstanceOf(ClientCollectionValue.class, body);
+        ClientCollectionValue<?> value = (ClientCollectionValue<?>) body;
+        assertEquals(1, value.size());
+        Iterator<?> propIter = value.iterator();
+        Object propValueObj = propIter.next();
+        assertIsInstanceOf(ClientComplexValue.class, propValueObj);
+        ClientComplexValue propValue = (ClientComplexValue) propValueObj;
+        assertEquals("Boise", propValue.get("City").getComplexValue().get("Name").getValue().toString());
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
@@ -491,33 +557,35 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
 
                 from("direct:readdocument").to("olingo4://read/");
 
-                from("direct:readentities").to("olingo4://read/People?$top=5&$orderby=FirstName asc");
+                from("direct:readentities").to("olingo4://read/" + PEOPLE + "?$top=5&$orderby=FirstName asc");
 
-                from("direct:readcount").to("olingo4://read/People/$count");
+                from("direct:readcount").to("olingo4://read/" + PEOPLE + "/$count");
 
-                from("direct:readvalue").to("olingo4://read/People('russellwhyte')/Gender/$value");
+                from("direct:readvalue").to("olingo4://read/" + TEST_PEOPLE + "/Gender/$value");
 
                 from("direct:readsingleprop").to("olingo4://read/Airports('KSFO')/Name");
 
                 from("direct:readcomplexprop").to("olingo4://read/Airports('KSFO')/Location");
 
-                from("direct:readentitybyid").to("olingo4://read/People('russellwhyte')");
+                from("direct:readcollectionprop").to("olingo4://read/" + TEST_PEOPLE + "/AddressInfo");
+
+                from("direct:readentitybyid").to("olingo4://read/" + TEST_PEOPLE + "");
 
                 from("direct:readwithfilter").to("olingo4://read/Airports?$filter=Name eq 'San Francisco International Airport'");
 
                 from("direct:callunboundfunction").to("olingo4://read/GetNearestAirport(lat=33,lon=-118)");
 
                 // test route for create individual entity
-                from("direct:create-entity").to("olingo4://create/People");
+                from("direct:create-entity").to("olingo4://create/" + PEOPLE);
 
                 // test route for update
-                from("direct:update-entity").to("olingo4://update/People('lewisblack')");
+                from("direct:update-entity").to("olingo4://update/" + PEOPLE + "('lewisblack')");
 
                 // test route for delete
-                from("direct:delete-entity").to("olingo4://delete/People('lewisblack')");
+                from("direct:delete-entity").to("olingo4://delete/" + PEOPLE + "('lewisblack')");
 
                 // test route for delete
-                from("direct:read-deleted-entity").to("olingo4://delete/People('lewisblack')");
+                from("direct:read-deleted-entity").to("olingo4://delete/" + PEOPLE + "('lewisblack')");
 
                 // test route for batch
                 from("direct:batch").to("olingo4://batch");
@@ -526,22 +594,27 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
 
                 from("direct:delete-with-etag").to("olingo4://delete/Airlines('AA')");
 
-                from("direct:read-people-nofilterseen").to("olingo4://read/People").to("mock:producer-noalreadyseen");
+                from("direct:read-people-nofilterseen").to("olingo4://read/" + PEOPLE).to("mock:producer-noalreadyseen");
 
-                from("direct:read-people-filterseen").to("olingo4://read/People?filterAlreadySeen=true").to("mock:producer-alreadyseen");
+                from("direct:read-people-filterseen").to("olingo4://read/" + PEOPLE + "?filterAlreadySeen=true").to("mock:producer-alreadyseen");
 
                 //
                 // Consumer endpoint
                 //
-                from("olingo4://read/People?filterAlreadySeen=true&consumer.delay=2&consumer.sendEmptyMessageWhenIdle=true&consumer.splitResult=false")
+                from("olingo4://read/" + PEOPLE + "?filterAlreadySeen=true&consumer.delay=2&consumer.sendEmptyMessageWhenIdle=true&consumer.splitResult=false")
                     .to("mock:consumer-alreadyseen");
 
-                from("olingo4://read/People?consumer.splitResult=true")
+                from("olingo4://read/" + PEOPLE + "?consumer.splitResult=true")
                     .to("mock:consumer-splitresult");
 
-                from("olingo4://read/People('russellwhyte')/FavoriteFeature?consumer.splitResult=true")
+                from("olingo4://read/" + TEST_PEOPLE + "/FavoriteFeature?consumer.splitResult=true")
                     .to("mock:consumer-splitresult-value");
 
+                from("olingo4://read/" + TEST_PEOPLE + "/AddressInfo?consumer.splitResult=true")
+                    .to("mock:consumer-splitresult-collection-value");
+
+                from("olingo4://read/" + TEST_PEOPLE + "/AddressInfo?consumer.splitResult=false")
+                .to("mock:consumer-nosplitresult-colleciton-value");
             }
         };
     }