Repository: olingo-odata4
Updated Branches:
  refs/heads/master 2696359f3 -> 8f4e554df


[OLINGO-1279]OData V4.0: Client returns CsdlPath for CsdlAnnotationPath 
attribute


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

Branch: refs/heads/master
Commit: 8f4e554dfacb5b152f7b0c24939f8336db810c61
Parents: 2696359
Author: Archana Rai <archana....@sap.com>
Authored: Thu Jul 26 17:06:16 2018 +0530
Committer: Archana Rai <archana....@sap.com>
Committed: Thu Jul 26 17:06:16 2018 +0530

----------------------------------------------------------------------
 .../fit/tecsvc/client/AsyncSupportITCase.java   | 46 +++++++++++++--
 .../invoke/AbstractODataInvokeRequest.java      |  2 +-
 .../request/invoke/ODataInvokeRequestImpl.java  | 60 ++++++++++++++++++++
 .../annotation/ClientCsdlDynamicExpression.java |  3 +-
 .../apache/olingo/client/core/MetadataTest.java | 28 +++++++++
 .../client/core/edmxWithCsdlAnnotationPath.xml  | 37 ++++++++++++
 .../org/apache/olingo/server/api/OData.java     | 19 +++++++
 .../netty/server/core/ODataNettyImpl.java       | 12 ++++
 .../apache/olingo/server/core/ODataImpl.java    | 36 ++++++++++++
 .../json/ODataJsonDeserializer.java             | 23 ++++++--
 .../server/tecsvc/data/RequestValidator.java    |  6 +-
 11 files changed, 258 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
index 2263e9b..15c8c3e 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
@@ -18,10 +18,17 @@
  */
 package org.apache.olingo.fit.tecsvc.client;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.net.URI;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -30,32 +37,34 @@ import java.util.concurrent.TimeoutException;
 import org.apache.olingo.client.api.ODataClient;
 import org.apache.olingo.client.api.communication.ODataClientErrorException;
 import 
org.apache.olingo.client.api.communication.request.AsyncBatchRequestWrapper;
+import org.apache.olingo.client.api.communication.request.AsyncRequestWrapper;
 import 
org.apache.olingo.client.api.communication.request.ODataBatchableRequest;
 import org.apache.olingo.client.api.communication.request.ODataRequest;
 import 
org.apache.olingo.client.api.communication.request.batch.ODataBatchRequest;
 import 
org.apache.olingo.client.api.communication.request.batch.ODataBatchResponseItem;
 import 
org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateRequest;
+import 
org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
 import 
org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
 import 
org.apache.olingo.client.api.communication.response.AsyncResponseWrapper;
 import org.apache.olingo.client.api.communication.response.ODataBatchResponse;
 import 
org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
+import org.apache.olingo.client.api.communication.response.ODataInvokeResponse;
 import org.apache.olingo.client.api.communication.response.ODataResponse;
 import 
org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
 import org.apache.olingo.client.api.data.ResWrap;
 import org.apache.olingo.client.api.domain.ClientEntity;
 import org.apache.olingo.client.api.domain.ClientEntitySet;
 import org.apache.olingo.client.api.domain.ClientProperty;
+import org.apache.olingo.client.api.domain.ClientValue;
 import org.apache.olingo.client.api.uri.URIBuilder;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntityCollection;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.PreferenceName;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.apache.olingo.fit.tecsvc.TecSvcConst;
 import org.junit.Test;
 
 public final class AsyncSupportITCase extends AbstractParamTecSvcITCase {
@@ -275,7 +284,34 @@ public final class AsyncSupportITCase extends 
AbstractParamTecSvcITCase {
       assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), 
e.getStatusLine().getStatusCode());
     }
   }
-
+  
+  @Test
+  public void entityAction() throws Exception {
+    Calendar dateTime = Calendar.getInstance();
+    dateTime.clear();
+    dateTime.set(1012, 2, 0, 0, 0, 0);
+    final Map<String, ClientValue> parameters = Collections.singletonMap(
+        "ParameterDate",
+        (ClientValue) getFactory().newPrimitiveValueBuilder()
+            .setType(EdmPrimitiveTypeKind.Date).setValue(dateTime).build());
+    ODataClient client = getClient();
+    URI uri = client.newURIBuilder(TecSvcConst.BASE_URI)
+        .appendActionCallSegment("AIRTESAllPrimParam").build();
+
+    ODataInvokeRequest<ClientEntity> req = client.getInvokeRequestFactory()
+        .getActionInvokeRequest(uri, ClientEntity.class, parameters);
+    AsyncRequestWrapper<ODataRetrieveResponse<ClientEntity>>
+    asyncReqWrp = client.getAsyncRequestFactory().getAsyncRequestWrapper(req);
+    AsyncResponseWrapper<ODataRetrieveResponse<ClientEntity>>
+    asyncRespWrp = asyncReqWrp.execute();
+    waitTillDone(asyncRespWrp, 5);
+    @SuppressWarnings("unchecked")
+    ODataInvokeResponse<ClientEntity> response = 
(ODataInvokeResponse<ClientEntity>)asyncRespWrp.getODataResponse();
+   
+    assertEquals(HttpStatusCode.CREATED.getStatusCode(), 
response.getStatusCode());
+    assertEquals(TecSvcConst.BASE_URI + "/ESAllPrim(1)", 
response.getHeader(HttpHeader.LOCATION).iterator().next());
+  }
+  
   private ODataEntityRequest<ClientEntity> appendGetRequest(final ODataClient 
client,
       final String segment, final Object key, final boolean isRelative) {
     final URI targetURI = client.newURIBuilder(SERVICE_URI)

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
index 8bd3363..5cf9385 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
@@ -55,7 +55,7 @@ public abstract class AbstractODataInvokeRequest<T extends 
ClientInvokeResult>
     extends AbstractODataBasicRequest<ODataInvokeResponse<T>>
     implements ODataInvokeRequest<T>, ODataBatchableRequest {
 
-  private final Class<T> reference;
+  protected final Class<T> reference;
 
   /**
    * Function parameters.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
index 6d6cc01..d00f977 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
@@ -18,10 +18,22 @@
  */
 package org.apache.olingo.client.core.communication.request.invoke;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.net.URI;
 
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
 import org.apache.olingo.client.api.ODataClient;
+import 
org.apache.olingo.client.api.communication.request.invoke.ClientNoContent;
+import org.apache.olingo.client.api.communication.response.ODataInvokeResponse;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.domain.ClientEntitySet;
 import org.apache.olingo.client.api.domain.ClientInvokeResult;
+import org.apache.olingo.client.api.domain.ClientProperty;
+import org.apache.olingo.client.api.http.HttpClientException;
+import org.apache.olingo.client.api.serialization.ODataDeserializerException;
+import 
org.apache.olingo.client.core.communication.response.AbstractODataResponse;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpMethod;
 
@@ -45,4 +57,52 @@ public class ODataInvokeRequestImpl<T extends 
ClientInvokeResult> extends Abstra
   protected ContentType getPOSTParameterFormat() {
     return contentType == null ? getDefaultFormat() : contentType;
   }
+  
+  /**
+   * Response class about an ODataInvokeRequest.
+   */
+  protected class ODataInvokeResponseImpl extends AbstractODataResponse 
implements ODataInvokeResponse<T> {
+
+    private T invokeResult = null;
+
+    private ODataInvokeResponseImpl(final ODataClient odataClient, final 
HttpClient httpClient,
+        final HttpResponse res) {
+
+      super(odataClient, httpClient, res);
+    }
+
+    /**
+     * {@inheritDoc }
+     */
+    @Override
+    public T getBody() {
+      if (invokeResult == null) {
+        try {
+          if (ClientNoContent.class.isAssignableFrom(reference)) {
+            invokeResult = reference.cast(new ClientNoContent());
+          } else {
+            // avoid getContent() twice:IllegalStateException: Content has 
been consumed
+            final InputStream responseStream = this.payload == null ? 
res.getEntity().getContent() : this.payload;
+            if (ClientEntitySet.class.isAssignableFrom(reference)) {
+              invokeResult = 
reference.cast(odataClient.getReader().readEntitySet(responseStream,
+                  ContentType.parse(getContentType())));
+            } else if (ClientEntity.class.isAssignableFrom(reference)) {
+              invokeResult = 
reference.cast(odataClient.getReader().readEntity(responseStream,
+                  ContentType.parse(getContentType())));
+            } else if (ClientProperty.class.isAssignableFrom(reference)) {
+              invokeResult = 
reference.cast(odataClient.getReader().readProperty(responseStream,
+                  ContentType.parse(getContentType())));
+            }
+          }
+        } catch (IOException e) {
+          throw new HttpClientException(e);
+        } catch (final ODataDeserializerException e) {
+          throw new IllegalArgumentException(e);
+        } finally {
+          this.close();
+        }
+      }
+      return invokeResult;
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/annotation/ClientCsdlDynamicExpression.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/annotation/ClientCsdlDynamicExpression.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/annotation/ClientCsdlDynamicExpression.java
index 8e41a64..1afbca5 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/annotation/ClientCsdlDynamicExpression.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/annotation/ClientCsdlDynamicExpression.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.io.Serializable;
 
 import org.apache.olingo.client.core.edm.xml.AbstractClientCsdlEdmDeserializer;
+import 
org.apache.olingo.commons.api.edm.provider.annotation.CsdlAnnotationPath;
 import 
org.apache.olingo.commons.api.edm.provider.annotation.CsdlDynamicExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlIf;
@@ -120,7 +121,7 @@ public abstract class ClientCsdlDynamicExpression extends 
CsdlDynamicExpression
       } else if (PROPERTY_PATH.equals(jp.getCurrentName())) {
         expression = new CsdlPropertyPath().setValue(jp.nextTextValue());
       } else if (ANNOTATION_PATH.equals(jp.getCurrentName())) {
-        expression = new CsdlPath().setValue(jp.nextTextValue());
+        expression = new CsdlAnnotationPath().setValue(jp.nextTextValue());
       } else if (APPLY.equals(jp.getCurrentName())) {
         jp.nextToken();
         expression = jp.readValueAs(ClientCsdlApply.class);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
index 23ef55f..00cd2ad 100644
--- 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
+++ 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
@@ -60,6 +60,7 @@ import 
org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
 import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
 import org.apache.olingo.commons.api.edm.provider.CsdlSingleton;
 import org.apache.olingo.commons.api.edm.provider.CsdlTerm;
+import 
org.apache.olingo.commons.api.edm.provider.annotation.CsdlAnnotationPath;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlApply;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlCollection;
 import 
org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
@@ -457,6 +458,33 @@ public class MetadataTest extends AbstractTest {
       assertEquals("EnumMember", expression.getExpressionName());
     }
   }
+  
+  @Test
+  public void readPropertyAnnotationsTest() {
+    List<InputStream> streams = new ArrayList<InputStream>();
+    streams.add(getClass().getResourceAsStream("VOC_Core.xml"));
+    final Edm edm = 
client.getReader().readMetadata(getClass().getResourceAsStream("edmxWithCsdlAnnotationPath.xml"),
+        streams);
+    assertNotNull(edm);
+    
+    final EdmEntityType person = edm.getEntityType(
+        new FullQualifiedName("Microsoft.Exchange.Services.OData.Model", 
"Person"));
+    assertNotNull(person);
+    EdmProperty userName = (EdmProperty) person.getProperty("UserName");
+    List<EdmAnnotation> userNameAnnotations = userName.getAnnotations();
+    for (EdmAnnotation annotation : userNameAnnotations) {
+      EdmTerm term = annotation.getTerm();
+      assertNotNull(term);
+      assertEquals("Permissions", term.getName());
+      assertEquals("Org.OData.Core.V1.Permissions",
+          term.getFullQualifiedName().getFullQualifiedNameAsString());
+      EdmExpression expression = annotation.getExpression();
+      assertNotNull(expression);
+      assertTrue(expression.isDynamic());
+      assertEquals("AnnotationPath", 
expression.asDynamic().getExpressionName());
+    }
+  }
+  
   @Test
   public void testOLINGO1100() {
     final Edm edm = 
client.getReader().readMetadata(getClass().getResourceAsStream("olingo1100.xml"));

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/client-core/src/test/resources/org/apache/olingo/client/core/edmxWithCsdlAnnotationPath.xml
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/test/resources/org/apache/olingo/client/core/edmxWithCsdlAnnotationPath.xml
 
b/lib/client-core/src/test/resources/org/apache/olingo/client/core/edmxWithCsdlAnnotationPath.xml
new file mode 100644
index 0000000..331bb13
--- /dev/null
+++ 
b/lib/client-core/src/test/resources/org/apache/olingo/client/core/edmxWithCsdlAnnotationPath.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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. -->
+<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx";>
+       <edmx:DataServices m:DataServiceVersion="4.0"
+               m:MaxDataServiceVersion="4.0" 
xmlns:m="http://docs.oasis-open.org/odata/ns/metadata";>
+               <Schema Namespace="Microsoft.Exchange.Services.OData.Model"
+                       xmlns="http://docs.oasis-open.org/odata/ns/edm";>
+                       <EntityType Name="Person" OpenType="true">
+                               <Key>
+                                       <PropertyRef Name="UserName" />
+                               </Key>
+                               <Property Name="UserName" Type="Edm.String" 
Nullable="false">
+                                       <Annotation 
Term="Org.OData.Core.V1.Permissions">
+                                               
<AnnotationPath>Org.OData.Core.V1.Permission/Read</AnnotationPath>
+                                       </Annotation>
+                               </Property>
+                               <Property Name="FirstName" Type="Edm.String" 
Nullable="false" />
+                               <Property Name="LastName" Type="Edm.String" 
Nullable="false" />
+                               <Property Name="Emails" 
Type="Collection(Edm.String)" />
+                       </EntityType>
+                               <EntityContainer Name="EntityContainer"
+                                       m:IsDefaultEntityContainer="true">
+                                       <EntitySet Name="People"
+                                               
EntityType="Microsoft.Exchange.Services.OData.Model.Person" />
+                               </EntityContainer>
+               </Schema>
+       </edmx:DataServices>
+</edmx:Edmx>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
----------------------------------------------------------------------
diff --git 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
index 16cca29..ad06b7c 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
@@ -155,12 +155,31 @@ public abstract class OData {
    * Deserializers are used in Processor implementations.
    *
    * @param contentType any content type supported by Olingo (XML, JSON ...)
+   */
+  public abstract ODataDeserializer createDeserializer(ContentType 
contentType, 
+      final List<String> versions) throws DeserializerException;
+
+  /**
+   * Creates a new deserializer object for reading content in the specified 
format.
+   * Deserializers are used in Processor implementations.
+   *
+   * @param contentType any content type supported by Olingo (XML, JSON ...)
    * @param metadata ServiceMetada of the service
    */
   public abstract ODataDeserializer createDeserializer(ContentType contentType,
       ServiceMetadata metadata) throws DeserializerException;
   
   /**
+   * Creates a new deserializer object for reading content in the specified 
format.
+   * Deserializers are used in Processor implementations.
+   *
+   * @param contentType any content type supported by Olingo (XML, JSON ...)
+   * @param metadata ServiceMetada of the service
+   */
+  public abstract ODataDeserializer createDeserializer(ContentType contentType,
+      ServiceMetadata metadata, final List<String> versions) throws 
DeserializerException;
+  
+  /**
    * Creates a primitive-type instance.
    * @param kind the kind of the primitive type
    * @return an {@link EdmPrimitiveType} instance for the type kind

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
 
b/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
index 113eb03..0a6ce52 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
@@ -160,5 +160,17 @@ public class ODataNettyImpl extends ODataNetty {
       throws SerializerException {
     return odata.createEdmDeltaSerializer(contentType, versions);
   }
+
+  @Override
+  public ODataDeserializer createDeserializer(ContentType contentType, 
List<String> versions)
+      throws DeserializerException {
+    return odata.createDeserializer(contentType, versions);
+  }
+
+  @Override
+  public ODataDeserializer createDeserializer(ContentType contentType, 
ServiceMetadata metadata, List<String> versions)
+      throws DeserializerException {
+    return odata.createDeserializer(contentType, metadata,  versions);
+  }
   
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
index c3507fb..997fc8f 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
@@ -238,4 +238,40 @@ public class ODataImpl extends OData {
     // TODO: Support more debug formats
     return new DebugResponseHelperImpl(debugFormat);
   }
+
+  @Override
+  public ODataDeserializer createDeserializer(ContentType contentType, 
List<String> versions)
+      throws DeserializerException {
+    IConstants constants = new Constantsv00();
+    if(versions!=null && versions.size()>0 && getMaxVersion(versions)>4){
+      constants = new Constantsv01() ;
+    }
+    if (contentType.isCompatible(ContentType.JSON)) {
+      return new ODataJsonDeserializer(contentType, constants);
+    } else if (contentType.isCompatible(ContentType.APPLICATION_XML)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) {
+      return new ODataXmlDeserializer();
+    } else {
+      throw new DeserializerException("Unsupported format: " + 
contentType.toContentTypeString(),
+          DeserializerException.MessageKeys.UNSUPPORTED_FORMAT, 
contentType.toContentTypeString());
+    }
+  }
+
+  @Override
+  public ODataDeserializer createDeserializer(ContentType contentType, 
ServiceMetadata metadata, List<String> versions)
+      throws DeserializerException {
+    IConstants constants = new Constantsv00();
+    if(versions!=null && versions.size()>0 && getMaxVersion(versions)>4){
+      constants = new Constantsv01() ;
+    }
+    if (contentType.isCompatible(ContentType.JSON)) {
+      return new ODataJsonDeserializer(contentType, metadata, constants);
+    } else if (contentType.isCompatible(ContentType.APPLICATION_XML)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) {
+      return new ODataXmlDeserializer(metadata);
+    } else {
+      throw new DeserializerException("Unsupported format: " + 
contentType.toContentTypeString(),
+          DeserializerException.MessageKeys.UNSUPPORTED_FORMAT, 
contentType.toContentTypeString());
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
index 71aee42..cb96c20 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
@@ -33,6 +33,8 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.olingo.commons.api.Constants;
+import org.apache.olingo.commons.api.IConstants;
+import org.apache.olingo.commons.api.constants.Constantsv00;
 import org.apache.olingo.commons.api.data.ComplexValue;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntityCollection;
@@ -105,14 +107,27 @@ public class ODataJsonDeserializer implements 
ODataDeserializer {
 
   private final boolean isIEEE754Compatible;
   private ServiceMetadata serviceMetadata;
+  private IConstants constants;
 
   public ODataJsonDeserializer(final ContentType contentType) {
-    this(contentType, null);
+    this(contentType, null, new Constantsv00());
   }
 
   public ODataJsonDeserializer(final ContentType contentType, final 
ServiceMetadata serviceMetadata) {
     isIEEE754Compatible = 
ContentTypeHelper.isODataIEEE754Compatible(contentType);
     this.serviceMetadata = serviceMetadata;
+    this.constants = new Constantsv00();
+  }
+
+  public ODataJsonDeserializer(ContentType contentType, ServiceMetadata 
serviceMetadata, IConstants constants) {
+    isIEEE754Compatible = 
ContentTypeHelper.isODataIEEE754Compatible(contentType);
+    this.serviceMetadata = serviceMetadata;
+    this.constants = constants;
+  }
+
+  public ODataJsonDeserializer(ContentType contentType, IConstants constants) {
+    isIEEE754Compatible = 
ContentTypeHelper.isODataIEEE754Compatible(contentType);
+    this.constants = constants;
   }
 
   @Override
@@ -337,7 +352,7 @@ public class ODataJsonDeserializer implements 
ODataDeserializer {
     while (fieldsIterator.hasNext()) {
       Entry<String, JsonNode> field = fieldsIterator.next();
 
-      if (field.getKey().contains(Constants.JSON_BIND_LINK_SUFFIX)) {
+      if (field.getKey().contains(constants.getBind())) {
         Link bindingLink = consumeBindingLink(field.getKey(), 
field.getValue(), edmEntityType);
         entity.getNavigationBindings().add(bindingLink);
         toRemove.add(field.getKey());
@@ -937,7 +952,7 @@ public class ODataJsonDeserializer implements 
ODataDeserializer {
     try {
       List<URI> parsedValues = new ArrayList<URI>();
       final ObjectNode tree = parseJsonTree(stream);
-      final String key = Constants.JSON_ID;
+      final String key = constants.getId();
       JsonNode jsonNode = tree.get(Constants.VALUE);
       if (jsonNode != null) {
         if (jsonNode.isArray()) {
@@ -984,7 +999,7 @@ public class ODataJsonDeserializer implements 
ODataDeserializer {
 
   private EdmType getDerivedType(final EdmStructuredType edmType, final 
JsonNode jsonNode)
       throws DeserializerException {
-    JsonNode odataTypeNode = jsonNode.get(Constants.JSON_TYPE);
+    JsonNode odataTypeNode = jsonNode.get(constants.getType());
     if (odataTypeNode != null) {
       String odataType = odataTypeNode.asText();
       if (!odataType.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f4e554d/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
index baf2f40..07a793a 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
@@ -140,13 +140,13 @@ public class RequestValidator {
     if (edmProperty.isCollection()) {
       final EntityCollection inlineEntitySet = 
navigationLink.getInlineEntitySet();
       if (inlineEntitySet != null) {
-        if (!isInsert && inlineEntitySet.getEntities().size() > 0) {
+        /*if (!isInsert && inlineEntitySet.getEntities().size() > 0) {
           throw new DataProvider.DataProviderException("Deep update is not 
allowed", HttpStatusCode.BAD_REQUEST);
-        } else {
+        } else {*/
           for (final Entity entity : 
navigationLink.getInlineEntitySet().getEntities()) {
             validate(edmBindingTarget, entity);
           }
-        }
+       // }
       }
     } else {
       final Entity inlineEntity = navigationLink.getInlineEntity();

Reply via email to