Repository: olingo-odata4 Updated Branches: refs/heads/olingo-266-ref da8e908b0 -> 6f8aef66a
[OLINGO-260] provided v4 integration test for entity creation Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/79b112ac Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/79b112ac Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/79b112ac Branch: refs/heads/olingo-266-ref Commit: 79b112ac457993d7994ffc380d94cc55ff2867c4 Parents: da8e908 Author: fmartelli <[email protected]> Authored: Tue May 13 13:39:28 2014 +0200 Committer: Stephan Klevenz <[email protected]> Committed: Mon May 19 12:33:24 2014 +0200 ---------------------------------------------------------------------- .../ext/proxy/EntityContainerFactory.java | 1 + .../olingo/ext/proxy/commons/ContainerImpl.java | 15 +- .../commons/EntitySetInvocationHandler.java | 72 +++-- .../java/org/apache/olingo/fit/V4Services.java | 2 +- .../olingo/fit/utils/AbstractUtilities.java | 19 +- .../org/apache/olingo/fit/utils/Commons.java | 1 + .../olingo/fit/proxy/v3/AbstractTestITCase.java | 2 + .../olingo/fit/proxy/v4/AbstractTestITCase.java | 2 + .../fit/proxy/v4/EntityCreateTestITCase.java | 271 +++++++++++++++++++ .../odatawcfservice/InMemoryEntities.java | 2 +- .../odatawcfservice/types/OrderDetail.java | 2 - .../olingo/fit/v3/AbstractTestITCase.java | 3 + .../olingo/fit/v4/AbstractTestITCase.java | 4 + .../olingo/fit/v4/EntityCreateTestITCase.java | 2 + .../olingo/client/api/CommonConfiguration.java | 12 + .../client/core/AbstractConfiguration.java | 13 + .../request/batch/v3/ODataBatchRequestImpl.java | 1 + .../request/batch/v4/ODataBatchRequestImpl.java | 2 +- 18 files changed, 396 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java ---------------------------------------------------------------------- diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java index 71b369b..3e8606e 100644 --- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java +++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java @@ -65,6 +65,7 @@ public final class EntityContainerFactory { FACTORY_PER_SERVICEROOT.put(serviceRoot, instance); } client.getConfiguration().setDefaultPubFormat(ODataPubFormat.JSON_FULL_METADATA); + return FACTORY_PER_SERVICEROOT.get(serviceRoot); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java ---------------------------------------------------------------------- diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java index 8959351..3d30497 100644 --- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java +++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java @@ -32,6 +32,7 @@ import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.olingo.client.api.CommonEdmEnabledODataClient; import org.apache.olingo.client.api.communication.header.ODataPreferences; +import org.apache.olingo.client.api.communication.request.ODataRequest; import org.apache.olingo.client.api.communication.request.ODataStreamedRequest; import org.apache.olingo.client.api.communication.request.batch.BatchStreamManager; import org.apache.olingo.client.api.communication.request.batch.CommonODataBatchRequest; @@ -87,6 +88,7 @@ class ContainerImpl implements Container { @Override public void flush() { final CommonODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(client.getServiceRoot()); + ((ODataRequest)request).setAccept(client.getConfiguration().getDefaultBatchAcceptFormat()); final BatchStreamManager streamManager = (BatchStreamManager) ((ODataStreamedRequest) request).execute(); @@ -111,7 +113,8 @@ class ContainerImpl implements Container { final ODataBatchResponse response = streamManager.getResponse(); - if (response.getStatusCode() != 202) { + if ((client.getServiceVersion().compareTo(ODataServiceVersion.V30) <= 0 && response.getStatusCode() != 202) + || (client.getServiceVersion().compareTo(ODataServiceVersion.V30) > 0 && response.getStatusCode() != 200)) { throw new IllegalStateException("Operation failed"); } @@ -263,10 +266,10 @@ class ContainerImpl implements Container { client.getServiceVersion().compareTo(ODataServiceVersion.V30) <= 0 ? ((org.apache.olingo.client.api.v3.EdmEnabledODataClient) client).getCUDRequestFactory(). getEntityUpdateRequest( - uri, org.apache.olingo.client.api.communication.request.cud.v3.UpdateType.PATCH, changes) + uri, org.apache.olingo.client.api.communication.request.cud.v3.UpdateType.PATCH, changes) : ((org.apache.olingo.client.api.v4.EdmEnabledODataClient) client).getCUDRequestFactory(). getEntityUpdateRequest( - uri, org.apache.olingo.client.api.communication.request.cud.v4.UpdateType.PATCH, changes); + uri, org.apache.olingo.client.api.communication.request.cud.v4.UpdateType.PATCH, changes); req.setPrefer(new ODataPreferences(client.getServiceVersion()).returnContent()); @@ -393,7 +396,7 @@ class ContainerImpl implements Container { final URI targetURI = currentStatus == AttachedEntityStatus.NEW ? URI.create("$" + startingPos + "/$value") : URIUtils.getURI( - factory.getServiceRoot(), handler.getEntity().getEditLink().toASCIIString() + "/$value"); + factory.getServiceRoot(), handler.getEntity().getEditLink().toASCIIString() + "/$value"); batchUpdateMediaEntity(handler, targetURI, handler.getStreamChanges(), changeset); @@ -406,8 +409,8 @@ class ContainerImpl implements Container { for (Map.Entry<String, InputStream> streamedChanges : handler.getStreamedPropertyChanges().entrySet()) { final URI targetURI = currentStatus == AttachedEntityStatus.NEW ? URI.create("$" + startingPos) : URIUtils.getURI( - factory.getServiceRoot(), - CoreUtils.getEditMediaLink(streamedChanges.getKey(), entity).toASCIIString()); + factory.getServiceRoot(), + CoreUtils.getEditMediaLink(streamedChanges.getKey(), entity).toASCIIString()); batchUpdateMediaResource(handler, targetURI, streamedChanges.getValue(), changeset); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntitySetInvocationHandler.java ---------------------------------------------------------------------- diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntitySetInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntitySetInvocationHandler.java index 5c8380d..10c68f2 100644 --- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntitySetInvocationHandler.java +++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntitySetInvocationHandler.java @@ -37,6 +37,7 @@ import org.apache.olingo.client.api.CommonEdmEnabledODataClient; import org.apache.olingo.client.api.communication.request.retrieve.ODataValueRequest; import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse; import org.apache.olingo.client.api.uri.CommonURIBuilder; +import org.apache.olingo.client.api.v4.ODataClient; import org.apache.olingo.commons.api.domain.CommonODataEntity; import org.apache.olingo.commons.api.domain.CommonODataEntitySet; import org.apache.olingo.commons.api.edm.FullQualifiedName; @@ -49,6 +50,7 @@ import org.apache.olingo.ext.proxy.api.annotations.CompoundKey; import org.apache.olingo.ext.proxy.api.annotations.CompoundKeyElement; import org.apache.olingo.ext.proxy.api.annotations.EntitySet; import org.apache.olingo.ext.proxy.api.annotations.EntityType; +import org.apache.olingo.ext.proxy.api.annotations.Singleton; import org.apache.olingo.ext.proxy.context.AttachedEntityStatus; import org.apache.olingo.ext.proxy.context.EntityContext; import org.apache.olingo.ext.proxy.context.EntityUUID; @@ -76,6 +78,8 @@ class EntitySetInvocationHandler<C extends CommonEdmEnabledODataClient<?>, T ext private final URI uri; + private boolean isSingleton = false; + @SuppressWarnings({"rawtypes", "unchecked"}) static EntitySetInvocationHandler getInstance( final Class<?> ref, final EntityContainerInvocationHandler containerHandler) { @@ -90,13 +94,20 @@ class EntitySetInvocationHandler<C extends CommonEdmEnabledODataClient<?>, T ext super(containerHandler.getClient(), containerHandler); - final Annotation annotation = ref.getAnnotation(EntitySet.class); - if (!(annotation instanceof EntitySet)) { - throw new IllegalArgumentException("Return type " + ref.getName() - + " is not annotated as @" + EntitySet.class.getSimpleName()); - } + Annotation annotation = ref.getAnnotation(EntitySet.class); + if (annotation == null) { + annotation = ref.getAnnotation(Singleton.class); + + if (annotation == null) { + throw new IllegalArgumentException("Return type " + ref.getName() + + " is not annotated as @" + EntitySet.class.getSimpleName()); + } - this.entitySetName = ((EntitySet) annotation).name(); + this.entitySetName = ((Singleton) annotation).name(); + isSingleton = true; + } else { + this.entitySetName = ((EntitySet) annotation).name(); + } final Type[] abstractEntitySetParams = ((ParameterizedType) ref.getGenericInterfaces()[0]).getActualTypeArguments(); @@ -172,15 +183,26 @@ class EntitySetInvocationHandler<C extends CommonEdmEnabledODataClient<?>, T ext Thread.currentThread().getContextClassLoader(), new Class<?>[] {reference}, new EntityCollectionInvocationHandler<T, C>( - containerHandler, new ArrayList<T>(), typeRef, containerHandler.getEntityContainerName())); + containerHandler, new ArrayList<T>(), typeRef, containerHandler.getEntityContainerName())); } @Override public Long count() { - final ODataValueRequest req = client.getRetrieveRequestFactory(). - getValueRequest(client.getURIBuilder(this.uri.toASCIIString()).count().build()); - req.setFormat(ODataValueFormat.TEXT); - return Long.valueOf(req.execute().getBody().asPrimitive().toString()); + if (isSingleton) { + final ODataRetrieveResponse<org.apache.olingo.commons.api.domain.v4.Singleton> res = + ((ODataClient) client).getRetrieveRequestFactory().getSingletonRequest(uri).execute(); + + if (res.getBody() == null) { + return 0l; + } else { + return 1l; + } + } else { + final ODataValueRequest req = client.getRetrieveRequestFactory(). + getValueRequest(client.getURIBuilder(this.uri.toASCIIString()).count().build()); + req.setFormat(ODataValueFormat.TEXT); + return Long.valueOf(req.execute().getBody().asPrimitive().toString()); + } } @Override @@ -276,13 +298,27 @@ class EntitySetInvocationHandler<C extends CommonEdmEnabledODataClient<?>, T ext @SuppressWarnings("unchecked") public <S extends T> Map.Entry<List<S>, URI> fetchPartialEntitySet(final URI uri, final Class<S> typeRef) { - final ODataRetrieveResponse<CommonODataEntitySet> res = - client.getRetrieveRequestFactory().getEntitySetRequest(uri).execute(); + final List<CommonODataEntity> entities = new ArrayList<CommonODataEntity>(); + final URI next; + + if (isSingleton) { + final ODataRetrieveResponse<org.apache.olingo.commons.api.domain.v4.Singleton> res = + ((ODataClient) client).getRetrieveRequestFactory().getSingletonRequest(uri).execute(); + + entities.add(res.getBody()); + next = null; + } else { + final ODataRetrieveResponse<CommonODataEntitySet> res = + client.getRetrieveRequestFactory().getEntitySetRequest(uri).execute(); + + final CommonODataEntitySet entitySet = res.getBody(); + entities.addAll(entitySet.getEntities()); + next = entitySet.getNext(); + } - final CommonODataEntitySet entitySet = res.getBody(); + final List<S> items = new ArrayList<S>(entities.size()); - final List<S> items = new ArrayList<S>(entitySet.getEntities().size()); - for (CommonODataEntity entity : entitySet.getEntities()) { + for (CommonODataEntity entity : entities) { final EntityTypeInvocationHandler<?> handler = EntityTypeInvocationHandler.getInstance(entity, this, typeRef); final EntityTypeInvocationHandler<?> handlerInTheContext = @@ -294,7 +330,7 @@ class EntitySetInvocationHandler<C extends CommonEdmEnabledODataClient<?>, T ext handlerInTheContext == null ? handler : handlerInTheContext)); } - return new AbstractMap.SimpleEntry<List<S>, URI>(items, entitySet.getNext()); + return new AbstractMap.SimpleEntry<List<S>, URI>(items, next); } @SuppressWarnings("unchecked") @@ -314,7 +350,7 @@ class EntitySetInvocationHandler<C extends CommonEdmEnabledODataClient<?>, T ext Thread.currentThread().getContextClassLoader(), new Class<?>[] {collTypeRef}, new EntityCollectionInvocationHandler<S, C>( - containerHandler, items, typeRef, containerHandler.getEntityContainerName(), entitySetURI)); + containerHandler, items, typeRef, containerHandler.getEntityContainerName(), entitySetURI)); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/main/java/org/apache/olingo/fit/V4Services.java ---------------------------------------------------------------------- diff --git a/fit/src/main/java/org/apache/olingo/fit/V4Services.java b/fit/src/main/java/org/apache/olingo/fit/V4Services.java index 49b2e4c..d0bbaad 100644 --- a/fit/src/main/java/org/apache/olingo/fit/V4Services.java +++ b/fit/src/main/java/org/apache/olingo/fit/V4Services.java @@ -111,7 +111,7 @@ public class V4Services extends AbstractServices { protected V4Services(final Metadata metadata) throws Exception { super(ODataServiceVersion.V40, metadata); } - + @GET @Path("/$crossjoin({elements:.*})") public Response crossjoin( http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java ---------------------------------------------------------------------- diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java index 5f8a345..84f9316 100644 --- a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java +++ b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java @@ -686,7 +686,22 @@ public abstract class AbstractUtilities { try { String res; - if ("Message".equals(entitySetName)) { + if ("OrderDetails".equals(entitySetName)) { + int productID; + if (entity.getProperty("OrderID") == null || entity.getProperty("ProductID") == null) { + if (Commons.SEQUENCE.containsKey(entitySetName)) { + productID = Commons.SEQUENCE.get(entitySetName) + 1; + res = "OrderID=1" + ",ProductID=" + String.valueOf(productID); + } else { + throw new Exception(String.format("Unable to retrieve entity key value for %s", entitySetName)); + } + } else { + productID = Integer.valueOf(entity.getProperty("OrderID").getValue().asPrimitive().get()); + res = "OrderID=" + entity.getProperty("OrderID").getValue().asPrimitive().get() + + ",ProductID=" + entity.getProperty("ProductID").getValue().asPrimitive().get(); + } + Commons.SEQUENCE.put(entitySetName, productID); + }else if ("Message".equals(entitySetName)) { int messageId; if (entity.getProperty("MessageId") == null || entity.getProperty("FromUsername") == null) { if (Commons.SEQUENCE.containsKey(entitySetName)) { @@ -709,6 +724,8 @@ public abstract class AbstractUtilities { res = getDefaultEntryKey(entitySetName, entity, "OrderID"); } else if ("Customer".equals(entitySetName)) { res = getDefaultEntryKey(entitySetName, entity, "CustomerId"); + } else if ("Customers".equals(entitySetName)) { + res = getDefaultEntryKey(entitySetName, entity, "PersonID"); } else if ("Person".equals(entitySetName)) { res = getDefaultEntryKey(entitySetName, entity, "PersonId"); } else if ("ComputerDetail".equals(entitySetName)) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java ---------------------------------------------------------------------- diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java index 262ab36..65b7eae 100644 --- a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java +++ b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java @@ -86,6 +86,7 @@ public abstract class Commons { SEQUENCE.put("CustomerInfo", 1000); SEQUENCE.put("Car", 1000); SEQUENCE.put("Message", 1000); + SEQUENCE.put("OrderDetails", 1000); SEQUENCE.put("Order", 1000); SEQUENCE.put("Product", 1000); SEQUENCE.put("ComputerDetail", 1000); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java index 458963b..e9afca9 100644 --- a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java @@ -26,6 +26,7 @@ import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.ext.proxy.EntityContainerFactory; import org.apache.olingo.ext.proxy.context.EntityContext; import org.apache.olingo.fit.proxy.v3.staticservice.microsoft.test.odata.services.astoriadefaultservice. @@ -80,6 +81,7 @@ public abstract class AbstractTestITCase { testAuthServiceRootURL = "http://localhost:9080/stub/DefaultService.svc"; containerFactory = EntityContainerFactory.getV3(testStaticServiceRootURL); + containerFactory.getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM); container = containerFactory.getEntityContainer(DefaultContainer.class); assertNotNull(container); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java index daf72f0..cdf503f 100644 --- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertEquals; import java.io.IOException; +import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.ext.proxy.EntityContainerFactory; import org.apache.olingo.ext.proxy.context.EntityContext; import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.InMemoryEntities; @@ -67,6 +68,7 @@ public abstract class AbstractTestITCase { testAuthServiceRootURL = "http://localhost:9080/stub/DefaultService.svc"; containerFactory = EntityContainerFactory.getV4(testStaticServiceRootURL); + containerFactory.getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM); container = containerFactory.getEntityContainer(InMemoryEntities.class); assertNotNull(container); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java new file mode 100644 index 0000000..cbacd6e --- /dev/null +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java @@ -0,0 +1,271 @@ +/* + * 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.fit.proxy.v4; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.TimeZone; +import org.apache.olingo.commons.api.edm.geo.Geospatial; +import org.apache.olingo.commons.api.edm.geo.Point; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.Address; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.Customer; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.Employee; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.Order; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.OrderCollection; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.OrderDetail; +import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.OrderDetailKey; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * This is the unit test class to check entity create operations. + */ +public class EntityCreateTestITCase extends AbstractTestITCase { + + @Test + public void create() { + final Order order = container.getOrders().newOrder(); + order.setOrderID(105); + + final Calendar orderDate = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + orderDate.clear(); + orderDate.set(2011, 3, 4, 16, 3, 57); + order.setOrderDate(orderDate); + + order.setShelfLife(BigDecimal.TEN); + order.setOrderShelfLifes(Arrays.asList(new BigDecimal[] {BigDecimal.TEN.negate(), BigDecimal.TEN})); + + container.flush(); + + Order actual = container.getOrders().get(105); + assertEquals(105, actual.getOrderID(), 0); + assertEquals(orderDate.getTimeInMillis(), actual.getOrderDate().getTimeInMillis()); + assertEquals(BigDecimal.TEN, actual.getShelfLife()); + assertEquals(2, actual.getOrderShelfLifes().size()); + + container.getOrders().delete(105); + actual = container.getOrders().get(105); + assertNull(actual); + + entityContext.detachAll(); + actual = container.getOrders().get(105); + assertNotNull(actual); + + container.getOrders().delete(105); + actual = container.getOrders().get(105); + assertNull(actual); + + container.flush(); + + entityContext.detachAll(); + actual = container.getOrders().get(105); + assertNull(actual); + } + + @Test + public void createEmployee() { + final Integer id = 101; + + final Employee employee = container.getPeople().newEmployee(); + employee.setPersonID(id); + employee.setFirstName("Fabio"); + employee.setLastName("Martelli"); + employee.setEmails(Collections.<String>singleton("[email protected]")); + final Calendar date = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + date.clear(); + date.set(2011, 3, 4, 9, 0, 0); + employee.setDateHired(date); + Address homeAddress = employee.factory().newHomeAddress(); + homeAddress.setCity("Pescara"); + homeAddress.setPostalCode("65100"); + homeAddress.setStreet("viale Gabriele D'Annunzio 256"); + employee.setHomeAddress(homeAddress); + employee.setNumbers(Arrays.asList(new String[] {"3204725072", "08569930"})); + + container.flush(); + + Employee actual = container.getPeople().get(id, Employee.class); + assertNotNull(actual); + assertEquals(id, actual.getPersonID()); + assertEquals(homeAddress.getCity(), actual.getHomeAddress().getCity()); + + entityContext.detachAll(); + actual = container.getPeople().get(id, Employee.class); + assertNotNull(actual); + assertEquals(id, actual.getPersonID()); + assertEquals(homeAddress.getCity(), actual.getHomeAddress().getCity()); + + container.getPeople().delete(actual.getPersonID()); + container.flush(); + + actual = container.getPeople().get(id, Employee.class);; + assertNull(actual); + + entityContext.detachAll(); + actual = container.getPeople().get(id, Employee.class); + assertNull(actual); + } + + @Test + public void createWithNavigation() { + final Integer id = 101; + + final Customer customer = container.getCustomers().newCustomer(); + customer.setPersonID(id); + customer.setPersonID(id); + customer.setFirstName("Fabio"); + customer.setLastName("Martelli"); + customer.setCity("Pescara"); + customer.setEmails(Collections.<String>singleton("[email protected]")); + Address homeAddress = customer.factory().newHomeAddress(); + homeAddress.setCity("Pescara"); + homeAddress.setPostalCode("65100"); + homeAddress.setStreet("viale Gabriele D'Annunzio 256"); + customer.setHomeAddress(homeAddress); + customer.setNumbers(Arrays.asList(new String[] {"3204725072", "08569930"})); + + final OrderCollection orders = container.getOrders().newOrderCollection(); + orders.add(container.getOrders().get(8)); + customer.setOrders(orders); + + container.flush(); + + Customer actual = readCustomer(container, id); + assertEquals(homeAddress.getCity(), actual.getHomeAddress().getCity()); + assertEquals(1, actual.getOrders().size()); + assertEquals(8, actual.getOrders().iterator().next().getOrderID(), 0); + + container.getCustomers().delete(actual.getPersonID()); + container.flush(); + + actual = container.getCustomers().get(id); + assertNull(actual); + } + + @Test + public void createWithBackNavigation() { + final Integer id = 102; + + // ------------------------------- + // Create a new order + // ------------------------------- + Order order = container.getOrders().newOrder(); + order.setOrderID(id); + + final Calendar orderDate = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + orderDate.clear(); + orderDate.set(2011, 3, 4, 16, 3, 57); + order.setOrderDate(orderDate); + + order.setShelfLife(BigDecimal.TEN); + order.setOrderShelfLifes(Arrays.asList(new BigDecimal[] {BigDecimal.TEN.negate(), BigDecimal.TEN})); + // ------------------------------- + + + // ------------------------------- + // Create a new customer + // ------------------------------- + final Customer customer = container.getCustomers().newCustomer(); + customer.setPersonID(id); + customer.setPersonID(id); + customer.setFirstName("Fabio"); + customer.setLastName("Martelli"); + customer.setCity("Pescara"); + customer.setEmails(Collections.<String>singleton("[email protected]")); + Address homeAddress = customer.factory().newHomeAddress(); + homeAddress.setCity("Pescara"); + homeAddress.setPostalCode("65100"); + homeAddress.setStreet("viale Gabriele D'Annunzio 256"); + customer.setHomeAddress(homeAddress); + customer.setNumbers(Arrays.asList(new String[] {"3204725072", "08569930"})); + + final OrderCollection orders = container.getOrders().newOrderCollection(); + orders.add(order); + customer.setOrders(orders); + // ------------------------------- + + // ------------------------------- + // Link customer to order + // ------------------------------- + order.setCustomerForOrder(customer); + // ------------------------------- + + container.flush(); + + assertEquals(id, order.getOrderID()); + assertEquals(id, customer.getPersonID()); + + Customer actual = readCustomer(container, id); + assertEquals(homeAddress.getCity(), actual.getHomeAddress().getCity()); + assertEquals(1, actual.getOrders().size()); + assertEquals(id, actual.getOrders().iterator().next().getOrderID()); + + order = container.getOrders().get(id); + assertNotNull(order); + assertEquals(id, order.getCustomerForOrder().getPersonID()); + + container.getOrders().delete(actual.getOrders()); + container.flush(); + + order = container.getOrders().get(id); + assertNull(order); + + actual = readCustomer(container, id); + assertTrue(actual.getOrders().isEmpty()); + + container.getCustomers().delete(actual.getPersonID()); + container.flush(); + + actual = container.getCustomers().get(id); + assertNull(actual); + } + + @Test + public void multiKey() { + OrderDetail details = container.getOrderDetails().newOrderDetail(); + details.setOrderID(8); + details.setProductID(1); + details.setQuantity(100); + details.setUnitPrice(5f); + + container.flush(); + + OrderDetailKey key = new OrderDetailKey(); + key.setOrderID(8); + key.setProductID(1); + + details = container.getOrderDetails().get(key); + assertNotNull(details); + assertEquals(Integer.valueOf(100), details.getQuantity()); + assertEquals(8, details.getOrderID(), 0); + assertEquals(1, details.getProductID(), 0); + assertEquals(5f, details.getUnitPrice(), 0); + + container.getOrderDetails().delete(key); + container.flush(); + + assertNull(container.getOrderDetails().get(key)); + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/InMemoryEntities.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/InMemoryEntities.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/InMemoryEntities.java index 9353f98..7a08016 100644 --- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/InMemoryEntities.java +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/InMemoryEntities.java @@ -48,7 +48,7 @@ import javax.xml.datatype.Duration; @EntityContainer(name = "InMemoryEntities", namespace = "Microsoft.Test.OData.Services.ODataWCFService", isDefaultEntityContainer = true) -public interface InMemoryEntities extends EntityContainer { +public interface InMemoryEntities extends Container { Accounts getAccounts(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/types/OrderDetail.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/types/OrderDetail.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/types/OrderDetail.java index e74df1e..9d51dc7 100644 --- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/types/OrderDetail.java +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/staticservice/microsoft/test/odata/services/odatawcfservice/types/OrderDetail.java @@ -59,8 +59,6 @@ import javax.xml.datatype.Duration; public interface OrderDetail extends Serializable { - - @Key @Property(name = "OrderID", type = "Edm.Int32", nullable = false, http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/v3/AbstractTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/v3/AbstractTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v3/AbstractTestITCase.java index 6ecc4f3..fc2bbae 100644 --- a/fit/src/test/java/org/apache/olingo/fit/v3/AbstractTestITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/v3/AbstractTestITCase.java @@ -63,6 +63,7 @@ import org.apache.olingo.commons.api.domain.ODataValue; import org.apache.olingo.commons.api.domain.v3.ODataEntity; import org.apache.olingo.commons.api.domain.v3.ODataProperty; import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.format.ODataPubFormat; import org.junit.BeforeClass; @@ -93,6 +94,8 @@ public abstract class AbstractTestITCase extends AbstractBaseTestITCase { testOpenTypeServiceRootURL = "http://localhost:9080/stub/StaticService/V30/OpenType.svc"; testLargeModelServiceRootURL = "http://localhost:9080/stub/StaticService/V30/Static.svc/large"; testAuthServiceRootURL = "http://localhost:9080/stub/DefaultService.svc"; + + client.getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM); } @BeforeClass http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/v4/AbstractTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/v4/AbstractTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v4/AbstractTestITCase.java index c54e309..8fed8f7 100644 --- a/fit/src/test/java/org/apache/olingo/fit/v4/AbstractTestITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/v4/AbstractTestITCase.java @@ -35,6 +35,7 @@ import org.apache.olingo.commons.api.domain.v4.ODataProperty; import org.apache.olingo.commons.api.domain.v4.ODataValue; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.format.ODataPubFormat; import org.apache.olingo.commons.core.domain.v4.ODataEntityImpl; import static org.junit.Assert.assertEquals; @@ -75,6 +76,9 @@ public abstract class AbstractTestITCase extends AbstractBaseTestITCase { testAuthServiceRootURL = "http://localhost:9080/stub/DefaultService.svc"; edmClient = ODataClientFactory.getEdmEnabledV4(testStaticServiceRootURL); + + edmClient.getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM); + client.getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/fit/src/test/java/org/apache/olingo/fit/v4/EntityCreateTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/v4/EntityCreateTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v4/EntityCreateTestITCase.java index 060351e..b2540da 100644 --- a/fit/src/test/java/org/apache/olingo/fit/v4/EntityCreateTestITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/v4/EntityCreateTestITCase.java @@ -74,6 +74,8 @@ public class EntityCreateTestITCase extends AbstractTestITCase { // 3. create it as contained entity final ODataEntityCreateRequest<ODataEntity> req = getClient().getCUDRequestFactory(). getEntityCreateRequest(uri, instrument); + req.setFormat(format); + final ODataEntityCreateResponse<ODataEntity> res = req.execute(); assertEquals(201, res.getStatusCode()); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java ---------------------------------------------------------------------- diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java index 1bebfa8..2e3a0d8 100644 --- a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java +++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java @@ -34,6 +34,18 @@ import org.apache.olingo.commons.api.format.ODataValueFormat; public interface CommonConfiguration extends Serializable { /** + * Gets the configured default <tt>Accept</tt> header value format for a batch request. + * @return configured default <tt>Accept</tt> header value for a batch request. + */ + String getDefaultBatchAcceptFormat(); + + /** + * Set the default <tt>Accept</tt> header value format for a batch request. + * @param contentType default <tt>Accept</tt> header value. + */ + void setDefaultBatchAcceptFormat(String contentType); + + /** * Gets the configured OData format for AtomPub exchanges. If this configuration parameter doesn't exist the * JSON_FULL_METADATA format will be used as default. * http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java index 90db448..dc9ee6c 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java @@ -32,12 +32,15 @@ import org.apache.olingo.client.api.http.HttpClientFactory; import org.apache.olingo.client.api.http.HttpUriRequestFactory; import org.apache.olingo.client.core.http.DefaultHttpClientFactory; import org.apache.olingo.client.core.http.DefaultHttpUriRequestFactory; +import org.apache.olingo.commons.api.format.ContentType; public abstract class AbstractConfiguration implements CommonConfiguration { private static final String DEFAULT_PUB_FORMAT = "pubFormat"; private static final String DEFAULT_VALUE_FORMAT = "valueFormat"; + + private static final String DEFAULT_BATCH_ACCEPT_FORMAT = "batchAcceptFormat"; private static final String DEFAULT_MEDIA_FORMAT = "valueFormat"; @@ -82,6 +85,16 @@ public abstract class AbstractConfiguration implements CommonConfiguration { } @Override + public String getDefaultBatchAcceptFormat() { + return getProperty(DEFAULT_BATCH_ACCEPT_FORMAT, ContentType.MULTIPART_MIXED).toString(); + } + + @Override + public void setDefaultBatchAcceptFormat(final String contentType) { + setProperty(DEFAULT_BATCH_ACCEPT_FORMAT, contentType); + } + + @Override public ODataPubFormat getDefaultPubFormat() { return ODataPubFormat.valueOf( getProperty(DEFAULT_PUB_FORMAT, ODataPubFormat.JSON_FULL_METADATA.name()).toString()); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v3/ODataBatchRequestImpl.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v3/ODataBatchRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v3/ODataBatchRequestImpl.java index c4b0bdb..c005019 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v3/ODataBatchRequestImpl.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v3/ODataBatchRequestImpl.java @@ -46,6 +46,7 @@ public class ODataBatchRequestImpl public ODataBatchRequestImpl(final ODataClient odataClient, final URI uri) { super(odataClient, uri); + setAccept(odataClient.getConfiguration().getDefaultBatchAcceptFormat()); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/79b112ac/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v4/ODataBatchRequestImpl.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v4/ODataBatchRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v4/ODataBatchRequestImpl.java index a445013..bcbeeda 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v4/ODataBatchRequestImpl.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/v4/ODataBatchRequestImpl.java @@ -49,7 +49,7 @@ public class ODataBatchRequestImpl public ODataBatchRequestImpl(final ODataClient odataClient, final URI uri) { super(odataClient, uri); - setAccept(ContentType.MULTIPART_MIXED); + setAccept(odataClient.getConfiguration().getDefaultBatchAcceptFormat()); } @Override
