From 652cd91de779fb2618bca549b7f00c9f714a17d1 Mon Sep 17 00:00:00 2001 From: Mike Hatfield Date: Thu, 3 Jul 2008 15:34:18 +0000 Subject: [PATCH] Re-org of DocLib data webscripts to support both site-format and noderef-format references. New DocLib "generic action" function which enables much easier addition of new actions. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@9638 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../documentlibrary/action/action.lib.js | 86 +++++++++++++++++-- .../action/cancel-checkout.post.desc.xml | 9 ++ .../action/cancel-checkout.post.js | 58 +++++++++++++ .../action/cancel-checkout.post.json.ftl | 2 + .../action/checkin.post.desc.xml | 9 ++ .../documentlibrary/action/checkin.post.js | 58 +++++++++++++ .../action/checkin.post.json.ftl | 2 + .../action/checkout.post.desc.xml | 3 +- .../action/file.delete.desc.xml | 6 +- .../documentlibrary/action/file.delete.js | 10 ++- .../action/folder.post.desc.xml | 8 +- .../slingshot/documentlibrary/doclist.get.js | 2 + .../documentlibrary/doclist.get.json.ftl | 1 + 13 files changed, 241 insertions(+), 13 deletions(-) create mode 100644 config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.json.ftl create mode 100644 config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.json.ftl diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/action.lib.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/action.lib.js index 5a688a0e9f..8a60789502 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/action.lib.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/action.lib.js @@ -19,7 +19,15 @@ main(); function main() { // Params object contains commonly-used arguments - var params = getInputParams(); + var params; + if (url.templateArgs.storetype != undefined) + { + params = getNodeRefInputParams(); + } + else + { + params = getSiteInputParams(); + } if (typeof params == "string") { status.setCode(status.STATUS_BAD_REQUEST, params); @@ -68,12 +76,12 @@ function main() /** - * Get and check existence of mandatory input parameter + * Get and check existence of mandatory input parameters (Site-based) * - * @method getInputParams + * @method getSiteInputParams * @return {object|string} object literal containing parameters value or string error */ -function getInputParams() +function getSiteInputParams() { var params = {}; var error = null; @@ -140,7 +148,68 @@ function getInputParams() { containerId: containerId, siteId: siteId, - filePath: filePath + filePath: filePath, + usingNodeRef: false + } + } + catch(e) + { + error = e.toString(); + } + + // Return the params object, or the error string if it was set + return (error !== null ? error : params); +} + +/** + * Get and check existence of mandatory input parameters (nodeRef-based) + * + * @method getNodeRefInputParams + * @return {object|string} object literal containing parameters value or string error + */ +function getNodeRefInputParams() +{ + var params = {}; + var error = null; + + try + { + // First try to get the parameters from the URI + var storeType = url.templateArgs.storetype; + var storeId = url.templateArgs.storeid; + var id = url.templateArgs.id; + + // Was a JSON parameter list supplied? + // TODO: Also handle multiple files + if (typeof json == "object") + { + if (!json.isNull("storetype")) + { + storeType = json.get("storetype"); + } + if (!json.isNull("storeid")) + { + storeId = json.get("storeid"); + } + if (!json.isNull("id")) + { + id = json.get("id"); + } + } + + var nodeRef = storeType + "://" + storeId + "/" + id; + var node = search.findNode(nodeRef); + + if (node === null) + { + return "'" + nodeRef + "' is not valid."; + } + + // Populate the return object + params = + { + nodeRef: nodeRef, + usingNodeRef: true } } catch(e) @@ -164,6 +233,11 @@ function getRootNode(p_params) var rootNode = null; var error = null; + if (p_params.usingNodeRef) + { + return search.findNode(p_params.nodeRef); + } + try { // Find the site @@ -205,7 +279,7 @@ function getAssetNode(p_rootNode, p_assetPath) try { - if (p_assetPath.length > 0) + if (p_assetPath && (p_assetPath.length > 0)) { assetNode = assetNode.childByNamePath(p_assetPath); } diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.desc.xml new file mode 100644 index 0000000000..ff1062ad6a --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.desc.xml @@ -0,0 +1,9 @@ + + cancel-checkout + Document List Action - Cancel check-out for file + /slingshot/doclib/action/cancel-checkout/site/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/cancel-checkout/node/{storetype}/{storeid}/{id} + argument + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.js new file mode 100644 index 0000000000..0137e5f0e2 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.js @@ -0,0 +1,58 @@ + + +/** + * Cancel checkout file action + * @method POST + * @param uri {string} /{siteId}/{containerId}/{filepath} + */ + +/** + * Entrypoint required by action.lib.js + * + * @method runAction + * @param p_params {object} standard action parameters: nodeRef, siteId, containerId, filePath + * @return {object|null} object representation of action result + */ +function runAction(p_params) +{ + var results; + + try + { + var assetNode = getAssetNode(p_params.rootNode, p_params.filePath); + + // Must have assetNode by this point + if (typeof assetNode == "string") + { + status.setCode(status.STATUS_NOT_FOUND, "Not found: " + p_params.filePath); + return; + } + + // Checkin the asset + var originalDoc = assetNode.cancelCheckout(); + if (originalDoc === null) + { + status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, "Could not cancel checkout: " + p_params.filePath); + return; + } + + var resultId = originalDoc.name; + var resultNodeRef = originalDoc.nodeRef.toString(); + + // Construct the result object + results = [ + { + id: resultId, + nodeRef: resultNodeRef, + action: "cancelCheckoutAsset", + success: true + }]; + } + catch(e) + { + status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, e.toString()); + return; + } + + return results; +} diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.json.ftl new file mode 100644 index 0000000000..e2f0e9da9f --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/cancel-checkout.post.json.ftl @@ -0,0 +1,2 @@ +<#import "action.lib.ftl" as actionLib /> +<@actionLib.resultsJSON results=results /> \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.desc.xml new file mode 100644 index 0000000000..c0cb6c9a9d --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.desc.xml @@ -0,0 +1,9 @@ + + checkin + Document List Action - Check-in file + /slingshot/doclib/action/checkin/site/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/checkin/node/{storetype}/{storeid}/{id} + argument + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.js new file mode 100644 index 0000000000..4060e8add0 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.js @@ -0,0 +1,58 @@ + + +/** + * Checkin file action + * @method POST + * @param uri {string} /{siteId}/{containerId}/{filepath} + */ + +/** + * Entrypoint required by action.lib.js + * + * @method runAction + * @param p_params {object} standard action parameters: nodeRef, siteId, containerId, filePath + * @return {object|null} object representation of action result + */ +function runAction(p_params) +{ + var results; + + try + { + var assetNode = getAssetNode(p_params.rootNode, p_params.filePath); + + // Must have assetNode by this point + if (typeof assetNode == "string") + { + status.setCode(status.STATUS_NOT_FOUND, "Not found: " + p_params.filePath); + return; + } + + // Checkin the asset + var originalDoc = assetNode.checkin(); + if (originalDoc === null) + { + status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, "Could not checkin: " + p_params.filePath); + return; + } + + var resultId = assetNode.name; + var resultNodeRef = originalDoc.nodeRef.toString(); + + // Construct the result object + results = [ + { + id: resultId, + nodeRef: resultNodeRef, + action: "checkinAsset", + success: true + }]; + } + catch(e) + { + status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, e.toString()); + return; + } + + return results; +} diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.json.ftl new file mode 100644 index 0000000000..e2f0e9da9f --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkin.post.json.ftl @@ -0,0 +1,2 @@ +<#import "action.lib.ftl" as actionLib /> +<@actionLib.resultsJSON results=results /> \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkout.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkout.post.desc.xml index 2465aac75d..bc23cd0197 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkout.post.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/checkout.post.desc.xml @@ -1,7 +1,8 @@ checkout Document List Action - Check-out file - /slingshot/doclib/action/checkout/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/checkout/site/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/checkout/node/{storetype}/{storeid}/{id} argument user required diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.desc.xml index 6ee313b27c..3c3441c5f9 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.desc.xml @@ -1,8 +1,10 @@ file Document List Action - Delete file - /slingshot/doclib/action/file/{siteid}/{containerId}/{filepath} - /slingshot/doclib/action/folder/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/file/site/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/folder/site/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/file/node/{storetype}/{storeid}/{id} + /slingshot/doclib/action/folder/node/{storetype}/{storeid}/{id} argument user required diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.js index cc01280248..bf44a0eede 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/file.delete.js @@ -19,7 +19,15 @@ function runAction(p_params) try { - var assetNode = getAssetNode(p_params.rootNode, p_params.filePath); + var assetNode; + if (p_params.usingNodeRef) + { + assetNode = p_params.nodeRef; + } + else + { + assetNode = getAssetNode(p_params.rootNode, p_params.filePath); + } // Must have assetNode by this point if (typeof assetNode == "string") diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/folder.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/folder.post.desc.xml index fff699c210..b3490560db 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/folder.post.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/action/folder.post.desc.xml @@ -1,9 +1,11 @@ folder Document List Action - Create folder - /slingshot/doclib/action/folder/{siteid}/{containerId} - /slingshot/doclib/action/folder/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/folder/site/{siteid}/{containerId} + /slingshot/doclib/action/folder/site/{siteid}/{containerId}/{filepath} + /slingshot/doclib/action/folder/node/{storetype}/{storeid}/{id} argument user required - \ No newline at end of file + + diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js index 4ecb25f13a..671f6d4ab5 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js @@ -43,6 +43,7 @@ function getDoclist(siteId, path, type, filter) else { pathNode = containerNode; + path = ""; } if (pathNode === null) @@ -114,6 +115,7 @@ function getDoclist(siteId, path, type, filter) items.push( { asset: asset, + parent: path, status: itemStatus, owner: itemOwner, actionSet: actionSet diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.json.ftl index 4e7c74501e..0d4a45f10e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.json.ftl @@ -15,6 +15,7 @@ "mimetype": "${d.mimetype!""}", "icon32": "${d.icon32}", "name": "${d.name?replace(" (Working Copy)", "")?html}", + "parent": "${item.parent}", "status": "<#list item.status as s>${s}<#if s_has_next>,", "lockedBy": "${item.owner}", "title": "${(d.properties.title!"")?html}",