CAMEL-7806 Fixed Olingo2 API and component to support entity container names, also added tests with container names and batch content id reference with property suffix
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/56615ec3 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/56615ec3 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/56615ec3 Branch: refs/heads/master Commit: 56615ec332f51899eb6fc17e47dae4c67c6a887f Parents: 6984401 Author: Dhiraj Bokde <dhira...@yahoo.com> Authored: Thu Sep 11 13:52:28 2014 -0700 Committer: Dhiraj Bokde <dhira...@yahoo.com> Committed: Thu Sep 11 13:52:28 2014 -0700 ---------------------------------------------------------------------- .../api/batch/Olingo2BatchChangeRequest.java | 10 +++++++ .../api/batch/Olingo2BatchQueryRequest.java | 4 +++ .../olingo2/api/impl/Olingo2AppImpl.java | 23 +++++++++++++-- .../olingo2/api/Olingo2AppIntegrationTest.java | 3 +- .../olingo2/Olingo2AppIntegrationTest.java | 31 +++++++++++++------- 5 files changed, 57 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/56615ec3/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchChangeRequest.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchChangeRequest.java b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchChangeRequest.java index d2d06ad..a032cb5 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchChangeRequest.java +++ b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchChangeRequest.java @@ -88,6 +88,16 @@ public class Olingo2BatchChangeRequest extends Olingo2BatchRequest { } public Olingo2BatchChangeRequest build() { + // avoid later NPEs + if (request.resourcePath == null) { + throw new IllegalArgumentException("Null resourcePath"); + } + if (request.operation == null) { + throw new IllegalArgumentException("Null operation"); + } + if (request.operation != Operation.DELETE && request.body == null) { + throw new IllegalArgumentException("Null body"); + } return request; } } http://git-wip-us.apache.org/repos/asf/camel/blob/56615ec3/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchQueryRequest.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchQueryRequest.java b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchQueryRequest.java index cac47ff..5ae3ead 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchQueryRequest.java +++ b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/batch/Olingo2BatchQueryRequest.java @@ -50,6 +50,10 @@ public class Olingo2BatchQueryRequest extends Olingo2BatchRequest { private Olingo2BatchQueryRequest request = new Olingo2BatchQueryRequest(); public Olingo2BatchQueryRequest build() { + // avoid later NPEs + if (request.resourcePath == null) { + throw new IllegalArgumentException("Null resourcePath"); + } return request; } http://git-wip-us.apache.org/repos/asf/camel/blob/56615ec3/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java index 0b3705e..327a6c3 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java +++ b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java @@ -69,6 +69,7 @@ import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse; import org.apache.olingo.odata2.api.commons.HttpStatusCodes; import org.apache.olingo.odata2.api.commons.ODataHttpHeaders; import org.apache.olingo.odata2.api.edm.Edm; +import org.apache.olingo.odata2.api.edm.EdmEntityContainer; import org.apache.olingo.odata2.api.edm.EdmEntitySet; import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmProperty; @@ -696,7 +697,25 @@ public final class Olingo2AppImpl implements Olingo2App { } // create a dummy entity location by adding a dummy key predicate - final EdmEntitySet entitySet = edm.getDefaultEntityContainer().getEntitySet(referencedEntity.toString()); + // look for a Container name if available + String referencedEntityName = referencedEntity.toString(); + final int containerSeparator = referencedEntityName.lastIndexOf('.'); + final EdmEntityContainer entityContainer; + if (containerSeparator != -1) { + final String containerName = referencedEntityName.substring(0, containerSeparator); + referencedEntityName = referencedEntityName.substring(containerSeparator + 1); + entityContainer = edm.getEntityContainer(containerName); + if (entityContainer == null) { + throw new IllegalArgumentException("EDM does not have entity container " + containerName); + } + } else { + entityContainer = edm.getDefaultEntityContainer(); + if (entityContainer == null) { + throw new IllegalArgumentException("EDM does not have a default entity container" + + ", use a fully qualified entity set name"); + } + } + final EdmEntitySet entitySet = entityContainer.getEntitySet(referencedEntityName); final List<EdmProperty> keyProperties = entitySet.getEntityType().getKeyProperties(); if (keyProperties.size() == 1) { @@ -710,7 +729,7 @@ public final class Olingo2AppImpl implements Olingo2App { referencedEntity.append(')'); } - return pathSeparator == -1 ? referencedEntity.toString() + return pathSeparator == -1 ? referencedEntityName : referencedEntity.append(entityReference.substring(pathSeparator)).toString(); } http://git-wip-us.apache.org/repos/asf/camel/blob/56615ec3/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java b/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java index aa41056..e8b951b 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java +++ b/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java @@ -73,12 +73,13 @@ public class Olingo2AppIntegrationTest { private static final long TIMEOUT = 10; private static final String MANUFACTURERS = "Manufacturers"; + private static final String FQN_MANUFACTURERS = "DefaultContainer.Manufacturers"; private static final String ADDRESS = "Address"; private static final String CARS = "Cars"; private static final String TEST_KEY = "'1'"; private static final String TEST_CREATE_KEY = "'123'"; - private static final String TEST_MANUFACTURER = MANUFACTURERS + "(" + TEST_KEY + ")"; + private static final String TEST_MANUFACTURER = FQN_MANUFACTURERS + "(" + TEST_KEY + ")"; private static final String TEST_CREATE_MANUFACTURER = MANUFACTURERS + "(" + TEST_CREATE_KEY + ")"; private static final String TEST_RESOURCE_CONTENT_ID = "1"; http://git-wip-us.apache.org/repos/asf/camel/blob/56615ec3/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java index aa96533..2b67d44 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java +++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java @@ -61,7 +61,8 @@ public class Olingo2AppIntegrationTest extends AbstractOlingo2TestSupport { private static final String TEST_RESOURCE_CONTENT_ID = "1"; private static final String ADDRESS = "Address"; private static final String TEST_RESOURCE = "$1"; - private static final String TEST_CREATE_MANUFACTURER = "Manufacturers('123')"; + private static final String TEST_RESOURCE_ADDRESS = TEST_RESOURCE + "/Address"; + private static final String TEST_CREATE_MANUFACTURER = "DefaultContainer.Manufacturers('123')"; @Test public void testRead() throws Exception { @@ -160,26 +161,29 @@ public class Olingo2AppIntegrationTest extends AbstractOlingo2TestSupport { batchParts.add(Olingo2BatchChangeRequest.resourcePath(MANUFACTURERS). contentId(TEST_RESOURCE_CONTENT_ID).operation(Operation.CREATE).body(data).build()); - // 6. update - final Map<String, Object> updateData = new HashMap<String, Object>(data); + // 6. update address in created entry @SuppressWarnings("unchecked") + final Map<String, Object> updateData = new HashMap<String, Object>(data); Map<String, Object> address = (Map<String, Object>) updateData.get(ADDRESS); - updateData.put("Name", "MyCarManufacturer Renamed"); address.put("Street", "Main Street"); + batchParts.add( + Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE_ADDRESS).operation(Operation.UPDATE).body(address).build()); + // 7. update + updateData.put("Name", "MyCarManufacturer Renamed"); batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.UPDATE) .body(updateData).build()); - // 7. delete + // 8. delete batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.DELETE).build()); - // 8. read to verify delete + // 9. read to verify delete batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_CREATE_MANUFACTURER).build()); // execute batch request final List<Olingo2BatchResponse> responseParts = requestBody("direct://BATCH", batchParts); assertNotNull("Batch response", responseParts); - assertEquals("Batch responses expected", 8, responseParts.size()); + assertEquals("Batch responses expected", 9, responseParts.size()); final Edm edm = (Edm) responseParts.get(0).getBody(); assertNotNull(edm); @@ -203,13 +207,18 @@ public class Olingo2AppIntegrationTest extends AbstractOlingo2TestSupport { int statusCode = responseParts.get(5).getStatusCode(); assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode); + LOG.info("Update address status: {}", statusCode); + statusCode = responseParts.get(6).getStatusCode(); - LOG.info("Update status: {}", statusCode); + assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode); + LOG.info("Update entry status: {}", statusCode); + + statusCode = responseParts.get(7).getStatusCode(); assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode); LOG.info("Delete status: {}", statusCode); - assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), responseParts.get(7).getStatusCode()); - final Exception exception = (Exception) responseParts.get(7).getBody(); + assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), responseParts.get(8).getStatusCode()); + final Exception exception = (Exception) responseParts.get(8).getBody(); assertNotNull(exception); LOG.info("Read deleted entry exception: {}", exception); } @@ -226,7 +235,7 @@ public class Olingo2AppIntegrationTest extends AbstractOlingo2TestSupport { .to("olingo2://read/Manufacturers?$orderBy=Name%20asc"); from("direct://READENTRY") - .to("olingo2://read/Manufacturers"); + .to("olingo2://read/DefaultContainer.Manufacturers"); // test route for create from("direct://CREATE")