mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
Merged HEAD (5.2) to 5.2.N (5.2.1)
126508 jkaabimofrad: Merged FILE-FOLDER-API (5.2.0) to HEAD (5.2) 122778 jvonka: Nodes (FileFolder) API - list (folder) children - add "includeSource" option - optionally also lookup and return the folder/node info for parent (ie. source) - especially useful if also using "relativePath" to resolve the actual parent to be listed RA-823, RA-634, RA-753 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@126852 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -650,9 +650,7 @@ public class NodesImpl implements Nodes
|
|||||||
String path = parameters.getParameter(PARAM_RELATIVE_PATH);
|
String path = parameters.getParameter(PARAM_RELATIVE_PATH);
|
||||||
NodeRef nodeRef = validateOrLookupNode(nodeId, path);
|
NodeRef nodeRef = validateOrLookupNode(nodeId, path);
|
||||||
|
|
||||||
QName typeQName = getNodeType(nodeRef);
|
return getFolderOrDocumentFullInfo(nodeRef, null, null, parameters);
|
||||||
|
|
||||||
return getFolderOrDocumentFullInfo(nodeRef, getParentNodeRef(nodeRef), typeQName, parameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Node getFolderOrDocumentFullInfo(NodeRef nodeRef, NodeRef parentNodeRef, QName nodeTypeQName, Parameters parameters)
|
private Node getFolderOrDocumentFullInfo(NodeRef nodeRef, NodeRef parentNodeRef, QName nodeTypeQName, Parameters parameters)
|
||||||
@@ -680,11 +678,21 @@ public class NodesImpl implements Nodes
|
|||||||
pathInfo = lookupPathInfo(nodeRef);
|
pathInfo = lookupPathInfo(nodeRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
Type type = getType(nodeTypeQName, nodeRef);
|
if (nodeTypeQName == null)
|
||||||
|
{
|
||||||
|
nodeTypeQName = getNodeType(nodeRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parentNodeRef == null)
|
||||||
|
{
|
||||||
|
parentNodeRef = getParentNodeRef(nodeRef);
|
||||||
|
}
|
||||||
|
|
||||||
Node node;
|
Node node;
|
||||||
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
|
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
|
||||||
|
|
||||||
|
Type type = getType(nodeTypeQName, nodeRef);
|
||||||
|
|
||||||
if (type == null)
|
if (type == null)
|
||||||
{
|
{
|
||||||
// not direct folder (or file) ...
|
// not direct folder (or file) ...
|
||||||
@@ -916,9 +924,9 @@ public class NodesImpl implements Nodes
|
|||||||
final NodeRef parentNodeRef = validateOrLookupNode(parentFolderNodeId, path);
|
final NodeRef parentNodeRef = validateOrLookupNode(parentFolderNodeId, path);
|
||||||
|
|
||||||
// check that resolved node is a folder
|
// check that resolved node is a folder
|
||||||
if (! nodeMatches(parentNodeRef, Collections.singleton(ContentModel.TYPE_FOLDER), null, false))
|
if (!nodeMatches(parentNodeRef, Collections.singleton(ContentModel.TYPE_FOLDER), null, false))
|
||||||
{
|
{
|
||||||
throw new InvalidArgumentException("NodeId of folder is expected: "+parentNodeRef.getId());
|
throw new InvalidArgumentException("NodeId of folder is expected: " + parentNodeRef.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<String> selectParam = parameters.getSelectedProperties();
|
final List<String> selectParam = parameters.getSelectedProperties();
|
||||||
@@ -1040,7 +1048,14 @@ public class NodesImpl implements Nodes
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return CollectionWithPagingInfo.asPaged(paging, nodes, pagingResults.hasMoreItems(), pagingResults.getTotalResultCount().getFirst());
|
Node sourceEntity = null;
|
||||||
|
if (parameters.includeSource())
|
||||||
|
{
|
||||||
|
sourceEntity = getFolderOrDocument(parentNodeRef, null, null, selectParam, mapUserInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return CollectionWithPagingInfo.asPaged(paging, nodes, pagingResults.hasMoreItems(), pagingResults.getTotalResultCount().getFirst(), sourceEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pair<QName,Boolean> parseNodeTypeFilter(String nodeTypeStr)
|
private Pair<QName,Boolean> parseNodeTypeFilter(String nodeTypeStr)
|
||||||
@@ -1553,10 +1568,7 @@ public class NodesImpl implements Nodes
|
|||||||
setWriterContentType(writer, new ContentInfoWrapper(contentInfo), nodeRef, true);
|
setWriterContentType(writer, new ContentInfoWrapper(contentInfo), nodeRef, true);
|
||||||
writer.putContent(stream);
|
writer.putContent(stream);
|
||||||
|
|
||||||
return getFolderOrDocumentFullInfo(nodeRef,
|
return getFolderOrDocumentFullInfo(nodeRef, null, null, parameters);
|
||||||
getParentNodeRef(nodeRef),
|
|
||||||
nodeService.getType(nodeRef),
|
|
||||||
parameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setWriterContentType(ContentWriter writer, ContentInfoWrapper contentInfo, NodeRef nodeRef, boolean guessEncodingIfNull)
|
private void setWriterContentType(ContentWriter writer, ContentInfoWrapper contentInfo, NodeRef nodeRef, boolean guessEncodingIfNull)
|
||||||
|
@@ -67,6 +67,7 @@ import org.alfresco.service.cmr.security.PermissionService;
|
|||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
import org.alfresco.service.cmr.site.SiteVisibility;
|
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||||
import org.alfresco.util.TempFileProvider;
|
import org.alfresco.util.TempFileProvider;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -366,7 +367,7 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
assertTrue(node.getContent().getSizeInBytes() > 0);
|
assertTrue(node.getContent().getSizeInBytes() > 0);
|
||||||
|
|
||||||
// request without select
|
// request without select
|
||||||
Map<String, String> params = new LinkedHashMap<>();
|
Map<String, String> params = new HashMap<>();
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
||||||
for (Node n : nodes)
|
for (Node n : nodes)
|
||||||
@@ -378,7 +379,7 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
// request with select - example 1
|
// request with select - example 1
|
||||||
params = new LinkedHashMap<>();
|
params = new HashMap<>();
|
||||||
params.put("select", "isLink");
|
params.put("select", "isLink");
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
||||||
@@ -388,7 +389,7 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
// request with select - example 2
|
// request with select - example 2
|
||||||
params = new LinkedHashMap<>();
|
params = new HashMap<>();
|
||||||
params.put("select", "aspectNames,properties, path,isLink");
|
params.put("select", "aspectNames,properties, path,isLink");
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
||||||
@@ -401,7 +402,7 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
// request specific property via select
|
// request specific property via select
|
||||||
params = new LinkedHashMap<>();
|
params = new HashMap<>();
|
||||||
params.put("select", "cm:lastThumbnailModification");
|
params.put("select", "cm:lastThumbnailModification");
|
||||||
params.put("orderBy", "isFolder DESC,modifiedAt DESC");
|
params.put("orderBy", "isFolder DESC,modifiedAt DESC");
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
@@ -418,7 +419,7 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
|
|
||||||
|
|
||||||
// filtering, via where clause - folders only
|
// filtering, via where clause - folders only
|
||||||
params = new LinkedHashMap<>();
|
params = new HashMap<>();
|
||||||
params.put("where", "("+Nodes.PARAM_ISFOLDER+"=true)");
|
params.put("where", "("+Nodes.PARAM_ISFOLDER+"=true)");
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
||||||
@@ -433,7 +434,7 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
assertTrue(folderIds.contains(nodes.get(1).getId()));
|
assertTrue(folderIds.contains(nodes.get(1).getId()));
|
||||||
|
|
||||||
// filtering, via where clause - content only
|
// filtering, via where clause - content only
|
||||||
params = new LinkedHashMap<>();
|
params = new HashMap<>();
|
||||||
params.put("where", "("+Nodes.PARAM_ISFILE+"=true)");
|
params.put("where", "("+Nodes.PARAM_ISFILE+"=true)");
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
||||||
@@ -446,16 +447,45 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
|
|
||||||
params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, folder1);
|
params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, folder1);
|
||||||
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
response = getAll(myChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
JSONObject jsonResponse = response.getJsonResponse();
|
||||||
|
nodes = jacksonUtil.parseEntries(jsonResponse, Document.class);
|
||||||
assertEquals(1, nodes.size());
|
assertEquals(1, nodes.size());
|
||||||
assertEquals(contentF1_Id, nodes.get(0).getId());
|
assertEquals(contentF1_Id, nodes.get(0).getId());
|
||||||
|
|
||||||
|
JSONObject jsonList = (JSONObject)jsonResponse.get("list");
|
||||||
|
assertNotNull(jsonList);
|
||||||
|
JSONObject jsonSrcObj = (JSONObject)jsonResponse.get("source");
|
||||||
|
assertNull(jsonSrcObj);
|
||||||
|
|
||||||
params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder2);
|
params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder2);
|
||||||
response = getAll(rootChildrenUrl, user1, paging, params, 200);
|
response = getAll(rootChildrenUrl, user1, paging, params, 200);
|
||||||
nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class);
|
jsonResponse = response.getJsonResponse();
|
||||||
|
nodes = jacksonUtil.parseEntries(jsonResponse, Document.class);
|
||||||
assertEquals(1, nodes.size());
|
assertEquals(1, nodes.size());
|
||||||
assertEquals(contentF2_Id, nodes.get(0).getId());
|
assertEquals(contentF2_Id, nodes.get(0).getId());
|
||||||
|
|
||||||
|
jsonList = (JSONObject)jsonResponse.get("list");
|
||||||
|
assertNotNull(jsonList);
|
||||||
|
jsonSrcObj = (JSONObject)jsonResponse.get("source");
|
||||||
|
assertNull(jsonSrcObj);
|
||||||
|
|
||||||
|
// list children via relativePath and also return the source entity
|
||||||
|
|
||||||
|
params = new HashMap<>();
|
||||||
|
params.put(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder2);
|
||||||
|
params.put("includeSource", "true");
|
||||||
|
response = getAll(rootChildrenUrl, user1, paging, params, 200);
|
||||||
|
jsonResponse = response.getJsonResponse();
|
||||||
|
nodes = jacksonUtil.parseEntries(jsonResponse, Document.class);
|
||||||
|
assertEquals(1, nodes.size());
|
||||||
|
assertEquals(contentF2_Id, nodes.get(0).getId());
|
||||||
|
|
||||||
|
jsonList = (JSONObject)jsonResponse.get("list");
|
||||||
|
assertNotNull(jsonList);
|
||||||
|
|
||||||
|
Folder src = RestApiUtil.parsePojo("source", jsonList, Folder.class);
|
||||||
|
assertEquals(folder2_Id, src.getId());
|
||||||
|
|
||||||
// -ve test - Invalid QName (Namespace prefix cm... is not mapped to a namespace URI) for the orderBy parameter.
|
// -ve test - Invalid QName (Namespace prefix cm... is not mapped to a namespace URI) for the orderBy parameter.
|
||||||
params = Collections.singletonMap("orderBy", Nodes.PARAM_ISFOLDER+" DESC,cm" + System.currentTimeMillis() + ":modified DESC");
|
params = Collections.singletonMap("orderBy", Nodes.PARAM_ISFOLDER+" DESC,cm" + System.currentTimeMillis() + ":modified DESC");
|
||||||
getAll(myChildrenUrl, user1, paging, params, 400);
|
getAll(myChildrenUrl, user1, paging, params, 400);
|
||||||
|
Reference in New Issue
Block a user