You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2016/03/18 15:38:56 UTC
olingo-odata4 git commit: OLINGO-911: Correcting request with
PUT/DELETE verbs to correctly handle serialization and way notify the service
about the raw value
Repository: olingo-odata4
Updated Branches:
refs/heads/master 11e040bab -> 7d10c60c5
OLINGO-911: Correcting request with PUT/DELETE verbs to correctly handle serialization and way notify the service about the raw value
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/7d10c60c
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/7d10c60c
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/7d10c60c
Branch: refs/heads/master
Commit: 7d10c60c5740686dd0daeb58489a8805ad7b09e0
Parents: 11e040b
Author: Ramesh Reddy <ra...@jboss.org>
Authored: Fri Mar 18 09:38:26 2016 -0500
Committer: Ramesh Reddy <ra...@jboss.org>
Committed: Fri Mar 18 09:38:26 2016 -0500
----------------------------------------------------------------------
.../org/apache/olingo/server/core/ServiceHandler.java | 8 ++++++--
.../server/core/legacy/ProcessorServiceHandler.java | 2 +-
.../apache/olingo/server/core/requests/DataRequest.java | 10 +++++-----
.../olingo/server/core/responses/PropertyResponse.java | 10 +++++++---
.../org/apache/olingo/server/example/TripPinHandler.java | 9 ++++++++-
.../apache/olingo/server/example/TripPinServiceTest.java | 9 ++++++---
6 files changed, 33 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7d10c60c/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
index 8f8fc1d..77e1cfe 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
@@ -134,14 +134,18 @@ public interface ServiceHandler extends Processor {
* DeleteProperty 11.4.9.2
* @param request
* @param property - Updated property.
+ * @param rawValue - $value based call, where property value provided is in byte[] format.
+ * user must convert the value to correct datatype format before update.
+ * The semantics of conversion are not defined.
* @param merge - if the property is complex, true here means merge, false is replace
* @param entityETag - entity tag to match before update operation, "*" allows all.
* @param response
* @throws ODataLibraryException
* @throws ODataApplicationException
*/
- void updateProperty(DataRequest request, Property property, boolean merge, String entityETag,
- PropertyResponse response) throws ODataLibraryException, ODataApplicationException;
+ void updateProperty(DataRequest request, Property property, boolean rawValue,
+ boolean merge, String entityETag, PropertyResponse response)
+ throws ODataLibraryException, ODataApplicationException;
/**
* Update Stream property, if StreamContent is null, it should treated as delete request
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7d10c60c/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
index d4d0662..de5843c 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
@@ -228,7 +228,7 @@ public class ProcessorServiceHandler implements ServiceHandler {
}
@Override
- public void updateProperty(DataRequest request, Property property, boolean merge,
+ public void updateProperty(DataRequest request, Property property, boolean rawValue, boolean merge,
String entityETag, PropertyResponse response) throws ODataLibraryException,
ODataApplicationException {
if (property.isPrimitive()) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7d10c60c/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/DataRequest.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/DataRequest.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/DataRequest.java
index fecc8b8..de26be0 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/DataRequest.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/DataRequest.java
@@ -574,14 +574,14 @@ public class DataRequest extends ServiceRequest {
handler.read(DataRequest.this, buildResponse(response, edmProperty));
}
} else if (isPATCH()) {
- handler.updateProperty(DataRequest.this, getPropertyValueFromClient(edmProperty), true,
+ handler.updateProperty(DataRequest.this, getPropertyValueFromClient(edmProperty), false, true,
getETag(), buildResponse(response, edmProperty));
} else if (isPUT()) {
if (isPropertyStream()) {
handler.upsertStreamProperty(DataRequest.this, getETag(), request.getBody(),
new NoContentResponse(getServiceMetaData(), response));
} else {
- handler.updateProperty(DataRequest.this, getPropertyValueFromClient(edmProperty), false,
+ handler.updateProperty(DataRequest.this, getPropertyValueFromClient(edmProperty), false, false,
getETag(), buildResponse(response, edmProperty));
}
} else if (isDELETE()) {
@@ -591,7 +591,7 @@ public class DataRequest extends ServiceRequest {
} else {
Property property = new Property(edmProperty.getType().getFullQualifiedName()
.getFullQualifiedNameAsString(), edmProperty.getName());
- handler.updateProperty(DataRequest.this, property, false, getETag(),
+ handler.updateProperty(DataRequest.this, property, false, false, getETag(),
buildResponse(response, edmProperty));
}
}
@@ -679,7 +679,7 @@ public class DataRequest extends ServiceRequest {
edmProperty.getName());
PropertyResponse propertyResponse = PropertyResponse.getInstance(DataRequest.this, response,
edmProperty.getType(), getContextURL(odata), edmProperty.isCollection());
- handler.updateProperty(DataRequest.this, property, false, getETag(), propertyResponse);
+ handler.updateProperty(DataRequest.this, property, true, false, getETag(), propertyResponse);
} else if (isPUT()) {
PropertyResponse propertyResponse = PropertyResponse.getInstance(DataRequest.this, response,
edmProperty.getType(), getContextURL(odata), edmProperty.isCollection());
@@ -687,7 +687,7 @@ public class DataRequest extends ServiceRequest {
edmProperty.getType().getFullQualifiedName().getFullQualifiedNameAsString(),
edmProperty.getName());
property.setValue(ValueType.PRIMITIVE, getRawValueFromClient());
- handler.updateProperty(DataRequest.this, property, false,
+ handler.updateProperty(DataRequest.this, property, true, false,
getETag(), propertyResponse);
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7d10c60c/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
index 290abb5..7bb2c24 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
@@ -53,11 +53,15 @@ public class PropertyResponse extends ServiceResponse {
SerializerException {
ContentType type = request.getResponseContentType();
+
+ // this is special case to allow $value based PUT/DELETE, which do not really
+ // need a serializer but request comes in with text/plain content type and there
+ // is no serializer for that.
ODataSerializer serializer = null;
- if (type.equals(ContentType.TEXT_PLAIN)) {
- serializer = request.getSerializer(ContentType.APPLICATION_JSON);
- } else {
+ try {
serializer = request.getSerializer();
+ } catch (SerializerException e) {
+ serializer = request.getSerializer(ContentType.APPLICATION_JSON);
}
if (edmType.getKind() == EdmTypeKind.PRIMITIVE) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7d10c60c/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
index c2ca7a6..b83c0e4 100644
--- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
+++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
@@ -30,6 +30,7 @@ import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntityCollection;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
+import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.edm.EdmAction;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
@@ -318,10 +319,16 @@ public class TripPinHandler implements ServiceHandler {
}
@Override
- public void updateProperty(DataRequest request, final Property property, boolean merge,
+ public void updateProperty(DataRequest request, final Property property, boolean rawValue, boolean merge,
String entityETag, PropertyResponse response) throws ODataLibraryException,
ODataApplicationException {
+ if (rawValue && property.getValue() != null) {
+ // this is more generic, stricter conversion rules must taken in a real service
+ byte[] value = (byte[])property.getValue();
+ property.setValue(ValueType.PRIMITIVE, new String(value));
+ }
+
EdmEntitySet edmEntitySet = request.getEntitySet();
Entity entity = this.dataModel.getEntity(edmEntitySet.getName(), request.getKeyPredicates());
if (entity == null) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7d10c60c/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServiceTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServiceTest.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServiceTest.java
index 0486439..eb2384b 100644
--- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServiceTest.java
+++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServiceTest.java
@@ -209,10 +209,13 @@ public class TripPinServiceTest {
// Note that in-real services must convert raw value (byte[]) to
// the data type it needs to save in in updateProperty method
String editUrl = baseURL + "/Airlines('AF')/Name/$value";
- HttpPut request = new HttpPut(editUrl);
- request.setEntity(new StringEntity("Safari"));
- HttpResponse response = httpSend(request, 204);
+ HttpPut put = new HttpPut(editUrl);
+ put.setEntity(new StringEntity("Safari"));
+ HttpResponse response = httpSend(put, 204);
EntityUtils.consumeQuietly(response.getEntity());
+
+ response = httpGET(baseURL + "/Airlines('AF')/Name/$value", 200);
+ assertEquals("Safari", IOUtils.toString(response.getEntity().getContent()));
}
@Test @Ignore