From c252a3e4b5f37525a2e615160dbf1e08198698fc Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 26 Aug 2011 15:37:27 +0000 Subject: [PATCH] Switch the Links creating webscript to be Java backed using the new service, and enhance unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30108 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repository/links/links.post.json.js | 88 -------------- .../web-scripts-application-context.xml | 6 + .../repo/web/scripts/links/LinkGet.java | 3 +- .../repo/web/scripts/links/LinksPost.java | 113 ++++++++++++++++++ 4 files changed, 121 insertions(+), 89 deletions(-) delete mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/links/links.post.json.js create mode 100644 source/java/org/alfresco/repo/web/scripts/links/LinksPost.java diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links.post.json.js b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links.post.json.js deleted file mode 100644 index 9b6c060603..0000000000 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links.post.json.js +++ /dev/null @@ -1,88 +0,0 @@ - - - - -function ensureTagScope(node) -{ - if (!node.isTagScope) - { - node.isTagScope = true; - } - - // also check the parent (the site!) - if (!node.parent.isTagScope) - { - node.parent.isTagScope = true; - } -} - -/** - * Creates a link - */ -function createLink(linkNode) -{ - var tags = []; - if (json.has("tags")) - { - // get the tags JSONArray and copy it into a real javascript array object - var tmp = json.get("tags"); - for (var x = 0; x < tmp.length(); x++) - { - tags.push(tmp.get(x)); - } - } - - // get a unique name - var nodeName = getUniqueChildName(linkNode, "link"); - linkNode = linkNode.createNode(nodeName, "lnk:link",getLinkProperties()); - - if (isLinkInternal()) - { - var pr = []; - pr["lnk:isInternal"] = "true"; - linkNode.addAspect("lnk:internal", pr); - } - - linkNode.tags = tags; - linkNode.mimetype = "text/html"; - linkNode.content = linkNode.properties["lnk:url"]; - linkNode.save(); - - var siteId = url.templateArgs.site; - var data = - { - title: json.get("title"), - page: json.get("page") + "?linkId=" + nodeName - }; - - model.message = linkNode.properties["name"]; - activities.postActivity("org.alfresco.links.link-created", siteId, "links", jsonUtils.toJSONString(data)); - - return linkNode; -} - -function main() -{ - // get requested node - var node = getRequestNode(); - if (status.getCode() != status.STATUS_OK) - { - return; - } - - if (!node.hasPermission("CreateChildren")) - { - status.code = 403; - var mes = "Permission to create is denied"; - status.message = mes; - model.message = mes; - return; - } - - ensureTagScope(node); - - var link = createLink(node); - model.item = link; -} - -main(); \ No newline at end of file diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index e2daeb8b50..8d7922afed 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -1525,6 +1525,12 @@ parent="abstractLinksWebScript"> + + + + . + */ +package org.alfresco.repo.web.scripts.links; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.repo.security.permissions.AccessDeniedException; +import org.alfresco.service.cmr.links.LinkInfo; +import org.alfresco.service.cmr.site.SiteInfo; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptException; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * This class is the controller for the link fetching links.post webscript. + * + * @author Nick Burch + * @since 4.0 + */ +public class LinksPost extends AbstractLinksWebScript +{ + private static final String PARAM_MESSAGE = "message"; + + @Override + protected Map executeImpl(SiteInfo site, String linkName, + WebScriptRequest req, JSONObject json, Status status, Cache cache) { + Map model = new HashMap(); + + // Get the new link details from the JSON + String title; + String description; + String url; + boolean internal; + List tags; + try + { + // Fetch the main properties + title = getOrNull(json, "title"); + description = getOrNull(json, "description"); + url = getOrNull(json, "url"); + + // Handle internal / not internal + internal = json.has("internal"); + + // Do the tags + tags = getTags(json); + } + catch(JSONException je) + { + throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Invalid JSON: " + je.getMessage()); + } + + + // Create the link + LinkInfo link; + try + { + link = linksService.createLink(site.getShortName(), title, description, url, internal); + } + catch(AccessDeniedException e) + { + String message = "You don't have permission to create a link"; + + status.setCode(Status.STATUS_FORBIDDEN); + status.setMessage(message); + model.put(PARAM_MESSAGE, message); + return model; + } + + // Set the tags if required + if(tags != null && tags.size() > 0) + { + link.getTags().addAll(tags); + linksService.updateLink(link); + } + + // Generate an activity for the change + addActivityEntry("created", link, site, req, json); + + + // Build the model + model.put(PARAM_MESSAGE, link.getSystemName()); // Really! + model.put("item", renderLink(link)); + model.put("node", link.getNodeRef()); + model.put("link", link); + model.put("site", site); + model.put("siteId", site.getShortName()); + + // All done + return model; + } +}