From e586f9f210ece31201a6b9c7caa1c0fb49efb472 Mon Sep 17 00:00:00 2001 From: Ancuta Morarasu Date: Tue, 13 Sep 2016 15:41:43 +0000 Subject: [PATCH] REPO-484: [REST API] 400 error for unsupported NOT operator in the 'where' predicate. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@130610 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../parameters/where/QueryHelper.java | 7 +- .../api/impl/MapBasedQueryWalker.java | 145 +++++++++--------- .../api/impl/TaskVariablesWalkerCallback.java | 2 +- .../alfresco/rest/api/tests/NodeApiTest.java | 6 + .../rest/framework/tests/core/WhereTests.java | 2 +- 5 files changed, 85 insertions(+), 77 deletions(-) diff --git a/source/java/org/alfresco/rest/framework/resource/parameters/where/QueryHelper.java b/source/java/org/alfresco/rest/framework/resource/parameters/where/QueryHelper.java index abcb996e62..aa61615ec8 100644 --- a/source/java/org/alfresco/rest/framework/resource/parameters/where/QueryHelper.java +++ b/source/java/org/alfresco/rest/framework/resource/parameters/where/QueryHelper.java @@ -27,7 +27,6 @@ package org.alfresco.rest.framework.resource.parameters.where; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -67,7 +66,7 @@ public abstract class QueryHelper /** * One of EQUALS LESSTHAN GREATERTHAN LESSTHANOREQUALS GREATERTHANOREQUALS; */ - void comparison(int type, String propertyName, String propertyValue); + void comparison(int type, String propertyName, String propertyValue, boolean negated); /** * Called any time an IN clause is encountered. @@ -110,7 +109,7 @@ public abstract class QueryHelper @Override public void between(String propertyName, String firstValue, String secondValue, boolean negated) { throw UNSUPPORTED;} @Override - public void comparison(int type, String propertyName, String propertyValue) { throw UNSUPPORTED;} + public void comparison(int type, String propertyName, String propertyValue, boolean negated) { throw UNSUPPORTED;} @Override public void in(String propertyName, boolean negated, String... propertyValues) { throw UNSUPPORTED;} @Override @@ -191,7 +190,7 @@ public abstract class QueryHelper if (WhereClauseParser.PROPERTYNAME == tree.getChild(0).getType() && WhereClauseParser.PROPERTYVALUE == tree.getChild(1).getType()) { - callback.comparison(tree.getType(), tree.getChild(0).getText(), stripQuotes(tree.getChild(1).getText())); + callback.comparison(tree.getType(), tree.getChild(0).getText(), stripQuotes(tree.getChild(1).getText()), negated); return; } break; diff --git a/source/java/org/alfresco/rest/workflow/api/impl/MapBasedQueryWalker.java b/source/java/org/alfresco/rest/workflow/api/impl/MapBasedQueryWalker.java index f039506d00..033a47ba77 100644 --- a/source/java/org/alfresco/rest/workflow/api/impl/MapBasedQueryWalker.java +++ b/source/java/org/alfresco/rest/workflow/api/impl/MapBasedQueryWalker.java @@ -175,91 +175,94 @@ public class MapBasedQueryWalker extends WalkerCallbackAdapter } @Override - public void comparison(int type, String propertyName, String propertyValue) + public void comparison(int type, String propertyName, String propertyValue, boolean negated) { - boolean throwError = false; - if (variablesEnabled && propertyName.startsWith("variables/")) { - processVariable(propertyName, propertyValue, type); - } - else + processVariable(propertyName, propertyValue, type); + return; + } + + boolean throwError = false; + if (type == WhereClauseParser.EQUALS) { - if (type == WhereClauseParser.EQUALS) + if (supportedEqualsParameters != null && supportedEqualsParameters.contains(propertyName)) { - if (supportedEqualsParameters != null && supportedEqualsParameters.contains(propertyName)) - { - equalsProperties.put(propertyName, propertyValue); - } - else - { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); - } - } - else if (type == WhereClauseParser.MATCHES) - { - if (supportedMatchesParameters != null && supportedMatchesParameters.contains(propertyName)) - { - matchesProperties.put(propertyName, propertyValue); - } - else - { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); - } - } - else if (type == WhereClauseParser.GREATERTHAN) - { - if (supportedGreaterThanParameters != null && supportedGreaterThanParameters.contains(propertyName)) - { - greaterThanProperties.put(propertyName, propertyValue); - } - else - { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); - } - } - else if (type == WhereClauseParser.GREATERTHANOREQUALS) - { - if (supportedGreaterThanOrEqualParameters != null && supportedGreaterThanOrEqualParameters.contains(propertyName)) - { - greaterThanOrEqualProperties.put(propertyName, propertyValue); - } - else - { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); - } - } - else if (type == WhereClauseParser.LESSTHAN) - { - if (supportedLessThanParameters != null && supportedLessThanParameters.contains(propertyName)) - { - lessThanProperties.put(propertyName, propertyValue); - } - else - { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); - } - } - else if (type == WhereClauseParser.LESSTHANOREQUALS) - { - if (supportedLessThanOrEqualParameters != null && supportedLessThanOrEqualParameters.contains(propertyName)) - { - lessThanOrEqualProperties.put(propertyName, propertyValue); - } - else - { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); - } + equalsProperties.put(propertyName, propertyValue); } else { - throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); } } + else if (type == WhereClauseParser.MATCHES) + { + if (supportedMatchesParameters != null && supportedMatchesParameters.contains(propertyName)) + { + matchesProperties.put(propertyName, propertyValue); + } + else + { + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + } + } + else if (type == WhereClauseParser.GREATERTHAN) + { + if (supportedGreaterThanParameters != null && supportedGreaterThanParameters.contains(propertyName)) + { + greaterThanProperties.put(propertyName, propertyValue); + } + else + { + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + } + } + else if (type == WhereClauseParser.GREATERTHANOREQUALS) + { + if (supportedGreaterThanOrEqualParameters != null && supportedGreaterThanOrEqualParameters.contains(propertyName)) + { + greaterThanOrEqualProperties.put(propertyName, propertyValue); + } + else + { + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + } + } + else if (type == WhereClauseParser.LESSTHAN) + { + if (supportedLessThanParameters != null && supportedLessThanParameters.contains(propertyName)) + { + lessThanProperties.put(propertyName, propertyValue); + } + else + { + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + } + } + else if (type == WhereClauseParser.LESSTHANOREQUALS) + { + if (supportedLessThanOrEqualParameters != null && supportedLessThanOrEqualParameters.contains(propertyName)) + { + lessThanOrEqualProperties.put(propertyName, propertyValue); + } + else + { + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + } + } + else + { + throwError = !handleUnmatchedComparison(type, propertyName, propertyValue); + } if (throwError) { throw new InvalidArgumentException("framework.exception.InvalidProperty", new Object[] {propertyName, propertyValue, WhereClauseParser.tokenNames[type]}); + } + else if (negated) + { + // Throw error for the unsupported NOT operator only if the property was valid for comparison, show the more meaningful error first. + throw new InvalidArgumentException("NOT operator is not supported for " + WhereClauseParser.tokenNames[type] + " comparison."); } } diff --git a/source/java/org/alfresco/rest/workflow/api/impl/TaskVariablesWalkerCallback.java b/source/java/org/alfresco/rest/workflow/api/impl/TaskVariablesWalkerCallback.java index b411628344..40e21dcd31 100644 --- a/source/java/org/alfresco/rest/workflow/api/impl/TaskVariablesWalkerCallback.java +++ b/source/java/org/alfresco/rest/workflow/api/impl/TaskVariablesWalkerCallback.java @@ -37,7 +37,7 @@ public class TaskVariablesWalkerCallback extends WalkerCallbackAdapter private VariableScope scope = VariableScope.ANY; @Override - public void comparison(int type, String propertyName, String propertyValue) + public void comparison(int type, String propertyName, String propertyValue, boolean negated) { if (PROPERTY_SCOPE.equals(propertyName)) { diff --git a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java index b3215cbb9b..b251470d5f 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -519,6 +519,12 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // -ve test - list folder children with relative path to unknown node should return 400 params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, "/unknown"); getAll(getNodeChildrenUrl(content1_Id), paging, params, 400); + + // filtering, via where clause - negated comparison + params = new HashMap<>(); + params.put("where", "(NOT "+Nodes.PARAM_ISFILE+"=true)"); + getAll(childrenUrl, paging, params, 400); + } /** diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/WhereTests.java b/source/test-java/org/alfresco/rest/framework/tests/core/WhereTests.java index 878cba9992..6161f7d3fc 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/WhereTests.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/WhereTests.java @@ -485,7 +485,7 @@ public class WhereTests implements RecognizedParamsExtractor assertEquals(WhereClauseParser.PROPERTYVALUE, tree.getChild(1).getType()); QueryHelper.walk(theQuery, new WalkerCallbackAdapter(){ @Override - public void comparison(int comparisonType, String propertyName, String propertyValue) { + public void comparison(int comparisonType, String propertyName, String propertyValue, boolean negated) { assertTrue("Property name should be "+propName,propName.equals(propertyName)); assertTrue(comparisonOperator == comparisonType); assertTrue("Property value should be "+propVal,propVal.equals(propertyValue));