olingo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From m...@apache.org
Subject [2/3] git commit: [OLINGO-444] Introduced PropertyProcessor and adapted related classes
Date Mon, 06 Oct 2014 08:22:57 GMT
[OLINGO-444] Introduced PropertyProcessor and adapted related classes


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

Branch: refs/heads/master
Commit: 1971a90c799aea076328d95612e2294666a278c6
Parents: afebbbb
Author: Michael Bolz <michael.bolz@sap.com>
Authored: Thu Oct 2 14:44:00 2014 +0200
Committer: Michael Bolz <michael.bolz@sap.com>
Committed: Thu Oct 2 15:24:31 2014 +0200

----------------------------------------------------------------------
 .../server/api/processor/EntityProcessor.java   | 17 +----
 .../server/api/processor/PropertyProcessor.java | 62 +++++++++++++++
 .../server/api/serializer/ODataSerializer.java  |  5 +-
 .../apache/olingo/server/core/ODataHandler.java | 23 +++---
 .../core/serializer/ODataXmlSerializerImpl.java |  3 +-
 .../serializer/json/ODataJsonSerializer.java    | 47 +++++-------
 .../tecsvc/processor/TechnicalProcessor.java    | 80 ++++++++++++++++----
 .../olingo/server/core/ODataHandlerTest.java    | 54 ++++++-------
 .../json/ODataJsonSerializerTest.java           | 15 ++--
 9 files changed, 192 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/EntityProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/EntityProcessor.java
b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/EntityProcessor.java
index daccae4..7f2e3ab 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/EntityProcessor.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/EntityProcessor.java
@@ -29,25 +29,10 @@ import org.apache.olingo.server.api.uri.UriInfo;
 public interface EntityProcessor extends Processor {
 
   /**
-   * Reads entity data from persistency and puts serialized content and status into the response.
+   *  Reads entity data from persistence and puts serialized content and status into the
response.
    *  @param request - OData request object containing raw HTTP information
    *  @param response - OData response object for collecting response data
    *  @param uriInfo - information of a parsed OData URI
-   *  @param requestedContentType - requested content type after content negotiation
    */
   void readEntity(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType
format);
-
-  /**
-   * Reads primitive property from entity.
-   * If the property is single-valued and has the null value, the service responds with 204
No Content.
-   * If the property is not available, for example due to permissions, the service responds
with 404 Not Found
-   * @param request - OData request object containing raw HTTP information
-   * @param response - OData response object for collecting response data
-   * @param uriInfo - information of a parsed OData URI
-   * @param format - requested content type after content negotiation
-   * @param value - true if only value of property requested through $value,
-   *                 false when individual property read with metadata
-   */  
-  void readEntityProperty(ODataRequest request, ODataResponse response,
-      UriInfo uriInfo, ContentType format, boolean value);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/PropertyProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/PropertyProcessor.java
b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/PropertyProcessor.java
new file mode 100644
index 0000000..31ff2b1
--- /dev/null
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/PropertyProcessor.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.api.processor;
+
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataRequest;
+import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.serializer.ODataSerializerException;
+import org.apache.olingo.server.api.uri.UriInfo;
+
+/**
+ * Processor interface for handling a property of an entity.
+ */
+public interface PropertyProcessor extends Processor {
+
+  /**
+   * Reads primitive or complex property from entity.
+   * If the property is single-valued and has the null value, the service responds with 204
No Content.
+   * If the property is not available, for example due to permissions, the service responds
with 404 Not Found
+   *
+   * @param request - OData request object containing raw HTTP information
+   * @param response - OData response object for collecting response data
+   * @param uriInfo - information of a parsed OData URI
+   * @param format - requested content type after content negotiation
+   * @throws ODataApplicationException if service implementation encounters a failure
+   * @throws ODataSerializerException if serialization failed
+   */
+  void readProperty(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType
format)
+          throws ODataApplicationException, ODataSerializerException;
+
+  /**
+   * Reads value for primitive property from entity.
+   * If the property is single-valued and has the null value, the service responds with 204
No Content.
+   * If the property is not available, for example due to permissions, the service responds
with 404 Not Found
+   *
+   * @param request - OData request object containing raw HTTP information
+   * @param response - OData response object for collecting response data
+   * @param uriInfo - information of a parsed OData URI
+   * @param format - requested content type after content negotiation
+   * @throws ODataApplicationException if service implementation encounters a failure
+   * @throws ODataSerializerException if serialization failed
+   */
+  void readPropertyValue(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType
format)
+          throws ODataApplicationException, ODataSerializerException;
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
index 4fe93ec..57e0014 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
@@ -62,11 +62,10 @@ public interface ODataSerializer {
    * Writes entity data into an InputStream.
    * @param edmProperty property definition
    * @param property property value
-   * @param value when true send bare value of property, false metadata is also included
    * @param options options for the serializer
    */
-  InputStream entityProperty(EdmProperty edmProperty, Property property,
-      boolean value, ODataSerializerOptions options) throws ODataSerializerException;
+  InputStream entityProperty(EdmProperty edmProperty, Property property, ODataSerializerOptions
options)
+          throws ODataSerializerException;
 
   /**
    * Writes entity-set data into an InputStream.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
index 7a5831f..827dfd8 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
@@ -33,18 +33,11 @@ import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.ODataTranslatedException;
-import org.apache.olingo.server.api.processor.DefaultProcessor;
-import org.apache.olingo.server.api.processor.EntitySetProcessor;
-import org.apache.olingo.server.api.processor.EntityProcessor;
-import org.apache.olingo.server.api.processor.ExceptionProcessor;
-import org.apache.olingo.server.api.processor.MetadataProcessor;
-import org.apache.olingo.server.api.processor.Processor;
-import org.apache.olingo.server.api.processor.ServiceDocumentProcessor;
+import org.apache.olingo.server.api.processor.*;
 import org.apache.olingo.server.api.uri.UriInfo;
 import org.apache.olingo.server.api.uri.UriResource;
 import org.apache.olingo.server.api.uri.UriResourceNavigation;
 import org.apache.olingo.server.api.uri.UriResourcePartTyped;
-import org.apache.olingo.server.api.uri.UriResourceProperty;
 import org.apache.olingo.server.core.uri.parser.Parser;
 import org.apache.olingo.server.core.uri.parser.UriParserException;
 import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
@@ -166,7 +159,7 @@ public class ODataHandler {
   }
 
   private void handleResourceDispatching(final ODataRequest request, final ODataResponse
response,
-      final UriInfo uriInfo) throws ODataTranslatedException {
+      final UriInfo uriInfo) throws ODataTranslatedException, ODataApplicationException {
     int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
     UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
     ContentType requestedContentType = null;
@@ -240,12 +233,12 @@ public class ODataHandler {
     case primitiveProperty:
     case complexProperty:
       if (request.getMethod().equals(HttpMethod.GET)) {
-        EntityProcessor ep = selectProcessor(EntityProcessor.class);
+        PropertyProcessor ep = selectProcessor(PropertyProcessor.class);
 
         requestedContentType =
-            ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, ep,
EntityProcessor.class);
+            ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, ep,
PropertyProcessor.class);
 
-        ep.readEntityProperty(request, response, uriInfo, requestedContentType, false);
+        ep.readProperty(request, response, uriInfo, requestedContentType);
       } else {
         throw new ODataHandlerException("not implemented",
             ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
@@ -253,8 +246,10 @@ public class ODataHandler {
       break;
     case value:
       if (request.getMethod().equals(HttpMethod.GET)) {
-        EntityProcessor ep = selectProcessor(EntityProcessor.class);
-        ep.readEntityProperty(request, response, uriInfo, requestedContentType, true);
+        PropertyProcessor ep = selectProcessor(PropertyProcessor.class);
+        requestedContentType =
+                ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request,
ep, PropertyProcessor.class);
+        ep.readPropertyValue(request, response, uriInfo, requestedContentType);
       } else {
         throw new ODataHandlerException("not implemented",
             ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
index 9588619..3220ce1 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
@@ -111,8 +111,7 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
 
   @Override
   public 	InputStream entityProperty(EdmProperty edmProperty, Property property,
-    boolean value, ODataSerializerOptions options)
-      throws ODataSerializerException{
+    ODataSerializerOptions options) throws ODataSerializerException{
     throw new ODataSerializerException("error serialization not implemented for XML format",
       ODataSerializerException.MessageKeys.NOT_IMPLEMENTED);
 	}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
index 46cc6ff..e588448 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
@@ -392,13 +392,13 @@ public class ODataJsonSerializer implements ODataSerializer {
       final Set<List<String>> selectedPaths, JsonGenerator json)
       throws IOException, EdmPrimitiveTypeException, ODataSerializerException {
     json.writeStartObject();
-    writeProperyValues(edmProperty, properties, selectedPaths, json);
+    writePropertyValues(edmProperty, properties, selectedPaths, json);
     json.writeEndObject();
   }
 
-  private void writeProperyValues(final EdmProperty edmProperty,
-      final List<Property> properties, final Set<List<String>> selectedPaths,
-      JsonGenerator json) throws IOException, ODataSerializerException {
+  private void writePropertyValues(final EdmProperty edmProperty,
+                                   final List<Property> properties, final Set<List<String>>
selectedPaths,
+                                   JsonGenerator json) throws IOException, ODataSerializerException
{
     final EdmComplexType type = (EdmComplexType) edmProperty.getType();
     for (final String propertyName : type.getPropertyNames()) {
       final Property property = findProperty(propertyName, properties);
@@ -427,35 +427,30 @@ public class ODataJsonSerializer implements ODataSerializer {
 
   @Override
   public InputStream entityProperty(EdmProperty edmProperty,
-      Property property, boolean value, ODataSerializerOptions options)
+      Property property, ODataSerializerOptions options)
       throws ODataSerializerException {
     final ContextURL contextURL = checkContextURL(options);
     CircleStreamBuffer buffer = new CircleStreamBuffer();
     try {
       JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
-      if (value) {
-        // this is always primitive
-        writePropertyValue(edmProperty, property, null, json);
-      } else {
-        json.writeStartObject();
-        if (format != ODataFormat.JSON_NO_METADATA) {
-          if (contextURL != null) {
-            json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
-          }
-        }
-        if (property.isPrimitive() && property.isNull()) {
-          throw new ODataSerializerException("Property value can not be null",
-              ODataSerializerException.MessageKeys.NULL_INPUT);
-        } else if (property.isComplex() && !property.isNull()) {
-          writeProperyValues(edmProperty, property.asComplex(), null, json);
-        } else if (property.isLinkedComplex() && !property.isNull()) {
-          writeProperyValues(edmProperty, property.asLinkedComplex().getValue(), null, json);
-        } else {
-          json.writeFieldName(Constants.VALUE);
-          writePropertyValue(edmProperty, property, null, json);
+      json.writeStartObject();
+      if (format != ODataFormat.JSON_NO_METADATA) {
+        if (contextURL != null) {
+          json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
         }
-        json.writeEndObject();
       }
+      if (property.isPrimitive() && property.isNull()) {
+        throw new ODataSerializerException("Property value can not be null",
+            ODataSerializerException.MessageKeys.NULL_INPUT);
+      } else if (property.isComplex() && !property.isNull()) {
+        writePropertyValues(edmProperty, property.asComplex(), null, json);
+      } else if (property.isLinkedComplex() && !property.isNull()) {
+        writePropertyValues(edmProperty, property.asLinkedComplex().getValue(), null, json);
+      } else {
+        json.writeFieldName(Constants.VALUE);
+        writePropertyValue(edmProperty, property, null, json);
+      }
+      json.writeEndObject();
       json.close();
     } catch (final IOException e) {
       throw new ODataSerializerException("An I/O exception occurred.", e,

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/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 274b988..99f64ef 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
@@ -23,9 +23,7 @@ import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntitySet;
 import org.apache.olingo.commons.api.data.ContextURL.Suffix;
 import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmEntitySet;
-import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.*;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.format.ODataFormat;
 import org.apache.olingo.commons.api.http.HttpHeader;
@@ -36,27 +34,25 @@ import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.processor.EntitySetProcessor;
 import org.apache.olingo.server.api.processor.EntityProcessor;
+import org.apache.olingo.server.api.processor.PropertyProcessor;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.apache.olingo.server.api.serializer.ODataSerializerException;
 import org.apache.olingo.server.api.serializer.ODataSerializerOptions;
-import org.apache.olingo.server.api.uri.UriInfo;
-import org.apache.olingo.server.api.uri.UriInfoResource;
-import org.apache.olingo.server.api.uri.UriResource;
-import org.apache.olingo.server.api.uri.UriResourceEntitySet;
-import org.apache.olingo.server.api.uri.UriResourceProperty;
+import org.apache.olingo.server.api.uri.*;
 import org.apache.olingo.server.api.uri.queryoption.ExpandOption;
 import org.apache.olingo.server.api.uri.queryoption.SelectOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
 import org.apache.olingo.server.tecsvc.data.DataProvider;
 
 import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
 import java.util.List;
 import java.util.Locale;
 
 /**
  * Technical Processor which provides current implemented processor functionality.
  */
-public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
+public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor, PropertyProcessor
{
 
   private OData odata;
   private DataProvider dataProvider;
@@ -213,14 +209,25 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor
{
 
   private EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) throws ODataApplicationException
{
     final List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
-    if (resourcePaths.size() != 1) {
-      throw new ODataApplicationException("Invalid resource path.",
-          HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
-    }
+    // first must be entity set
     if (!(resourcePaths.get(0) instanceof UriResourceEntitySet)) {
       throw new ODataApplicationException("Invalid resource type.",
           HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
     }
+
+    List<UriResource> subResPaths = resourcePaths.subList(1, resourcePaths.size());
+    for (UriResource subResPath : subResPaths) {
+      UriResourceKind kind = subResPath.getKind();
+      if(kind != UriResourceKind.primitiveProperty
+              && kind != UriResourceKind.complexProperty
+              && kind != UriResourceKind.count
+              && kind != UriResourceKind.value) {
+        throw new ODataApplicationException("Invalid resource type.",
+                HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
+      }
+    }
+
+    //
     final UriResourceEntitySet uriResource = (UriResourceEntitySet) resourcePaths.get(0);
     if (uriResource.getTypeFilterOnCollection() != null || uriResource.getTypeFilterOnEntry()
!= null) {
       throw new ODataApplicationException("Type filters are not supported.",
@@ -242,8 +249,8 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor
{
   }
 
   @Override
-  public void readEntityProperty(ODataRequest request,
-      ODataResponse response, UriInfo uriInfo, ContentType contentType, boolean value) {
+  public void readProperty(ODataRequest request,
+                           ODataResponse response, UriInfo uriInfo, ContentType contentType)
{
 
     if (!validateOptions(uriInfo.asUriInfoResource())) {
       response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
@@ -267,7 +274,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor
{
           } else {
             final ODataFormat format = ODataFormat.fromContentType(contentType);
             ODataSerializer serializer = odata.createSerializer(format);
-            response.setContent(serializer.entityProperty(edmProperty, property, value,
+            response.setContent(serializer.entityProperty(edmProperty, property,
                 ODataSerializerOptions.with()
                     .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
                         getContextUrl(serializer, edmEntitySet, true, null, null, edmProperty.getName()))
@@ -285,4 +292,45 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor
{
       response.setStatusCode(e.getStatusCode());
     }
   }
+
+  @Override
+  public void readPropertyValue(ODataRequest request, ODataResponse response,
+                                UriInfo uriInfo, ContentType contentType) {
+
+    if (!validateOptions(uriInfo.asUriInfoResource())) {
+      response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
+      return;
+    }
+    try {
+      final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
+      final Entity entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
+      if (entity == null) {
+        response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
+      } else {
+        UriResourceProperty uriProperty = (UriResourceProperty) uriInfo
+                .getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 2);
+        EdmProperty edmProperty = uriProperty.getProperty();
+        Property property = entity.getProperty(edmProperty.getName());
+        if (property == null || property.getValue() == null) {
+          response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
+        } else {
+          final EdmPrimitiveType type = (EdmPrimitiveType) edmProperty.getType();
+          final String value = type.valueToString(property.getValue(),
+                  edmProperty.isNullable(), edmProperty.getMaxLength(),
+                  edmProperty.getPrecision(), edmProperty.getScale(), edmProperty.isUnicode());
+          response.setContent(new ByteArrayInputStream(value.getBytes("UTF-8")));
+          response.setStatusCode(HttpStatusCode.OK.getStatusCode());
+          response.setHeader(HttpHeader.CONTENT_TYPE, ContentType.TEXT_PLAIN.toContentTypeString());
+        }
+      }
+    } catch (final DataProvider.DataProviderException e) {
+      response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
+    } catch (final EdmPrimitiveTypeException e) {
+      response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
+    } catch (final UnsupportedEncodingException e) {
+      response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
+    } catch (final ODataApplicationException e) {
+      response.setStatusCode(e.getStatusCode());
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
index 50113a0..1ae9ea3 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
@@ -36,11 +36,8 @@ import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.processor.EntitySetProcessor;
-import org.apache.olingo.server.api.processor.MetadataProcessor;
-import org.apache.olingo.server.api.processor.ServiceDocumentProcessor;
+import org.apache.olingo.server.api.processor.*;
 import org.apache.olingo.server.api.uri.UriInfo;
-import org.apache.olingo.server.api.processor.EntityProcessor;
 import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
 import org.junit.Before;
 import org.junit.Test;
@@ -262,7 +259,7 @@ public class ODataHandlerTest {
   }
 
   @Test
-  public void testCountWithNavigation() throws Exception {
+  public void dispatchCountWithNavigation() throws Exception {
     ODataRequest request = new ODataRequest();
 
     request.setMethod(HttpMethod.GET);
@@ -280,65 +277,62 @@ public class ODataHandlerTest {
   }
 
   @Test
-  public void testAddressPrimitiveProperty() throws Exception {
+  public void dispatchAddressPrimitiveProperty() throws Exception {
     ODataRequest request = new ODataRequest();
 
     request.setMethod(HttpMethod.GET);
     request.setRawODataPath("ESAllPrim/PropertyInt16");
 
-    EntityProcessor processor = mock(EntityProcessor.class);
+    PropertyProcessor processor = mock(PropertyProcessor.class);
     handler.register(processor);
 
     ODataResponse response = handler.process(request);
     assertNotNull(response);
 
-    Mockito.verify(processor).readEntityProperty(
-        Mockito.any(ODataRequest.class),
-        Mockito.any(ODataResponse.class),
-        Mockito.any(UriInfo.class),
-        Mockito.any(ContentType.class),
-        Mockito.eq(false));
+    Mockito.verify(processor).readProperty(
+            Mockito.any(ODataRequest.class),
+            Mockito.any(ODataResponse.class),
+            Mockito.any(UriInfo.class),
+            Mockito.any(ContentType.class));
   }
 
   @Test
-  public void testAddressPrimitivePropertyValue() throws Exception {
+  public void dispatchAddressPrimitivePropertyValue() throws Exception {
     ODataRequest request = new ODataRequest();
 
     request.setMethod(HttpMethod.GET);
     request.setRawODataPath("ESAllPrim/PropertyInt16/$value");
 
-    EntityProcessor processor = mock(EntityProcessor.class);
+    PropertyProcessor processor = mock(PropertyProcessor.class);
     handler.register(processor);
 
     ODataResponse response = handler.process(request);
     assertNotNull(response);
 
-    Mockito.verify(processor).readEntityProperty(
-        Mockito.any(ODataRequest.class),
-        Mockito.any(ODataResponse.class),
-        Mockito.any(UriInfo.class),
-        Mockito.any(ContentType.class),
-        Mockito.eq(true));
+    Mockito.verify(processor).readPropertyValue(
+            Mockito.any(ODataRequest.class),
+            Mockito.any(ODataResponse.class),
+            Mockito.any(UriInfo.class),
+            Mockito.any(ContentType.class));
   }
 
   @Test
-  public void testAddressComplexProperty() throws Exception {
+  public void dispatchAddressComplexProperty() throws Exception {
     ODataRequest request = new ODataRequest();
 
     request.setMethod(HttpMethod.GET);
     request.setRawODataPath("ESMixPrimCollComp/PropertyComp");
 
-    EntityProcessor processor = mock(EntityProcessor.class);
+    PropertyProcessor processor = mock(PropertyProcessor.class);
     handler.register(processor);
 
     ODataResponse response = handler.process(request);
     assertNotNull(response);
 
-    Mockito.verify(processor).readEntityProperty(
-        Mockito.any(ODataRequest.class),
-        Mockito.any(ODataResponse.class),
-        Mockito.any(UriInfo.class),
-        Mockito.any(ContentType.class),
-        Mockito.eq(false));
+    Mockito.verify(processor).readProperty(
+            Mockito.any(ODataRequest.class),
+            Mockito.any(ODataResponse.class),
+            Mockito.any(UriInfo.class),
+            Mockito.any(ContentType.class));
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1971a90c/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
index 0650480..250cabb 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
@@ -45,12 +45,12 @@ import org.apache.olingo.server.api.uri.queryoption.ExpandItem;
 import org.apache.olingo.server.api.uri.queryoption.ExpandOption;
 import org.apache.olingo.server.api.uri.queryoption.SelectItem;
 import org.apache.olingo.server.api.uri.queryoption.SelectOption;
-import org.apache.olingo.server.core.edm.provider.EdmPropertyImpl;
 import org.apache.olingo.server.core.serializer.ExpandSelectMock;
 import org.apache.olingo.server.tecsvc.data.DataProvider;
 import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
 import org.hamcrest.CoreMatchers;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -580,7 +580,7 @@ public class ODataJsonSerializerTest {
     Entity entity = entitySet.getEntities().get(0);
 
     InputStream result = serializer
-        .entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyString"), false,
+        .entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyString"),
             ODataSerializerOptions.with()
                 .contextURL(ContextURL.with().entitySetOrSingletonOrType("Edm.String")
                     .build())
@@ -598,7 +598,7 @@ public class ODataJsonSerializerTest {
     final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
     EdmElement edmElement = edmEntitySet.getEntityType().getProperty("PropertyString");
     InputStream result = serializer
-        .entityProperty((EdmProperty) edmElement, property, false,
+        .entityProperty((EdmProperty) edmElement, property,
             ODataSerializerOptions.with()
                 .contextURL(ContextURL.with().entitySetOrSingletonOrType("Edm.String")
                     .build())
@@ -614,7 +614,7 @@ public class ODataJsonSerializerTest {
     Entity entity = entitySet.getEntities().get(0);
 
     InputStream result = serializer
-        .entityProperty((EdmProperty) edmElement, entity.getProperty("CollPropertyString"),
false,
+        .entityProperty((EdmProperty) edmElement, entity.getProperty("CollPropertyString"),
             ODataSerializerOptions.with()
                 .contextURL(ContextURL.with().entitySetOrSingletonOrType("Collection(Edm.String)")
                     .build())
@@ -627,6 +627,7 @@ public class ODataJsonSerializerTest {
   }
 
   @Test
+  @Ignore("Serialization of value of primitive property is not done by json serializer")
   public void individualPrimitivePropertyValue() throws Exception {
     final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
     final EntitySet entitySet = data.readAll(edmEntitySet);
@@ -635,9 +636,9 @@ public class ODataJsonSerializerTest {
     Entity entity = entitySet.getEntities().get(0);
 
     InputStream result = serializer
-        .entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyString"), true,
+        .entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyString"),
             ODataSerializerOptions.with()
-                .contextURL(ContextURL.with().entitySetOrSingletonOrType("ESAllPrim(1)")
+                .contextURL(ContextURL.with().entitySetOrSingletonOrType("ESAllPrim(0)")
                     .navOrPropertyPath("PropertyString")
                     .build())
                 .build());
@@ -654,7 +655,7 @@ public class ODataJsonSerializerTest {
     Entity entity = entitySet.getEntities().get(0);
 
     InputStream result = serializer
-        .entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyComp"), false,
+        .entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyComp"),
             ODataSerializerOptions.with()
                 .contextURL(ContextURL.with().entitySetOrSingletonOrType("ESMixPrimCollComp.PropertyComp")
                     .build())


Mime
View raw message