You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/11/28 06:30:33 UTC

[25/47] olingo-odata4 git commit: [OLINGO-801] support for non-primitive function parameters

[OLINGO-801] support for non-primitive function parameters

Signed-off-by: Christian Amend <ch...@sap.com>


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

Branch: refs/heads/OLINGO-811_CountForExpand
Commit: 3fa2b3df2ffd9dafc41af6ad6be436e55dbed6a4
Parents: 6614aea
Author: Klaus Straubinger <kl...@sap.com>
Authored: Fri Nov 13 16:46:04 2015 +0100
Committer: Christian Amend <ch...@sap.com>
Committed: Tue Nov 17 09:20:57 2015 +0100

----------------------------------------------------------------------
 .../fit/tecsvc/client/FunctionImportITCase.java |  35 +
 .../deserializer/FixedFormatDeserializer.java   |   9 +
 .../apache/olingo/server/api/uri/UriInfo.java   |  26 +-
 .../olingo/server/api/uri/UriInfoEntityId.java  |   2 +-
 .../olingo/server/api/uri/UriInfoMetadata.java  |   2 +-
 .../olingo/server/api/uri/UriInfoResource.java  |   3 +-
 .../uri/queryoption/SystemQueryOptionKind.java  |  28 +-
 .../olingo/server/core/uri/antlr/UriParser.g4   |  15 +-
 .../olingo/server/core/debug/DebugTabUri.java   | 176 ++++-
 .../server/core/debug/ServerCoreDebugger.java   |   3 +-
 .../FixedFormatDeserializerImpl.java            |  37 ++
 .../json/ODataJsonDeserializer.java             | 104 ++-
 .../olingo/server/core/uri/UriInfoImpl.java     | 215 +++---
 .../server/core/uri/UriParameterImpl.java       |   5 +-
 .../server/core/uri/UriResourceActionImpl.java  |   4 +-
 .../core/uri/UriResourceFunctionImpl.java       |   7 +-
 .../olingo/server/core/uri/parser/Parser.java   |  44 +-
 .../core/uri/parser/UriParseTreeVisitor.java    |  38 +-
 .../uri/queryoption/AliasQueryOptionImpl.java   |   2 +-
 .../core/uri/queryoption/ExpandOptionImpl.java  |   7 +-
 .../core/uri/queryoption/FormatOptionImpl.java  |   5 +-
 .../core/uri/queryoption/IdOptionImpl.java      |   5 +-
 .../core/uri/queryoption/OrderByOptionImpl.java |   7 +-
 .../core/uri/queryoption/SelectOptionImpl.java  |   8 +-
 .../uri/queryoption/SkipTokenOptionImpl.java    |   5 +-
 .../uri/queryoption/SystemQueryOptionImpl.java  |   2 +-
 .../server-core-exceptions-i18n.properties      |   2 +-
 .../olingo/server/tecsvc/data/ActionData.java   |  20 +-
 .../olingo/server/tecsvc/data/DataProvider.java |  48 +-
 .../olingo/server/tecsvc/data/FunctionData.java |  61 +-
 .../expression/ExpressionVisitorImpl.java       |  63 +-
 .../expression/operand/TypedOperand.java        |  13 +-
 .../expression/operation/BinaryOperator.java    |   8 +-
 .../queryoptions/options/FilterHandler.java     |   2 +-
 .../queryoptions/options/OrderByHandler.java    |   4 +-
 .../tecsvc/provider/ContainerProvider.java      |  45 +-
 .../tecsvc/provider/FunctionProvider.java       | 665 +++++++++----------
 .../server/tecsvc/provider/SchemaProvider.java  |  61 +-
 ...aJsonDeserializerFunctionParametersTest.java | 121 ++++
 .../serializer/json/ServiceDocumentTest.java    |   2 +-
 .../olingo/server/core/uri/UriInfoImplTest.java | 206 +++---
 .../core/uri/antlr/TestFullResourcePath.java    |  11 +-
 42 files changed, 1185 insertions(+), 941 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/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 d506838..66e6932 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
@@ -331,6 +331,41 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase {
         complexValue.get("PropertyString").getPrimitiveValue().toValue());
   }
 
+  @Test
+  public void allParameterKinds() {
+    Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    parameters.put("ParameterEnum", getFactory().newEnumValue("Namespace1_Alias.ENString", "String1"));
+    parameters.put("ParameterDef", getFactory().newPrimitiveValueBuilder().build());
+    parameters.put("ParameterComp", getFactory().newPrimitiveValueBuilder().setValue(
+        new ParameterAlias("comp")).build());
+    parameters.put("ParameterETTwoPrim", getFactory().newPrimitiveValueBuilder().build());
+    parameters.put("CollParameterByte", getFactory().newPrimitiveValueBuilder().setValue(
+        new ParameterAlias("collByte")).build());
+    parameters.put("CollParameterEnum", getFactory().newPrimitiveValueBuilder().setValue(
+        new ParameterAlias("collEnum")).build());
+    parameters.put("CollParameterDef", getFactory().newPrimitiveValueBuilder().setValue(
+        new ParameterAlias("collDef")).build());
+    parameters.put("CollParameterComp", getFactory().newPrimitiveValueBuilder().setValue(
+        new ParameterAlias("collComp")).build());
+    parameters.put("CollParameterETTwoPrim", getFactory().newPrimitiveValueBuilder().build());
+    ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
+            .appendOperationCallSegment("FINRTByteNineParam")
+            .addParameterAlias("comp", "{\"PropertyInt16\":1}")
+            .addParameterAlias("collByte", "[1]")
+            .addParameterAlias("collEnum", "[\"String1,String1\"]")
+            .addParameterAlias("collDef", "[\"Test\"]")
+            .addParameterAlias("collComp", "[{\"PropertyInt16\":11}]")
+            .build(),
+        ClientProperty.class,
+        parameters);
+    setCookieHeader(request);
+    final ODataInvokeResponse<ClientProperty> response = request.execute();
+    saveCookieHeader(response);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    assertShortOrInt(6, response.getBody().getPrimitiveValue().toValue());
+  }
+
   private Map<String, ClientValue> buildTwoParameters(final int parameterInt16, final String parameterString) {
     Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
     parameters.put("ParameterInt16", getFactory().newPrimitiveValueBuilder().buildInt32(parameterInt16));

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java
index 22dd711..0bf8e0d 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java
@@ -21,6 +21,8 @@ package org.apache.olingo.server.api.deserializer;
 import java.io.InputStream;
 import java.util.List;
 
+import org.apache.olingo.commons.api.data.Parameter;
+import org.apache.olingo.commons.api.edm.EdmParameter;
 import org.apache.olingo.commons.api.edm.EdmProperty;
 import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException;
 import org.apache.olingo.server.api.deserializer.batch.BatchOptions;
@@ -43,6 +45,13 @@ public interface FixedFormatDeserializer {
   public Object primitiveValue(InputStream content, EdmProperty property) throws DeserializerException;
 
   /**
+   * Reads parameter data (in URI syntax) from a String.
+   * @param content   the textual value as String
+   * @param parameter EDM parameter
+   */
+  public Parameter parameter(String content, EdmParameter parameter) throws DeserializerException;
+
+  /**
    * Reads batch data from an InputStream.
    * @param content  the data as multipart input stream
    * @param boundary the boundary between the parts

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
index d12c524..12cfdba 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
@@ -18,18 +18,18 @@
  */
 package org.apache.olingo.server.api.uri;
 
-import java.util.Collection;
+import java.util.List;
 
+import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
 
 /**
- * Object acting as general access to URI information extracted from the request URI. Depending on
- * the URI info kind different interfaces are used to provide access to that information. </p>
- * Use method {@link #getKind()} to obtain URI info kind information and to perform an appropriate cast.
+ * <p>Object acting as general access to URI information extracted from the request URI.</p>
+ * <p>Depending on the URI info kind different interfaces are used to provide access to that information.
+ * Use method {@link #getKind()} to obtain URI info kind information and to perform an appropriate cast.</p>
  */
-public interface UriInfo extends
-UriInfoService, UriInfoAll, UriInfoBatch, UriInfoCrossjoin,
-UriInfoEntityId, UriInfoMetadata, UriInfoResource {
+public interface UriInfo extends UriInfoService, UriInfoMetadata, UriInfoResource, UriInfoBatch,
+    UriInfoAll, UriInfoCrossjoin, UriInfoEntityId {
 
   /**
    * See {@link UriInfoKind} for more details which kinds are allowed.
@@ -80,8 +80,14 @@ UriInfoEntityId, UriInfoMetadata, UriInfoResource {
   UriInfoResource asUriInfoResource();
 
   /**
-   * A collection of all system query options which were in the URI.
-   * @return a collection of all system query options used.
+   * Gets a list of all system query options which were in the URI.
+   * @return a list of all system query options used
    */
-  Collection<SystemQueryOption> getSystemQueryOptions();
+  List<SystemQueryOption> getSystemQueryOptions();
+
+  /**
+   * Gets a list of all alias definitions which were in the URI (including aliases not used anywhere).
+   * @return a list of all alias definitions
+   */
+  List<AliasQueryOption> getAliases();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java
index 2579b6d..5dc5521 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java
@@ -34,7 +34,7 @@ import org.apache.olingo.server.api.uri.queryoption.SelectOption;
 public interface UriInfoEntityId {
 
   /**
-   * @return List of custom query options used in the URI
+   * @return List of custom query options used in the URI (without alias definitions)
    */
   List<CustomQueryOption> getCustomQueryOptions();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java
index 7bf8d91..2b9619d 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java
@@ -27,7 +27,7 @@ import org.apache.olingo.server.api.uri.queryoption.FormatOption;
 public interface UriInfoMetadata {
 
   /**
-   * @return Object containing information of the $id option
+   * @return Object containing information of the $format option
    */
   FormatOption getFormatOption();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java
index 3ea1058..c418bf9 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java
@@ -40,7 +40,7 @@ import org.apache.olingo.server.api.uri.queryoption.TopOption;
 public interface UriInfoResource {
 
   /**
-   * @return List of custom query options used in the URI
+   * @return List of custom query options used in the URI (without alias definitions)
    */
   List<CustomQueryOption> getCustomQueryOptions();
 
@@ -75,7 +75,6 @@ public interface UriInfoResource {
   OrderByOption getOrderByOption();
 
   /**
-   * <b>CURRENTLY NOT SUPPORTED. WILL ALWAYS RETURN NULL</b>
    * @return Object containing information of the $search option
    */
   SearchOption getSearchOption();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java
index 77dfb84..735c631 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java
@@ -19,70 +19,70 @@
 package org.apache.olingo.server.api.uri.queryoption;
 
 /**
- * Defining the supported system query options
+ * Defines the supported system query options.
  */
 
 public enum SystemQueryOptionKind {
 
   /**
-   * See {@link FilterOption}<br>
+   * @see FilterOption
    */
   FILTER("$filter"),
 
   /**
-   * See {@link FormatOption}<br>
+   * @see FormatOption
    */
   FORMAT("$format"),
 
   /**
-   * See {@link ExpandOption}<br>
+   * @see ExpandOption
    */
   EXPAND("$expand"),
 
   /**
-   * See {@link IdOption}<br>
+   * @see IdOption
    */
   ID("$id"),
 
   /**
-   * See {@link CountOption}<br>
+   * @see CountOption
    */
   COUNT("$count"),
 
   /**
-   * See {@link OrderByOption}<br>
+   * @see OrderByOption
    */
   ORDERBY("$orderby"),
 
   /**
-   * See {@link SearchOption}<br>
+   * @see SearchOption
    */
   SEARCH("$search"),
 
   /**
-   * See {@link SelectOption}<br>
+   * @see SelectOption
    */
   SELECT("$select"),
 
   /**
-   * See {@link SkipOption}<br>
+   * @see SkipOption
    */
   SKIP("$skip"),
 
   /**
-   * See {@link SkipTokenOption}<br>
+   * @see SkipTokenOption
    */
   SKIPTOKEN("$skiptoken"),
 
   /**
-   * See {@link TopOption}<br>
+   * @see TopOption
    */
   TOP("$top"),
 
   /**
-   * See {@link LevelsExpandOption}<br>
+   * @see LevelsExpandOption
    */
-  LEVELS("$level");
+  LEVELS("$levels");
 
   private String syntax;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4 b/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4
index ff8994f..5a24b29 100644
--- a/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4
+++ b/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4
@@ -302,24 +302,19 @@ castExpr                          : CAST_WORD  WSP? ( vE1=commonExpr WSP? COMMA
 arrayOrObject       : json_array
                     | json_object;
 
-json_array          : BEGIN_ARRAY json_value ( WSP? COMMA WSP? json_value)* END_ARRAY;
+json_array          : BEGIN_ARRAY (json_value (WS* COMMA WS* json_value)*)? END_ARRAY;
 
 json_value          : jsonPrimitive
                     | rootExpr
                     | json_object
                     | json_array;
 
-json_object         : BEGIN_OBJECT 
-                      (
-					  json_key_value_pair
-					  (COMMA json_key_value_pair)*
-                      )?	
+json_object         : BEGIN_OBJECT
+                      (json_key_value_pair (WS* COMMA WS* json_key_value_pair)*)?
                       END_OBJECT;
 
-json_key_value_pair : STRING_IN_JSON
-                      WSP? COLON WSP? 
-                      json_value;
-                                        
+json_key_value_pair : STRING_IN_JSON WS* COLON WS* json_value;
+
 //; JSON syntax: adapted to URI restrictions from [RFC4627]                 
 jsonPrimitive 		: STRING_IN_JSON
                     | number_in_json

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java
index 071bb3c..66c755a 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java
@@ -20,17 +20,25 @@ package org.apache.olingo.server.core.debug;
 
 import java.io.IOException;
 import java.io.Writer;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.olingo.commons.api.ex.ODataException;
 import org.apache.olingo.server.api.uri.UriInfo;
+import org.apache.olingo.server.api.uri.UriParameter;
 import org.apache.olingo.server.api.uri.UriResource;
+import org.apache.olingo.server.api.uri.UriResourceEntitySet;
+import org.apache.olingo.server.api.uri.UriResourceFunction;
+import org.apache.olingo.server.api.uri.UriResourceNavigation;
 import org.apache.olingo.server.api.uri.queryoption.CountOption;
 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.FilterOption;
 import org.apache.olingo.server.api.uri.queryoption.OrderByItem;
 import org.apache.olingo.server.api.uri.queryoption.OrderByOption;
+import org.apache.olingo.server.api.uri.queryoption.QueryOption;
 import org.apache.olingo.server.api.uri.queryoption.SelectItem;
 import org.apache.olingo.server.api.uri.queryoption.SelectOption;
 import org.apache.olingo.server.api.uri.queryoption.SkipOption;
@@ -61,6 +69,11 @@ public class DebugTabUri implements DebugTab {
   public void appendJson(JsonGenerator gen) throws IOException {
     gen.writeStartObject();
 
+    if (!uriInfo.getUriResourceParts().isEmpty()) {
+      gen.writeFieldName("uriResourceParts");
+      appendURIResourceParts(gen, uriInfo.getUriResourceParts());
+    }
+
     if (uriInfo.getFormatOption() != null) {
       gen.writeStringField("format", uriInfo.getFormatOption().getFormat());
     }
@@ -73,11 +86,17 @@ public class DebugTabUri implements DebugTab {
       gen.writeStringField("skiptoken", uriInfo.getSkipTokenOption().getValue());
     }
 
-    appendCommonJsonObjects(gen, uriInfo.getCountOption(), uriInfo.getSkipOption(), uriInfo.getTopOption(), uriInfo
-        .getFilterOption(), uriInfo.getOrderByOption(), uriInfo.getSelectOption(), uriInfo.getExpandOption());
+    appendCommonJsonObjects(gen, uriInfo.getCountOption(), uriInfo.getSkipOption(), uriInfo.getTopOption(),
+        uriInfo.getFilterOption(), uriInfo.getOrderByOption(), uriInfo.getSelectOption(), uriInfo.getExpandOption());
 
-    if (uriInfo.getUriResourceParts() != null) {
-      appendURIResourceParts(gen, uriInfo.getUriResourceParts());
+    if (!uriInfo.getAliases().isEmpty()) {
+      gen.writeFieldName("aliases");
+      DebugResponseHelperImpl.appendJsonTable(gen, getQueryOptionsMap(uriInfo.getAliases()));
+    }
+
+    if (!uriInfo.getCustomQueryOptions().isEmpty()) {
+      gen.writeFieldName("customQueryOptions");
+      DebugResponseHelperImpl.appendJsonTable(gen, getQueryOptionsMap(uriInfo.getCustomQueryOptions()));
     }
 
     gen.writeEndObject();
@@ -104,55 +123,76 @@ public class DebugTabUri implements DebugTab {
       appendJsonExpressionString(gen, filterOption.getExpression());
     }
 
-    if (orderByOption != null && orderByOption.getOrders() != null) {
+    if (orderByOption != null && !orderByOption.getOrders().isEmpty()) {
       gen.writeFieldName("orderby");
       gen.writeStartObject();
       gen.writeStringField("nodeType", "orderCollection");
       gen.writeFieldName("orders");
-      gen.writeStartArray();
-      for (OrderByItem item : orderByOption.getOrders()) {
-        gen.writeStartObject();
-        gen.writeStringField("nodeType", "order");
-        gen.writeStringField("sortorder", item.isDescending() ? "desc" : "asc");
-        gen.writeFieldName("expression");
-        appendJsonExpressionString(gen, item.getExpression());
-        gen.writeEndObject();
-      }
-      gen.writeEndArray();
+      appendOrderByItemsJson(gen, orderByOption.getOrders());
       gen.writeEndObject();
     }
 
     if (selectOption != null && !selectOption.getSelectItems().isEmpty()) {
+      gen.writeFieldName("select");
       appendSelectedPropertiesJson(gen, selectOption.getSelectItems());
     }
 
     if (expandOption != null && !expandOption.getExpandItems().isEmpty()) {
+      gen.writeFieldName("expand");
       appendExpandedPropertiesJson(gen, expandOption.getExpandItems());
     }
   }
 
   private void appendURIResourceParts(JsonGenerator gen, List<UriResource> uriResourceParts) throws IOException {
-    gen.writeFieldName("uriResourceParts");
-
     gen.writeStartArray();
     for (UriResource resource : uriResourceParts) {
       gen.writeStartObject();
       gen.writeStringField("uriResourceKind", resource.getKind().toString());
       gen.writeStringField("segment", resource.toString());
+      if (resource instanceof UriResourceEntitySet) {
+        appendParameters(gen, "keys", ((UriResourceEntitySet) resource).getKeyPredicates());
+      } else if (resource instanceof UriResourceNavigation) {
+        appendParameters(gen, "keys", ((UriResourceNavigation) resource).getKeyPredicates());
+      } else if (resource instanceof UriResourceFunction) {
+        appendParameters(gen, "parameters", ((UriResourceFunction) resource).getParameters());
+        appendParameters(gen, "keys", ((UriResourceFunction) resource).getKeyPredicates());
+      }
       gen.writeEndObject();
     }
     gen.writeEndArray();
   }
 
-  private void appendExpandedPropertiesJson(JsonGenerator gen, List<ExpandItem> expandItems) throws IOException {
-    gen.writeFieldName("expand");
+  private void appendParameters(JsonGenerator gen, final String name, final List<UriParameter> parameters)
+      throws IOException {
+    if (!parameters.isEmpty()) {
+      Map<String, String> parameterMap = new LinkedHashMap<String, String>();
+      for (final UriParameter parameter : parameters) {
+        parameterMap.put(parameter.getName(),
+            parameter.getText() == null ? parameter.getAlias() : parameter.getText());
+      }
+      gen.writeFieldName(name);
+      DebugResponseHelperImpl.appendJsonTable(gen, parameterMap);
+    }
+  }
 
+  private void appendOrderByItemsJson(JsonGenerator gen, final List<OrderByItem> orders) throws IOException {
     gen.writeStartArray();
+    for (final OrderByItem item : orders) {
+      gen.writeStartObject();
+      gen.writeStringField("nodeType", "order");
+      gen.writeStringField("sortorder", item.isDescending() ? "desc" : "asc");
+      gen.writeFieldName("expression");
+      appendJsonExpressionString(gen, item.getExpression());
+      gen.writeEndObject();
+    }
+    gen.writeEndArray();
+  }
 
+  private void appendExpandedPropertiesJson(JsonGenerator gen, List<ExpandItem> expandItems) throws IOException {
+    gen.writeStartArray();
     for (ExpandItem item : expandItems) {
       appendExpandItemJson(gen, item);
     }
-
     gen.writeEndArray();
   }
 
@@ -161,7 +201,7 @@ public class DebugTabUri implements DebugTab {
 
     if (item.isStar()) {
       gen.writeBooleanField("star", item.isStar());
-    } else if (item.getResourcePath() != null && item.getResourcePath().getUriResourceParts() != null) {
+    } else if (item.getResourcePath() != null && !item.getResourcePath().getUriResourceParts().isEmpty()) {
       gen.writeFieldName("expandPath");
       gen.writeStartArray();
       for (UriResource resource : item.getResourcePath().getUriResourceParts()) {
@@ -198,21 +238,18 @@ public class DebugTabUri implements DebugTab {
     } catch (final ODataException e) {
       expressionJsonString = "Exception in Debug Filter visitor occurred: " + e.getMessage();
     }
-
     gen.writeRawValue(expressionJsonString);
   }
 
   private void appendSelectedPropertiesJson(JsonGenerator gen, List<SelectItem> selectItems) throws IOException {
-    gen.writeFieldName("select");
-
     gen.writeStartArray();
     for (SelectItem selectItem : selectItems) {
-      appendSelectItemJson(gen, selectItem);
+      gen.writeString(getSelectString(selectItem));
     }
     gen.writeEndArray();
   }
 
-  private void appendSelectItemJson(JsonGenerator gen, SelectItem selectItem) throws IOException {
+  private String getSelectString(final SelectItem selectItem) {
     String selectedProperty = "";
     if (selectItem.isStar()) {
       if (selectItem.getAllOperationsInSchemaNameSpace() == null) {
@@ -230,18 +267,93 @@ public class DebugTabUri implements DebugTab {
         first = false;
       }
     }
-
-    gen.writeString(selectedProperty);
+    return selectedProperty;
   }
 
   @Override
   public void appendHtml(final Writer writer) throws IOException {
-    writer.append("<h2>Uri Information</h2>\n")
+    writer.append("<h2>Resource Path</h2>\n")
         .append("<ul class=\"json\">\n<li>\n");
-    JsonGenerator json = new JsonFactory().createGenerator(writer)
-        .setPrettyPrinter(new DefaultPrettyPrinter());
-    appendJson(json);
+    JsonGenerator json = new JsonFactory().createGenerator(writer).setPrettyPrinter(new DefaultPrettyPrinter());
+    appendURIResourceParts(json, uriInfo.getUriResourceParts());
     json.close();
     writer.append("\n</li>\n</ul>\n");
+
+    if (uriInfo.getFilterOption() != null) {
+      writer.append("<h2>Filter Option</h2>\n")
+          .append("<ul class=\"json\">\n<li>\n");
+      json = new JsonFactory().createGenerator(writer);
+      appendJsonExpressionString(json, uriInfo.getFilterOption().getExpression());
+      json.close();
+      writer.append("\n</li>\n</ul>\n");
+    }
+
+    if (uriInfo.getOrderByOption() != null) {
+      writer.append("<h2>OrderBy Option</h2>\n")
+          .append("<ul class=\"json\">\n<li>\n");
+      json = new JsonFactory().createGenerator(writer);
+      appendOrderByItemsJson(json, uriInfo.getOrderByOption().getOrders());
+      json.close();
+      writer.append("\n</li>\n</ul>\n");
+    }
+
+    if (uriInfo.getExpandOption() != null) {
+      writer.append("<h2>Expand Option</h2>\n")
+          .append("<ul class=\"json\">\n<li>\n");
+      json = new JsonFactory().createGenerator(writer);
+      appendExpandedPropertiesJson(json, uriInfo.getExpandOption().getExpandItems());
+      json.close();
+      writer.append("\n</li>\n</ul>\n");
+    }
+
+    if (uriInfo.getSelectOption() != null) {
+      writer.append("<h2>Selected Properties</h2>\n")
+          .append("<ul>\n");
+      for (final SelectItem selectItem : uriInfo.getSelectOption().getSelectItems()) {
+        writer.append("<li>").append(getSelectString(selectItem)).append("</li>\n");
+      }
+      writer.append("</ul>\n");
+    }
+
+    if (uriInfo.getSearchOption() != null) {
+      writer.append("<h2>Search Option</h2>\n")
+          .append("<p>not yet shown here</p>\n");
+    }
+
+    if (uriInfo.getSkipOption() != null
+        || uriInfo.getSkipTokenOption() != null
+        || uriInfo.getTopOption() != null
+        || uriInfo.getCountOption() != null
+        || uriInfo.getFormatOption() != null
+        || uriInfo.getIdOption() != null) {
+      writer.append("<h2>Unstructured System Query Options</h2>\n");
+      DebugResponseHelperImpl.appendHtmlTable(writer, getQueryOptionsMap(Arrays.asList(
+          uriInfo.getSkipOption(),
+          uriInfo.getSkipTokenOption(),
+          uriInfo.getTopOption(),
+          uriInfo.getCountOption(),
+          uriInfo.getFormatOption(),
+          uriInfo.getIdOption())));
+    }
+
+    if (!uriInfo.getAliases().isEmpty()) {
+      writer.append("<h2>Aliases</h2>\n");
+      DebugResponseHelperImpl.appendHtmlTable(writer, getQueryOptionsMap(uriInfo.getAliases()));
+    }
+
+    if (!uriInfo.getCustomQueryOptions().isEmpty()) {
+      writer.append("<h2>Custom Query Options</h2>\n");
+      DebugResponseHelperImpl.appendHtmlTable(writer, getQueryOptionsMap(uriInfo.getCustomQueryOptions()));
+    }
+  }
+
+  private Map<String, String> getQueryOptionsMap(final List<? extends QueryOption> queryOptions) {
+    Map<String, String> options = new LinkedHashMap<String, String>();
+    for (final QueryOption option : queryOptions) {
+      if (option != null) {
+        options.put(option.getName(), option.getText());
+      }
+    }
+    return options;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java
index 09ef98d..0ca965f 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java
@@ -122,10 +122,9 @@ public class ServerCoreDebugger {
 
   public void stopRuntimeMeasurement(final int handle) {
     if (isDebugMode && handle < runtimeInformation.size()) {
-      long stopTime = System.nanoTime();
       RuntimeMeasurement runtimeMeasurement = runtimeInformation.get(handle);
       if (runtimeMeasurement != null) {
-        runtimeMeasurement.setTimeStopped(stopTime);
+        runtimeMeasurement.setTimeStopped(System.nanoTime());
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java
index 7c54f1d..df6b4cc 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java
@@ -25,15 +25,22 @@ import java.io.InputStreamReader;
 import java.io.StringWriter;
 import java.util.List;
 
+import org.apache.olingo.commons.api.data.Parameter;
+import org.apache.olingo.commons.api.data.ValueType;
+import org.apache.olingo.commons.api.edm.EdmParameter;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
+import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.server.api.deserializer.DeserializerException;
 import org.apache.olingo.server.api.deserializer.FixedFormatDeserializer;
 import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException;
 import org.apache.olingo.server.api.deserializer.batch.BatchOptions;
 import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart;
 import org.apache.olingo.server.core.deserializer.batch.BatchParser;
+import org.apache.olingo.server.core.deserializer.json.ODataJsonDeserializer;
 
 public class FixedFormatDeserializerImpl implements FixedFormatDeserializer {
 
@@ -80,6 +87,36 @@ public class FixedFormatDeserializerImpl implements FixedFormatDeserializer {
   }
 
   @Override
+  public Parameter parameter(final String content, final EdmParameter parameter) throws DeserializerException {
+    final EdmType type = parameter.getType();
+    final EdmTypeKind kind = type.getKind();
+    if ((kind == EdmTypeKind.PRIMITIVE || kind == EdmTypeKind.DEFINITION || kind == EdmTypeKind.ENUM)
+        && !parameter.isCollection()) {
+      // The content is a primitive URI literal.
+      Parameter result = new Parameter();
+      result.setName(parameter.getName());
+      result.setType(type.getFullQualifiedName().getFullQualifiedNameAsString());
+      final EdmPrimitiveType primitiveType = (EdmPrimitiveType) type;
+      try {
+        result.setValue(type.getKind() == EdmTypeKind.ENUM ? ValueType.ENUM : ValueType.PRIMITIVE,
+            primitiveType.valueOfString(primitiveType.fromUriLiteral(content),
+                parameter.isNullable(), parameter.getMaxLength(), parameter.getPrecision(), parameter.getScale(), true,
+                parameter.getMapping() == null ?
+                    primitiveType.getDefaultType() :
+                    parameter.getMapping().getMappedJavaClass()));
+      } catch (final EdmPrimitiveTypeException e) {
+        throw new DeserializerException(
+            "Invalid value '" + content + "' for parameter " + parameter.getName(), e,
+            DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, parameter.getName());
+      }
+      return result;
+    } else {
+      // The content is a JSON array or object.
+      return new ODataJsonDeserializer(ContentType.JSON).parameter(content, parameter);
+    }
+  }
+
+  @Override
   public List<BatchRequestPart> parseBatchRequest(final InputStream content, final String boundary,
       final BatchOptions options)
       throws BatchDeserializerException {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/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 efe1531..9639b3d 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
@@ -107,21 +107,9 @@ public class ODataJsonDeserializer implements ODataDeserializer {
           DeserializerException.MessageKeys.VALUE_ARRAY_NOT_PRESENT);
     }
 
-    final List<String> toRemove = new ArrayList<String>();
-    Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields();
-    while (fieldsIterator.hasNext()) {
-      Map.Entry<String, JsonNode> field = fieldsIterator.next();
-
-      if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) {
-        // Control Information is ignored for requests as per specification chapter "4.5 Control Information"
-        toRemove.add(field.getKey());
-      } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) {
-        throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported",
-            DeserializerException.MessageKeys.NOT_IMPLEMENTED);
-      }
+    if (tree.isObject()) {
+      removeAnnotations(tree);
     }
-    // remove here to avoid iterator issues.
-    tree.remove(toRemove);
     assertJsonNodeIsEmpty(tree);
 
     return entitySet;
@@ -186,21 +174,9 @@ public class ODataJsonDeserializer implements ODataDeserializer {
       ObjectNode tree = parseJsonTree(stream);
       Map<String, Parameter> parameters = consumeParameters(edmAction, tree);
 
-      final List<String> toRemove = new ArrayList<String>();
-      Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields();
-      while (fieldsIterator.hasNext()) {
-        Map.Entry<String, JsonNode> field = fieldsIterator.next();
-
-        if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) {
-          // Control Information is ignored for requests as per specification chapter "4.5 Control Information"
-          toRemove.add(field.getKey());
-        } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) {
-          throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported",
-              DeserializerException.MessageKeys.NOT_IMPLEMENTED);
-        }
+      if (tree.isObject()) {
+        removeAnnotations(tree);
       }
-      // remove here to avoid iterator issues.
-      tree.remove(toRemove);
       assertJsonNodeIsEmpty(tree);
       return DeserializerResultImpl.with().actionParameters(parameters).build();
 
@@ -209,7 +185,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
     }
   }
 
-  private ObjectNode parseJsonTree(final InputStream stream) throws IOException, DeserializerException {
+  private ObjectNode parseJsonTree(InputStream stream) throws IOException, DeserializerException {
     ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.configure(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY, true);
     JsonParser parser = new JsonFactory(objectMapper).createParser(stream);
@@ -251,8 +227,8 @@ public class ODataJsonDeserializer implements ODataDeserializer {
     return parameters;
   }
 
-  private Parameter createParameter(JsonNode node, String paramName, EdmParameter edmParameter) throws
-      DeserializerException {
+  private Parameter createParameter(JsonNode node, final String paramName, final EdmParameter edmParameter)
+      throws DeserializerException {
     Parameter parameter = new Parameter();
     parameter.setName(paramName);
     if (node == null || node.isNull()) {
@@ -285,6 +261,28 @@ public class ODataJsonDeserializer implements ODataDeserializer {
     return parameter;
   }
 
+  /** Reads a parameter value from a String. */
+  public Parameter parameter(final String content, final EdmParameter parameter) throws DeserializerException {
+    try {
+      JsonParser parser = new JsonFactory(new ObjectMapper()
+          .configure(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY, true))
+          .createParser(content);
+      JsonNode node = parser.getCodec().readTree(parser);
+      if (node == null) {
+        throw new DeserializerException("Invalid JSON syntax.",
+            DeserializerException.MessageKeys.JSON_SYNTAX_EXCEPTION);
+      }
+      final Parameter result = createParameter(node, parameter.getName(), parameter);
+      if (node.isObject()) {
+        removeAnnotations((ObjectNode) node);
+        assertJsonNodeIsEmpty(node);
+      }
+      return result;
+    } catch (final IOException e) {
+      throw wrapParseException(e);
+    }
+  }
+
   /**
    * Consumes all remaining fields of Json ObjectNode and tries to map found values
    * to according Entity fields and omits OData fields to be ignored (e.g., control information).
@@ -305,16 +303,12 @@ public class ODataJsonDeserializer implements ODataDeserializer {
         Link bindingLink = consumeBindingLink(field.getKey(), field.getValue(), edmEntityType);
         entity.getNavigationBindings().add(bindingLink);
         toRemove.add(field.getKey());
-      } else if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) {
-        // Control Information is ignored for requests as per specification chapter "4.5 Control Information"
-        toRemove.add(field.getKey());
-      } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) {
-        throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported",
-            DeserializerException.MessageKeys.NOT_IMPLEMENTED);
       }
     }
     // remove here to avoid iterator issues.
     node.remove(toRemove);
+
+    removeAnnotations(node);
   }
 
   private void consumeEntityProperties(final EdmEntityType edmEntityType, final ObjectNode node,
@@ -492,22 +486,8 @@ public class ODataJsonDeserializer implements ODataDeserializer {
     // read and add all complex properties
     ComplexValue value = readComplexValue(name, type, isNullable, jsonNode);
 
-    final List<String> toRemove = new ArrayList<String>();
-    Iterator<Entry<String, JsonNode>> fieldsIterator = jsonNode.fields();
-    while (fieldsIterator.hasNext()) {
-      Entry<String, JsonNode> field = fieldsIterator.next();
-
-      if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) {
-        // Control Information is ignored for requests as per specification chapter "4.5 Control Information"
-        toRemove.add(field.getKey());
-      } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) {
-        throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported",
-            DeserializerException.MessageKeys.NOT_IMPLEMENTED);
-      }
-    }
-    // remove here to avoid iterator issues.
-    if (!jsonNode.isNull()) {
-      ((ObjectNode) jsonNode).remove(toRemove);
+    if (jsonNode.isObject()) {
+      removeAnnotations((ObjectNode) jsonNode);
     }
     // Afterwards the node must be empty
     assertJsonNodeIsEmpty(jsonNode);
@@ -653,6 +633,24 @@ public class ODataJsonDeserializer implements ODataDeserializer {
     }
   }
 
+  private void removeAnnotations(ObjectNode tree) throws DeserializerException {
+    List<String> toRemove = new ArrayList<String>();
+    Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields();
+    while (fieldsIterator.hasNext()) {
+      Map.Entry<String, JsonNode> field = fieldsIterator.next();
+
+      if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) {
+        // Control Information is ignored for requests as per specification chapter "4.5 Control Information"
+        toRemove.add(field.getKey());
+      } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) {
+        throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported",
+            DeserializerException.MessageKeys.NOT_IMPLEMENTED);
+      }
+    }
+    // remove here to avoid iterator issues.
+    tree.remove(toRemove);
+  }
+
   /**
    * Validates that node is empty (<code>node.size() == 0</code>).
    * @param node node to be checked

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
index 0aff5b6..bc396f7 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
@@ -19,7 +19,6 @@
 package org.apache.olingo.server.core.uri;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -36,8 +35,8 @@ import org.apache.olingo.server.api.uri.UriInfoKind;
 import org.apache.olingo.server.api.uri.UriInfoMetadata;
 import org.apache.olingo.server.api.uri.UriInfoResource;
 import org.apache.olingo.server.api.uri.UriInfoService;
-import org.apache.olingo.server.api.uri.UriParameter;
 import org.apache.olingo.server.api.uri.UriResource;
+import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.CountOption;
 import org.apache.olingo.server.api.uri.queryoption.CustomQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.ExpandOption;
@@ -45,6 +44,7 @@ import org.apache.olingo.server.api.uri.queryoption.FilterOption;
 import org.apache.olingo.server.api.uri.queryoption.FormatOption;
 import org.apache.olingo.server.api.uri.queryoption.IdOption;
 import org.apache.olingo.server.api.uri.queryoption.OrderByOption;
+import org.apache.olingo.server.api.uri.queryoption.QueryOption;
 import org.apache.olingo.server.api.uri.queryoption.SearchOption;
 import org.apache.olingo.server.api.uri.queryoption.SelectOption;
 import org.apache.olingo.server.api.uri.queryoption.SkipOption;
@@ -52,9 +52,6 @@ import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
 import org.apache.olingo.server.api.uri.queryoption.TopOption;
-import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.QueryOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.SystemQueryOptionImpl;
 
 public class UriInfoImpl implements UriInfo {
 
@@ -63,16 +60,25 @@ public class UriInfoImpl implements UriInfo {
   private List<String> entitySetNames = new ArrayList<String>(); // for $entity
   private EdmEntityType entityTypeCast; // for $entity
 
-  private List<CustomQueryOptionImpl> customQueryOptions = new ArrayList<CustomQueryOptionImpl>();
-  private Map<String, UriParameter> aliasValues = new HashMap<String, UriParameter>();
-  
+  private UriResource lastResourcePart;
+  private List<UriResource> pathParts = new ArrayList<UriResource>();
+
   private Map<SystemQueryOptionKind, SystemQueryOption> systemQueryOptions =
       new HashMap<SystemQueryOptionKind, SystemQueryOption>();
+  private Map<String, AliasQueryOption> aliases = new HashMap<String, AliasQueryOption>();
+  private List<CustomQueryOption> customQueryOptions = new ArrayList<CustomQueryOption>();
 
   private String fragment;
 
-  private UriResource lastResourcePart;
-  private List<UriResource> pathParts = new ArrayList<UriResource>();
+  public UriInfoImpl setKind(final UriInfoKind kind) {
+    this.kind = kind;
+    return this;
+  }
+
+  @Override
+  public UriInfoKind getKind() {
+    return kind;
+  }
 
   @Override
   public UriInfoAll asUriInfoAll() {
@@ -95,6 +101,11 @@ public class UriInfoImpl implements UriInfo {
   }
 
   @Override
+  public UriInfoService asUriInfoService() {
+    return this;
+  }
+
+  @Override
   public UriInfoMetadata asUriInfoMetadata() {
     return this;
   }
@@ -104,60 +115,90 @@ public class UriInfoImpl implements UriInfo {
     return this;
   }
 
+  public UriInfoImpl addEntitySetName(final String entitySet) {
+    entitySetNames.add(entitySet);
+    return this;
+  }
+
   @Override
   public List<String> getEntitySetNames() {
     return Collections.unmodifiableList(entitySetNames);
   }
 
-  public void addEntitySetName(final String entitySet) {
-    entitySetNames.add(entitySet);
+  public UriInfoImpl setEntityTypeCast(final EdmEntityType type) {
+    entityTypeCast = type;
+    return this;
   }
 
   @Override
-  public List<UriResource> getUriResourceParts() {
-    List<UriResource> returnList = new ArrayList<UriResource>();
-    for (UriResource item : pathParts) {
-      returnList.add(item);
-    }
-    return Collections.unmodifiableList(returnList);
+  public EdmEntityType getEntityTypeCast() {
+    return entityTypeCast;
   }
 
-  public UriInfoImpl addResourcePart(final UriResourceImpl uriPathInfo) {
+  public UriInfoImpl addResourcePart(final UriResource uriPathInfo) {
     pathParts.add(uriPathInfo);
     lastResourcePart = uriPathInfo;
     return this;
   }
 
-  @Override
-  public List<CustomQueryOption> getCustomQueryOptions() {
-    List<CustomQueryOption> retList = new ArrayList<CustomQueryOption>();
-    for (CustomQueryOptionImpl item : customQueryOptions) {
-      retList.add(item);
-    }
-    return retList;
+  public UriInfoImpl removeResourcePart(final int index) {
+    pathParts.remove(index);
+    return this;
   }
 
-  @Override
-  public String getValueForAlias(final String alias) {
-    final UriParameter parameter = aliasValues.get(alias);
-    return parameter == null ? null : parameter.getText();
+  public UriResource getLastResourcePart() {
+    return lastResourcePart;
   }
 
-  public UriParameter getAlias(final String key) {
-    return aliasValues.get(key);
-  }
-  
-  public void addAlias(final String key, UriParameter parameter) {
-    aliasValues.put(key, parameter);
-  }
-  
   @Override
-  public EdmEntityType getEntityTypeCast() {
-    return entityTypeCast;
+  public List<UriResource> getUriResourceParts() {
+    return Collections.unmodifiableList(pathParts);
   }
 
-  public UriInfoImpl setEntityTypeCast(final EdmEntityType type) {
-    entityTypeCast = type;
+  public UriInfoImpl setQueryOptions(final List<QueryOption> list) {
+    for (final QueryOption item : list) {
+      if (item instanceof SystemQueryOption) {
+        setSystemQueryOption((SystemQueryOption) item);
+      } else if (item instanceof AliasQueryOption) {
+        addAlias((AliasQueryOption) item);
+      } else if (item instanceof CustomQueryOption) {
+        addCustomQueryOption((CustomQueryOption) item);
+      }
+    }
+    return this;
+  }
+
+  /**
+   * Adds system query option.
+   * @param systemOption the option to be added
+   * @return this object for method chaining
+   * @throws ODataRuntimeException if an unsupported option is provided
+   * or an option of this kind has been added before
+   */
+  public UriInfoImpl setSystemQueryOption(final SystemQueryOption systemOption) {
+    final SystemQueryOptionKind kind = systemOption.getKind();
+    if (systemQueryOptions.containsKey(kind)) {
+      throw new ODataRuntimeException("Double System Query Option: " + systemOption.getName());
+    }
+
+    switch (kind) {
+    case EXPAND:
+    case FILTER:
+    case FORMAT:
+    case ID:
+    case COUNT:
+    case ORDERBY:
+    case SEARCH:
+    case SELECT:
+    case SKIP:
+    case SKIPTOKEN:
+    case TOP:
+    case LEVELS:
+      systemQueryOptions.put(kind, systemOption);
+      break;
+    default:
+      throw new ODataRuntimeException("Unsupported System Query Option: " + systemOption.getName());
+    }
     return this;
   }
 
@@ -187,27 +228,12 @@ public class UriInfoImpl implements UriInfo {
   }
 
   @Override
-  public UriInfoKind getKind() {
-    return kind;
-  }
-
-  public UriInfoImpl setKind(final UriInfoKind kind) {
-    this.kind = kind;
-    return this;
-  }
-
-  public UriResource getLastResourcePart() {
-    return lastResourcePart;
-  }
-
-  @Override
   public OrderByOption getOrderByOption() {
     return (OrderByOption) systemQueryOptions.get(SystemQueryOptionKind.ORDERBY);
   }
 
   @Override
   public SearchOption getSearchOption() {
-
     return (SearchOption) systemQueryOptions.get(SystemQueryOptionKind.SEARCH);
   }
 
@@ -231,64 +257,39 @@ public class UriInfoImpl implements UriInfo {
     return (TopOption) systemQueryOptions.get(SystemQueryOptionKind.TOP);
   }
 
-  public UriInfoImpl setQueryOptions(final List<QueryOptionImpl> list) {
+  @Override
+  public List<SystemQueryOption> getSystemQueryOptions() {
+    return Collections.unmodifiableList(new ArrayList<SystemQueryOption>(systemQueryOptions.values()));
+  }
 
-    for (QueryOptionImpl item : list) {
-      if (item instanceof SystemQueryOptionImpl) {
-        setSystemQueryOption((SystemQueryOptionImpl) item);
-      } else if (item instanceof CustomQueryOptionImpl) {
-        addCustomQueryOption((CustomQueryOptionImpl) item);
-      }
-    }
+  public UriInfoImpl addAlias(final AliasQueryOption alias) {
+    aliases.put(alias.getName(), alias);
     return this;
   }
 
-  public void addCustomQueryOption(final CustomQueryOptionImpl item) {
-    customQueryOptions.add(item);
+  @Override
+  public String getValueForAlias(final String alias) {
+    final AliasQueryOption aliasQueryOption = getAlias(alias);
+    return aliasQueryOption == null ? null : aliasQueryOption.getText();
   }
 
-  /**
-   * Adds system query option.
-   * @param systemOption the option to be added
-   * @return this object for method chaining
-   * @throws ODataRuntimeException if an unsupported option is provided
-   * or an option of this kind has been added before
-   */
-  public UriInfoImpl setSystemQueryOption(final SystemQueryOption systemOption) {
-    final SystemQueryOptionKind kind = systemOption.getKind();
-    if (systemQueryOptions.containsKey(kind)) {
-      throw new ODataRuntimeException("Double System Query Option: " + systemOption.getName());
-    }
-
-    switch (kind) {
-      case EXPAND:
-      case FILTER:
-      case FORMAT:
-      case ID:
-      case COUNT:
-      case ORDERBY:
-      case SEARCH:
-      case SELECT:
-      case SKIP:
-      case SKIPTOKEN:
-      case TOP:
-      case LEVELS:
-        systemQueryOptions.put(kind, systemOption);
-        break;
-      default:
-        throw new ODataRuntimeException("Unsupported System Query Option: " + systemOption.getName());
-    }
-    return this;
+  public AliasQueryOption getAlias(final String key) {
+    return aliases.get(key);
   }
 
   @Override
-  public UriInfoService asUriInfoService() {
+  public List<AliasQueryOption> getAliases() {
+    return Collections.unmodifiableList(new ArrayList<AliasQueryOption>(aliases.values()));
+  }
+
+  public UriInfoImpl addCustomQueryOption(final CustomQueryOption item) {
+    customQueryOptions.add(item);
     return this;
   }
 
   @Override
-  public String getFragment() {
-    return fragment;
+  public List<CustomQueryOption> getCustomQueryOptions() {
+    return Collections.unmodifiableList(customQueryOptions);
   }
 
   public UriInfoImpl setFragment(final String fragment) {
@@ -296,12 +297,8 @@ public class UriInfoImpl implements UriInfo {
     return this;
   }
 
-  public void removeResourcePart(final int index) {
-    pathParts.remove(index);
-  }
-
   @Override
-  public Collection<SystemQueryOption> getSystemQueryOptions() {
-    return Collections.unmodifiableCollection(systemQueryOptions.values());
+  public String getFragment() {
+    return fragment;
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java
index ddbcd57..b650cc5 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java
@@ -20,7 +20,6 @@ package org.apache.olingo.server.core.uri;
 
 import org.apache.olingo.server.api.uri.UriParameter;
 import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
 
 public class UriParameterImpl implements UriParameter {
   private String name;
@@ -64,7 +63,7 @@ public class UriParameterImpl implements UriParameter {
     return expression;
   }
 
-  public UriParameterImpl setExpression(final ExpressionImpl expression) {
+  public UriParameterImpl setExpression(final Expression expression) {
     this.expression = expression;
     return this;
   }
@@ -74,7 +73,7 @@ public class UriParameterImpl implements UriParameter {
     return referencedProperty;
   }
 
-  public UriParameterImpl setRefencedProperty(final String referencedProperty) {
+  public UriParameterImpl setReferencedProperty(final String referencedProperty) {
     this.referencedProperty = referencedProperty;
     return this;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java
index 008d693..4126110 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java
@@ -76,12 +76,12 @@ public class UriResourceActionImpl extends UriResourceImpl implements UriResourc
   }
   
   @Override
-  public String getSegmentValue(final boolean includeFilters){
+  public String getSegmentValue(final boolean includeFilters) {
     return actionImport == null ? (action == null ? "" : action.getName()) : actionImport.getName();
   }
 
   @Override
-  public String getSegmentValue(){
+  public String getSegmentValue() {
     return getSegmentValue(false);
   }
   

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java
index 4cf1536..a47a6ab 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java
@@ -18,7 +18,6 @@
  */
 package org.apache.olingo.server.core.uri;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -47,7 +46,7 @@ public class UriResourceFunctionImpl extends UriResourceWithKeysImpl implements
   public List<UriParameter> getParameters() {
     return parameters == null ?
         Collections.<UriParameter> emptyList() :
-        new ArrayList<UriParameter>(parameters);
+        Collections.unmodifiableList(parameters);
   }
 
   public UriResourceFunctionImpl setParameters(final List<UriParameter> parameters) {
@@ -71,9 +70,9 @@ public class UriResourceFunctionImpl extends UriResourceWithKeysImpl implements
     return functionImport;
   }
 
-  public UriResourceFunctionImpl setFunctionImport(final EdmFunctionImport edmFI,
+  public UriResourceFunctionImpl setFunctionImport(final EdmFunctionImport edmFunctionImport,
       final List<UriParameter> parameters) {
-    functionImport = edmFI;
+    functionImport = edmFunctionImport;
     setParameters(parameters);
     return this;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
index 8732341..c5857c7 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
@@ -39,10 +39,13 @@ import org.apache.olingo.server.api.uri.UriResourceCount;
 import org.apache.olingo.server.api.uri.UriResourcePartTyped;
 import org.apache.olingo.server.api.uri.UriResourceRef;
 import org.apache.olingo.server.api.uri.UriResourceValue;
+import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption;
+import org.apache.olingo.server.api.uri.queryoption.CustomQueryOption;
+import org.apache.olingo.server.api.uri.queryoption.FilterOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
+import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
 import org.apache.olingo.server.core.uri.UriInfoImpl;
-import org.apache.olingo.server.core.uri.UriParameterImpl;
 import org.apache.olingo.server.core.uri.antlr.UriLexer;
 import org.apache.olingo.server.core.uri.antlr.UriParserParser;
 import org.apache.olingo.server.core.uri.antlr.UriParserParser.AllEOFContext;
@@ -55,6 +58,7 @@ import org.apache.olingo.server.core.uri.antlr.UriParserParser.MetadataEOFContex
 import org.apache.olingo.server.core.uri.antlr.UriParserParser.OrderByEOFContext;
 import org.apache.olingo.server.core.uri.antlr.UriParserParser.PathSegmentEOFContext;
 import org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectEOFContext;
+import org.apache.olingo.server.core.uri.queryoption.AliasQueryOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.CountOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.ExpandOptionImpl;
@@ -66,7 +70,6 @@ import org.apache.olingo.server.core.uri.queryoption.SelectOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.SkipOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.SkipTokenOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
 
 public class Parser {
   private static final String ATOM = "atom";
@@ -274,30 +277,25 @@ public class Parser {
             throw new UriParserSyntaxException("Double system query option!", e,
                 UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION, option.name);
           }
-        } else {
-          if (option.name.startsWith(AT)) {
+        } else if (option.name.startsWith(AT)) {
+          if (context.contextUriInfo.getAlias(option.name) == null) {
             final FilterExpressionEOFContext filterExpCtx =
                 (FilterExpressionEOFContext) parseRule(option.value, ParserEntryRules.FilterExpression);
-            final ExpressionImpl expression = (ExpressionImpl)((FilterOptionImpl) uriParseTreeVisitor
-                .visitFilterExpressionEOF(filterExpCtx)).getExpression();
-
-            final UriParameterImpl parameter = new UriParameterImpl();
-            parameter.setAlias(option.name);
-            parameter.setExpression(expression);
-            parameter.setText(NULL.equals(option.value) ? null : option.value);
-            
-            if(context.contextUriInfo.getAlias(option.name) == null) {
-              context.contextUriInfo.addAlias(option.name, parameter);
-            } else {
-              throw new UriParserSyntaxException("Alias already specified! Name: " + option.name, 
-                  UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS, option.name);
-            }
+            final Expression expression = ((FilterOption) uriParseTreeVisitor.visitFilterExpressionEOF(filterExpCtx))
+                .getExpression();
+            context.contextUriInfo.addAlias((AliasQueryOption) new AliasQueryOptionImpl()
+                .setAliasValue(expression)
+                .setName(option.name)
+                .setText(NULL.equals(option.value) ? null : option.value));
+          } else {
+            throw new UriParserSyntaxException("Alias already specified! Name: " + option.name,
+                UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS, option.name);
           }
-          
-          final CustomQueryOptionImpl customOption = new CustomQueryOptionImpl();
-          customOption.setName(option.name);
-          customOption.setText(option.value);
-          context.contextUriInfo.addCustomQueryOption(customOption);
+        } else {
+          context.contextUriInfo.addCustomQueryOption((CustomQueryOption)
+              new CustomQueryOptionImpl()
+                  .setName(option.name)
+                  .setText(option.value));
         }
       }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
index c155355..1e33a19 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
@@ -1473,11 +1473,10 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
 
   @Override
   public Object visitInlinecount(final InlinecountContext ctx) {
-    CountOptionImpl inlineCount = new CountOptionImpl();
-
-    String text = ctx.children.get(2).getText();
-
-    return inlineCount.setValue(text.toLowerCase().equals("true") ? true : false).setText(text);
+    final String text = ctx.children.get(2).getText();
+    return new CountOptionImpl()
+        .setValue(text.equalsIgnoreCase("true") ? true : false)
+        .setText(text);
   }
 
   @Override
@@ -1700,7 +1699,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
         for (String item : lastKeyPredicates) {
           String property = partner.getReferencingPropertyName(item);
           if (property != null) {
-            list.add(new UriParameterImpl().setName(item).setRefencedProperty(property));
+            list.add(new UriParameterImpl().setName(item).setReferencedProperty(property));
           } else {
             if (missedKey == null) {
               missedKey = item;
@@ -1803,7 +1802,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
             String property = partner.getReferencingPropertyName(key);
             if (property != null) {
               // store the key name as referenced property
-              list.add(0, new UriParameterImpl().setName(key).setRefencedProperty(property));
+              list.add(0, new UriParameterImpl().setName(key).setReferencedProperty(property));
             }
           }
         }
@@ -2408,20 +2407,16 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
 
   @Override
   public Object visitSkip(final SkipContext ctx) {
-    SkipOptionImpl skiptoken = new SkipOptionImpl();
-
-    String text = ctx.children.get(2).getText();
-
-    return skiptoken.setValue(Integer.parseInt(text)).setText(text);
+    final String text = ctx.children.get(2).getText();
+    return new SkipOptionImpl()
+        .setValue(Integer.parseInt(text))
+        .setText(text);
   }
 
   @Override
   public Object visitSkiptoken(final SkiptokenContext ctx) {
-    SkipTokenOptionImpl skiptoken = new SkipTokenOptionImpl();
-
-    String text = ctx.children.get(2).getText();
-
-    return skiptoken.setValue(text).setText(text);
+    final String text = ctx.children.get(2).getText();
+    return new SkipTokenOptionImpl().setValue(text).setText(text);
   }
 
   @Override
@@ -2456,11 +2451,10 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
 
   @Override
   public Object visitTop(final TopContext ctx) {
-    TopOptionImpl top = new TopOptionImpl();
-
-    String text = ctx.children.get(2).getText();
-
-    return top.setValue(Integer.parseInt(text)).setText(text);
+    final String text = ctx.children.get(2).getText();
+    return new TopOptionImpl()
+        .setValue(Integer.parseInt(text))
+        .setText(text);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java
index a4df652..3a4fdf1 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java
@@ -30,7 +30,7 @@ public class AliasQueryOptionImpl extends QueryOptionImpl implements AliasQueryO
     return aliasValue;
   }
 
-  public AliasQueryOption setAliasValue(final Expression aliasValue) {
+  public AliasQueryOptionImpl setAliasValue(final Expression aliasValue) {
     this.aliasValue = aliasValue;
     return this;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java
index 1e1542e..bb4986d 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.server.core.uri.queryoption;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.olingo.server.api.uri.queryoption.ExpandItem;
@@ -39,11 +40,7 @@ public class ExpandOptionImpl extends SystemQueryOptionImpl implements ExpandOpt
 
   @Override
   public List<ExpandItem> getExpandItems() {
-    List<ExpandItem> retList = new ArrayList<ExpandItem>();
-    for (ExpandItem item : expandItems) {
-      retList.add(item);
-    }
-    return retList;
+    return Collections.unmodifiableList(expandItems);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java
index a0baad7..607afbb 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java
@@ -22,20 +22,19 @@ import org.apache.olingo.server.api.uri.queryoption.FormatOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
 
 public class FormatOptionImpl extends SystemQueryOptionImpl implements FormatOption {
-  private String value;
 
   public FormatOptionImpl() {
     setKind(SystemQueryOptionKind.FORMAT);
   }
 
   public FormatOptionImpl setFormat(final String value) {
-    this.value = value;
+    setText(value);
     return this;
   }
 
   @Override
   public String getFormat() {
-    return value;
+    return getText();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java
index f7df825..309b30a 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java
@@ -22,19 +22,18 @@ import org.apache.olingo.server.api.uri.queryoption.IdOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
 
 public class IdOptionImpl extends SystemQueryOptionImpl implements IdOption {
-  private String value;
 
   public IdOptionImpl() {
     setKind(SystemQueryOptionKind.ID);
   }
 
   public IdOptionImpl setValue(final String value) {
-    this.value = value;
+    setText(value);
     return this;
   }
 
   @Override
   public String getValue() {
-    return value;
+    return getText();
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java
index 53f7225..5ff50dc 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.server.core.uri.queryoption;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.olingo.server.api.uri.queryoption.OrderByItem;
@@ -35,11 +36,7 @@ public class OrderByOptionImpl extends SystemQueryOptionImpl implements OrderByO
 
   @Override
   public List<OrderByItem> getOrders() {
-    List<OrderByItem> retList = new ArrayList<OrderByItem>();
-    for (OrderByItem item : orders) {
-      retList.add(item);
-    }
-    return retList;
+    return Collections.unmodifiableList(orders);
   }
 
   public OrderByOptionImpl addOrder(final OrderByItem order) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java
index a9caa47..d9147e5 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java
@@ -18,7 +18,7 @@
  */
 package org.apache.olingo.server.core.uri.queryoption;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.olingo.server.api.uri.queryoption.SelectItem;
@@ -40,11 +40,7 @@ public class SelectOptionImpl extends SystemQueryOptionImpl implements SelectOpt
 
   @Override
   public List<SelectItem> getSelectItems() {
-    List<SelectItem> retList = new ArrayList<SelectItem>();
-    for (SelectItem item : selectItems) {
-      retList.add(item);
-    }
-    return retList;
+    return selectItems == null ? Collections.<SelectItem> emptyList() : Collections.unmodifiableList(selectItems);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java
index f65115c..d440781 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java
@@ -22,7 +22,6 @@ import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
 
 public class SkipTokenOptionImpl extends SystemQueryOptionImpl implements SkipTokenOption {
-  private String skipTokenValue;
 
   public SkipTokenOptionImpl() {
     setKind(SystemQueryOptionKind.SKIPTOKEN);
@@ -30,11 +29,11 @@ public class SkipTokenOptionImpl extends SystemQueryOptionImpl implements SkipTo
 
   @Override
   public String getValue() {
-    return skipTokenValue;
+    return getText();
   }
 
   public SkipTokenOptionImpl setValue(final String skipTokenValue) {
-    this.skipTokenValue = skipTokenValue;
+    setText(skipTokenValue);
     return this;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java
index 8ead93e..ac27a59 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java
@@ -30,7 +30,7 @@ public abstract class SystemQueryOptionImpl extends QueryOptionImpl implements S
     return kind;
   }
 
-  void setKind(final SystemQueryOptionKind kind) {
+  protected void setKind(final SystemQueryOptionKind kind) {
     this.kind = kind;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
index 046edfd..28c6dd7 100644
--- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
+++ b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
@@ -118,7 +118,7 @@ DeserializerException.JSON_SYNTAX_EXCEPTION=The syntax of the JSON document is n
 DeserializerException.INVALID_NULL_PROPERTY=The property '%1$s' must not be null.
 DeserializerException.UNKNOWN_CONTENT='%1$s' can not be mapped as a property or an annotation.
 DeserializerException.INVALID_VALUE_FOR_PROPERTY=Invalid value for property '%1$s'.
-DeserializerException.INVALID_TYPE_FOR_PROPERTY=Invalid JSON type for property '%1$s'.
+DeserializerException.INVALID_JSON_TYPE_FOR_PROPERTY=Invalid JSON type for property '%1$s'.
 DeserializerException.VALUE_ARRAY_NOT_PRESENT=Cannot find the value array. A collection needs at least an empty array. 
 DeserializerException.VALUE_TAG_MUST_BE_AN_ARRAY=Invalid JSON type for the value tag. Must be an Array. 
 DeserializerException.INVALID_ENTITY=Invalid JSON type for an entity. Must be a JSON object.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java
index bc90090..4fae878 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java
@@ -53,19 +53,7 @@ public class ActionData {
     if ("UARTString".equals(name)) {
       return DataCreator.createPrimitive(null, "UARTString string value");
     } else if ("UARTByteNineParam".equals(name)) {
-      short count = 0;  // counts non-empty parameters
-      for (final Parameter parameter : parameters.values()) {
-        if (!(parameter.isNull()
-            || !parameter.isCollection()
-                && (parameter.isComplex() && parameter.asComplex().getValue().isEmpty()
-                    || parameter.isEntity() && ((Entity) parameter.getValue()).getProperties().isEmpty())
-            || parameter.isCollection()
-                && (parameter.isEntity() && ((EntityCollection) parameter.getValue()).getEntities().isEmpty()
-                    || parameter.asCollection().isEmpty()))) {
-          count++;
-        }
-      }
-      return DataCreator.createPrimitive(null, count);
+      return FunctionData.primitiveComplexFunction("UFNRTByteNineParam", parameters, null);
     }
     throw new DataProviderException("Action " + name + " is not yet implemented.",
         HttpStatusCode.NOT_IMPLEMENTED);
@@ -85,7 +73,7 @@ public class ActionData {
                   name + " int16 value: " + param16String,
                   name + " duration value: " + paramDurationString));
         } catch (EdmPrimitiveTypeException e) {
-          throw new DataProviderException("EdmPrimitiveTypeException", e);
+          throw new DataProviderException("EdmPrimitiveTypeException", HttpStatusCode.BAD_REQUEST, e);
         }
       }
       short loopCount = (Short) paramInt16.asPrimitive();
@@ -98,7 +86,7 @@ public class ActionData {
           String value = primDuration.valueToString(duration, false, null, null, null, null);
           collectionValues.add(name + " duration value: " + value);
         } catch (EdmPrimitiveTypeException e) {
-          throw new DataProviderException("EdmPrimitiveTypeException", e);
+          throw new DataProviderException("EdmPrimitiveTypeException", HttpStatusCode.BAD_REQUEST, e);
         }
         duration = duration.add(addValue);
       }
@@ -279,7 +267,7 @@ public class ActionData {
       entity.setId(URI.create(oData.createUriHelper().buildCanonicalURL(
           edm.getEntityContainer().getEntitySet(entitySetName), entity)));
     } catch (final SerializerException e) {
-      throw new DataProviderException("Unable to set entity ID!", e);
+      throw new DataProviderException("Unable to set entity ID!", HttpStatusCode.INTERNAL_SERVER_ERROR, e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
index d91f923..20cbf94 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
@@ -119,7 +119,7 @@ public class DataProvider {
       }
       return null;
     } catch (final EdmPrimitiveTypeException e) {
-      throw new DataProviderException("Wrong key!", e);
+      throw new DataProviderException("Wrong key!", HttpStatusCode.BAD_REQUEST, e);
     }
   }
 
@@ -165,7 +165,7 @@ public class DataProvider {
     try {
       newEntity.setId(URI.create(odata.createUriHelper().buildCanonicalURL(edmEntitySet, newEntity)));
     } catch (final SerializerException e) {
-      throw new DataProviderException("Unable to set entity ID!", e);
+      throw new DataProviderException("Unable to set entity ID!", HttpStatusCode.INTERNAL_SERVER_ERROR, e);
     }
     entities.add(newEntity);
 
@@ -518,48 +518,38 @@ public class DataProvider {
   public EntityCollection readFunctionEntityCollection(final EdmFunction function, final List<UriParameter> parameters,
       final UriInfoResource uriInfo) throws DataProviderException {
     return FunctionData.entityCollectionFunction(function.getName(),
-        getFunctionParameterValues(function, parameters, uriInfo),
+        getFunctionParameters(function, parameters, uriInfo),
         data);
   }
 
   public Entity readFunctionEntity(final EdmFunction function, final List<UriParameter> parameters,
       final UriInfoResource uriInfo) throws DataProviderException {
     return FunctionData.entityFunction(function.getName(),
-        getFunctionParameterValues(function, parameters, uriInfo),
+        getFunctionParameters(function, parameters, uriInfo),
         data);
   }
 
   public Property readFunctionPrimitiveComplex(final EdmFunction function, final List<UriParameter> parameters,
       final UriInfoResource uriInfo) throws DataProviderException {
     return FunctionData.primitiveComplexFunction(function.getName(),
-        getFunctionParameterValues(function, parameters, uriInfo),
+        getFunctionParameters(function, parameters, uriInfo),
         data);
   }
 
-  private Map<String, Object> getFunctionParameterValues(final EdmFunction function,
+  private Map<String, Parameter> getFunctionParameters(final EdmFunction function,
       final List<UriParameter> parameters, final UriInfoResource uriInfo) throws DataProviderException {
-    Map<String, Object> values = new HashMap<String, Object>();
+    Map<String, Parameter> values = new HashMap<String, Parameter>();
     for (final UriParameter parameter : parameters) {
       final EdmParameter edmParameter = function.getParameter(parameter.getName());
       final String text = parameter.getAlias() == null ?
           parameter.getText() :
           uriInfo.getValueForAlias(parameter.getAlias());
       if (text != null) {
-        if (edmParameter.getType().getKind() == EdmTypeKind.PRIMITIVE
-            && !edmParameter.isCollection()) {
-          final EdmPrimitiveType primitiveType = (EdmPrimitiveType) edmParameter.getType();
-          try {
-            values.put(parameter.getName(),
-                primitiveType.valueOfString(primitiveType.fromUriLiteral(text),
-                    edmParameter.isNullable(), edmParameter.getMaxLength(),
-                    edmParameter.getPrecision(), edmParameter.getScale(), null,
-                    primitiveType.getDefaultType()));
-          } catch (final EdmPrimitiveTypeException e) {
-            throw new DataProviderException("Invalid function parameter.", e);
-          }
-        } else {
-          throw new DataProviderException("Non-primitive and collection functionn parameters are not yet supported.",
-              HttpStatusCode.NOT_IMPLEMENTED);
+        try {
+          values.put(parameter.getName(),
+              odata.createFixedFormatDeserializer().parameter(text, edmParameter));
+        } catch (final DeserializerException e) {
+          throw new DataProviderException("Invalid function parameter.", HttpStatusCode.BAD_REQUEST, e);
         }
       }
     }
@@ -654,23 +644,19 @@ public class DataProvider {
         throw new DataProviderException("Entity not found", HttpStatusCode.NOT_FOUND);
       }
     } catch (DeserializerException e) {
-      throw new DataProviderException("Invalid entity-id", HttpStatusCode.BAD_REQUEST);
+      throw new DataProviderException("Invalid entity-id", HttpStatusCode.BAD_REQUEST, e);
     }
   }
 
   public static class DataProviderException extends ODataApplicationException {
     private static final long serialVersionUID = 5098059649321796156L;
 
-    public DataProviderException(final String message, final Throwable throwable) {
-      super(message, HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ROOT, throwable);
-    }
-
-    public DataProviderException(final String message) {
-      this(message, HttpStatusCode.INTERNAL_SERVER_ERROR);
-    }
-
     public DataProviderException(final String message, final HttpStatusCode statusCode) {
       super(message, statusCode.getStatusCode(), Locale.ROOT);
     }
+
+    public DataProviderException(final String message, final HttpStatusCode statusCode, final Throwable throwable) {
+      super(message, statusCode.getStatusCode(), Locale.ROOT, throwable);
+    }
   }
 }