Repository: olingo-odata4
Updated Branches:
  refs/heads/master 7c77b17c6 -> 04baf388e


[OLINGO-658] Modification operations should return the changed data

Change-Id: I62b6db1c062618cd3c27b093d40b9456cd415f77

Signed-off-by: Christian Amend <[email protected]>


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

Branch: refs/heads/master
Commit: 04baf388ecd1419fd3b0fdfc0e562542e1e2d742
Parents: 7c77b17
Author: Klaus Straubinger <[email protected]>
Authored: Tue May 12 11:05:10 2015 +0200
Committer: Christian Amend <[email protected]>
Committed: Tue May 12 13:57:51 2015 +0200

----------------------------------------------------------------------
 .../olingo/fit/tecsvc/client/BasicITCase.java   |  87 ++++--------
 .../fit/tecsvc/client/BatchClientITCase.java    |   4 +-
 .../olingo/fit/tecsvc/client/BindingITCase.java |   2 +-
 .../fit/tecsvc/client/FunctionImportITCase.java |  74 ++++++----
 .../olingo/fit/tecsvc/client/MediaITCase.java   |   2 +-
 .../olingo/server/tecsvc/data/FunctionData.java |   4 +-
 .../processor/TechnicalEntityProcessor.java     | 138 ++++++++++---------
 .../tecsvc/processor/TechnicalProcessor.java    |  11 +-
 8 files changed, 158 insertions(+), 164 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
index c6c2efe..39d73b1 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
@@ -239,15 +239,10 @@ public class BasicITCase extends AbstractBaseTestITCase {
     final ODataEntityUpdateRequest<ClientEntity> request = 
client.getCUDRequestFactory().getEntityUpdateRequest(
         uri, UpdateType.PATCH, patchEntity);
     final ODataEntityUpdateResponse<ClientEntity> response = request.execute();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
 
     // Check that the patched properties have changed and the other properties 
not.
-    // This check has to be in the same session in order to access the same 
data provider.
-    ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory().getEntityRequest(uri);
-    entityRequest.addCustomHeader(HttpHeader.COOKIE, 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next());
-    final ODataRetrieveResponse<ClientEntity> entityResponse = 
entityRequest.execute();
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
entityResponse.getStatusCode());
-    final ClientEntity entity = entityResponse.getBody();
+    final ClientEntity entity = response.getBody();
     assertNotNull(entity);
     final ClientProperty property1 = entity.getProperty("PropertyString");
     assertNotNull(property1);
@@ -276,15 +271,10 @@ public class BasicITCase extends AbstractBaseTestITCase {
     final ODataEntityUpdateRequest<ClientEntity> request = 
client.getCUDRequestFactory().getEntityUpdateRequest(
         uri, UpdateType.REPLACE, newEntity);
     final ODataEntityUpdateResponse<ClientEntity> response = request.execute();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
 
     // Check that the updated properties have changed and that other 
properties have their default values.
-    // This check has to be in the same session in order to access the same 
data provider.
-    ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory().getEntityRequest(uri);
-    entityRequest.addCustomHeader(HttpHeader.COOKIE, 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next());
-    final ODataRetrieveResponse<ClientEntity> entityResponse = 
entityRequest.execute();
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
entityResponse.getStatusCode());
-    final ClientEntity entity = entityResponse.getBody();
+    final ClientEntity entity = response.getBody();
     assertNotNull(entity);
     final ClientProperty property1 = entity.getProperty("PropertyInt64");
     assertNotNull(property1);
@@ -309,15 +299,10 @@ public class BasicITCase extends AbstractBaseTestITCase {
     final ODataEntityUpdateRequest<ClientEntity> request = 
client.getCUDRequestFactory().getEntityUpdateRequest(
         uri, UpdateType.PATCH, patchEntity);
     final ODataEntityUpdateResponse<ClientEntity> response = request.execute();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
 
     // Check that the patched properties have changed and the other properties 
not.
-    // This check has to be in the same session in order to access the same 
data provider.
-    ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory().getEntityRequest(uri);
-    entityRequest.addCustomHeader(HttpHeader.COOKIE, 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next());
-    final ODataRetrieveResponse<ClientEntity> entityResponse = 
entityRequest.execute();
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
entityResponse.getStatusCode());
-    final ClientEntity entity = entityResponse.getBody();
+    final ClientEntity entity = response.getBody();
     assertNotNull(entity);
     final ClientComplexValue complex = 
entity.getProperty("PropertyComp").getComplexValue()
         .get("PropertyComp").getComplexValue();
@@ -353,15 +338,10 @@ public class BasicITCase extends AbstractBaseTestITCase {
     final ODataEntityUpdateRequest<ClientEntity> request = 
client.getCUDRequestFactory().getEntityUpdateRequest(
         uri, UpdateType.REPLACE, newEntity);
     final ODataEntityUpdateResponse<ClientEntity> response = request.execute();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
 
     // Check that the complex-property hierarchy is still there and that all 
primitive values are now null.
-    // This check has to be in the same session in order to access the same 
data provider.
-    ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory().getEntityRequest(uri);
-    entityRequest.addCustomHeader(HttpHeader.COOKIE, 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next());
-    final ODataRetrieveResponse<ClientEntity> entityResponse = 
entityRequest.execute();
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
entityResponse.getStatusCode());
-    final ClientEntity entity = entityResponse.getBody();
+    final ClientEntity entity = response.getBody();
     assertNotNull(entity);
     final ClientComplexValue complex = 
entity.getProperty("PropertyCompCompNav").getComplexValue()
         .get("PropertyCompNav").getComplexValue();
@@ -492,25 +472,14 @@ public class BasicITCase extends AbstractBaseTestITCase {
         .build();
 
     final ODataEntityUpdateResponse<ClientEntity> response = 
getClient().getCUDRequestFactory()
-        .getEntityUpdateRequest(uri,
-            UpdateType.PATCH,
-            entity)
+        .getEntityUpdateRequest(uri, UpdateType.PATCH, entity)
             .execute();
 
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
-    final String cookie = 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
-
-    // Check if entity has changed
-    final ODataEntityRequest<ClientEntity> entityRequest =
-        getClient().getRetrieveRequestFactory().getEntityRequest(uri);
-    entityRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
-    final ODataRetrieveResponse<ClientEntity> entityResponse = 
entityRequest.execute();
-
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
entityResponse.getStatusCode());
-    assertNotNull(entityResponse.getBody().getProperty("CollPropertyComp"));
-    assertEquals(2, 
entityResponse.getBody().getProperty("CollPropertyComp").getCollectionValue().size());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    assertNotNull(response.getBody().getProperty("CollPropertyComp"));
+    assertEquals(2, 
response.getBody().getProperty("CollPropertyComp").getCollectionValue().size());
 
-    final Iterator<ClientValue> collectionIterator = entityResponse.getBody()
+    final Iterator<ClientValue> collectionIterator = response.getBody()
         .getProperty("CollPropertyComp")
         .getCollectionValue()
         .iterator();
@@ -632,7 +601,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
   }
 
   @Test
-  public void testComplexPropertyWithNotNullablePrimitiveValue() {
+  public void complexPropertyWithNotNullablePrimitiveValue() {
     final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
     final ClientObjectFactory of = client.getObjectFactory();
 
@@ -649,7 +618,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
   }
 
   @Test
-  public void testUpsert() throws EdmPrimitiveTypeException {
+  public void upsert() throws EdmPrimitiveTypeException {
     final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
     final ClientObjectFactory of = client.getObjectFactory();
 
@@ -681,7 +650,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
   }
 
   @Test
-  public void testUpdatePropertyWithNull() {
+  public void updatePropertyWithNull() {
     final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
     final ClientObjectFactory of = client.getObjectFactory();
 
@@ -698,21 +667,13 @@ public class BasicITCase extends AbstractBaseTestITCase {
         .getEntityUpdateRequest(targetURI, UpdateType.PATCH, entity)
         .execute();
 
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
updateResponse.getStatusCode());
-    final String cookie = 
updateResponse.getHeader(HttpHeader.SET_COOKIE).iterator().next();
-
-    final ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory()
-        .getEntityRequest(targetURI);
-    entityRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
-    final ODataRetrieveResponse<ClientEntity> entityResponse = 
entityRequest.execute();
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
entityResponse.getStatusCode());
-
-    
assertTrue(entityResponse.getBody().getProperty("PropertyString").hasNullValue());
-    assertEquals(34, 
entityResponse.getBody().getProperty("PropertyDecimal").getPrimitiveValue().toValue());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
updateResponse.getStatusCode());
+    
assertTrue(updateResponse.getBody().getProperty("PropertyString").hasNullValue());
+    assertEquals(34, 
updateResponse.getBody().getProperty("PropertyDecimal").getPrimitiveValue().toValue());
   }
 
   @Test(expected = ODataClientErrorException.class)
-  public void testUpdatePropertyWithNullNotAllowed() {
+  public void updatePropertyWithNullNotAllowed() {
     final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
     final ClientObjectFactory of = client.getObjectFactory();
 
@@ -729,7 +690,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
   }
 
   @Test
-  public void testUpdateMerge() {
+  public void updateMerge() {
     final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
     final ClientObjectFactory of = client.getObjectFactory();
 
@@ -753,7 +714,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
         .getEntityUpdateRequest(targetURI, UpdateType.PATCH, entity)
         .execute();
 
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
     final String cookie = 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
 
     final ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory()
@@ -823,7 +784,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
   }
 
   @Test
-  public void testUpdateReplace() {
+  public void updateReplace() {
     final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
     final ClientObjectFactory of = client.getObjectFactory();
 
@@ -853,7 +814,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
         .getEntityUpdateRequest(targetURI, UpdateType.REPLACE, entity)
         .execute();
 
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
     final String cookie = 
response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
 
     final ODataEntityRequest<ClientEntity> entityRequest = 
client.getRetrieveRequestFactory()

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
index 4cf68ee..63c9a7f 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
@@ -424,7 +424,7 @@ public class BatchClientITCase extends AbstractTestITCase {
     final ODataEntityCreateResponse<ClientEntity> createResponse = 
((ODataEntityCreateResponse<ClientEntity>) res);
 
     res = chgitem.next();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
res.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), res.getStatusCode());
     assertTrue(res instanceof ODataEntityUpdateResponse);
 
     final ODataEntitySetRequest<ClientEntitySet> req = 
client.getRetrieveRequestFactory().getEntitySetRequest(
@@ -561,7 +561,7 @@ public class BatchClientITCase extends AbstractTestITCase {
     // Update
     assertTrue(item.hasNext());
     final ODataResponse response2 = item.next();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response2.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response2.getStatusCode());
     assertTrue(response2 instanceof ODataEntityUpdateResponse);
 
     // Upsert

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BindingITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BindingITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BindingITCase.java
index 8b8b432..48c4a00 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BindingITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BindingITCase.java
@@ -288,7 +288,7 @@ public class BindingITCase extends AbstractBaseTestITCase {
 
     ODataEntityUpdateResponse<ClientEntity> updateResponse =
         client.getCUDRequestFactory().getEntityUpdateRequest(entityURI, 
UpdateType.PATCH, entity).execute();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
updateResponse.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
updateResponse.getStatusCode());
 
     final ODataEntityRequest<ClientEntity> getRequest =
         client.getRetrieveRequestFactory().getEntityRequest(

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
index a81a1df..5632bda 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
@@ -50,8 +50,27 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void entity() throws Exception {
     final ODataInvokeRequest<ClientEntity> request = 
getClient().getInvokeRequestFactory()
-        
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTESTwoKeyNav").build(), 
ClientEntity.class);
+        .getFunctionInvokeRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTESTwoKeyNav").build(),
+            ClientEntity.class);
+    assertNotNull(request);
+
+    final ODataInvokeResponse<ClientEntity> response = request.execute();
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+
+    final ClientEntity entity = response.getBody();
+    assertNotNull(entity);
+    final ClientProperty property = entity.getProperty("PropertyInt16");
+    assertNotNull(property);
+    assertEquals(1, property.getPrimitiveValue().toValue());
+  }
+
+  @Test
+  public void entityWithoutEntitySet() throws Exception {
+    final ODataInvokeRequest<ClientEntity> request = 
getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTETKeyNav").build(),
+            ClientEntity.class);
     assertNotNull(request);
 
     final ODataInvokeResponse<ClientEntity> response = request.execute();
@@ -67,8 +86,10 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void entityCollection() {
     final ODataInvokeRequest<ClientEntitySet> request = 
getClient().getInvokeRequestFactory()
-        
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTCollESTwoKeyNavParam").build(), 
ClientEntitySet.class,
+        .getFunctionInvokeRequest(
+            getClient().newURIBuilder(TecSvcConst.BASE_URI)
+                
.appendOperationCallSegment("FICRTCollESTwoKeyNavParam").build(),
+            ClientEntitySet.class,
             Collections.<String, ClientValue> singletonMap("ParameterInt16",
                 
getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(2)));
     assertNotNull(request);
@@ -93,10 +114,11 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   public void entityCollectionWithAppendedKey() {
     // .../odata.svc/FICRTCollESMedia()(1)
     final ODataInvokeRequest<ClientEntity> request = 
getClient().getInvokeRequestFactory()
-        
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTCollESMedia")
-            
.appendKeySegment(getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(1))
-            .build(), ClientEntity.class);
+        .getFunctionInvokeRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCollESMedia")
+                
.appendKeySegment(getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(1))
+                .build(),
+            ClientEntity.class);
     assertNotNull(request);
 
     final ODataInvokeResponse<ClientEntity> response = request.execute();
@@ -114,11 +136,12 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   public void entityCollectionWithAppendedKeyAndProperty() {
     // .../odata.svc/FICRTCollESMedia()(2)/PropertyInt16
     final ODataInvokeRequest<ClientProperty> request = 
getClient().getInvokeRequestFactory()
-        
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTCollESMedia")
-            
.appendKeySegment(getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(2))
-            .appendPropertySegment("PropertyInt16")
-            .build(), ClientProperty.class);
+        .getFunctionInvokeRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCollESMedia")
+                
.appendKeySegment(getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(2))
+                .appendPropertySegment("PropertyInt16")
+                .build(),
+            ClientProperty.class);
     assertNotNull(request);
 
     final ODataInvokeResponse<ClientProperty> response = request.execute();
@@ -133,8 +156,8 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void countEntityCollection() throws Exception {
     final ODataRawRequest request = getClient().getRetrieveRequestFactory()
-        .getRawRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTCollESMedia").count().build());
+        
.getRawRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCollESMedia")
+            .count().build());
     final ODataRawResponse response = request.execute();
     assertEquals("4", IOUtils.toString(response.getRawResponse()));
   }
@@ -142,8 +165,9 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void complexWithPath() throws Exception {
     final ODataInvokeRequest<ClientProperty> request = 
getClient().getInvokeRequestFactory()
-        
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            
.appendOperationCallSegment("FICRTCTTwoPrim").appendPropertySegment("PropertyInt16").build(),
+        .getFunctionInvokeRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCTTwoPrim")
+                .appendPropertySegment("PropertyInt16").build(),
             ClientProperty.class);
     assertNotNull(request);
 
@@ -158,8 +182,9 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void primitiveCollection() throws Exception {
     final ODataInvokeRequest<ClientProperty> request = 
getClient().getInvokeRequestFactory()
-        
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTCollString").build(), 
ClientProperty.class);
+        .getFunctionInvokeRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCollString").build(),
+            ClientProperty.class);
     assertNotNull(request);
 
     final ODataInvokeResponse<ClientProperty> response = request.execute();
@@ -178,8 +203,9 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void primitiveValue() throws Exception {
     final ODataValueRequest request = getClient().getRetrieveRequestFactory()
-        
.getPropertyValueRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            
.appendOperationCallSegment("FICRTString").appendValueSegment().build());
+        .getPropertyValueRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTString")
+                .appendValueSegment().build());
     final ODataRetrieveResponse<ClientPrimitiveValue> response = 
request.execute();
     assertEquals("UFCRTString string value", response.getBody().toValue());
   }
@@ -187,9 +213,9 @@ public class FunctionImportITCase extends 
AbstractBaseTestITCase {
   @Test
   public void primitiveValueWithPath() throws Exception {
     final ODataValueRequest request = getClient().getRetrieveRequestFactory()
-        
.getPropertyValueRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
-            .appendOperationCallSegment("FICRTCTTwoPrim")
-            
.appendPropertySegment("PropertyString").appendValueSegment().build());
+        .getPropertyValueRequest(
+            
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCTTwoPrim")
+                
.appendPropertySegment("PropertyString").appendValueSegment().build());
     final ODataRetrieveResponse<ClientPrimitiveValue> response = 
request.execute();
     assertEquals("UFCRTCTTwoPrim string value", response.getBody().toValue());
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
index 9380ab4..92336fd 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
@@ -103,7 +103,7 @@ public final class MediaITCase extends 
AbstractBaseTestITCase {
     assertNotNull(request);
 
     final ODataMediaEntityUpdateResponse<ClientEntity> response = 
request.payloadManager().getResponse();
-    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
 
     // Check that the media stream has changed.
     // This check has to be in the same session in order to access the same 
data provider.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java
index 7e126a0..517c7df 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java
@@ -55,7 +55,9 @@ public class FunctionData {
   protected static Entity entityFunction(final String name, final 
List<UriParameter> parameters,
       final Map<String, EntityCollection> data) throws DataProviderException {
     final List<Entity> esTwoKeyNav = data.get("ESTwoKeyNav").getEntities();
-    if (name.equals("UFCRTETTwoKeyNav")) {
+    if (name.equals("UFCRTETKeyNav")) {
+      return data.get("ESKeyNav").getEntities().get(0);
+    } else if (name.equals("UFCRTETTwoKeyNav")) {
       return esTwoKeyNav.get(0);
     } else if (name.equals("UFCRTETTwoKeyNavParam")) {
       final int index = parameters.isEmpty() ? 0 : 
Short.valueOf(parameters.get(0).getText());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
index 9eb9800..ac70879 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
@@ -157,23 +157,23 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
     EntityCollection collection =
         dataProvider.processActionEntityCollection(action.getName(), 
deserializerResult.getActionParameters());
 
-    if (collection == null) {
-      // Collection Propertys must never be null
-      throw new ODataApplicationException("The action could no be executed", 
500, Locale.ROOT);
-    } else if (collection.getEntities().contains(null) && 
!action.getReturnType().isNullable()) {
-      // Not nullable return type but array contains a null value
-      throw new ODataApplicationException("The action could no be executed", 
500, Locale.ROOT);
+    // Collections must never be null.
+    // Not nullable return types must not contain a null value.
+    if (collection == null
+        || collection.getEntities().contains(null) && 
!action.getReturnType().isNullable()) {
+      throw new ODataApplicationException("The action could not be executed.",
+          HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ROOT);
     }
-    EdmEntityType type = (EdmEntityType) action.getReturnType().getType();
-    ContextURL contextURL = 
ContextURL.with().type(type).asCollection().build();
-    EntityCollectionSerializerOptions options = 
EntityCollectionSerializerOptions.with().contextURL(contextURL).build();
-
-    SerializerResult result =
-        odata.createSerializer(ODataFormat.fromContentType(responseFormat))
-            .entityCollection(serviceMetadata, type, collection, options);
-
+    final EdmEntitySet edmEntitySet = 
getEdmEntitySet(uriInfo.asUriInfoResource());
+    final EdmEntityType type = (EdmEntityType) 
action.getReturnType().getType();
+    final ODataFormat format = ODataFormat.fromContentType(responseFormat);
+    EntityCollectionSerializerOptions options = 
EntityCollectionSerializerOptions.with()
+        .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
+            getContextUrl(edmEntitySet, type, false, null, null))
+        .build();
+    response.setContent(odata.createSerializer(format)
+        .entityCollection(serviceMetadata, type, collection, 
options).getContent());
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setContent(result.getContent());
     response.setHeader(HttpHeader.CONTENT_TYPE, 
responseFormat.toContentTypeString());
   }
 
@@ -181,13 +181,16 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
   public void countEntityCollection(final ODataRequest request, final 
ODataResponse response, final UriInfo uriInfo)
       throws ODataApplicationException, SerializerException {
     validateOptions(uriInfo.asUriInfoResource());
-    getEdmEntitySet(uriInfo); // including checks
-    EntityCollection entitySet = readEntityCollection(uriInfo);
-    if (entitySet == null) {
+    final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo); // including 
checks
+    final EntityCollection entitySetInitial = readEntityCollection(uriInfo);
+    if (entitySetInitial == null) {
       throw new ODataApplicationException("Nothing found.", 
HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ROOT);
     } else {
-      setCount(entitySet);
-      
response.setContent(odata.createFixedFormatSerializer().count(entitySet.getCount()));
+      EntityCollection entitySet = new EntityCollection();
+      entitySet.getEntities().addAll(entitySetInitial.getEntities());
+      FilterHandler.applyFilterSystemQuery(uriInfo.getFilterOption(), 
entitySet, edmEntitySet);
+      response.setContent(odata.createFixedFormatSerializer().count(
+          entitySet.getEntities().size()));
       response.setStatusCode(HttpStatusCode.OK.getStatusCode());
       response.setHeader(HttpHeader.CONTENT_TYPE, HttpContentType.TEXT_PLAIN);
     }
@@ -206,7 +209,6 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
     final Entity entity = readEntity(uriInfo);
 
     final ODataFormat format = 
ODataFormat.fromContentType(requestedContentType);
-    ODataSerializer serializer = odata.createSerializer(format);
     final ExpandOption expand = uriInfo.getExpandOption();
     final SelectOption select = uriInfo.getSelectOption();
 
@@ -214,15 +216,8 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
     final Entity entitySerialization = 
expandHandler.transformEntityGraphToTree(entity, edmEntitySet, expand);
     expandHandler.applyExpandQueryOptions(entitySerialization, edmEntitySet, 
expand);
 
-    response.setContent(serializer.entity(
-        serviceMetadata,
-        edmEntitySet.getEntityType(),
-        entitySerialization,
-        EntitySerializerOptions.with()
-            .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
-                getContextUrl(edmEntitySet, edmEntityType, true, expand, 
select))
-            .expand(expand).select(select)
-            .build()).getContent());
+    response.setContent(serializeEntity(entitySerialization, edmEntitySet, 
edmEntityType, format, expand, select)
+        .getContent());
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
     response.setHeader(HttpHeader.CONTENT_TYPE, 
requestedContentType.toContentTypeString());
   }
@@ -278,13 +273,8 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
     }
 
     final ODataFormat format = ODataFormat.fromContentType(responseFormat);
-    ODataSerializer serializer = odata.createSerializer(format);
-    response.setContent(serializer.entity(serviceMetadata, edmEntityType, 
entity,
-        EntitySerializerOptions.with()
-            .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
-                getContextUrl(edmEntitySet, edmEntityType, true, null, null))
-            .expand(expand)
-            .build()).getContent());
+    response.setContent(serializeEntity(entity, edmEntitySet, edmEntityType, 
format, expand, null)
+        .getContent());
     response.setStatusCode(HttpStatusCode.CREATED.getStatusCode());
     response.setHeader(HttpHeader.CONTENT_TYPE, 
responseFormat.toContentTypeString());
     response.setHeader(HttpHeader.LOCATION,
@@ -296,6 +286,7 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
       final ContentType requestFormat, final ContentType responseFormat)
       throws ODataApplicationException, DeserializerException, 
SerializerException {
     final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo);
+    final EdmEntityType edmEntityType = edmEntitySet.getEntityType();
     Entity entity;
 
     try {
@@ -322,19 +313,31 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
 
     dataProvider.update(request.getRawBaseUri(), edmEntitySet, entity, 
changedEntity,
         request.getMethod() == HttpMethod.PATCH, false);
-    response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
+
+    final ODataFormat format = ODataFormat.fromContentType(responseFormat);
+    response.setContent(serializeEntity(entity, edmEntitySet, edmEntityType, 
format, null, null)
+        .getContent());
+    response.setStatusCode(HttpStatusCode.OK.getStatusCode());
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
responseFormat.toContentTypeString());
   }
 
   @Override
   public void updateMediaEntity(final ODataRequest request, final 
ODataResponse response, final UriInfo uriInfo,
       final ContentType requestFormat, final ContentType responseFormat)
       throws ODataApplicationException, DeserializerException, 
SerializerException {
-    getEdmEntitySet(uriInfo); // including checks
+    final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo);
+    final EdmEntityType edmEntityType = edmEntitySet.getEntityType();
+
     Entity entity = readEntity(uriInfo);
     checkRequestFormat(requestFormat);
     dataProvider.setMedia(entity, 
odata.createFixedFormatDeserializer().binary(request.getBody()),
         requestFormat.toContentTypeString());
-    response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
+
+    final ODataFormat format = ODataFormat.fromContentType(responseFormat);
+    response.setContent(serializeEntity(entity, edmEntitySet, edmEntityType, 
format, null, null)
+        .getContent());
+    response.setStatusCode(HttpStatusCode.OK.getStatusCode());
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
responseFormat.toContentTypeString());
   }
 
   @Override
@@ -350,34 +353,29 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
   public void processActionEntity(final ODataRequest request, final 
ODataResponse response, final UriInfo uriInfo,
       final ContentType requestFormat, final ContentType responseFormat)
       throws ODataApplicationException, DeserializerException, 
SerializerException {
-    EdmAction action = checkBoundAndExtractAction(uriInfo);
-    DeserializerResult deserializerResult =
+    final EdmAction action = checkBoundAndExtractAction(uriInfo);
+    final EdmEntitySet edmEntitySet = 
getEdmEntitySet(uriInfo.asUriInfoResource());
+    final EdmEntityType type = (EdmEntityType) 
action.getReturnType().getType();
+
+    final DeserializerResult deserializerResult =
         odata.createDeserializer(ODataFormat.fromContentType(requestFormat))
             .actionParameters(request.getBody(), action);
 
-    EntityActionResult entityResult =
+    final EntityActionResult entityResult =
         dataProvider.processActionEntity(action.getName(), 
deserializerResult.getActionParameters());
-    EdmEntityType type = (EdmEntityType) action.getReturnType().getType();
     if (entityResult == null || entityResult.getEntity() == null) {
       if (action.getReturnType().isNullable()) {
         response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
       } else {
         // Not nullable return type so we have to give back a 500
-        throw new ODataApplicationException("The action could no be executed", 
500, Locale.ROOT);
+        throw new ODataApplicationException("The action could not be 
executed.",
+            HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ROOT);
       }
     } else {
-      ContextURL contextURL = ContextURL.with().type(type).build();
-      EntitySerializerOptions options = 
EntitySerializerOptions.with().contextURL(contextURL).build();
-
-      SerializerResult result = 
odata.createSerializer(ODataFormat.fromContentType(responseFormat))
-          .entity(serviceMetadata, type, entityResult.getEntity(), options);
-
-      if (entityResult.isCreated()) {
-        response.setStatusCode(HttpStatusCode.CREATED.getStatusCode());
-      } else {
-        response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-      }
-      response.setContent(result.getContent());
+      final ODataFormat format = ODataFormat.fromContentType(responseFormat);
+      response.setContent(serializeEntity(entityResult.getEntity(), 
edmEntitySet, type, format, null, null)
+          .getContent());
+      response.setStatusCode((entityResult.isCreated() ? 
HttpStatusCode.CREATED : HttpStatusCode.OK).getStatusCode());
       response.setHeader(HttpHeader.CONTENT_TYPE, 
responseFormat.toContentTypeString());
     }
   }
@@ -396,12 +394,6 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
     response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
   }
 
-  private void setCount(final EntityCollection entitySet) {
-    if (entitySet.getCount() == null) {
-      entitySet.setCount(entitySet.getEntities().size());
-    }
-  }
-
   private void checkRequestFormat(final ContentType requestFormat) throws 
ODataApplicationException {
     if (requestFormat == null) {
       throw new ODataApplicationException("The content type has not been set 
in the request.",
@@ -415,9 +407,23 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
     builder = entitySet == null ?
         isSingleEntity ? builder.type(entityType) : 
builder.asCollection().type(entityType) :
         builder.entitySet(entitySet);
-    builder = builder.selectList(odata.createUriHelper()
-        .buildContextURLSelectList(entityType, expand, select))
-        .suffix(isSingleEntity ? Suffix.ENTITY : null);
+    builder = builder
+        
.selectList(odata.createUriHelper().buildContextURLSelectList(entityType, 
expand, select))
+        .suffix(isSingleEntity && entitySet != null ? Suffix.ENTITY : null);
     return builder.build();
   }
+
+  private SerializerResult serializeEntity(final Entity entity,
+      final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType, 
final ODataFormat format,
+      final ExpandOption expand, final SelectOption select) throws 
SerializerException {
+    return odata.createSerializer(format).entity(
+        serviceMetadata,
+        edmEntityType,
+        entity,
+        EntitySerializerOptions.with()
+            .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
+                getContextUrl(edmEntitySet, edmEntityType, true, expand, 
select))
+            .expand(expand).select(select)
+            .build());
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/04baf388/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
index ef0d7bc..e5991bd 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
@@ -81,6 +81,8 @@ public abstract class TechnicalProcessor implements Processor 
{
       entitySet = ((UriResourceEntitySet) resourcePaths.get(0)).getEntitySet();
     } else if (resourcePaths.get(0) instanceof UriResourceFunction) {
       entitySet = ((UriResourceFunction) 
resourcePaths.get(0)).getFunctionImport().getReturnedEntitySet();
+    } else if (resourcePaths.get(0) instanceof UriResourceAction) {
+      entitySet = ((UriResourceAction) 
resourcePaths.get(0)).getActionImport().getReturnedEntitySet();
     } else {
       throw new ODataApplicationException("Invalid resource type.",
           HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
@@ -217,14 +219,11 @@ public abstract class TechnicalProcessor implements 
Processor {
   }
 
   protected EdmAction checkBoundAndExtractAction(final UriInfo uriInfo) throws 
ODataApplicationException {
-    final UriInfoResource resource = uriInfo.asUriInfoResource();
-    List<UriResource> uriResourceParts = resource.getUriResourceParts();
+    final List<UriResource> uriResourceParts = 
uriInfo.asUriInfoResource().getUriResourceParts();
     if (uriResourceParts.size() > 1) {
-      throw new ODataApplicationException("Bound acctions not supported yet.",
+      throw new ODataApplicationException("Bound actions are not supported 
yet.",
           HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
     }
-    UriResourceAction uriResourceAction = (UriResourceAction) 
uriResourceParts.get(0);
-    EdmAction action = uriResourceAction.getAction();
-    return action;
+    return ((UriResourceAction) uriResourceParts.get(0)).getAction();
   }
 }

Reply via email to