You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/11/20 12:26:32 UTC

olingo-odata4 git commit: [OLINGO-568] validation for system query option $search

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 63db8b36c -> 16a856eae


[OLINGO-568] validation for system query option $search

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/16a856ea
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/16a856ea
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/16a856ea

Branch: refs/heads/master
Commit: 16a856eaea4a7c84df7df3c2268420afc7dd0bdb
Parents: 63db8b3
Author: Klaus Straubinger <kl...@sap.com>
Authored: Fri Nov 20 12:13:58 2015 +0100
Committer: Christian Amend <ch...@sap.com>
Committed: Fri Nov 20 12:26:10 2015 +0100

----------------------------------------------------------------------
 .../core/debug/ExpressionJsonVisitor.java       |  19 +-
 .../server/core/uri/validator/UriValidator.java |   8 +-
 .../core/uri/validator/UriValidatorTest.java    | 313 ++++++++-----------
 3 files changed, 143 insertions(+), 197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16a856ea/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
index 5b8ebc8..cb87b08 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
@@ -52,6 +52,9 @@ public class ExpressionJsonVisitor implements ExpressionVisitor<JsonNode> {
   private static final String STRING_NAME = "String";
   private static final String BOOLEAN_NAME = "Boolean";
   private static final String NUMBER_NAME = "Number";
+  private static final String DATE_NAME = "Date";
+  private static final String TIME_NAME = "TimeOfDay";
+  private static final String DATETIMEOFFSET_NAME = "DateTimeOffset";
   private static final String ENUM_NAME = "enum";
   private static final String VALUES_NAME = "values";
   private static final String NAME_NAME = "name";
@@ -235,6 +238,8 @@ public class ExpressionJsonVisitor implements ExpressionVisitor<JsonNode> {
     case FRACTIONALSECONDS:
     case TOTALOFFSETMINUTES:
     case TOTALSECONDS:
+    case GEODISTANCE:
+    case GEOLENGTH:
       return NUMBER_NAME;
 
     case CONCAT:
@@ -244,14 +249,18 @@ public class ExpressionJsonVisitor implements ExpressionVisitor<JsonNode> {
     case TRIM:
       return STRING_NAME;
 
-    case CAST:
-    case GEODISTANCE:
-    case GEOLENGTH:
-    case MAXDATETIME:
-    case MINDATETIME:
     case DATE:
+      return DATE_NAME;
+
     case TIME:
+      return TIME_NAME;
+
+    case MAXDATETIME:
+    case MINDATETIME:
     case NOW:
+      return DATETIMEOFFSET_NAME;
+
+    case CAST:
     default:
       return UNKNOWN_NAME;
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16a856ea/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
index 39c73da..f840e8e 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
@@ -60,17 +60,17 @@ public class UriValidator {
       /*                         metadata  4 */ { false,   true ,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*                          service  5 */ { false,   true ,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*                        entitySet  6 */ { true ,   true ,   true ,   false,   true ,   true ,    true ,   true ,   true ,   true ,      true  },
-      /*                   entitySetCount  7 */ { true ,   false,   false,   false,   false,   false,    true,    false,   false,   false,      false },
+      /*                   entitySetCount  7 */ { true ,   false,   false,   false,   false,   false,    true ,   false,   false,   false,      false },
       /*                           entity  8 */ { false,   true ,   true ,   false,   false,   false,    false,   true ,   false,   false,      false },
       /*                      mediaStream  9 */ { false,   false,   false,   false,   false,   false,    false,   false,   false,   false,      false },
-      /*                       references 10 */ { true ,   true ,   false,   true,    true ,   true ,    true ,   false,   true ,   true ,      true  },
+      /*                       references 10 */ { true ,   true ,   false,   true ,   true ,   true ,    true ,   false,   true ,   true ,      true  },
       /*                        reference 11 */ { false,   true ,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*                  propertyComplex 12 */ { false,   true ,   true ,   false,   false,   false,    false,   true ,   false,   false,      false },
       /*        propertyComplexCollection 13 */ { true ,   true ,   true ,   false,   true ,   true ,    false,   true ,   true ,   true ,      true  },
-      /*   propertyComplexCollectionCount 14 */ { true ,   false,   false,   false,   false,   false,    true,    false,   false,   false,      false },
+      /*   propertyComplexCollectionCount 14 */ { true ,   false,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*                propertyPrimitive 15 */ { false,   true ,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*      propertyPrimitiveCollection 16 */ { true ,   true ,   false,   false,   true ,   true ,    false,   false,   true ,   true ,      true  },
-      /* propertyPrimitiveCollectionCount 17 */ { true ,   false,   false,   false,   false,   false,    true,    false,   false,   false,      false },
+      /* propertyPrimitiveCollectionCount 17 */ { true ,   false,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*           propertyPrimitiveValue 18 */ { false,   true ,   false,   false,   false,   false,    false,   false,   false,   false,      false },
       /*                             none 19 */ { false,   true ,   false,   false,   false,   false,    false,   false,   false,   false,      false }
     };

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16a856ea/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java
index f1413a8..0e8b2e6 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java
@@ -27,13 +27,11 @@ import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.edmx.EdmxReference;
-import org.apache.olingo.server.api.uri.UriInfo;
 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;
 import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException;
 import org.apache.olingo.server.core.uri.testutil.TestUriValidator;
-import org.apache.olingo.server.tecsvc.provider.ContainerProvider;
 import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
 import org.junit.Test;
 
@@ -41,36 +39,41 @@ public class UriValidatorTest {
 
   private static final String URI_ACTION_NO_RETURN = "AIRT";
   private static final String URI_ACTION_PRIM = "AIRTString";
-  private static final String URI_ACTION_COOL_PRIM = "AIRTCollStringTwoParam";
+  private static final String URI_ACTION_COLL_PRIM = "AIRTCollStringTwoParam";
   private static final String URI_ACTION_CT = "AIRTCTTwoPrimParam";
   private static final String URI_ACTION_COLL_CT = "AIRTCollCTTwoPrimParam";
   private static final String URI_ACTION_ENTITY = "AIRTESAllPrimParam";
   private static final String URI_ACTION_ES = "AIRTCollESAllPrimParam";
+  // TODO: bound actions
+  @SuppressWarnings("unused")
+  private static final String URI_BOUND_ACTION_ENTITY_SET = "ESTwoKeyNav/Namespace1_Alias.BAESTwoKeyNavRTESTwoKeyNav";
+  @SuppressWarnings("unused")
+  private static final String URI_BOUND_ACTION_ENTITY = "ESAllPrim/Namespace1_Alias.BAESAllPrimRTETAllPrim";
   private static final String URI_ALL = "$all";
   private static final String URI_BATCH = "$batch";
   private static final String URI_CROSSJOIN = "$crossjoin(ESAllPrim)";
-  private static final String URI_ENTITY_ID = "/$entity";
+  private static final String URI_ENTITY_ID = "$entity";
   private static final String URI_METADATA = "$metadata";
   private static final String URI_SERVICE = "";
-  private static final String URI_ENTITY_SET = "/ESAllPrim";
-  private static final String URI_ENTITY_SET_COUNT = "/ESAllPrim/$count";
-  private static final String URI_ENTITY = "/ESAllPrim(1)";
-  private static final String URI_MEDIA_STREAM = "/ESMedia(1)/$value";
-  private static final String URI_REFERENCES = "/ESAllPrim/$ref";
-  private static final String URI_REFERENCE = "/ESAllPrim(1)/$ref";
-  private static final String URI_PROPERTY_COMPLEX = "/ESCompComp(1)/PropertyComp";
+  private static final String URI_ENTITY_SET = "ESAllPrim";
+  private static final String URI_ENTITY_SET_COUNT = "ESAllPrim/$count";
+  private static final String URI_ENTITY = "ESAllPrim(1)";
+  private static final String URI_MEDIA_STREAM = "ESMedia(1)/$value";
+  private static final String URI_REFERENCES = "ESAllPrim/$ref";
+  private static final String URI_REFERENCE = "ESAllPrim(1)/$ref";
+  private static final String URI_PROPERTY_COMPLEX = "ESCompComp(1)/PropertyComp";
   private static final String URI_PROPERTY_COMPLEX_COLLECTION =
-      "/ESCompCollComp(1)/PropertyComp/CollPropertyComp";
+      "ESCompCollComp(1)/PropertyComp/CollPropertyComp";
   private static final String URI_PROPERTY_COMPLEX_COLLECTION_COUNT =
-      "/ESCompCollComp(1)/PropertyComp/CollPropertyComp/$count";
-  private static final String URI_PROPERTY_PRIMITIVE = "/ESAllPrim(1)/PropertyString";
-  private static final String URI_PROPERTY_PRIMITIVE_COLLECTION = "/ESCollAllPrim(1)/CollPropertyString";
+      "ESCompCollComp(1)/PropertyComp/CollPropertyComp/$count";
+  private static final String URI_PROPERTY_PRIMITIVE = "ESAllPrim(1)/PropertyString";
+  private static final String URI_PROPERTY_PRIMITIVE_COLLECTION = "ESCollAllPrim(1)/CollPropertyString";
   private static final String URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT =
-      "/ESCollAllPrim(1)/CollPropertyString/$count";
-  private static final String URI_PROPERTY_PRIMITIVE_VALUE = "/ESAllPrim(1)/PropertyString/$value";
-  private static final String URI_SINGLETON = "/SI";
-  private static final String URI_NAV_ENTITY = "/ESKeyNav(1)/NavPropertyETKeyNavOne";
-  private static final String URI_NAV_ENTITY_SET = "/ESKeyNav(1)/NavPropertyETKeyNavMany";
+      "ESCollAllPrim(1)/CollPropertyString/$count";
+  private static final String URI_PROPERTY_PRIMITIVE_VALUE = "ESAllPrim(1)/PropertyString/$value";
+  private static final String URI_SINGLETON = "SI";
+  private static final String URI_NAV_ENTITY = "ESKeyNav(1)/NavPropertyETKeyNavOne";
+  private static final String URI_NAV_ENTITY_SET = "ESKeyNav(1)/NavPropertyETKeyNavMany";
   private static final String URI_FI_ENTITY_SET = "FICRTCollESMedia()";
   private static final String URI_FI_ENTITY = "FICRTETTwoKeyNavParam(ParameterInt16=1)";
   private static final String URI_FI_ENTITY_SET_KEY = "FICRTCollESMedia()(3)";
@@ -81,7 +84,7 @@ public class UriValidatorTest {
   private static final String QO_ID = "$id=Products(0)";
   private static final String QO_COUNT = "$count=true";
   private static final String QO_ORDERBY = "$orderby=true";
-  // private static final String QO_SEARCH = "$search='bla'";
+  private static final String QO_SEARCH = "$search=bla";
   private static final String QO_SELECT = "$select=*";
   private static final String QO_SKIP = "$skip=3";
   private static final String QO_SKIPTOKEN = "$skiptoken=123";
@@ -89,12 +92,12 @@ public class UriValidatorTest {
 
   private final String[][] urisWithValidSystemQueryOptions = {
       { URI_ALL, QO_FILTER }, { URI_ALL, QO_FORMAT }, { URI_ALL, QO_EXPAND }, { URI_ALL, QO_COUNT },
-      { URI_ALL, QO_ORDERBY }, /* { URI_ALL, QO_SEARCH }, */{ URI_ALL, QO_SELECT }, { URI_ALL, QO_SKIP },
+      { URI_ALL, QO_ORDERBY }, { URI_ALL, QO_SEARCH }, { URI_ALL, QO_SELECT }, { URI_ALL, QO_SKIP },
       { URI_ALL, QO_SKIPTOKEN }, { URI_ALL, QO_TOP },
 
       { URI_CROSSJOIN, QO_FILTER }, { URI_CROSSJOIN, QO_FORMAT },
       { URI_CROSSJOIN, QO_EXPAND }, { URI_CROSSJOIN, QO_COUNT }, { URI_CROSSJOIN, QO_ORDERBY },
-      /* { URI_CROSSJOIN, QO_SEARCH }, */{ URI_CROSSJOIN, QO_SELECT }, { URI_CROSSJOIN, QO_SKIP },
+      { URI_CROSSJOIN, QO_SEARCH }, { URI_CROSSJOIN, QO_SELECT }, { URI_CROSSJOIN, QO_SKIP },
       { URI_CROSSJOIN, QO_SKIPTOKEN }, { URI_CROSSJOIN, QO_TOP },
 
       { URI_ENTITY_ID, QO_ID, QO_FORMAT }, { URI_ENTITY_ID, QO_ID }, { URI_ENTITY_ID, QO_ID, QO_EXPAND },
@@ -105,16 +108,16 @@ public class UriValidatorTest {
       { URI_SERVICE, QO_FORMAT },
 
       { URI_ENTITY_SET, QO_FILTER }, { URI_ENTITY_SET, QO_FORMAT }, { URI_ENTITY_SET, QO_EXPAND },
-      { URI_ENTITY_SET, QO_COUNT }, { URI_ENTITY_SET, QO_ORDERBY }, /* { URI_ENTITY_SET, QO_SEARCH }, */
+      { URI_ENTITY_SET, QO_COUNT }, { URI_ENTITY_SET, QO_ORDERBY }, { URI_ENTITY_SET, QO_SEARCH },
       { URI_ENTITY_SET, QO_SELECT }, { URI_ENTITY_SET, QO_SKIP }, { URI_ENTITY_SET, QO_SKIPTOKEN },
       { URI_ENTITY_SET, QO_TOP },
 
-      { URI_ENTITY_SET_COUNT, QO_FILTER }, /* { URI_ENTITY_SET_COUNT, QO_SEARCH }, */
+      { URI_ENTITY_SET_COUNT, QO_FILTER }, { URI_ENTITY_SET_COUNT, QO_SEARCH },
 
       { URI_ENTITY, QO_FORMAT }, { URI_ENTITY, QO_EXPAND }, { URI_ENTITY, QO_SELECT },
 
       { URI_REFERENCES, QO_FILTER }, { URI_REFERENCES, QO_FORMAT }, { URI_REFERENCES, QO_ORDERBY },
-      /* { URI_REFERENCES, QO_SEARCH }, */{ URI_REFERENCES, QO_SKIP }, { URI_REFERENCES, QO_SKIPTOKEN },
+      { URI_REFERENCES, QO_SEARCH }, { URI_REFERENCES, QO_SKIP }, { URI_REFERENCES, QO_SKIPTOKEN },
       { URI_REFERENCES, QO_TOP }, { URI_REFERENCES, QO_ID }, { URI_REFERENCES, QO_COUNT },
 
       { URI_REFERENCE, QO_FORMAT },
@@ -127,7 +130,7 @@ public class UriValidatorTest {
       { URI_PROPERTY_COMPLEX_COLLECTION, QO_SKIP }, { URI_PROPERTY_COMPLEX_COLLECTION, QO_SKIPTOKEN },
       { URI_PROPERTY_COMPLEX_COLLECTION, QO_TOP },
 
-      { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_FILTER }, /* { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_SEARCH }, */
+      { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_FILTER },
 
       { URI_PROPERTY_PRIMITIVE, QO_FORMAT },
 
@@ -137,7 +140,6 @@ public class UriValidatorTest {
       { URI_PROPERTY_PRIMITIVE_COLLECTION, QO_TOP },
 
       { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_FILTER },
-      /* { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_SEARCH }, */
 
       { URI_PROPERTY_PRIMITIVE_VALUE, QO_FORMAT },
 
@@ -147,11 +149,11 @@ public class UriValidatorTest {
 
       { URI_NAV_ENTITY_SET, QO_FILTER }, { URI_NAV_ENTITY_SET, QO_FORMAT }, { URI_NAV_ENTITY_SET, QO_EXPAND },
       { URI_NAV_ENTITY_SET, QO_COUNT }, { URI_NAV_ENTITY_SET, QO_ORDERBY },
-      /* { URI_NAV_ENTITY_SET, QO_SEARCH }, */{ URI_NAV_ENTITY_SET, QO_SELECT }, { URI_NAV_ENTITY_SET, QO_SKIP },
+      { URI_NAV_ENTITY_SET, QO_SEARCH }, { URI_NAV_ENTITY_SET, QO_SELECT }, { URI_NAV_ENTITY_SET, QO_SKIP },
       { URI_NAV_ENTITY_SET, QO_SKIPTOKEN }, { URI_NAV_ENTITY_SET, QO_TOP },
 
       { URI_FI_ENTITY_SET, QO_FILTER }, { URI_FI_ENTITY_SET, QO_FORMAT }, { URI_FI_ENTITY_SET, QO_EXPAND },
-      { URI_FI_ENTITY_SET, QO_COUNT }, { URI_FI_ENTITY_SET, QO_ORDERBY }, /* { URI_FI_ENTITY_SET, QO_SEARCH }, */
+      { URI_FI_ENTITY_SET, QO_COUNT }, { URI_FI_ENTITY_SET, QO_ORDERBY }, { URI_FI_ENTITY_SET, QO_SEARCH },
       { URI_FI_ENTITY_SET, QO_SELECT }, { URI_FI_ENTITY_SET, QO_SKIP }, { URI_FI_ENTITY_SET, QO_SKIPTOKEN },
       { URI_FI_ENTITY_SET, QO_TOP },
 
@@ -161,36 +163,29 @@ public class UriValidatorTest {
       { "FINRTInt16()", QO_FORMAT },
       { "FICRTCollString()", QO_FORMAT },
       { "FICRTCTTwoPrim()", QO_FORMAT },
-      { "FICRTCollCTTwoPrim()", QO_FORMAT },
-
-      { "ESTwoKeyNav/olingo.odata.test1.BAESTwoKeyNavRTESTwoKeyNav" },
-      { "ESAllPrim/olingo.odata.test1.BAESAllPrimRTETAllPrim" },
-      { ContainerProvider.AIRT_COLL_STRING_TWO_PARAM },
-      { ContainerProvider.AIRTET_TWO_KEY_TWO_PRIM_PARAM },
-      { ContainerProvider.AIRT_STRING }
+      { "FICRTCollCTTwoPrim()", QO_FORMAT }
   };
 
   private final String[][] urisWithNonValidSystemQueryOptions = {
       { URI_ALL, QO_ID },
 
       { URI_BATCH, QO_FILTER }, { URI_BATCH, QO_FORMAT }, { URI_BATCH, QO_ID }, { URI_BATCH, QO_EXPAND },
-      { URI_BATCH, QO_COUNT }, { URI_BATCH, QO_ORDERBY }, /* { URI_BATCH, QO_SEARCH }, */{ URI_BATCH, QO_SELECT },
+      { URI_BATCH, QO_COUNT }, { URI_BATCH, QO_ORDERBY }, { URI_BATCH, QO_SEARCH }, { URI_BATCH, QO_SELECT },
       { URI_BATCH, QO_SKIP }, { URI_BATCH, QO_SKIPTOKEN }, { URI_BATCH, QO_TOP },
 
       { URI_CROSSJOIN, QO_ID },
 
       { URI_ENTITY_ID, QO_ID, QO_FILTER },
-      { URI_ENTITY_ID, QO_ID, QO_COUNT }, { URI_ENTITY_ID, QO_ORDERBY }, /* { URI_ENTITY_ID, QO_SEARCH }, */
-
+      { URI_ENTITY_ID, QO_ID, QO_COUNT }, { URI_ENTITY_ID, QO_ORDERBY }, { URI_ENTITY_ID, QO_SEARCH },
       { URI_ENTITY_ID, QO_ID, QO_SKIP }, { URI_ENTITY_ID, QO_ID, QO_SKIPTOKEN }, { URI_ENTITY_ID, QO_ID, QO_TOP },
 
       { URI_METADATA, QO_FILTER }, { URI_METADATA, QO_ID }, { URI_METADATA, QO_EXPAND },
-      { URI_METADATA, QO_COUNT }, { URI_METADATA, QO_ORDERBY }, /* { URI_METADATA, QO_SEARCH }, */
+      { URI_METADATA, QO_COUNT }, { URI_METADATA, QO_ORDERBY }, { URI_METADATA, QO_SEARCH },
       { URI_METADATA, QO_SELECT }, { URI_METADATA, QO_SKIP }, { URI_METADATA, QO_SKIPTOKEN },
       { URI_METADATA, QO_TOP },
 
       { URI_SERVICE, QO_FILTER }, { URI_SERVICE, QO_ID }, { URI_SERVICE, QO_EXPAND }, { URI_SERVICE, QO_COUNT },
-      { URI_SERVICE, QO_ORDERBY }, /* { URI_SERVICE, QO_SEARCH }, */{ URI_SERVICE, QO_SELECT },
+      { URI_SERVICE, QO_ORDERBY }, { URI_SERVICE, QO_SEARCH }, { URI_SERVICE, QO_SELECT },
       { URI_SERVICE, QO_SKIP }, { URI_SERVICE, QO_SKIPTOKEN }, { URI_SERVICE, QO_TOP },
 
       { URI_ENTITY_SET, QO_ID },
@@ -201,63 +196,62 @@ public class UriValidatorTest {
       { URI_ENTITY_SET_COUNT, QO_SELECT }, { URI_ENTITY_SET_COUNT, QO_SKIP }, { URI_ENTITY_SET_COUNT, QO_SKIPTOKEN },
       { URI_ENTITY_SET_COUNT, QO_TOP },
 
-      { URI_ENTITY, QO_FILTER }, { URI_ENTITY, QO_ID }, { URI_ENTITY, QO_COUNT }, /* { URI_ENTITY, QO_ORDERBY }, */
-      /* { URI_ENTITY, QO_SEARCH }, */{ URI_ENTITY, QO_SKIP }, { URI_ENTITY, QO_SKIPTOKEN }, { URI_ENTITY, QO_TOP },
+      { URI_ENTITY, QO_FILTER }, { URI_ENTITY, QO_ID }, { URI_ENTITY, QO_COUNT }, { URI_ENTITY, QO_ORDERBY },
+      { URI_ENTITY, QO_SEARCH }, { URI_ENTITY, QO_SKIP }, { URI_ENTITY, QO_SKIPTOKEN }, { URI_ENTITY, QO_TOP },
 
       { URI_MEDIA_STREAM, QO_FILTER }, { URI_MEDIA_STREAM, QO_FORMAT }, { URI_MEDIA_STREAM, QO_ID },
       { URI_MEDIA_STREAM, QO_EXPAND }, { URI_MEDIA_STREAM, QO_COUNT }, { URI_MEDIA_STREAM, QO_ORDERBY },
-      /* { URI_MEDIA_STREAM, QO_SEARCH }, */{ URI_MEDIA_STREAM, QO_SELECT }, { URI_MEDIA_STREAM, QO_SKIP },
+      { URI_MEDIA_STREAM, QO_SEARCH }, { URI_MEDIA_STREAM, QO_SELECT }, { URI_MEDIA_STREAM, QO_SKIP },
       { URI_MEDIA_STREAM, QO_SKIPTOKEN }, { URI_MEDIA_STREAM, QO_TOP },
 
       { URI_REFERENCES, QO_EXPAND }, { URI_REFERENCES, QO_SELECT },
 
       { URI_REFERENCE, QO_FILTER }, { URI_REFERENCE, QO_ID }, { URI_REFERENCE, QO_EXPAND },
-      { URI_REFERENCE, QO_COUNT }, { URI_REFERENCE, QO_ORDERBY }, /* { URI_REFERENCE, QO_SEARCH }, */
+      { URI_REFERENCE, QO_COUNT }, { URI_REFERENCE, QO_ORDERBY }, { URI_REFERENCE, QO_SEARCH },
       { URI_REFERENCE, QO_SELECT }, { URI_REFERENCE, QO_SKIP }, { URI_REFERENCE, QO_SKIPTOKEN },
       { URI_REFERENCE, QO_TOP },
 
       { URI_PROPERTY_COMPLEX, QO_FILTER }, { URI_PROPERTY_COMPLEX, QO_ID }, { URI_PROPERTY_COMPLEX, QO_COUNT },
-      { URI_PROPERTY_COMPLEX, QO_ORDERBY }, /* { URI_PROPERTY_COMPLEX, QO_SEARCH }, */
+      { URI_PROPERTY_COMPLEX, QO_ORDERBY }, { URI_PROPERTY_COMPLEX, QO_SEARCH },
       { URI_PROPERTY_COMPLEX, QO_SKIP }, { URI_PROPERTY_COMPLEX, QO_SKIPTOKEN }, { URI_PROPERTY_COMPLEX, QO_TOP },
 
-      { URI_PROPERTY_COMPLEX_COLLECTION, QO_ID },
-      /* { URI_PROPERTY_COMPLEX_COLLECTION, QO_SEARCH }, */
+      { URI_PROPERTY_COMPLEX_COLLECTION, QO_ID }, { URI_PROPERTY_COMPLEX_COLLECTION, QO_SEARCH },
 
       { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_FORMAT },
       { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_ID }, { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_EXPAND },
       { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_COUNT }, { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_ORDERBY },
-      { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_SELECT },
+      { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_SEARCH }, { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_SELECT },
       { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_SKIP }, { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_SKIPTOKEN },
       { URI_PROPERTY_COMPLEX_COLLECTION_COUNT, QO_TOP },
 
       { URI_PROPERTY_PRIMITIVE, QO_FILTER }, { URI_PROPERTY_PRIMITIVE, QO_ID }, { URI_PROPERTY_PRIMITIVE, QO_EXPAND },
       { URI_PROPERTY_PRIMITIVE, QO_COUNT }, { URI_PROPERTY_PRIMITIVE, QO_ORDERBY },
-      /* { URI_PROPERTY_PRIMITIVE, QO_SEARCH }, */{ URI_PROPERTY_PRIMITIVE, QO_SELECT },
+      { URI_PROPERTY_PRIMITIVE, QO_SEARCH }, { URI_PROPERTY_PRIMITIVE, QO_SELECT },
       { URI_PROPERTY_PRIMITIVE, QO_SKIP }, { URI_PROPERTY_PRIMITIVE, QO_SKIPTOKEN },
       { URI_PROPERTY_PRIMITIVE, QO_TOP },
 
       { URI_PROPERTY_PRIMITIVE_COLLECTION, QO_ID }, { URI_PROPERTY_PRIMITIVE_COLLECTION, QO_EXPAND },
-      /* { URI_PROPERTY_PRIMITIVE_COLLECTION, QO_SEARCH }, */{ URI_PROPERTY_PRIMITIVE_COLLECTION, QO_SELECT },
+      { URI_PROPERTY_PRIMITIVE_COLLECTION, QO_SEARCH }, { URI_PROPERTY_PRIMITIVE_COLLECTION, QO_SELECT },
 
       { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_FORMAT },
       { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_ID }, { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_EXPAND },
       { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_COUNT },
-      { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_ORDERBY },
+      { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_ORDERBY }, { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_SEARCH },
       { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_SELECT }, { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_SKIP },
       { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_SKIPTOKEN }, { URI_PROPERTY_PRIMITIVE_COLLECTION_COUNT, QO_TOP },
 
       { URI_PROPERTY_PRIMITIVE_VALUE, QO_FILTER }, { URI_PROPERTY_PRIMITIVE_VALUE, QO_ID },
       { URI_PROPERTY_PRIMITIVE_VALUE, QO_EXPAND }, { URI_PROPERTY_PRIMITIVE_VALUE, QO_COUNT },
-      { URI_PROPERTY_PRIMITIVE_VALUE, QO_ORDERBY },/* { URI_PROPERTY_PRIMITIVE_VALUE, QO_SEARCH }, */
+      { URI_PROPERTY_PRIMITIVE_VALUE, QO_ORDERBY }, { URI_PROPERTY_PRIMITIVE_VALUE, QO_SEARCH },
       { URI_PROPERTY_PRIMITIVE_VALUE, QO_SELECT }, { URI_PROPERTY_PRIMITIVE_VALUE, QO_SKIP },
       { URI_PROPERTY_PRIMITIVE_VALUE, QO_SKIPTOKEN }, { URI_PROPERTY_PRIMITIVE_VALUE, QO_TOP },
 
       { URI_SINGLETON, QO_FILTER }, { URI_SINGLETON, QO_ID }, { URI_SINGLETON, QO_COUNT },
-      { URI_SINGLETON, QO_ORDERBY }, /* { URI_SINGLETON, QO_SEARCH }, */{ URI_SINGLETON, QO_SKIP },
+      { URI_SINGLETON, QO_ORDERBY }, { URI_SINGLETON, QO_SEARCH }, { URI_SINGLETON, QO_SKIP },
       { URI_SINGLETON, QO_SKIPTOKEN }, { URI_SINGLETON, QO_TOP },
 
       { URI_NAV_ENTITY, QO_FILTER }, { URI_NAV_ENTITY, QO_ID }, { URI_NAV_ENTITY, QO_COUNT },
-      { URI_NAV_ENTITY, QO_ORDERBY }, /* { URI_NAV_ENTITY, QO_SEARCH }, */{ URI_NAV_ENTITY, QO_SKIP },
+      { URI_NAV_ENTITY, QO_ORDERBY }, { URI_NAV_ENTITY, QO_SEARCH }, { URI_NAV_ENTITY, QO_SKIP },
       { URI_NAV_ENTITY, QO_SKIPTOKEN }, { URI_SINGLETON, QO_TOP },
 
       { URI_NAV_ENTITY_SET, QO_ID },
@@ -265,10 +259,10 @@ public class UriValidatorTest {
       { URI_FI_ENTITY_SET, QO_ID },
 
       { URI_FI_ENTITY, QO_FILTER }, { URI_FI_ENTITY, QO_ID }, { URI_FI_ENTITY, QO_COUNT },
-      { URI_FI_ENTITY, QO_ORDERBY }, /* { URI_FI_ENTITY, QO_SEARCH }, */{ URI_FI_ENTITY, QO_SKIP },
+      { URI_FI_ENTITY, QO_ORDERBY }, { URI_FI_ENTITY, QO_SEARCH }, { URI_FI_ENTITY, QO_SKIP },
       { URI_FI_ENTITY, QO_SKIPTOKEN }, { URI_FI_ENTITY, QO_TOP },
       { URI_FI_ENTITY_SET_KEY, QO_FILTER }, { URI_FI_ENTITY_SET_KEY, QO_ID }, { URI_FI_ENTITY_SET_KEY, QO_COUNT },
-      { URI_FI_ENTITY_SET_KEY, QO_ORDERBY }, /* { URI_FI_ENTITY_SET_KEY, QO_SEARCH }, */
+      { URI_FI_ENTITY_SET_KEY, QO_ORDERBY }, { URI_FI_ENTITY_SET_KEY, QO_SEARCH },
       { URI_FI_ENTITY_SET_KEY, QO_SKIP }, { URI_FI_ENTITY_SET_KEY, QO_SKIPTOKEN }, { URI_FI_ENTITY_SET_KEY, QO_TOP }
   };
 
@@ -278,10 +272,10 @@ public class UriValidatorTest {
       // PrimReturnType
       { URI_ACTION_PRIM, QO_FORMAT },
       // PrimCollectionReturnType
-      { URI_ACTION_COOL_PRIM, QO_FILTER }, { URI_ACTION_COOL_PRIM, QO_FORMAT },
-      { URI_ACTION_COOL_PRIM, QO_COUNT }, { URI_ACTION_COOL_PRIM, QO_ORDERBY },
-      { URI_ACTION_COOL_PRIM, QO_SKIP }, { URI_ACTION_COOL_PRIM, QO_SKIPTOKEN },
-      { URI_ACTION_COOL_PRIM, QO_TOP },
+      { URI_ACTION_COLL_PRIM, QO_FILTER }, { URI_ACTION_COLL_PRIM, QO_FORMAT },
+      { URI_ACTION_COLL_PRIM, QO_COUNT }, { URI_ACTION_COLL_PRIM, QO_ORDERBY },
+      { URI_ACTION_COLL_PRIM, QO_SKIP }, { URI_ACTION_COLL_PRIM, QO_SKIPTOKEN },
+      { URI_ACTION_COLL_PRIM, QO_TOP },
       // ComplexReturnType
       { URI_ACTION_CT, QO_FORMAT }, { URI_ACTION_CT, QO_SELECT }, { URI_ACTION_CT, QO_EXPAND },
       // ComplexCollectionReturnType
@@ -293,169 +287,93 @@ public class UriValidatorTest {
       // EntityReturnType
       { URI_ACTION_ENTITY, QO_FORMAT }, { URI_ACTION_ENTITY, QO_EXPAND }, { URI_ACTION_ENTITY, QO_SELECT },
       // EntityCollectionReturnType
-      { URI_ACTION_ES, QO_FORMAT }, { URI_ACTION_ES, QO_FILTER }, { URI_ENTITY_SET, URI_ACTION_ES },
-      { URI_ACTION_ES, QO_COUNT }, { URI_ACTION_ES, QO_ORDERBY }, /* { URI_ACTION_ES, QO_SEARCH }, */
+      { URI_ACTION_ES, QO_FORMAT }, { URI_ACTION_ES, QO_FILTER },
+      { URI_ACTION_ES, QO_COUNT }, { URI_ACTION_ES, QO_ORDERBY }, { URI_ACTION_ES, QO_SEARCH },
       { URI_ACTION_ES, QO_SELECT }, { URI_ACTION_ES, QO_SKIP }, { URI_ACTION_ES, QO_SKIPTOKEN },
-      { URI_ACTION_ES, QO_TOP },
+      { URI_ACTION_ES, QO_TOP }
   };
 
   private final String[][] actionsWithNotValidSystemQueryOptions = {
       // NoReturnType
       { URI_ACTION_NO_RETURN, QO_FILTER }, { URI_ACTION_NO_RETURN, QO_ID },
       { URI_ACTION_NO_RETURN, QO_EXPAND }, { URI_ACTION_NO_RETURN, QO_COUNT },
-      { URI_ACTION_NO_RETURN, QO_ORDERBY },/* { URI_ACTION_NO_RETURN, QO_SEARCH }, */
+      { URI_ACTION_NO_RETURN, QO_ORDERBY }, { URI_ACTION_NO_RETURN, QO_SEARCH },
       { URI_ACTION_NO_RETURN, QO_SELECT }, { URI_ACTION_NO_RETURN, QO_SKIP },
       { URI_ACTION_NO_RETURN, QO_SKIPTOKEN }, { URI_ACTION_NO_RETURN, QO_TOP },
       // PrimReturnType
       { URI_ACTION_PRIM, QO_FILTER }, { URI_ACTION_PRIM, QO_ID },
       { URI_ACTION_PRIM, QO_EXPAND }, { URI_ACTION_PRIM, QO_COUNT },
-      { URI_ACTION_PRIM, QO_ORDERBY },/* { URI_ACTION_PRIM, QO_SEARCH }, */
+      { URI_ACTION_PRIM, QO_ORDERBY }, { URI_ACTION_PRIM, QO_SEARCH },
       { URI_ACTION_PRIM, QO_SELECT }, { URI_ACTION_PRIM, QO_SKIP },
       { URI_ACTION_PRIM, QO_SKIPTOKEN }, { URI_ACTION_PRIM, QO_TOP },
       // PrimCollectionReturnType
-      { URI_ACTION_COOL_PRIM, QO_ID }, { URI_ACTION_COOL_PRIM, QO_EXPAND },
-      /* { URI_ACTION_COOL_PRIM, QO_SEARCH }, */{ URI_ACTION_COOL_PRIM, QO_SELECT },
+      { URI_ACTION_COLL_PRIM, QO_ID }, { URI_ACTION_COLL_PRIM, QO_EXPAND },
+      { URI_ACTION_COLL_PRIM, QO_SEARCH }, { URI_ACTION_COLL_PRIM, QO_SELECT },
       // ComplexReturnType
       { URI_ACTION_CT, QO_FILTER }, { URI_ACTION_CT, QO_ID }, { URI_ACTION_CT, QO_COUNT },
-      { URI_ACTION_CT, QO_ORDERBY }, /* { URI_ACTION_CT, QO_SEARCH }, */
+      { URI_ACTION_CT, QO_ORDERBY }, { URI_ACTION_CT, QO_SEARCH },
       { URI_ACTION_CT, QO_SKIP }, { URI_ACTION_CT, QO_SKIPTOKEN }, { URI_ACTION_CT, QO_TOP },
       // ComplexCollectionReturnType
-      { URI_ACTION_COLL_CT, QO_ID },
-      /* { URI_ACTION_COLL_CT, QO_SEARCH }, */
+      { URI_ACTION_COLL_CT, QO_ID }, { URI_ACTION_COLL_CT, QO_SEARCH },
       // EntityReturnType
       { URI_ACTION_ENTITY, QO_FILTER }, { URI_ACTION_ENTITY, QO_ID }, { URI_ACTION_ENTITY, QO_COUNT },
-      /* { URI_ACTION_ENTITY, QO_ORDERBY }, *//* { URI_ACTION_ENTITY, QO_SEARCH }, */
+      { URI_ACTION_ENTITY, QO_ORDERBY }, { URI_ACTION_ENTITY, QO_SEARCH },
       { URI_ACTION_ENTITY, QO_SKIP }, { URI_ACTION_ENTITY, QO_SKIPTOKEN }, { URI_ACTION_ENTITY, QO_TOP },
       // EntityCollectionReturnType
-      { URI_ACTION_ES, QO_ID },
+      { URI_ACTION_ES, QO_ID }
   };
 
   private static final Edm edm = OData.newInstance().createServiceMetadata(
       new EdmTechProvider(), Collections.<EdmxReference> emptyList()).getEdm();
 
   @Test
-  public void validatePostOnActionSystemQueryOptions() throws Exception {
-    for (final String[] uriArray : actionWithValidSystemQueryOptions) {
-      final String[] uri = constructUri(uriArray);
-      try {
-        new UriValidator().validate(
-            new Parser().parseUri(uri[0], uri[1], null, edm),
-            HttpMethod.GET);
-      } catch (final UriParserException e) {
-        fail("Failed for uri: " + uri[0] + '?' + uri[1]);
-      } catch (final UriValidationException e) {
-        fail("Failed for uri: " + uri[0] + '?' + uri[1]);
-      }
-    }
-  }
-
-  @Test
-  public void checkPostOnActionSystemQueryOptionsNotValid() throws Exception {
-    for (final String[] uriArray : actionsWithNotValidSystemQueryOptions) {
-      final String[] uri = constructUri(uriArray);
-      validateWrong(uri[0], uri[1], HttpMethod.POST,
-          UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED);
-    }
-  }
-
-  @Test
   public void serviceDocumentMustNotFailForHttpPostPutPatchDelete() throws Exception {
     // We must not fail with a nullpointer here as the HTTP method to resource validation happens in the dispatcher
-    final UriInfo uri = new Parser().parseUri(URI_SERVICE, null, null, edm);
-    final UriValidator validator = new UriValidator();
-
-    validator.validate(uri, HttpMethod.GET);
-    validator.validate(uri, HttpMethod.POST);
-    validator.validate(uri, HttpMethod.PUT);
-    validator.validate(uri, HttpMethod.DELETE);
-    validator.validate(uri, HttpMethod.PATCH);
+    validate(URI_SERVICE, null, HttpMethod.GET);
+    validate(URI_SERVICE, null, HttpMethod.POST);
+    validate(URI_SERVICE, null, HttpMethod.PUT);
+    validate(URI_SERVICE, null, HttpMethod.DELETE);
+    validate(URI_SERVICE, null, HttpMethod.PATCH);
   }
 
   @Test
   public void validateForHttpMethods() throws Exception {
-    final UriInfo uri = new Parser().parseUri(URI_ENTITY, null, null, edm);
-    final UriValidator validator = new UriValidator();
-
-    validator.validate(uri, HttpMethod.GET);
-    validator.validate(uri, HttpMethod.POST);
-    validator.validate(uri, HttpMethod.PUT);
-    validator.validate(uri, HttpMethod.DELETE);
-    validator.validate(uri, HttpMethod.PATCH);
+    validate(URI_ENTITY, null, HttpMethod.GET);
+    validate(URI_ENTITY, null, HttpMethod.POST);
+    validate(URI_ENTITY, null, HttpMethod.PUT);
+    validate(URI_ENTITY, null, HttpMethod.DELETE);
+    validate(URI_ENTITY, null, HttpMethod.PATCH);
   }
 
   @Test
   public void systemQueryOptionsNotAllowedForHttpPostPutPatchDelete() throws Exception {
-    String[] queryOptions =
-    { QO_FILTER, QO_FORMAT, QO_EXPAND, QO_COUNT, QO_ORDERBY, QO_SELECT, QO_SKIP, QO_TOP, QO_SKIPTOKEN };
-    final UriValidator validator = new UriValidator();
+    final String[] queryOptions =
+        { QO_FILTER, QO_FORMAT, QO_EXPAND, QO_COUNT, QO_ORDERBY, QO_SEARCH, QO_SELECT, QO_SKIP, QO_TOP, QO_SKIPTOKEN };
     for (int i = 0; i < queryOptions.length; i++) {
-      final UriInfo uri = new Parser().parseUri(URI_ENTITY, queryOptions[i], null, edm);
-      try {
-        validator.validate(uri, HttpMethod.POST);
-        fail("UriValidation exception expected for method POST and system query option: " + queryOptions[i]);
-      } catch (UriValidationException e) {
-        assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-            .getMessageKey());
-      }
-      try {
-        validator.validate(uri, HttpMethod.PUT);
-        fail("UriValidation exception expected for method PUT and system query option: " + queryOptions[i]);
-      } catch (UriValidationException e) {
-        assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-            .getMessageKey());
-      }
-      try {
-        validator.validate(uri, HttpMethod.PATCH);
-        fail("UriValidation exception expected for method PATCH and system query option: " + queryOptions[i]);
-      } catch (UriValidationException e) {
-        assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-            .getMessageKey());
-      }
-      try {
-        validator.validate(uri, HttpMethod.DELETE);
-        fail("UriValidation exception expected for method DELETE and system query option: " + queryOptions[i]);
-      } catch (UriValidationException e) {
-        assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-            .getMessageKey());
-      }
+      validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.POST,
+          UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
+      validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.PUT,
+          UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
+      validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.PATCH,
+          UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
+      validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.DELETE,
+          UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
     }
   }
 
   @Test
   public void systemQueryOptionIDAllowedForDELETEReferencesOnly() throws Exception {
-    final UriValidator validator = new UriValidator();
-    final UriInfo uri = new Parser().parseUri(URI_REFERENCES, QO_ID, null, edm);
-    validator.validate(uri, HttpMethod.DELETE);
-    try {
-      validator.validate(uri, HttpMethod.POST);
-      fail("UriValidation exception expected for method POST and system query option: " + QO_ID);
-    } catch (UriValidationException e) {
-      assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-          .getMessageKey());
-    }
-    try {
-      validator.validate(uri, HttpMethod.PUT);
-      fail("UriValidation exception expected for method PUT and system query option: " + QO_ID);
-    } catch (UriValidationException e) {
-      assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-          .getMessageKey());
-    }
-    try {
-      validator.validate(uri, HttpMethod.PATCH);
-      fail("UriValidation exception expected for method PATCH and system query option: " + QO_ID);
-    } catch (UriValidationException e) {
-      assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-          .getMessageKey());
-    }
+    validate(URI_REFERENCES, QO_ID, HttpMethod.DELETE);
 
-    final UriInfo newUri = new Parser().parseUri(URI_ENTITY, QO_ID, null, edm);
-    try {
-      validator.validate(newUri, HttpMethod.DELETE);
-      fail("UriValidation exception expected for method DELETE and system query option: " + QO_ID);
-    } catch (UriValidationException e) {
-      assertEquals(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD, e
-          .getMessageKey());
-    }
+    validateWrong(URI_REFERENCES, QO_ID, HttpMethod.POST,
+        UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
+    validateWrong(URI_REFERENCES, QO_ID, HttpMethod.PUT,
+        UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
+    validateWrong(URI_REFERENCES, QO_ID, HttpMethod.PATCH,
+        UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
+
+    validateWrong(URI_ENTITY, QO_ID, HttpMethod.DELETE,
+        UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD);
   }
 
   @Test
@@ -525,15 +443,7 @@ public class UriValidatorTest {
   public void checkValidSystemQueryOption() throws Exception {
     for (final String[] uriArray : urisWithValidSystemQueryOptions) {
       final String[] uri = constructUri(uriArray);
-      try {
-        new UriValidator().validate(
-            new Parser().parseUri(uri[0], uri[1], null, edm),
-            HttpMethod.GET);
-      } catch (final UriParserException e) {
-        fail("Failed for uri: " + uri[0] + '?' + uri[1]);
-      } catch (final UriValidationException e) {
-        fail("Failed for uri: " + uri[0] + '?' + uri[1]);
-      }
+      validate(uri[0], uri[1], HttpMethod.GET);
     }
   }
 
@@ -547,6 +457,23 @@ public class UriValidatorTest {
   }
 
   @Test
+  public void validatePostOnActionSystemQueryOptions() throws Exception {
+    for (final String[] uriArray : actionWithValidSystemQueryOptions) {
+      final String[] uri = constructUri(uriArray);
+      validate(uri[0], uri[1], HttpMethod.POST);
+    }
+  }
+
+  @Test
+  public void checkPostOnActionSystemQueryOptionsNotValid() throws Exception {
+    for (final String[] uriArray : actionsWithNotValidSystemQueryOptions) {
+      final String[] uri = constructUri(uriArray);
+      validateWrong(uri[0], uri[1], HttpMethod.POST,
+          UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED);
+    }
+  }
+
+  @Test
   public void propertyOperations() throws Exception {
     validateWrong(URI_PROPERTY_PRIMITIVE_COLLECTION, null, HttpMethod.PATCH,
         UriValidationException.MessageKeys.UNSUPPORTED_HTTP_METHOD);
@@ -570,6 +497,16 @@ public class UriValidatorTest {
     return new String[] { path, query };
   }
 
+  private void validate(final String path, final String query, final HttpMethod method) {
+    try {
+      new UriValidator().validate(new Parser().parseUri(path, query, null, edm), method);
+    } catch (final UriParserException e) {
+      fail("Failed for uri: " + path + '?' + query);
+    } catch (final UriValidationException e) {
+      fail("Failed for uri: " + path + '?' + query);
+    }
+  }
+
   private void validateWrong(final String path, final String query, final HttpMethod method,
       final UriValidationException.MessageKeys expectedMessageKey) {
     try {