diff --git a/source/java/org/alfresco/rest/api/impl/NodesImpl.java b/source/java/org/alfresco/rest/api/impl/NodesImpl.java index 33cbfeaecd..568e774847 100644 --- a/source/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/source/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -1087,13 +1087,25 @@ public class NodesImpl implements Nodes includeFiles = isFile; } + if (Boolean.TRUE.equals(includeFiles) && Boolean.TRUE.equals(includeFolders)) + { + throw new InvalidArgumentException("Invalid filter (isFile=true and isFolder = true) - a node cannot be both a file and a folder"); + } + String nodeTypeStr = propertyWalker.getProperty(PARAM_NODETYPE, WhereClauseParser.EQUALS, String.class); if ((nodeTypeStr != null) && (! nodeTypeStr.isEmpty())) { + if ((isFile != null) || (isFolder != null)) + { + throw new InvalidArgumentException("Invalid filter - nodeType and isFile/isFolder are mutually exclusive"); + } + Pair pair = parseNodeTypeFilter(nodeTypeStr); filterNodeTypeQName = pair.getFirst(); filterIncludeSubTypes = pair.getSecond(); } + + } List sortCols = parameters.getSorting(); @@ -1129,8 +1141,11 @@ public class NodesImpl implements Nodes PagingRequest pagingRequest = Util.getPagingRequest(paging); final PagingResults pagingResults; - if ((filterNodeTypeQName != null) || (Boolean.FALSE.equals(includeFiles) && Boolean.FALSE.equals(includeFolders))) + if (((includeFiles == null) && (includeFolders == null)) || + (filterNodeTypeQName != null) || + (Boolean.FALSE.equals(includeFiles) && Boolean.FALSE.equals(includeFolders))) { + // either no filtering or some filtering (but not just files or folders) if (filterNodeTypeQName == null) { filterNodeTypeQName = ContentModel.TYPE_CMOBJECT; @@ -1144,19 +1159,9 @@ public class NodesImpl implements Nodes } else { - // files and/or folders only - if ((includeFiles == null) && (includeFolders == null)) - { - // no filtering - includeFiles = true; - includeFolders = true; - } - else - { - // some filtering - includeFiles = (includeFiles != null ? includeFiles : false); - includeFolders = (includeFolders != null ? includeFolders : false); - } + // files or folders only + includeFiles = (includeFiles != null ? includeFiles : false); + includeFolders = (includeFolders != null ? includeFolders : false); pagingResults = fileFolderService.list(parentNodeRef, includeFiles, includeFolders, ignoreQNames, sortProps, pagingRequest); } 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 14919a8df6..04f6b021f9 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -1738,13 +1738,19 @@ public class NodeApiTest extends AbstractBaseApiTest Paging paging = getPaging(0, Integer.MAX_VALUE); + // no filtering + + HttpResponse response = getAll(myChildrenUrl, user1, paging, null, 200); + List nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); + checkNodeIds(nodes, allIds); + // filtering, via where clause - folders Map params = new HashMap<>(); params.put("where", "(nodeType='cm:folder')"); - HttpResponse response = getAll(myChildrenUrl, user1, paging, params, 200); - List nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); + response = getAll(myChildrenUrl, user1, paging, params, 200); + nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, folderIds); params = new HashMap<>(); @@ -1784,15 +1790,6 @@ public class NodeApiTest extends AbstractBaseApiTest nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, fileIds); - // filtering, via where clause - files and folders - - params = new HashMap<>(); - params.put("where", "(isFile=true AND isFolder=true)"); - - response = getAll(myChildrenUrl, user1, paging, params, 200); - nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); - checkNodeIds(nodes, folderAndFileIds); - // filtering, via where clause - non-folders / non-files params = new HashMap<>(); @@ -1815,6 +1812,20 @@ public class NodeApiTest extends AbstractBaseApiTest response = getAll(myChildrenUrl, user1, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, objIds); + + // -ve - node cannot be both a file and a folder + params = new HashMap<>(); + params.put("where", "(isFile=true AND isFolder=true)"); + getAll(myChildrenUrl, user1, paging, params, 400); + + // -ve - nodeType and isFile/isFolder are mutually exclusive + params = new HashMap<>(); + params.put("where", "(nodeType='cm:object' AND isFolder=true)"); + getAll(myChildrenUrl, user1, paging, params, 400); + + params = new HashMap<>(); + params.put("where", "(nodeType='cm:object' AND isFile=true)"); + getAll(myChildrenUrl, user1, paging, params, 400); } private void checkNodeIds(List nodes, List nodeIds)