diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.atomfeed.ftl index f7f19cb6df..ac9e1664e2 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.atomfeed.ftl @@ -17,7 +17,7 @@ [#list results as child] [#if child.isDocument] - [@entryLib.document node=child renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none"/] + [@entryLib.document node=child renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships/] [/#if] [/#list] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.desc.xml index ff28e5d416..6b2fffd9d9 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.desc.xml @@ -28,7 +28,7 @@ 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.
]]> - /cmis/checkedout?folderId={folderId?}&includeDescendants={includeDescendants?}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/checkedout?folderId={folderId?}&includeDescendants={includeDescendants?}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} user diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.js index 656c22176e..1870c0eb49 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/checkedout.get.js @@ -42,6 +42,13 @@ script: var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } + // retrieve checked-out var page = paging.createPageOrWindow(args); var paged = cmis.queryCheckedOut(person.properties.userName, model.folder, model.includeDescendants, page); diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.atomfeed.ftl index b5f4fd30e1..160d90dd02 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.atomfeed.ftl @@ -26,9 +26,9 @@ [#list results as child] [#if child.isDocument] - [@entryLib.document node=child renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions/] + [@entryLib.document node=child renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships/] [#else] - [@entryLib.folder node=child renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions/] + [@entryLib.folder node=child renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships/] [/#if] [/#list] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.desc.xml index 04efb35a97..39f6a0fd19 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.desc.xml @@ -36,14 +36,14 @@ If no “maxItems” value is provided, then the Repository will determine an ap - /cmis/i/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} - /cmis/s/{store}/i/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} + /cmis/i/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} + /cmis/s/{store}/i/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} - /cmis/p{path}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} - /cmis/s/{store}/p{path}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} + /cmis/p{path}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} + /cmis/s/{store}/p{path}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} - /api/node/{store_type}/{store_id}/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} - /api/path/{store_type}/{store_id}/{path}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} + /api/node/{store_type}/{store_id}/{id}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} + /api/path/{store_type}/{store_id}/{path}/children?types={types}&filter={filter?}&skipCount={skipCount?}&maxItems={maxItems?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?}&orderBy={orderBy?} guest diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.js index 9bb3e45beb..3373c358ee 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.get.js @@ -41,6 +41,13 @@ script: var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } + // retrieve children var page = paging.createPageOrWindow(args); var paged = cmis.queryChildren(model.node, model.types, orderBy, page); diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.post.atomentry.201.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.post.atomentry.201.ftl index 2aa1ac4d39..727afe591e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/children.post.atomentry.201.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/children.post.atomentry.201.ftl @@ -8,9 +8,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if node.isDocument] - [@entryLib.document node=node propfilter="*" includeallowableactions=true includerelationships=true ns=namespace/] + [@entryLib.document node=node propfilter="*" includeallowableactions=true ns=namespace/] [#else] - [@entryLib.folder node=node propfilter="*" includeallowableactions=true includerelationships=true ns=namespace/] + [@entryLib.folder node=node propfilter="*" includeallowableactions=true ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.atomfeed.ftl index 19cd7c0275..baf22cf98f 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.atomfeed.ftl @@ -23,9 +23,9 @@ [#if depth > 0 || depth == -1] [#list cmischildren(node, typesFilter) as child] [#if child.isDocument] - [@entryLib.document node=child renditionfilter=renditionFilter propfilter=propFilter includeallowableactions=includeAllowableActions includerelationships=false/] + [@entryLib.document node=child renditionfilter=renditionFilter propfilter=propFilter includeallowableactions=includeAllowableActions includerelationships=includeRelationships/] [#else] - [@entryLib.folder node=child renditionfilter=renditionFilter propfilter=propFilter typesfilter=types includeallowableactions=includeAllowableActions includerelationships=false depth=1 maxdepth=depth/] + [@entryLib.folder node=child renditionfilter=renditionFilter propfilter=propFilter typesfilter=types includeallowableactions=includeAllowableActions includerelationships=includeRelationships depth=1 maxdepth=depth/] [/#if] [/#list] [/#if] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.desc.xml index db2f70d6fc..3fc29e49c5 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.desc.xml @@ -34,14 +34,14 @@ If “includeAllowableActions” is TRUE, the repository will return the allowab - /cmis/i/{id}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/i/{id}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/i/{id}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/i/{id}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} - /cmis/p{path}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/p{path}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/p{path}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/p{path}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} - /api/node/{store_type}/{store_id}/{id}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /api/path/{store_type}/{store_id}/{path}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /api/node/{store_type}/{store_id}/{id}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /api/path/{store_type}/{store_id}/{path}/descendants?types={types}&filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} guest diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.js index 4b93ff7517..7989b37477 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/descendants.get.js @@ -40,4 +40,11 @@ script: // include allowable actions var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } } diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl index 4f75de647c..662d8cb222 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl @@ -8,9 +8,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] [#if node.isDocument] - [@entryLib.document node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none" includeacl=includeACL ns=namespace/] + [@entryLib.document node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships includeacl=includeACL ns=namespace/] [#else] - [@entryLib.folder node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none" includeacl=includeACL ns=namespace/] + [@entryLib.folder node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships includeacl=includeACL ns=namespace/] [/#if] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.desc.xml index 34b16c87a4..639ca3b6d0 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.desc.xml @@ -27,20 +27,20 @@ PropertyCollection includes changeToken (if applicable to repository)
- /cmis/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/p{path}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/p{path}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/p{path}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/p{path}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/arg/i?id={id}&filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/arg/p?path={path}&filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/arg/n?noderef={noderef}&filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/arg/i?id={id}&filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/arg/p?path={path}&filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/arg/n?noderef={noderef}&filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /api/node/{store_type}/{store_id}/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /api/path/{store_type}/{store_id}/{path}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /api/node/{store_type}/{store_id}/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /api/path/{store_type}/{store_id}/{path}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} guest diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js index 8054613ab9..9041bd0aec 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js @@ -36,4 +36,11 @@ script: // include allowable actions model.includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true"; + + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } } diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/atomentry.lib.atom.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/atomentry.lib.atom.ftl index 8a964a9ded..5f27d147cd 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/atomentry.lib.atom.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/atomentry.lib.atom.ftl @@ -44,6 +44,7 @@ [@objectCMISProps node propfilter/] [#if includeallowableactions][@allowableactions node/][/#if] +[@relationships node includerelationships includeallowableactions propfilter/] [#if includeacl][@aclreport node/][/#if] ${node.name?xml} @@ -71,31 +72,6 @@ [/#list] [/#macro] - -[#-- --] -[#-- ATOM Entry for Version --] -[#-- --] - -[#macro version node propfilter="*" ns=""] -[@entry ns] -${node.properties.creator!""} -[@contentstream node/] -urn:uuid:${node.id} -[@linksLib.linknodeself node/] -[@linksLib.linkstream node "enclosure"/] -[@documentCMISLinks node=node/] -${xmldate(node.properties.created)} -[@contentsummary node/] -${node.name?xml} -${xmldate(node.properties.modified)} -${xmldate(node.properties.modified)} -${absurl(url.context)}${node.icon16} - -[@objectCMISProps node propfilter/] - -[/@entry] -[/#macro] - [#-- --] [#-- ATOM Entry for Folder --] [#-- --] @@ -121,6 +97,7 @@ [@objectCMISProps node propfilter/] [#if includeallowableactions][@allowableactions node/][/#if] +[@relationships node includerelationships includeallowableactions propfilter/] [#if includeacl][@aclreport node/][/#if] ${node.name?xml} @@ -171,26 +148,24 @@ [#macro assoc assoc propfilter="*" includeallowableactions=false ns=""] [@entry ns] -${xmldate(date)} [#-- TODO: [@namedvalue cmisconstants.PROP_CREATED_BY assoc cmisconstants.DATATYPE_STRING/] --] -[@namedvalue cmisconstants.PROP_OBJECT_ID assoc cmisconstants.DATATYPE_ID/] [#-- TODO: spec id, how to map? --] +${assoc.source.properties.creator!""} +[@namedvalue cmisconstants.PROP_OBJECT_ID assoc cmisconstants.DATATYPE_ID/] [@namedvalue cmisconstants.PROP_OBJECT_ID assoc cmisconstants.DATATYPE_ID/] [#-- TODO: id compliant --] [@linksLib.linkassocself assoc/] [@linksLib.linkassocedit assoc/] [@assocCMISLinks assoc=assoc/] -${xmldate(date)} [#-- TODO: [@namedvalue cmisconstants.PROP_CREATION_DATE assoc cmisconstants.DATATYPE_DATETIME/] --] -[@namedvalue cmisconstants.PROP_OBJECT_ID assoc cmisconstants.DATATYPE_ID/] [#-- TODO: spec id, how to map? --] -[@namedvalue cmisconstants.PROP_OBJECT_ID assoc cmisconstants.DATATYPE_ID/] [#-- TODO: spec id, how to map? --] +[@namedvalue cmisconstants.PROP_NAME assoc cmisconstants.DATATYPE_STRING/] ${xmldate(date)} [#-- TODO: [@namedvalue cmisconstants.PROP_LAST_MODIFICATION_DATE assoc cmisconstants.DATATYPE_DATETIME/] --] ${xmldate(date)} [#-- TODO: [@namedvalue cmisconstants.PROP_LAST_MODIFICATION_DATE assoc cmisconstants.DATATYPE_DATETIME/] --] [@objectCMISProps assoc propfilter/] -[#-- TODO: [#if includeallowableactions][@allowableactions node/][/#if] --] +[#if includeallowableactions][@assocallowableactions assoc/][/#if] [/@entry] [/#macro] [#macro assocCMISLinks assoc] -[#-- TODO: --] +[@linksLib.linkassocallowableactions assoc/] [@linksLib.linktype assoc/] [@linksLib.linktosource assoc.source/] [@linksLib.linktotarget assoc.target/] @@ -203,7 +178,7 @@ [#-- --] [#-- TODO: spec issue 47 --] -[#macro row row renditionfilter="cmis:none" includeallowableactions=false] +[#macro row row renditionfilter="cmis:none" includeallowableactions=false includerelationships="none"] [@entry] [#-- TODO: calculate multiNodeResultSet from result set --] [#if row.nodes?? && row.nodes?size == 1][#assign node = row.nodes?first/][/#if] @@ -255,7 +230,10 @@ [/#if] [/#list] -[#if node?? && includeallowableactions][@allowableactions node/][/#if] +[#if node??] +[#if includeallowableactions][@allowableactions node/][/#if] +[@relationships node includerelationships includeallowableactions/] +[/#if] [/@entry] [/#macro] @@ -391,6 +369,20 @@ [#macro urivalue value]${value?xml}[/#macro] [#macro idvalue value]${value?xml}[/#macro] +[#-- --] +[#-- CMIS Relationships --] +[#-- --] + +[#macro relationships node includerelationships="none" includeallowableactions=false propfilter="*"] +[#if includerelationships != "none"] +[#list cmisassocs(node, includerelationships) as assoc] + + [@objectCMISProps assoc propfilter/] + [#if includeallowableactions][@assocallowableactions assoc/][/#if] + +[/#list] +[/#if] +[/#macro] [#-- --] [#-- CMIS Allowable Actions --] @@ -410,6 +402,20 @@ ${actionevaluator.isAllowed(node.nodeRef)?string} [/#macro] +[#macro assocallowableactions assoc ns=""] + +[#nested] +[#assign typedef = cmistype(assoc)] +[#list typedef.actionEvaluators?values as actionevaluator] + [@assocallowableaction assoc actionevaluator/] +[/#list] + +[/#macro] + +[#macro assocallowableaction assoc actionevaluator] +${actionevaluator.isAllowed(assoc.associationRef)?string} +[/#macro] + [#-- --] [#-- CMIS Access Control Lists --] [#-- --] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/links.lib.atom.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/links.lib.atom.ftl index 0a915157b1..b6a62e69f6 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/links.lib.atom.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/links.lib.atom.ftl @@ -14,6 +14,11 @@ [/#macro] +[#-- Link to node allowable actions --] +[#macro linkassocallowableactions assoc] + +[/#macro] + [#-- Link to node relationships --] [#macro linkrelationships node] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/parent.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/parent.get.js index b3d862540a..bdb565e61f 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/parent.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/parent.get.js @@ -30,4 +30,11 @@ script: // include allowable actions var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } } diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.atomfeed.ftl index d61c90bdd1..3843ac445f 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.atomfeed.ftl @@ -17,7 +17,7 @@ [/@feedLib.node] [#if parent?? && parent.isContainer] - [@entryLib.folder node=parent renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none" relativePathSegment=node.name/] + [@entryLib.folder node=parent renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships relativePathSegment=node.name/] [/#if] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.desc.xml index 3dd4878381..0595266ff7 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/parents.get.desc.xml @@ -25,14 +25,14 @@ If “includeAllowableActions” is TRUE, the repository will return the allowab - /cmis/i/{id}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/i/{id}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/i/{id}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/i/{id}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} - /cmis/p{path}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/p{path}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/p{path}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/p{path}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} - /api/node/{store_type}/{store_id}/{id}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /api/path/{store_type}/{store_id}/{path}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /api/node/{store_type}/{store_id}/{id}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /api/path/{store_type}/{store_id}/{path}/parents?filter={filter?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} guest diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.atomentry.ftl index f89e065be1..29a90a912a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.atomentry.ftl @@ -7,6 +7,6 @@ [#assign namespace][@nsLib.entryNS/][/#assign] -[@entryLib.document node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships="none" includeacl=includeACL ns=namespace/] +[@entryLib.document node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships includeacl=includeACL ns=namespace/] [/#compress] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.desc.xml index 4935e5eabc..6318b772a4 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.desc.xml @@ -26,8 +26,8 @@ PropertyCollection includes changeToken (if applicable to repository)
]]> - /cmis/pwc/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} - /cmis/pwc/s/{store}/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/pwc/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} + /cmis/pwc/s/{store}/i/{id}?filter={filter?}&returnVersion={returnVersion?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&includeACL={includeACL?}&renditionFilter={renditionFilter?} user diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.js index 8054613ab9..a0ff01a9c4 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/pwc.get.js @@ -36,4 +36,11 @@ script: // include allowable actions model.includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true"; + + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } } diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.atomfeed.ftl index 9145e04dc6..ec0636c43c 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.atomfeed.ftl @@ -20,7 +20,7 @@ [#assign rs = cmisresultset(resultset)] [#list rs.rows as row] -[@entryLib.row row=row renditionfilter=renditionFilter includeallowableactions=includeAllowableActions/] +[@entryLib.row row=row renditionfilter=renditionFilter includeallowableactions=includeAllowableActions includerelationships=includeRelationships/] [/#list] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.cmisquery.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.cmisquery.js index fd368f149c..7b59d4969c 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.cmisquery.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/queries.post.cmisquery.js @@ -47,6 +47,13 @@ script: var includeAllowableActions = cmisQuery.includeAllowableActions.toString(); model.includeAllowableActions = (includeAllowableActions == null || includeAllowableActions == "true" ? true : false); + // include relationships + model.includeRelationships = cmisQuery.includeRelationships.toString(); + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } + // rendition filter var renditionFilter = cmisQuery.renditionFilter.toString(); model.renditionFilter = renditionFilter != null && renditionFilter.length > 0 ? renditionFilter : "cmis:none"; diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.atomfeed.ftl index 69887d68be..e2b1588582 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.atomfeed.ftl @@ -20,7 +20,7 @@ [#assign rs = cmisresultset(resultset)] [#list rs.rows as row] -[@entryLib.row row=row includeallowableactions=includeAllowableActions/] +[@entryLib.row row=row includeallowableactions=includeAllowableActions includerelationships=includeRelationships/] [/#list] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.desc.xml index e680414263..92b2317b1b 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.desc.xml @@ -29,7 +29,7 @@ It is recommended that “includeAllowableActions” be used with query statemen "IncludeRelationships" indicates whether relationships are also returned for each returned object. If it is set to "source" or "target", relationships for which the returned object is a source, or respectively a target, will also be returned. If it is set to "both", relationships for which the returned object is either a source or a target will be returned. If it is set to "none", relationships are not returned.
]]> - /cmis/query?q={q}&includeAllowableActions={includeAllowableActions?}&searchAllVersions={searchAllVersions?}&skipCount={skipCount?}&maxItems={maxItems?} + /cmis/query?q={q}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&searchAllVersions={searchAllVersions?}&skipCount={skipCount?}&maxItems={maxItems?} user diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.js index e1722669d8..3ad56254ba 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/query.get.js @@ -29,6 +29,13 @@ script: // include allowable actions var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } // perform query var page = paging.createPageOrWindow(args); diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.cmisallowableactions.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.cmisallowableactions.ftl new file mode 100644 index 0000000000..93c33a5b52 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.cmisallowableactions.ftl @@ -0,0 +1,11 @@ +[#ftl] +[#import "/org/alfresco/cmis/lib/ns.lib.atom.ftl" as nsLib/] +[#import "/org/alfresco/cmis/lib/links.lib.atom.ftl" as linksLib/] +[#import "/org/alfresco/cmis/lib/atomentry.lib.atom.ftl" as entryLib/] +[#compress] + + +[#assign namespace][@nsLib.allowableactionsNS/][/#assign] +[@entryLib.assocallowableactions assoc=assoc ns=namespace/] + +[/#compress] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.desc.xml new file mode 100644 index 0000000000..d1ce802b7d --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.desc.xml @@ -0,0 +1,9 @@ + + Retrieve Allowable Actions + Retrieve Allowable Actions + /cmis/rel/{assoc_id}/allowableactions + guest + + argument + CMIS + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.js new file mode 100644 index 0000000000..b946bff68f --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/relallowableactions.get.js @@ -0,0 +1,13 @@ + + +script: +{ + // locate association + var rel = getAssocFromUrl(); + if (rel.assoc == null) + { + break script; + } + model.assoc = rel.assoc; + +} diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/relationships.post.atom.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/relationships.post.atom.js index edaa832a82..898dc44829 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/relationships.post.atom.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/relationships.post.atom.js @@ -32,7 +32,7 @@ script: model.assoc = assoc; // TODO: set Content-Location status.code = 201; - // TODO: complete url mapping - status.location = url.server + url.serviceContext + "/cmis/rel/" + model.source.nodeRef.storeRef.protocol + "/" + model.source.nodeRef.storeRef.identifier + "/" + model.source.nodeRef.id; + + status.location = url.server + url.serviceContext + "/cmis/rel/" + assoc.associationRef.id; status.redirect = true; } diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.atomfeed.ftl index 02ac6b4c61..8cc9141c66 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.atomfeed.ftl @@ -22,7 +22,7 @@ [#if depth > 0 || depth == -1] [#list cmischildren(node, "folders") as child] - [@entryLib.foldertree node=child renditionfilter=renditionFilter propfilter=propFilter includeallowableactions=includeAllowableActions includerelationships=false maxdepth=depth/] + [@entryLib.foldertree node=child renditionfilter=renditionFilter propfilter=propFilter includeallowableactions=includeAllowableActions includerelationships=includeRelationships maxdepth=depth/] [/#list] [/#if] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.desc.xml index 390dcf3c78..47a7e1b4c2 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.desc.xml @@ -4,14 +4,14 @@ - /cmis/i/{id}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/i/{id}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/i/{id}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/i/{id}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} - /cmis/p{path}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /cmis/s/{store}/p{path}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /cmis/p{path}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /cmis/s/{store}/p{path}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} - /api/node/{store_type}/{store_id}/{id}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} - /api/path/{store_type}/{store_id}/{path}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&renditionFilter={renditionFilter?} + /api/node/{store_type}/{store_id}/{id}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} + /api/path/{store_type}/{store_id}/{path}/tree?filter={filter?}&depth={depth?}&includeAllowableActions={includeAllowableActions?}&includeRelationships={includeRelationships?}&renditionFilter={renditionFilter?} guest diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.js index e07c6d378b..c19b3ef204 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/tree.get.js @@ -39,4 +39,11 @@ script: // include allowable actions var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); + + // include relationships + model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; + if (model.includeRelationships == null || model.includeRelationships.length == 0) + { + model.includeRelationships = "none"; + } } diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/versions.get.atomfeed.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/versions.get.atomfeed.ftl index b52b507550..f52c55ebb7 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/versions.get.atomfeed.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/versions.get.atomfeed.ftl @@ -17,7 +17,9 @@ [/@feedLib.generic] [#list nodes as version] - [@entryLib.version version/] + [#if node.isDocument] + [@entryLib.document node=version propfilter=filter includeallowableactions=includeAllowableActions/] + [/#if] [/#list] diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index c8fd95e3a5..572d62e4bb 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -167,6 +167,13 @@ + + + + + + + diff --git a/source/java/org/alfresco/repo/cmis/rest/CMISAssocsMethod.java b/source/java/org/alfresco/repo/cmis/rest/CMISAssocsMethod.java new file mode 100644 index 0000000000..fbcab08c25 --- /dev/null +++ b/source/java/org/alfresco/repo/cmis/rest/CMISAssocsMethod.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * 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. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.repo.cmis.rest; + +import java.util.List; + +import org.alfresco.cmis.CMISRelationshipDirectionEnum; +import org.alfresco.cmis.CMISServiceException; +import org.alfresco.cmis.CMISServices; +import org.alfresco.repo.template.TemplateNode; +import org.alfresco.repo.web.scripts.RepositoryImageResolver; +import org.alfresco.service.cmr.repository.AssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.TemplateImageResolver; +import org.alfresco.service.cmr.repository.TemplateValueConverter; +import org.springframework.extensions.webscripts.WebScriptException; + +import freemarker.ext.beans.BeanModel; +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateScalarModel; + +/** + * Custom FreeMarker Template language method. + *

+ * Gets the associations of a TemplateNode + *

+ * Usage: cmisassocs(TemplateNode node, String direction) + * + * @author dward + */ +public class CMISAssocsMethod implements TemplateMethodModelEx +{ + private CMISServices cmisService; + private TemplateImageResolver imageResolver; + private TemplateValueConverter templateValueConverter; + + /** + * Construct + */ + public CMISAssocsMethod(CMISServices cmisService, RepositoryImageResolver imageResolver, + TemplateValueConverter templateValueConverter) + { + this.cmisService = cmisService; + this.imageResolver = imageResolver.getImageResolver(); + this.templateValueConverter = templateValueConverter; + } + + @SuppressWarnings("unchecked") + public Object exec(List args) throws TemplateModelException + { + NodeRef nodeRef = null; + CMISRelationshipDirectionEnum direction = CMISRelationshipDirectionEnum.SOURCE; + try + { + int i = 0; + // extract node ref + Object arg = args.get(i++); + if (arg instanceof BeanModel) + { + Object wrapped = ((BeanModel) arg).getWrappedObject(); + if (wrapped != null) + { + if (wrapped instanceof TemplateNode) + { + nodeRef = ((TemplateNode) wrapped).getNodeRef(); + } + } + } + // extract direction, if specified + arg = args.get(i++); + if (arg instanceof TemplateScalarModel) + { + direction = CMISRelationshipDirectionEnum.valueOf(((TemplateScalarModel) arg).getAsString()); + } + } + catch (IndexOutOfBoundsException e) + { + // Ignore optional arguments + } + + // query relationships + if (nodeRef != null) + { + AssociationRef[] assocs; + try + { + assocs = cmisService.getRelationships(nodeRef, null, true, direction); + } + catch (CMISServiceException e) + { + throw new WebScriptException(e.getStatusCode(), e.getMessage(), e); + } + return templateValueConverter.convertValue(assocs, imageResolver); + } + + return null; + } + +} diff --git a/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java index 27e5c859e1..f814bbb791 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java @@ -50,6 +50,7 @@ import org.alfresco.cmis.CMISConstraintException; import org.alfresco.cmis.CMISFilterNotValidException; import org.alfresco.cmis.CMISInvalidArgumentException; import org.alfresco.cmis.CMISQueryService; +import org.alfresco.cmis.CMISRelationshipDirectionEnum; import org.alfresco.cmis.CMISRendition; import org.alfresco.cmis.CMISRenditionService; import org.alfresco.cmis.CMISServices; @@ -87,14 +88,20 @@ public class DMAbstractServicePort private static final String INVALID_REPOSITORY_ID_MESSAGE = "Invalid repository id"; private static final Map ACL_PROPAGATION_ENUM_MAPPGIN; + private static final Map INCLUDE_RELATIONSHIPS_ENUM_MAPPING; private static final Map ALLOWED_ACTION_ENUM_MAPPING; static { - ACL_PROPAGATION_ENUM_MAPPGIN = new HashMap(); + ACL_PROPAGATION_ENUM_MAPPGIN = new HashMap(5); ACL_PROPAGATION_ENUM_MAPPGIN.put(EnumACLPropagation.OBJECTONLY, CMISAclPropagationEnum.OBJECT_ONLY); ACL_PROPAGATION_ENUM_MAPPGIN.put(EnumACLPropagation.PROPAGATE, CMISAclPropagationEnum.PROPAGATE); ACL_PROPAGATION_ENUM_MAPPGIN.put(EnumACLPropagation.REPOSITORYDETERMINED, CMISAclPropagationEnum.REPOSITORY_DETERMINED); + INCLUDE_RELATIONSHIPS_ENUM_MAPPING = new HashMap(5); + INCLUDE_RELATIONSHIPS_ENUM_MAPPING.put(EnumIncludeRelationships.SOURCE, CMISRelationshipDirectionEnum.SOURCE); + INCLUDE_RELATIONSHIPS_ENUM_MAPPING.put(EnumIncludeRelationships.TARGET, CMISRelationshipDirectionEnum.TARGET); + INCLUDE_RELATIONSHIPS_ENUM_MAPPING.put(EnumIncludeRelationships.BOTH, CMISRelationshipDirectionEnum.BOTH); + try { ALLOWED_ACTION_ENUM_MAPPING = new HashMap(97); @@ -210,37 +217,99 @@ public class DMAbstractServicePort * This method converts Alfresco's NodeRef's to CMIS objects those will be stored in resultList-parameter. Properties for returning filtering also performs * * @param filter properties filter value for filtering objects returning properties + * @param includeRelationships + * what relationships to include * @param sourceList the list that contains all returning Node References * @param resultList the list of CmisObjectType values for end response result collecting * @throws CmisException */ - protected void createCmisObjectList(PropertyFilter filter, boolean includeAllowableActions, String renditionFilter, List sourceList, List resultList) - throws CmisException + protected void createCmisObjectList(PropertyFilter filter, CMISRelationshipDirectionEnum includeRelationships, + boolean includeAllowableActions, String renditionFilter, List sourceList, + List resultList) throws CmisException { for (NodeRef objectNodeRef : sourceList) { - resultList.add(createCmisObject(objectNodeRef, filter, includeAllowableActions, renditionFilter)); + resultList.add(createCmisObject(objectNodeRef, filter, includeRelationships, includeAllowableActions, + renditionFilter)); } } /** - * This method creates and configures CMIS object against appropriate Alfresco object (NodeRef or AssociationRef) + * This method creates and configures CMIS object against appropriate Alfresco object (NodeRef or AssociationRef). * - * @param objectNodeRef the Alfresco object against those conversion must to be done - * @param filter accepted properties filter - * @return converted to CMIS object Alfresco object + * @param object + * the Alfresco object + * @param filter + * accepted properties filter + * @param includeRelationships + * what relationships to include + * @param includeAllowableActions + * should we include allowable actions? + * @param renditionFilter + * the rendition filter + * @return the converted CMIS object + * @throws CmisException + * on error */ - protected CmisObjectType createCmisObject(Object identifier, PropertyFilter filter, boolean includeAllowableActions, String renditionFilter) throws CmisException + protected CmisObjectType createCmisObject(Object object, PropertyFilter filter, + EnumIncludeRelationships includeRelationships, Boolean includeAllowableActions, String renditionFilter) + throws CmisException { + return createCmisObject(object, filter, includeRelationships == null ? null + : INCLUDE_RELATIONSHIPS_ENUM_MAPPING.get(includeRelationships), includeAllowableActions != null + && includeAllowableActions, renditionFilter); + } + + /** + * This method creates and configures CMIS object against appropriate Alfresco object (NodeRef or AssociationRef). + * + * @param object + * the Alfresco object + * @param filter + * accepted properties filter + * @param includeRelationships + * what relationships to include + * @param includeAllowableActions + * should we include allowable actions? + * @param renditionFilter + * the rendition filter + * @return the converted CMIS object + * @throws CmisException + * on error + */ + protected CmisObjectType createCmisObject(Object object, PropertyFilter filter, + CMISRelationshipDirectionEnum includeRelationships, boolean includeAllowableActions, String renditionFilter) + throws CmisException + { + // Get a NodeRef if we can + if (object instanceof Version) + { + object = ((Version) object).getFrozenStateNodeRef(); + } CmisObjectType result = new CmisObjectType(); - result.setProperties(propertiesUtil.getProperties(identifier, filter)); + result.setProperties(propertiesUtil.getProperties(object, filter)); + if (object instanceof NodeRef && includeRelationships != null) + { + List relationships = result.getRelationship(); + try + { + for (AssociationRef assoc : cmisService.getRelationships((NodeRef)object, null, true, includeRelationships)) + { + relationships.add(createCmisObject(assoc, filter, includeRelationships, includeAllowableActions, renditionFilter)); + } + } + catch (CMISInvalidArgumentException e) + { + throw ExceptionUtil.createCmisException(e); + } + } if (includeAllowableActions) { - result.setAllowableActions(determineObjectAllowableActions(identifier)); + result.setAllowableActions(determineObjectAllowableActions(object)); } if (renditionFilter != null) { - List renditions = getRenditions(identifier, renditionFilter); + List renditions = getRenditions(object, renditionFilter); if (renditions != null && !renditions.isEmpty()) { result.getRendition().addAll(renditions); diff --git a/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java index 6a0b9f4a2e..2a5bb4f5eb 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java @@ -84,13 +84,10 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na for (int index = cursor.getStartRow(); index <= cursor.getEndRow(); index++) { - resultListing.add(createCmisObject(nodeRefs[index], propertyFilter, includeAllowableActions, - renditionFilter)); + resultListing.add(createCmisObject(nodeRefs[index], propertyFilter, includeRelationships, + includeAllowableActions, renditionFilter)); } result.setHasMoreItems(new Boolean(cursor.getEndRow() < (nodeRefs.length - 1))); - - // TODO: includeAllowableActions, includeRelationships, renditions - return result; } catch (CMISServiceException e) @@ -128,8 +125,8 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na for (int index = cursor.getStartRow(); index <= cursor.getEndRow(); index++) { - CmisObjectType cmisObject = createCmisObject(listing[index], propertyFilter, includeAllowableActions, - renditionFilter); + CmisObjectType cmisObject = createCmisObject(listing[index], propertyFilter, includeRelationships, + includeAllowableActions, renditionFilter); CmisObjectInFolderType cmisObjectInFolder = new CmisObjectInFolderType(); cmisObjectInFolder.setObject(cmisObject); if (includePathSegments != null && includePathSegments) @@ -220,7 +217,7 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na throw ExceptionUtil.createCmisException(e); } - CmisObjectType result = createCmisObject(parentRef, propertyFilter, false, null); + CmisObjectType result = createCmisObject(parentRef, propertyFilter, null, false, null); return result; } @@ -253,8 +250,8 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na String relativePathSegment = propertiesUtil.getProperty(childNode, CMISDictionaryModel.PROP_NAME, ""); for (NodeRef objectNodeRef : parents) { - CmisObjectType cmisObject = createCmisObject(objectNodeRef, propertyFilter, includeAllowableActions, renditionFilter); - // TODO: includeRelationship, renditions + CmisObjectType cmisObject = createCmisObject(objectNodeRef, propertyFilter, includeRelationships, + includeAllowableActions, renditionFilter); CmisObjectParentsType cmisObjectParentsType = new CmisObjectParentsType(); cmisObjectParentsType.setObject(cmisObject); if (includeRelativePathSegment != null && includeRelativePathSegment) @@ -262,7 +259,6 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na cmisObjectParentsType.setRelativePathSegment(relativePathSegment); } result.add(cmisObjectParentsType); - } return result; } @@ -319,9 +315,8 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na private CmisObjectInFolderContainerType createObjectInFolderContainer(NodeRef nodeRef, PropertyFilter filter, Boolean includeAllowableActions, EnumIncludeRelationships includeRelationships, String renditionFilter, Boolean includePathSegments) throws CmisException { - includeAllowableActions = includeAllowableActions == null ? Boolean.FALSE : includeAllowableActions; - CmisObjectType cmisObject = createCmisObject(nodeRef, filter, includeAllowableActions, renditionFilter); - // TODO: add relationships and renditions + CmisObjectType cmisObject = createCmisObject(nodeRef, filter, includeRelationships, includeAllowableActions, + renditionFilter); CmisObjectInFolderType objectInFolderType = new CmisObjectInFolderType(); objectInFolderType.setObject(cmisObject); diff --git a/source/java/org/alfresco/repo/cmis/ws/DMObjectServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMObjectServicePort.java index d9e56943e5..99868e721e 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMObjectServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMObjectServicePort.java @@ -431,8 +431,8 @@ public class DMObjectServicePort extends DMAbstractServicePort implements Object { NodeRef object = cmisService.getReadableObject(objectId, NodeRef.class); PropertyFilter propertyFilter = createPropertyFilter(filter); - boolean includeActions = (null != includeAllowableActions) ? (includeAllowableActions.booleanValue()) : (false); - CmisObjectType cmisObject = createCmisObject(object, propertyFilter, includeActions, renditionFilter); + CmisObjectType cmisObject = createCmisObject(object, propertyFilter, includeRelationships, + includeAllowableActions, renditionFilter); // TODO: process relationships // TODO: process policyIds @@ -471,7 +471,8 @@ public class DMObjectServicePort extends DMAbstractServicePort implements Object throw ExceptionUtil.createCmisException("Path to Folder was not specified or Folder Path is invalid", EnumServiceException.INVALID_ARGUMENT); } PropertyFilter propertyFilter = createPropertyFilter(filter); - CmisObjectType object = createCmisObject(objectNodeRef, propertyFilter, includeAllowableActions, renditionFilter); + CmisObjectType object = createCmisObject(objectNodeRef, propertyFilter, includeRelationships, + includeAllowableActions, renditionFilter); boolean includeAcl = (null != includeACL) ? (includeACL.booleanValue()) : (false); if (includeAcl) { diff --git a/source/java/org/alfresco/repo/cmis/ws/DMRelationshipServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMRelationshipServicePort.java index 1bc9fa9f9d..e50f402087 100755 --- a/source/java/org/alfresco/repo/cmis/ws/DMRelationshipServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMRelationshipServicePort.java @@ -88,14 +88,14 @@ public class DMRelationshipServicePort extends DMAbstractServicePort implements } } - private CmisObjectListType createResult(PropertyFilter filter, boolean includeAllowableActions, Object[] sourceArray, BigInteger skipCount, BigInteger maxItems) + private CmisObjectListType createResult(PropertyFilter filter, Boolean includeAllowableActions, Object[] sourceArray, BigInteger skipCount, BigInteger maxItems) throws CmisException { Cursor cursor = createCursor(sourceArray.length, skipCount, maxItems); CmisObjectListType result = new CmisObjectListType(); for (int i = cursor.getStartRow(); i <= cursor.getEndRow(); i++) { - result.getObjects().add(createCmisObject(sourceArray[i], filter, includeAllowableActions, null)); + result.getObjects().add(createCmisObject(sourceArray[i], filter, null, includeAllowableActions, null)); } result.setHasMoreItems(cursor.getEndRow() < sourceArray.length); result.setNumItems(BigInteger.valueOf(cursor.getPageSize())); diff --git a/source/java/org/alfresco/repo/cmis/ws/DMVersioningServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMVersioningServicePort.java index 1b404d64ca..488d264da6 100755 --- a/source/java/org/alfresco/repo/cmis/ws/DMVersioningServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMVersioningServicePort.java @@ -162,15 +162,11 @@ public class DMVersioningServicePort extends DMAbstractServicePort implements Ve checkRepositoryId(repositoryId); PropertyFilter propertyFilter = createPropertyFilter(filter); List objects = new LinkedList(); - if (includeAllowableActions == null) - { - includeAllowableActions = false; - } try { for (NodeRef nodeRef : cmisService.getAllVersions(objectId)) { - objects.add(createCmisObject(nodeRef, propertyFilter, includeAllowableActions, null)); + objects.add(createCmisObject(nodeRef, propertyFilter, null, includeAllowableActions, null)); } } catch (CMISServiceException e) @@ -215,10 +211,10 @@ public class DMVersioningServicePort extends DMAbstractServicePort implements Ve try { NodeRef latestVersionNodeRef = cmisService.getLatestVersion(objectId, major != null && major); - // TODO: includeRelationships // TODO: includePolicyIds PropertyFilter propertyFilter = createPropertyFilter(filter); - CmisObjectType result = createCmisObject(latestVersionNodeRef, propertyFilter, includeAllowableActions, renditionFilter); + CmisObjectType result = createCmisObject(latestVersionNodeRef, propertyFilter, includeRelationships, + includeAllowableActions, renditionFilter); if (includeACL) { appendWithAce(cmisService.getVersionSeries(objectId, NodeRef.class, false), result);