diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/atomentry.lib.atom.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/atomentry.lib.atom.ftl index c7c97c2788..2c5573000e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/atomentry.lib.atom.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/atomentry.lib.atom.ftl @@ -15,7 +15,7 @@ [#-- ATOM Entry for Document --] [#-- --] -[#macro document node propfilter="*" ns=""] +[#macro document node propfilter="*" includeallowableactions=false includerelationships="none" ns=""] [@entry ns] ${node.properties.creator!""} [@contentstream node/] @@ -31,6 +31,7 @@ ${xmldate(node.properties.modified)} [@documentCMISProps node propfilter/] +[#if includeallowableactions][@allowableactions node/][/#if] ${xmldate(node.properties.modified)} @@ -93,7 +94,7 @@ [#-- ATOM Entry for Private Working Copy --] [#-- --] -[#macro pwc node propfilter="*" ns=""] +[#macro pwc node propfilter="*" includeallowableactions=false includerelationships="none" ns=""] [@entry ns] ${node.properties.creator} [@contentstream node/] @@ -123,7 +124,7 @@ [#-- ATOM Entry for Folder --] [#-- --] -[#macro folder node propfilter="*" typesfilter="any" ns="" depth=1 maxdepth=1] +[#macro folder node propfilter="*" typesfilter="any" includeallowableactions=false includerelationships="none" ns="" depth=1 maxdepth=1] [@entry ns] ${node.properties.creator} ${node.id} [#-- TODO --] @@ -138,14 +139,15 @@ [#-- recurse for depth greater than 1 --] [@folderCMISProps node propfilter/] +[#if includeallowableactions][@allowableactions node/][/#if] [#if depth < maxdepth || depth == -1] [#list cmischildren(node, typesfilter) as child] [#if child.isDocument] - [@entryLib.document child propfilter/] + [@entryLib.document child propfilter includeallowableactions includerelationships/] [#else] - [@entryLib.folder child propfilter/] - [@folder child propfilter typesfilter ns depth+1 maxdepth/] + [@entryLib.folder child propfilter includeallowableactions includerelationships/] + [@folder child propfilter typesfilter includeallowableactions includerelationships ns depth+1 maxdepth/] [/#if] [/#list] [/#if] @@ -304,6 +306,25 @@ [#macro idvalue value]${value}[/#macro] +[#-- --] +[#-- CMIS Allowable Actions --] +[#-- --] + +[#macro allowableactions node ns=""] + +[#nested] +[#assign typedef = cmistype(node)] +[#list typedef.actionEvaluators?values as actionevaluator] + [@allowableaction node actionevaluator/] +[/#list] + +[/#macro] + +[#macro allowableaction node actionevaluator] +${actionevaluator.isAllowed(node.nodeRef)?string} +[/#macro] + + [#-- --] [#-- ATOM Entry for Type Definition --] [#-- --] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/ns.lib.atom.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/ns.lib.atom.ftl index 435d4bc84a..22bfbbaa32 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/ns.lib.atom.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/ns.lib.atom.ftl @@ -6,4 +6,5 @@ [#macro opensearchNS]http://a9.com/-/spec/opensearch/1.1/[/#macro] [#macro serviceNS]xmlns="[@appNS/]" xmlns:atom="[@atomNS/]" xmlns:cmis="[@cmisNS/]" xmlns:alf="[@alfNS/]"[/#macro] [#macro feedNS]xmlns="[@atomNS/]" xmlns:app="[@appNS/]" xmlns:cmis="[@cmisNS/]" xmlns:alf="[@alfNS/]" xmlns:opensearch="[@opensearchNS/]"[/#macro] -[#macro entryNS]xmlns="[@atomNS/]" xmlns:app="[@appNS/]" xmlns:cmis="[@cmisNS/]" xmlns:alf="[@alfNS/]"[/#macro] \ No newline at end of file +[#macro entryNS]xmlns="[@atomNS/]" xmlns:app="[@appNS/]" xmlns:cmis="[@cmisNS/]" xmlns:alf="[@alfNS/]"[/#macro] +[#macro allowableactionsNS]xmlns:cmis="[@cmisNS/]"[/#macro] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.atomentry.ftl new file mode 100644 index 0000000000..59717fdc16 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.atomentry.ftl @@ -0,0 +1,13 @@ +[#ftl] +[#import "/org/alfresco/cmis/ns.lib.atom.ftl" as nsLib/] +[#import "/org/alfresco/cmis/atomentry.lib.atom.ftl" as entryLib/] +[#compress] + + +[#assign namespace][@nsLib.allowableactionsNS/][/#assign] +[@entryLib.allowableactions node=node ns=namespace] + ${cmisproperty(node, "ObjectId")} + ${absurl(url.serviceContext)}/api/node/${node.nodeRef.storeRef.protocol}/${node.nodeRef.storeRef.identifier}/${node.nodeRef.id} +[/@entryLib.allowableactions] + +[/#compress] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.desc.xml new file mode 100644 index 0000000000..867a74c0a5 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.desc.xml @@ -0,0 +1,9 @@ + + Retrieve Allowable Actions + Retrieve Allowable Actions + /api/node/{store_type}/{store_id}/{id}/permissions + /api/path/{store_type}/{store_id}/{id}/permissions + guest + argument + CMIS + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.js new file mode 100644 index 0000000000..bcaf54e27b --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/allowableactions.get.js @@ -0,0 +1,17 @@ +script: +{ + // locate node + var pathSegments = url.match.split("/"); + var reference = [ url.templateArgs.store_type, url.templateArgs.store_id ].concat(url.templateArgs.id.split("/")); + model.node = cmis.findNode(pathSegments[2], reference); + if (model.node === null) + { + status.code = 404; + status.message = "Repository " + pathSegments[2] + " " + reference.join("/") + " not found"; + status.redirect = true; + break script; + } + + // TODO: handle version?? + +} diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.get.atomfeed.ftl index dceb8f4622..b4feee5839 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.get.atomfeed.ftl @@ -14,7 +14,7 @@ [#list results as child] [#if child.isDocument] - [@entryLib.pwc child filter/] + [@entryLib.pwc node=child propfilter=filter includeallowableactions=false includerelationships="none"/] [/#if] [/#list] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.post.atomentry.201.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.post.atomentry.201.ftl index c271febd25..94b55b6441 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.post.atomentry.201.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/checkedout.post.atomentry.201.ftl @@ -5,6 +5,6 @@ [#assign namespace][@nsLib.entryNS/][/#assign] -[@entryLib.pwc node=pwc ns=namespace/] +[@entryLib.pwc node=pwc includeallowableactions=true includerelationships="none" ns=namespace/] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.atomfeed.ftl index d36de0d4c1..0916f3c724 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.atomfeed.ftl @@ -14,9 +14,9 @@ [#list results as child] [#if child.isDocument] - [@entryLib.document child filter/] + [@entryLib.document node=child propfilter=filter includeallowableactions=includeAllowableActions/] [#else] - [@entryLib.folder child filter/] + [@entryLib.folder node=child propfilter=filter includeallowableactions=includeAllowableActions/] [/#if] [/#list] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.desc.xml index 0fe24c29ad..01d7e4de0e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.desc.xml @@ -34,8 +34,8 @@ If “includeAllowableActions” is TRUE, the repository will return the allowab If no “maxItems” value is provided, then the Repository will determine an appropriate number of items to return. How the Repository determines this value is repository-specific and opaque to CMIS.
]]> - /api/node/{store_type}/{store_id}/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?} - /api/path/{store_type}/{store_id}/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?} + /api/node/{store_type}/{store_id}/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?} + /api/path/{store_type}/{store_id}/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?} guest argument CMIS diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.js index c429108376..9fd202bc34 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.get.js @@ -29,6 +29,10 @@ script: model.filter = "*"; } + // include allowable actions + var includeAllowableActions = cmis.findArg(args.includeAllowableActions, headers["CMIS-includeAllowableActions"]); + model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + // retrieve children var page = paging.createPageOrWindow(args, headers); var paged = cmis.queryChildren(model.node, model.types, page); diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.post.atomentry.201.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.post.atomentry.201.ftl index 0245ef2720..56cc6e5b0a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.post.atomentry.201.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/children.post.atomentry.201.ftl @@ -7,9 +7,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if node.isDocument] - [@entryLib.document node=node ns=namespace/] + [@entryLib.document node=node propfilter="*" includeallowableactions=true includerelationships=true ns=namespace/] [#else] - [@entryLib.folder node=node ns=namespace/] + [@entryLib.folder node=node propfilter="*" includeallowableactions=true includerelationships=true ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.get.atomfeed.ftl index b3ec1c03fd..0c23c95705 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.get.atomfeed.ftl @@ -12,9 +12,9 @@ [#if depth > 0 || depth == -1] [#list cmischildren(node, typesFilter) as child] [#if child.isDocument] - [@entryLib.document node=child propfilter=propFilter/] + [@entryLib.document node=child propfilter=propFilter includeallowableactions=false includerelationships=false/] [#else] - [@entryLib.folder node=child propfilter=propFilter typesfilter=typeFilter depth=1 maxdepth=depth/] + [@entryLib.folder node=child propfilter=propFilter typesfilter=typeFilter includeallowableactions=false includerelationships=false depth=1 maxdepth=depth/] [/#if] [/#list] [/#if] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.post.atomentry.201.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.post.atomentry.201.ftl index 556fb6ae06..836601b05f 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.post.atomentry.201.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/descendants.post.atomentry.201.ftl @@ -8,9 +8,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if node.isDocument] - [@entryLib.document node=node ns=namespace/] + [@entryLib.document node=node propfilter="*" includeallowableactions=false includerelationships="none" ns=namespace/] [#else] - [@entryLib.folder node=node ns=namespace/] + [@entryLib.folder node=node propfilter="*" includeallowableactions=false includerelationships="none" ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.atomentry.ftl index 6f28e3557c..1c0f892078 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.atomentry.ftl @@ -7,9 +7,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if node.isDocument] - [@entryLib.document node=node propfilter=filter ns=namespace/] + [@entryLib.document node=node propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none" ns=namespace/] [#else] - [@entryLib.folder node=node propfilter=filter ns=namespace/] + [@entryLib.folder node=node propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none" ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.js index bfbe035886..dd91984108 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.get.js @@ -21,4 +21,7 @@ script: model.filter = "*"; } + // include allowable actions + var includeAllowableActions = cmis.findArg(args.includeAllowableActions, headers["CMIS-includeAllowableActions"]); + model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); } diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.put.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.put.atomentry.ftl index 0245ef2720..ba1a5032ef 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.put.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/item.put.atomentry.ftl @@ -7,9 +7,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if node.isDocument] - [@entryLib.document node=node ns=namespace/] + [@entryLib.document node=node includeallowableactions=true includerelationships="none" ns=namespace/] [#else] - [@entryLib.folder node=node ns=namespace/] + [@entryLib.folder node=node includeallowableactions=true includerelationships="none" ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/parent.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/parent.get.atomfeed.ftl index 6abb45b382..6ed213481e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/parent.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/parent.get.atomfeed.ftl @@ -18,7 +18,7 @@ [#macro parent node recurse=false] [#if node?exists && node.isContainer] - [@entryLib.folder node filter/] + [@entryLib.folder node=node propfilter=filter includeallowableactions=false includerelationships="none"/] [#if recurse && node.id != rootNode.id] [@parent node.parent true/] [/#if] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/parents.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/parents.get.atomfeed.ftl index d209f9e422..07eaba4538 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/parents.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/parents.get.atomfeed.ftl @@ -18,7 +18,7 @@ [#macro parent node recurse=false] [#if node?exists && node.isContainer] - [@entryLib.folder node filter/] + [@entryLib.folder node=node propfilter=filter includeallowableactions=false includerelationships="none"/] [#if recurse && node.id != rootNode.id] [@parent node.parent true/] [/#if] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.get.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.get.atomentry.ftl index 5ddd79ba3e..8836a1c42e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.get.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.get.atomentry.ftl @@ -6,6 +6,6 @@ [#assign namespace][@nsLib.entryNS/][/#assign] -[@entryLib.pwc node=node ns=namespace/] +[@entryLib.pwc node=node includeallowableactions=false includerelationships="none" ns=namespace/] [/#compress] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.put.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.put.atomentry.ftl index 5eba4bd8c2..7b7b1f35ae 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.put.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/pwc.put.atomentry.ftl @@ -7,9 +7,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if checkin] - [@entryLib.document node=node ns=namespace/] + [@entryLib.document node=node includeallowableactions=true includerelationships="none" ns=namespace/] [#else] - [@entryLib.pwc node=node ns=namespace/] + [@entryLib.pwc node=node includeallowableactions=true includerelationships="none" ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/types.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/store/types.get.js index 9c9bb80071..feb57fc87a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/types.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/types.get.js @@ -34,5 +34,5 @@ script: // handle property definitions // TODO: spec issue 34 var returnPropertyDefinitions = cmis.findArg(args.includePropertyDefinitions, headers["CMIS-includePropertyDefinitions"]); - model.returnPropertyDefinitions = returnPropertyDefinitions == "true" ? true : false; + model.returnPropertyDefinitions = (returnPropertyDefinitions == "true" ? true : false); } diff --git a/source/java/org/alfresco/repo/cmis/rest/test/CMISTest.java b/source/java/org/alfresco/repo/cmis/rest/test/CMISTest.java index e87c56dff6..ad53a63e3d 100644 --- a/source/java/org/alfresco/repo/cmis/rest/test/CMISTest.java +++ b/source/java/org/alfresco/repo/cmis/rest/test/CMISTest.java @@ -1,6 +1,6 @@ /* - * * This program is free software; you can redistribute it and/or + * * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. @@ -554,6 +554,62 @@ public class CMISTest extends BaseCMISWebScriptTest assertEquals("updated content " + guid, contentRes.getContentAsString()); } + public void testAllowableActions() + throws Exception + { + // retrieve test folder for allowable actions + Entry testFolder = createTestFolder("testAllowableActions"); + Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN); + assertNotNull(childrenLink); + + // test allowable actions for folder + { + Entry child = createFolder(childrenLink.getHref(), "testFolderAllowableActions"); + assertNotNull(child); + Link allowableActions = child.getLink(CMISConstants.REL_ALLOWABLEACTIONS); + Response allowableActionsRes = sendRequest(new GetRequest(allowableActions.getHref().toString()), 200, getAtomValidator()); + assertNotNull(allowableActionsRes); + // TODO: parse response with Abdera extension + + // retrieve getProperties() with includeAllowableActions flag + Map args = new HashMap(); + args.put("includeAllowableActions", "true"); + Response getPropertiesRes = sendRequest(new GetRequest(child.getSelfLink().getHref().toString()).setArgs(args), 200, getAtomValidator()); + assertNotNull(getPropertiesRes); + // TODO: parse response with Abdera extension + + // TODO: test equality between getAllowableActions and getProperties + } + + // test allowable actions for document + { + Entry child = createDocument(childrenLink.getHref(), "testDocumentAllowableActions"); + assertNotNull(child); + Link allowableActions = child.getLink(CMISConstants.REL_ALLOWABLEACTIONS); + Response allowableActionsRes = sendRequest(new GetRequest(allowableActions.getHref().toString()), 200, getAtomValidator()); + assertNotNull(allowableActionsRes); + // TODO: parse response with Abdera extension + + // retrieve getProperties() with includeAllowableActions flag + Map args = new HashMap(); + args.put("includeAllowableActions", "true"); + Response getPropertiesRes = sendRequest(new GetRequest(child.getSelfLink().getHref().toString()).setArgs(args), 200, getAtomValidator()); + assertNotNull(getPropertiesRes); + // TODO: parse response with Abdera extension + + // TODO: test equality between getAllowableActions and getProperties + } + + // test allowable actions for children + { + Map args = new HashMap(); + args.put("includeAllowableActions", "true"); + Response allowableActionsRes = sendRequest(new GetRequest(childrenLink.getHref().toString()).setArgs(args), 200, getAtomValidator()); + assertNotNull(allowableActionsRes); + // TODO: parse response with Abdera extension + } + } + public void testGetCheckedOut() throws Exception {