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

Reply via email to