From d234223ae71ee2c8b2c3b2eec244ba21c75a2457 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 25 Oct 2017 12:30:50 +0100 Subject: [PATCH 1/3] REPO-2983: REST API: Additional information for node path elements Added `type` and `aspectNames` fields for each path element. Example output: ``` ... "elements": [ { "id": "1f525aa6-d0c5-4395-96e3-b140d728c5ca", "name": "Company Home", "type": "cm:folder", "aspectNames": [ "cm:titled", "cm:auditable", "sys:referenceable", "sys:localized", "app:uifacets" ] }, ... ] ... ``` --- .../org/alfresco/rest/api/impl/NodesImpl.java | 5 +- .../org/alfresco/rest/api/model/PathInfo.java | 20 +++++++- .../alfresco/rest/api/tests/NodeApiTest.java | 20 ++++++++ .../rest/api/tests/client/data/PathInfo.java | 46 +++++++++++++++++++ 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java b/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java index 1bb7e975de..55b03677fc 100644 --- a/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -1069,7 +1069,10 @@ public class NodesImpl implements Nodes if (permissionService.hasPermission(childNodeRef, PermissionService.READ) == AccessStatus.ALLOWED) { Serializable nameProp = nodeService.getProperty(childNodeRef, ContentModel.PROP_NAME); - pathElements.add(0, new ElementInfo(childNodeRef.getId(), nameProp.toString())); + String type = getNodeType(childNodeRef).toPrefixString(namespaceService); + Set aspects = nodeService.getAspects(childNodeRef); + List aspectNames = mapFromNodeAspects(aspects, Collections.emptyList(), Collections.emptyList()); + pathElements.add(0, new ElementInfo(childNodeRef.getId(), nameProp.toString(), type, aspectNames)); } else { diff --git a/src/main/java/org/alfresco/rest/api/model/PathInfo.java b/src/main/java/org/alfresco/rest/api/model/PathInfo.java index 4bccfe77ed..f4c2abd565 100644 --- a/src/main/java/org/alfresco/rest/api/model/PathInfo.java +++ b/src/main/java/org/alfresco/rest/api/model/PathInfo.java @@ -81,15 +81,19 @@ public class PathInfo private String id; private String name; + private String type; + private List aspectNames; public ElementInfo() { } - - public ElementInfo(String id, String name) + + public ElementInfo(String id, String name, String type, List aspectNames) { this.id = id; this.name = name; + this.type = type; + this.aspectNames = aspectNames; } public String getName() @@ -102,12 +106,24 @@ public class PathInfo return id; } + public String getType() + { + return type; + } + + public List getAspectNames() + { + return aspectNames; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder(250); sb.append("PathElement [id=").append(id) .append(", name=").append(name) + .append(", type=").append(type) + .append(", aspectNames=").append(aspectNames) .append(']'); return sb.toString(); } diff --git a/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java b/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java index cb3b5e5200..3f7b5485c3 100644 --- a/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -608,13 +608,33 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertTrue(path.getName().startsWith("/Company Home")); List pathElements = path.getElements(); assertEquals(7, pathElements.size()); + + // Check path element names and types, and one or two random aspects. assertEquals("Company Home", pathElements.get(0).getName()); + assertEquals("cm:folder", pathElements.get(0).getType()); + assertEquals("Sites", pathElements.get(1).getName()); + assertEquals("st:sites", pathElements.get(1).getType()); + assertEquals(site1Id, pathElements.get(2).getName()); + assertEquals("st:site", pathElements.get(2).getType()); + // Do some 'spot checks' that expected aspects are present. + assertTrue(pathElements.get(2).getAspectNames().contains("cm:titled")); + assertTrue(pathElements.get(2).getAspectNames().contains("sys:undeletable")); + assertTrue(pathElements.get(2).getAspectNames().contains("sys:unmovable")); + assertEquals("documentLibrary", pathElements.get(3).getName()); + assertEquals("cm:folder", pathElements.get(3).getType()); + assertTrue(pathElements.get(3).getAspectNames().contains("st:siteContainer")); + assertEquals(folderA, pathElements.get(4).getName()); + assertEquals("cm:folder", pathElements.get(4).getType()); + assertEquals(folderB, pathElements.get(5).getName()); + assertEquals("cm:folder", pathElements.get(5).getType()); + assertEquals(folderC, pathElements.get(6).getName()); + assertEquals("cm:folder", pathElements.get(6).getType()); // Try the above tests with user2 (site consumer) setRequestContext(user2); diff --git a/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java b/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java index 0035e04639..4f26aa2547 100644 --- a/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java +++ b/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java @@ -67,19 +67,42 @@ public class PathInfo return elements; } + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(120); + sb.append("PathInfo [name=").append(name) + .append(", isComplete=").append(isComplete) + .append(", elements=").append(elements) + .append(']'); + return sb.toString(); + } + public static class ElementInfo { private String id; private String name; + private String type; + private List aspectNames; + /** + * Required by jackson deserialisation. + */ public ElementInfo() { } public ElementInfo(String id, String name) + { + this(id, name, null, null); + } + + public ElementInfo(String id, String name, String type, List aspectNames) { this.id = id; this.name = name; + this.type = type; + this.aspectNames = aspectNames; } public String getName() @@ -92,6 +115,28 @@ public class PathInfo return id; } + public String getType() + { + return type; + } + + public List getAspectNames() + { + return aspectNames; + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(250); + sb.append("PathElement [id=").append(id) + .append(", name=").append(name) + .append(", type=").append(type) + .append(", aspectNames=").append(aspectNames) + .append(']'); + return sb.toString(); + } + public void expected(Object o) { assertTrue(o instanceof ElementInfo); @@ -99,6 +144,7 @@ public class PathInfo ElementInfo other = (ElementInfo) o; assertEquals(id, other.getName()); assertEquals(name, other.getName()); + assertEquals(type, other.getType()); } } From ffd7e197f0c68ef51ed68c476f11695b14a110f6 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 25 Oct 2017 16:47:13 +0100 Subject: [PATCH 2/3] REPO-2983: REST API: Additional information for node path elements Filtered the "aspectNames" field using the same list of exclusions as the other places that aspect names are returned. For example in `/nodes/{nodeId}/children?include=aspectNames` (currently just sys:*) --- src/main/java/org/alfresco/rest/api/impl/NodesImpl.java | 2 +- src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java b/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java index 55b03677fc..707695130b 100644 --- a/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -1071,7 +1071,7 @@ public class NodesImpl implements Nodes Serializable nameProp = nodeService.getProperty(childNodeRef, ContentModel.PROP_NAME); String type = getNodeType(childNodeRef).toPrefixString(namespaceService); Set aspects = nodeService.getAspects(childNodeRef); - List aspectNames = mapFromNodeAspects(aspects, Collections.emptyList(), Collections.emptyList()); + List aspectNames = mapFromNodeAspects(aspects, EXCLUDED_NS, EXCLUDED_ASPECTS); pathElements.add(0, new ElementInfo(childNodeRef.getId(), nameProp.toString(), type, aspectNames)); } else diff --git a/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java b/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java index 3f7b5485c3..bdb7e6c42c 100644 --- a/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -618,10 +618,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertEquals(site1Id, pathElements.get(2).getName()); assertEquals("st:site", pathElements.get(2).getType()); - // Do some 'spot checks' that expected aspects are present. assertTrue(pathElements.get(2).getAspectNames().contains("cm:titled")); - assertTrue(pathElements.get(2).getAspectNames().contains("sys:undeletable")); - assertTrue(pathElements.get(2).getAspectNames().contains("sys:unmovable")); + // Check that sys:* is filtered out - to be consistent with other aspect name lists + // e.g. /nodes/{nodeId}/children?include=aspectNames + assertFalse(pathElements.get(2).getAspectNames().contains("sys:undeletable")); + assertFalse(pathElements.get(2).getAspectNames().contains("sys:unmovable")); assertEquals("documentLibrary", pathElements.get(3).getName()); assertEquals("cm:folder", pathElements.get(3).getType()); From 55b683be8e5c93ce8d49838f6312a0f4c20e85de Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 25 Oct 2017 17:12:27 +0100 Subject: [PATCH 3/3] REPO-2983: REST API: Additional information for node path elements Renamed the path element "type" field to "nodeType", to be consistent with other uses. --- .../java/org/alfresco/rest/api/model/PathInfo.java | 12 ++++++------ .../org/alfresco/rest/api/tests/NodeApiTest.java | 14 +++++++------- .../rest/api/tests/client/data/PathInfo.java | 14 +++++++------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/alfresco/rest/api/model/PathInfo.java b/src/main/java/org/alfresco/rest/api/model/PathInfo.java index f4c2abd565..9d29a3e573 100644 --- a/src/main/java/org/alfresco/rest/api/model/PathInfo.java +++ b/src/main/java/org/alfresco/rest/api/model/PathInfo.java @@ -81,18 +81,18 @@ public class PathInfo private String id; private String name; - private String type; + private String nodeType; private List aspectNames; public ElementInfo() { } - public ElementInfo(String id, String name, String type, List aspectNames) + public ElementInfo(String id, String name, String nodeType, List aspectNames) { this.id = id; this.name = name; - this.type = type; + this.nodeType = nodeType; this.aspectNames = aspectNames; } @@ -106,9 +106,9 @@ public class PathInfo return id; } - public String getType() + public String getNodeType() { - return type; + return nodeType; } public List getAspectNames() @@ -122,7 +122,7 @@ public class PathInfo final StringBuilder sb = new StringBuilder(250); sb.append("PathElement [id=").append(id) .append(", name=").append(name) - .append(", type=").append(type) + .append(", nodeType=").append(nodeType) .append(", aspectNames=").append(aspectNames) .append(']'); return sb.toString(); diff --git a/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java b/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java index bdb7e6c42c..0b625cf056 100644 --- a/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -611,13 +611,13 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // Check path element names and types, and one or two random aspects. assertEquals("Company Home", pathElements.get(0).getName()); - assertEquals("cm:folder", pathElements.get(0).getType()); + assertEquals("cm:folder", pathElements.get(0).getNodeType()); assertEquals("Sites", pathElements.get(1).getName()); - assertEquals("st:sites", pathElements.get(1).getType()); + assertEquals("st:sites", pathElements.get(1).getNodeType()); assertEquals(site1Id, pathElements.get(2).getName()); - assertEquals("st:site", pathElements.get(2).getType()); + assertEquals("st:site", pathElements.get(2).getNodeType()); assertTrue(pathElements.get(2).getAspectNames().contains("cm:titled")); // Check that sys:* is filtered out - to be consistent with other aspect name lists // e.g. /nodes/{nodeId}/children?include=aspectNames @@ -625,17 +625,17 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertFalse(pathElements.get(2).getAspectNames().contains("sys:unmovable")); assertEquals("documentLibrary", pathElements.get(3).getName()); - assertEquals("cm:folder", pathElements.get(3).getType()); + assertEquals("cm:folder", pathElements.get(3).getNodeType()); assertTrue(pathElements.get(3).getAspectNames().contains("st:siteContainer")); assertEquals(folderA, pathElements.get(4).getName()); - assertEquals("cm:folder", pathElements.get(4).getType()); + assertEquals("cm:folder", pathElements.get(4).getNodeType()); assertEquals(folderB, pathElements.get(5).getName()); - assertEquals("cm:folder", pathElements.get(5).getType()); + assertEquals("cm:folder", pathElements.get(5).getNodeType()); assertEquals(folderC, pathElements.get(6).getName()); - assertEquals("cm:folder", pathElements.get(6).getType()); + assertEquals("cm:folder", pathElements.get(6).getNodeType()); // Try the above tests with user2 (site consumer) setRequestContext(user2); diff --git a/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java b/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java index 4f26aa2547..84fa18039a 100644 --- a/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java +++ b/src/test/java/org/alfresco/rest/api/tests/client/data/PathInfo.java @@ -82,7 +82,7 @@ public class PathInfo { private String id; private String name; - private String type; + private String nodeType; private List aspectNames; /** @@ -97,11 +97,11 @@ public class PathInfo this(id, name, null, null); } - public ElementInfo(String id, String name, String type, List aspectNames) + public ElementInfo(String id, String name, String nodeType, List aspectNames) { this.id = id; this.name = name; - this.type = type; + this.nodeType = nodeType; this.aspectNames = aspectNames; } @@ -115,9 +115,9 @@ public class PathInfo return id; } - public String getType() + public String getNodeType() { - return type; + return nodeType; } public List getAspectNames() @@ -131,7 +131,7 @@ public class PathInfo final StringBuilder sb = new StringBuilder(250); sb.append("PathElement [id=").append(id) .append(", name=").append(name) - .append(", type=").append(type) + .append(", nodeType=").append(nodeType) .append(", aspectNames=").append(aspectNames) .append(']'); return sb.toString(); @@ -144,7 +144,7 @@ public class PathInfo ElementInfo other = (ElementInfo) o; assertEquals(id, other.getName()); assertEquals(name, other.getName()); - assertEquals(type, other.getType()); + assertEquals(nodeType, other.getNodeType()); } }