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/09/08 18:40:07 UTC

[50/55] [abbrv] olingo-odata4 git commit: [OLINGO-659] Duplicated system query options in $expand lead to a http status 400 bad request

[OLINGO-659] Duplicated system query options in $expand lead to a http status 400 bad request


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

Branch: refs/heads/OLINGO-562_SpringExtension
Commit: ccf361b8fe9ab0db7d248e2e1ca31b2cd2d1e6bd
Parents: a354172
Author: Christian Holzer <c....@sap.com>
Authored: Tue Sep 1 16:50:31 2015 +0200
Committer: Christian Holzer <c....@sap.com>
Committed: Tue Sep 1 16:50:31 2015 +0200

----------------------------------------------------------------------
 .../core/uri/parser/UriParseTreeVisitor.java    | 27 +++++++++++++---
 .../core/uri/queryoption/ExpandItemImpl.java    | 21 +++++++++++-
 .../core/uri/antlr/TestFullResourcePath.java    | 34 ++++++++++++++++++++
 3 files changed, 77 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ccf361b8/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 7da3f11..8c25150 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
@@ -44,6 +44,7 @@ import org.apache.olingo.commons.api.edm.EdmSingleton;
 import org.apache.olingo.commons.api.edm.EdmStructuredType;
 import org.apache.olingo.commons.api.edm.EdmType;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.ex.ODataRuntimeException;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
 import org.apache.olingo.server.api.uri.UriInfoKind;
 import org.apache.olingo.server.api.uri.UriInfoResource;
@@ -1202,13 +1203,25 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
       } else if (ctx.vM != null) {
         LevelsOptionImpl levels = new LevelsOptionImpl().setMax();
         levels.setText(ctx.vM.getText());
-        expandItem.setSystemQueryOption(levels);
+        try {
+          expandItem.setSystemQueryOption(levels);
+        } catch(ODataRuntimeException e) {
+          // Thrown if duplicated system query options are detected
+          throw wrap(new UriParserSyntaxException("Double system query option!", e,
+                UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION, e.getMessage()));
+        }
       } else if (ctx.vL != null) {
         LevelsOptionImpl levels = new LevelsOptionImpl();
         String text = ctx.vL.getText();
         levels.setText(text);
         levels.setValue(Integer.parseInt(text));
-        expandItem.setSystemQueryOption(levels);
+        try {
+          expandItem.setSystemQueryOption(levels);
+        } catch(ODataRuntimeException e) {
+          // Thrown if duplicated system query options are detected
+          throw wrap(new UriParserSyntaxException("Double system query option!", e,
+                UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION, e.getMessage()));
+        }
       }
 
     } else if (ctx.vEP != null) {
@@ -1220,8 +1233,14 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
 
         @SuppressWarnings("unchecked")
         List<SystemQueryOptionImpl> list = (List<SystemQueryOptionImpl>) ctx.vEPE.accept(this);
-        for (SystemQueryOptionImpl option : list) {
-          expandItem.setSystemQueryOption(option);
+        try {
+          for (SystemQueryOptionImpl option : list) {
+            expandItem.setSystemQueryOption(option);
+          }
+        } catch(ODataRuntimeException e) {
+          // Thrown if duplicated system query options are detected
+          throw wrap(new UriParserSyntaxException("Double system query option!", e,
+                UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION, e.getMessage()));
         }
         context.contextExpandItemPath = contextExpandItemPathBU;
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ccf361b8/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandItemImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandItemImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandItemImpl.java
index 66b1bb6..8ff22b0 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandItemImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandItemImpl.java
@@ -21,6 +21,7 @@ package org.apache.olingo.server.core.uri.queryoption;
 import java.util.List;
 
 import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.ex.ODataRuntimeException;
 import org.apache.olingo.server.api.uri.UriInfoResource;
 import org.apache.olingo.server.api.uri.queryoption.CountOption;
 import org.apache.olingo.server.api.uri.queryoption.ExpandItem;
@@ -31,6 +32,7 @@ import org.apache.olingo.server.api.uri.queryoption.OrderByOption;
 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;
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.TopOption;
 
 public class ExpandItemImpl implements ExpandItem {
@@ -54,27 +56,44 @@ public class ExpandItemImpl implements ExpandItem {
   public ExpandItemImpl setSystemQueryOption(final SystemQueryOptionImpl sysItem) {
 
     if (sysItem instanceof ExpandOptionImpl) {
+      validateDoubleSystemQueryOption(expandOption, sysItem);
       expandOption = (ExpandOptionImpl) sysItem;
     } else if (sysItem instanceof FilterOptionImpl) {
+      validateDoubleSystemQueryOption(filterOption, sysItem);
       filterOption = (FilterOptionImpl) sysItem;
     } else if (sysItem instanceof CountOptionImpl) {
+      validateDoubleSystemQueryOption(inlineCountOption, sysItem);
       inlineCountOption = (CountOptionImpl) sysItem;
     } else if (sysItem instanceof OrderByOptionImpl) {
+      validateDoubleSystemQueryOption(orderByOption, sysItem);
       orderByOption = (OrderByOptionImpl) sysItem;
     } else if (sysItem instanceof SearchOptionImpl) {
+      validateDoubleSystemQueryOption(searchOption, sysItem);
       searchOption = (SearchOptionImpl) sysItem;
     } else if (sysItem instanceof SelectOptionImpl) {
+      validateDoubleSystemQueryOption(selectOption, sysItem);
       selectOption = (SelectOptionImpl) sysItem;
     } else if (sysItem instanceof SkipOptionImpl) {
+      validateDoubleSystemQueryOption(skipOption, sysItem);
       skipOption = (SkipOptionImpl) sysItem;
     } else if (sysItem instanceof TopOptionImpl) {
+      validateDoubleSystemQueryOption(topOption, sysItem);
       topOption = (TopOptionImpl) sysItem;
     } else if (sysItem instanceof LevelsExpandOption) {
+      if(levelsExpandOption != null) {
+        throw new ODataRuntimeException("$levels"); 
+      }
       levelsExpandOption = (LevelsExpandOption) sysItem;
     }
     return this;
   }
-
+  
+  private void validateDoubleSystemQueryOption(final SystemQueryOption oldOption, final SystemQueryOption newOption) {
+    if(oldOption != null) {
+      throw new ODataRuntimeException(newOption.getName()); 
+    }
+  }
+  
   public ExpandItemImpl setSystemQueryOptions(final List<SystemQueryOptionImpl> list) {
 
     for (SystemQueryOptionImpl item : list) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ccf361b8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
index 11b882e..6a17d4b 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
@@ -2538,6 +2538,40 @@ public class TestFullResourcePath {
   }
 
   @Test
+  public void runDuplicatedSystemQueryOptionsInExpand() throws UriParserException, UriValidationException {
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyInt16;$select=PropertyInt16)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($filter=true;$filter=true)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($orderby=PropertyInt16;$orderby=PropertyInt16)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($levels=2;$levels=3)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($expand=*;$expand=*)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($count=true;$count=true)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($top=1;$top=1)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+      
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($skip=2;$skip=2)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+  }
+  
+  @Test
+  @Ignore("$search currently not implemented")
+  public void runDuplicatedSearchExpand() throws UriParserException, UriValidationException {
+      testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($search=Test;$search=Test)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION);
+  }
+  
+  @Test
   public void runTop() throws Exception {
     // top
     testUri.run("ESKeyNav", "$top=1")