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 <[email protected]> Authored: Fri Mar 18 09:38:26 2016 -0500 Committer: Ramesh Reddy <[email protected]> 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
