diff --git a/source/java/org/alfresco/rest/api/impl/NodesImpl.java b/source/java/org/alfresco/rest/api/impl/NodesImpl.java index a95fd1719e..88b7fd5041 100644 --- a/source/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/source/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -248,6 +248,7 @@ public class NodesImpl implements Nodes ContentModel.PROP_WORKING_COPY_OWNER); private final static String PARAM_ISFOLDER = "isFolder"; + private final static String PARAM_ISCONTENT = "isContent"; private final static String PARAM_SUBTYPES = "subTypes"; private final static String PARAM_NAME = "name"; @@ -277,8 +278,9 @@ public class NodesImpl implements Nodes MAP_PARAM_QNAME = Collections.unmodifiableMap(aMap); } + // list children filtering (via where clause) private final static Set LIST_FOLDER_CHILDREN_EQUALS_QUERY_PROPERTIES = - new HashSet<>(Arrays.asList(new String[] {PARAM_ISFOLDER, PARAM_NODETYPE, PARAM_SUBTYPES})); + new HashSet<>(Arrays.asList(new String[] {PARAM_ISFOLDER, PARAM_ISCONTENT, PARAM_NODETYPE, PARAM_SUBTYPES})); /* * Validates that node exists. @@ -677,8 +679,9 @@ public class NodesImpl implements Nodes { // not direct folder (or file) ... // might be sub-type of cm:cmobject (or a cm:link pointing to cm:cmobject or possibly even another cm:link) - node = new Document(nodeRef, parentNodeRef, properties, mapUserInfo, sr); + node = new Node(nodeRef, parentNodeRef, properties, mapUserInfo, sr); node.setIsFolder(false); + node.setIsContent(false); } else if (type.equals(Type.DOCUMENT)) { @@ -686,7 +689,6 @@ public class NodesImpl implements Nodes } else if (type.equals(Type.FOLDER)) { - // container/folder node = new Folder(nodeRef, parentNodeRef, properties, mapUserInfo, sr); } else @@ -927,11 +929,23 @@ public class NodesImpl implements Nodes QueryHelper.walk(q, propertyWalker); Boolean isFolder = propertyWalker.getProperty(PARAM_ISFOLDER, WhereClauseParser.EQUALS, Boolean.class); - if (isFolder != null) + Boolean isContent = propertyWalker.getProperty(PARAM_ISCONTENT, WhereClauseParser.EQUALS, Boolean.class); + + if ((isFolder != null) && (isContent != null)) + { + includeFiles = isContent; + includeFolders = isFolder; + } + else if (isFolder != null) { includeFiles = !isFolder; includeFolders = isFolder; } + else if (isContent != null) + { + includeFiles = isContent; + includeFolders = !isContent; + } String nodeTypeStr = propertyWalker.getProperty(PARAM_NODETYPE, WhereClauseParser.EQUALS, String.class); if ((nodeTypeStr != null) && (! nodeTypeStr.isEmpty())) @@ -961,6 +975,7 @@ public class NodesImpl implements Nodes List> sortProps = null; if ((sortCols != null) && (sortCols.size() > 0)) { + // TODO should we allow isContent in sort (and map to reverse of isFolder) ? sortProps = new ArrayList<>(sortCols.size()); for (SortColumn sortCol : sortCols) { diff --git a/source/java/org/alfresco/rest/api/model/Document.java b/source/java/org/alfresco/rest/api/model/Document.java index d348f43261..c2008e9b2c 100644 --- a/source/java/org/alfresco/rest/api/model/Document.java +++ b/source/java/org/alfresco/rest/api/model/Document.java @@ -62,7 +62,8 @@ public class Document extends Node contentInfo = new ContentInfo(mimeType, mimeTypeName, cd.getSize(), cd.getEncoding()); } - this.isFolder = false; + setIsFolder(false); + setIsContent(true); } @Override diff --git a/source/java/org/alfresco/rest/api/model/Folder.java b/source/java/org/alfresco/rest/api/model/Folder.java index 17dcb39e83..29e14a5667 100644 --- a/source/java/org/alfresco/rest/api/model/Folder.java +++ b/source/java/org/alfresco/rest/api/model/Folder.java @@ -49,7 +49,9 @@ public class Folder extends Node public Folder(NodeRef nodeRef, NodeRef parentNodeRef, Map nodeProps, Map mapUserInfo, ServiceRegistry sr) { super(nodeRef, parentNodeRef, nodeProps, mapUserInfo, sr); - this.isFolder = true; + + setIsFolder(true); + setIsContent(false); } @Override diff --git a/source/java/org/alfresco/rest/api/model/Node.java b/source/java/org/alfresco/rest/api/model/Node.java index 2e6eba5000..a1d25cfd7d 100644 --- a/source/java/org/alfresco/rest/api/model/Node.java +++ b/source/java/org/alfresco/rest/api/model/Node.java @@ -64,6 +64,7 @@ public class Node implements Comparable protected UserInfo modifiedByUser; protected Boolean isFolder; + protected Boolean isContent; protected Boolean isLink; protected NodeRef parentNodeRef; @@ -260,6 +261,16 @@ public class Node implements Comparable this.isFolder = isFolder; } + public Boolean getIsContent() + { + return isContent; + } + + public void setIsContent(Boolean isContent) + { + this.isContent = isContent; + } + public Boolean getIsLink() { return isLink; @@ -298,10 +309,11 @@ public class Node implements Comparable return "Node [nodeRef=" + nodeRef + ", type=" + prefixTypeQName + ", name=" + name + ", title=" + title + ", description=" + description + ", createdAt=" + createdAt + ", modifiedAt=" + modifiedAt + ", createdByUser=" + createdByUser + ", modifiedBy=" - + modifiedByUser + ", pathInfo =" + pathInfo +"]"; + + modifiedByUser + ", isFolder =" + isFolder + ", isContent =" + isContent + ", pathInfo =" + pathInfo +"]"; } // here to allow POST /nodes/{id}/children when creating empty file with specified content.mimeType + // also allows list of results to be returned as "nodes" protected ContentInfo contentInfo; 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 f6468a6713..6638da75a9 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -267,12 +267,16 @@ public class NodeApiTest extends AbstractBaseApiTest assertEquals(4, nodes.size()); assertEquals(folder2, nodes.get(0).getName()); assertTrue(nodes.get(0).getIsFolder()); + assertFalse(nodes.get(0).getIsContent()); assertEquals(folder1, nodes.get(1).getName()); assertTrue(nodes.get(1).getIsFolder()); + assertFalse(nodes.get(1).getIsContent()); assertEquals(content2, nodes.get(2).getName()); assertFalse(nodes.get(2).getIsFolder()); + assertTrue(nodes.get(2).getIsContent()); assertEquals(content1, nodes.get(3).getName()); assertFalse(nodes.get(3).getIsFolder()); + assertTrue(nodes.get(3).getIsContent()); // Order by folders last and modified date first orderBy = Collections.singletonMap("orderBy", "isFolder ASC,modifiedAt DESC"); @@ -457,17 +461,21 @@ public class NodeApiTest extends AbstractBaseApiTest assertEquals(2, nodes.size()); assertTrue(nodes.get(0).getIsFolder()); - assertTrue(nodes.get(1).getIsFolder()); + assertFalse(nodes.get(0).getIsContent()); assertTrue(folderIds.contains(nodes.get(0).getId())); + + assertTrue(nodes.get(1).getIsFolder()); + assertFalse(nodes.get(1).getIsContent()); assertTrue(folderIds.contains(nodes.get(1).getId())); // filtering, via where clause - content only params = new LinkedHashMap<>(); - params.put("where", "(isFolder=false)"); + params.put("where", "(isContent=true)"); response = getAll(myChildrenUrl, user1, paging, params, 200); nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class); assertEquals(1, nodes.size()); assertFalse(nodes.get(0).getIsFolder()); + assertTrue(nodes.get(0).getIsContent()); assertTrue(contentIds.contains(nodes.get(0).getId())); // list children via relativePath @@ -614,6 +622,7 @@ public class NodeApiTest extends AbstractBaseApiTest assertNotNull(myFilesNodeId); assertEquals(user1, node.getName()); assertTrue(node.getIsFolder()); + assertFalse(node.getIsContent()); NodeRef myHomeNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, myFilesNodeId); NodeRef userHomesNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, node.getParentId()); @@ -759,6 +768,7 @@ public class NodeApiTest extends AbstractBaseApiTest assertNotNull(myFilesNodeId); assertEquals(user1, node.getName()); assertTrue(node.getIsFolder()); + assertFalse(node.getIsContent()); assertNull(node.getPath()); // note: path can be optionally "select"'ed - see separate test response = getSingle(NodesEntityResource.class, user1, Nodes.PATH_SHARED, null, 200); @@ -767,6 +777,7 @@ public class NodeApiTest extends AbstractBaseApiTest assertNotNull(sharedFilesNodeId); assertEquals("Shared", node.getName()); assertTrue(node.getIsFolder()); + assertFalse(node.getIsContent()); assertNull(node.getPath()); //Delete user1's home @@ -2001,6 +2012,7 @@ public class NodeApiTest extends AbstractBaseApiTest assertNotNull(docResp.getModifiedAt()); assertNotNull(docResp.getModifiedByUser()); assertFalse(docResp.getIsFolder()); + assertTrue(docResp.getIsContent()); assertNull(docResp.getIsLink()); assertEquals("cm:content", docResp.getNodeType()); assertNotNull(docResp.getParentId()); diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/Document.java b/source/test-java/org/alfresco/rest/api/tests/client/data/Document.java index 590587244b..98417620d4 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/Document.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/Document.java @@ -28,14 +28,14 @@ package org.alfresco.rest.api.tests.client.data; import static org.junit.Assert.assertTrue; /** - * Representation of a document node (initially for client tests for File Folder API) + * Representation of a document node - initially for client tests for Nodes (aka File Folder) API * * @author janv * */ public class Document extends Node { - private ContentInfo content; + private ContentInfo contentInfo; public Document() { super(); @@ -43,12 +43,12 @@ public class Document extends Node public ContentInfo getContent() { - return content; + return contentInfo; } - public void setContent(ContentInfo content) + public void setContent(ContentInfo contentInfo) { - this.content = content; + this.contentInfo = contentInfo; } @Override @@ -60,6 +60,6 @@ public class Document extends Node Document other = (Document) o; - content.expected(((Document) o).getContent()); + contentInfo.expected(other.getContent()); } } diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/Folder.java b/source/test-java/org/alfresco/rest/api/tests/client/data/Folder.java index 0f432b26ac..9d711fa4eb 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/Folder.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/Folder.java @@ -28,7 +28,7 @@ package org.alfresco.rest.api.tests.client.data; import static org.junit.Assert.assertTrue; /** - * Representation of a folder node (initially for client tests for File Folder API) + * Representation of a folder node - initially for client tests for Nodes (aka File Folder) API * * @author janv */ diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/Node.java b/source/test-java/org/alfresco/rest/api/tests/client/data/Node.java index c7cb56b6ed..f48029ab8b 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/Node.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/Node.java @@ -37,7 +37,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** - * Representation of a node (for client tests for File Folder API) + * Representation of a node - initially for client tests for Nodes (aka File Folder) API * * @author janv */ @@ -52,6 +52,7 @@ public class Node protected UserInfo modifiedByUser; protected Boolean isFolder; + protected Boolean isContent; protected Boolean isLink; protected String parentId; @@ -121,11 +122,21 @@ public class Node return isFolder; } - public void setIsFolder(Boolean folder) + public void setIsFolder(Boolean isFolder) { - isFolder = folder; + this.isFolder = isFolder; } + public Boolean getIsContent() + { + return isContent; + } + + public void setIsContent(Boolean isContent) + { + this.isContent = isContent; + } + public Boolean getIsLink() { return isLink; @@ -269,6 +280,7 @@ public class Node } AssertUtil.assertEquals("isFolder", isFolder, other.getIsFolder()); + AssertUtil.assertEquals("isContent", isContent, other.getIsContent()); AssertUtil.assertEquals("isLink", isLink, other.getIsLink()); if (path != null) {