I have added the json template and javascript to the folder.get webservice When I do a webservice call to retrieve 'html' (original functionality) I get a folder list as expected. However when I do a json call: http://localhost:8080/alfresco/service/sample/folder.json/Company%20Home I get an error 500 (see below). Am I missing something or is this a case of misunderstanding the concept?
I have added a .json.ftl and a .json.js to bind to the original webscript. For the record: I am using Alfresco Community 2.1 out of the box (no sdk).
Alex
Below is the webscript dump of "folder.get" and the Error 500 message.
============================================ Web Script: org/alfresco/sample/folder.get Alfresco Community Network v2.1.0 (482) Generated from /alfresco/service/script/org/alfresco/sample/folder.get on 28-mrt-2008 11:16:16
Script Properties Id: org/alfresco/sample/folder.get Short Name: Folder Listing Sample Description: Sample demonstrating the listing of folder contents Authentication: guest Transaction: required Method: GET URL Template: /sample/folder/{path} URL Template: /sample/folder.json/{path} Format Style: extension Default Format: html Implementation: class org.alfresco.web.scripts.DeclarativeWebScript
return { parse: function(s) { try { return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test( s.replace(/"(\\.|[^"\\])*"/g, ))) && eval('(' + s + ')'); } catch (e) { return false; } }, stringify: s.object }; })(); } var WEBSERVICE_PATH = '/com/onepoint/alfresco/webservices/folderbrowser'; /** * This is a Javascript object that can be used * for JSON serialization. * @param folder The Java object that is going to be transformed into a Javascript object. */ function JsonFolder(folder) { this.displayPath = folder.displayPath; this.name = folder.name; this.hasParent = folder.parent.parent != null; this.parentPath = escape(encodePath(folder.parent)); this.folders = new Array(); this.files = new Array(); this.fileLinks = new Array();
for(var i = 0, length = folder.children.length; i < length; i++) { var child = folder.children; if (child.isContainer) { this.folders[this.folders.length] = escape(encodePath(child)); } else { this.files[this.files.length] = escape(encodePath(child)); var childName = child.name != null ? child.name : ""; this.fileLinks[this.files.length] = escape(url.serviceContext + "/api/node/content/" + child.nodeRef.storeRef.protocol + "/" + child.nodeRef.storeRef.identifier + "/" + child.nodeRef.id + "/" + childName); } } } /** * Encodes the path of one node. * @param node The node that is to be encoded. */ function encodePath(node) { var path = ""; if(node.parent) { path = node.name; path = encodePath(node.parent) + '/' + path; } return path; } // locate folder by path if ((args.p == null || args.p.length == 0) && (url.extension == null || url.extension.length == 0)) { status.code = 400; status.message = "No folder has been specified."; status.redirect = true; } else { var folder = roothome.childByNamePath(args.p != null ? args.p : url.extension); model.folder = folder; var jsonFolder = new JsonFolder(folder); model.jsonFolder = json.stringify(jsonFolder); } File: org/alfresco/sample/folder.get.js // locate folder by path // NOTE: only supports path beneath company home, not from root var folder = roothome.childByNamePath(url.extension); if (folder == undefined || !folder.isContainer) { status.code = 404; status.message = "Folder " + url.extension + " not found."; status.redirect = true; } model.folder = folder; File: org/alfresco/sample/folder.get.atom.ftl <?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <generator version="${server.version}">Alfresco (${server.edition})</generator> <title>Folder: ${folder.displayPath}/${folder.name}</title> <updated>${xmldate(date)}</updated> <icon>${absurl(url.context)}/images/logo/AlfrescoLogo16.ico</icon> <#list folder.children as child> <entry> <title>${child.name}</title> <#if child.isContainer> <link rel="alternate" href="${absurl(url.serviceContext)}/sample/folder<@encodepath node=child/>"/> <#else> <link rel="alternate" href="${absurl(url.serviceContext)}/api/node/content/${child.nodeRef.storeRef.protocol}/${child.nodeRef.storeRef.identifier}/${child.nodeRef.id}/${child.name?url}"/> </#if> <icon>${absurl(url.context)}${child.icon16}</icon> <id>urn:uuid:${child.id}</id> <updated>${xmldate(child.properties.modified)}</updated> <summary>${child.properties.description!""}</summary> <author> <name>${child.properties.creator}</name> </author> </entry> </#list> </feed> <#macro encodepath node><#if node.parent?exists><@encodepath node=node.parent/>/${node.name?url}</#if></#macro> File: org/alfresco/sample/folder.get.html.ftl <html> <head> <title>${folder.displayPath}/${folder.name}</title> </head> <body> Folder: ${folder.displayPath}/${folder.name} <br> <table> <#if folder.parent.parent?exists> <tr> <td><td><a href="${url.serviceContext}/sample/folder<@encodepath node=folder.parent/>">..</a> </tr> </#if> <#list folder.children as child> <tr> <#if child.isContainer> <td>><td><a href="${url.serviceContext}/sample/folder<@encodepath node=child/>">${child.name}</a> <#else> <td><td><a href="${url.serviceContext}/api/node/content/${child.nodeRef.storeRef.protocol}/${child.nodeRef.storeRef.identifier}/${child.nodeRef.id}/${child.name?url}">${child.name}</a> </#if> </tr> </#list> </table> </body> </html>
Forget my previous post. There is only one javascript per webscript. The problem was related to a "faulty" version of the javascript. I applied a different version of the javascript with one description xml-file, one template for json output and a correct javascript and the webscript performs as by design.