From 5f6cb303106c764380705cf4182d05b8d50b1b3e Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 25 Jul 2008 12:21:03 +0000 Subject: [PATCH] Sites collection added to person rest API, check point of tagging rest API git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@10025 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../person/person.sites.get.desc.xml | 8 ++ .../repository/person/person.sites.get.js | 23 +++++ .../person/person.sites.get.json.ftl | 8 ++ .../repository/tagging/node.tags.get.desc.xml | 9 ++ .../repository/tagging/node.tags.get.js | 19 ++++ .../repository/tagging/node.tags.get.json.ftl | 5 + .../tagging/node.tags.post.desc.xml | 9 ++ .../repository/tagging/node.tags.post.js | 25 +++++ .../tagging/node.tags.post.json.ftl | 5 + .../repository/tagging/tags.get.desc.xml | 8 ++ .../alfresco/repository/tagging/tags.get.js | 15 +++ .../repository/tagging/tags.get.json.ftl | 5 + .../tagging/tags.nodes.get.desc.xml | 8 ++ .../repository/tagging/tags.nodes.get.js | 21 ++++ .../tagging/tags.nodes.get.json.ftl | 8 ++ .../web/scripts/site/SiteServiceTest.java | 47 +++++++++ .../scripts/tagging/TaggingServiceTest.java | 96 ++++++++++++++++++- 17 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.json.ftl create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.json.ftl create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.json.ftl create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.json.ftl create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.js create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.json.ftl diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.desc.xml new file mode 100644 index 0000000000..0cca660be2 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.desc.xml @@ -0,0 +1,8 @@ + + Sites + Get a colleciton of the sites a person has an explicit member to. + /api/people/{userid}/sites + + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.js new file mode 100644 index 0000000000..4197c7c9f9 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.js @@ -0,0 +1,23 @@ +function main() +{ + // Get the user name of the person to get + var userName = url.templateArgs.userid; + + // Get the person who has that user name + var person = people.getPerson(userName); + + if (person === null) + { + // Return 404 - Not Found + status.setCode(status.STATUS_NOT_FOUND, "Person " + userName + " does not exist"); + return; + } + + // Get the list of sites + var sites = siteService.listUserSites(userName); + + // Pass the queried sites to the template + model.sites = sites; +} + +main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.json.ftl new file mode 100644 index 0000000000..5fd158a692 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/person/person.sites.get.json.ftl @@ -0,0 +1,8 @@ +<#import "../site/site.lib.ftl" as siteLib/> + +[ + <#list sites as site> + <@siteLib.siteJSON site=site/> + <#if site_has_next>, + +] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.desc.xml new file mode 100644 index 0000000000..f3a9468c76 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.desc.xml @@ -0,0 +1,9 @@ + + NodeTags + Get all the tags for a node + /api/node/{store_type}/{store_id}/{id}/tags + /api/path/{store_type}/{store_id}/{id}/tags + + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.js new file mode 100644 index 0000000000..3aed5b70e0 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.js @@ -0,0 +1,19 @@ +function main() +{ + // Get the node from the URL + var pathSegments = url.match.split("/"); + var reference = [ url.templateArgs.store_type, url.templateArgs.store_id ].concat(url.templateArgs.id.split("/")); + var node = search.findNode(pathSegments[2], reference); + + // 404 if the node is not found + if (node == null) + { + status.setCode(status.STATUS_NOT_FOUND, "The node could not be found"); + return; + } + + // Get the tags of the node + model.tags = node.tags; +} + +main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.json.ftl new file mode 100644 index 0000000000..a879d21096 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.get.json.ftl @@ -0,0 +1,5 @@ +[ + <#list tags as tag> + ${tag}<#if tag_has_next>, + +] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.desc.xml new file mode 100644 index 0000000000..dbe73abe9c --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.desc.xml @@ -0,0 +1,9 @@ + + NodeTags + Add the posted tags to the node + /api/node/{store_type}/{store_id}/{id}/tags + /api/path/{store_type}/{store_id}/{id}/tags + + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.js b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.js new file mode 100644 index 0000000000..0b8ca142c6 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.js @@ -0,0 +1,25 @@ +function main() +{ + // Get the node from the URL + var pathSegments = url.match.split("/"); + var reference = [ url.templateArgs.store_type, url.templateArgs.store_id ].concat(url.templateArgs.id.split("/")); + var node = search.findNode(pathSegments[2], reference); + + // 404 if the node is not found + if (node == null) + { + status.setCode(status.STATUS_NOT_FOUND, "The node could not be found"); + return; + } + + // Get the array of posted tags + for(var index = 0; index < json.length; index++) + { + node.addTag(json.getString(index); + } + + // Get the tags of the node + model.tags = node.tags; +} + +main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.json.ftl new file mode 100644 index 0000000000..a879d21096 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/node.tags.post.json.ftl @@ -0,0 +1,5 @@ +[ + <#list tags as tag> + ${tag}<#if tag_has_next>, + +] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.desc.xml new file mode 100644 index 0000000000..b858404125 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.desc.xml @@ -0,0 +1,8 @@ + + Tags + Get the currently available tags + /api/tags/{store_type}/{store_id}?tf={tag_filter?} + + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.js new file mode 100644 index 0000000000..b878bb1b36 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.js @@ -0,0 +1,15 @@ +// Get the store reference +var store = url.templateArgs.store_type + "://" + url.templateArgs.store_id; + +var filter = args["tf"]; +if (filter === null) +{ + // Get all the tags + model.tags = taggingService.getTags(store); +} +else +{ + // Get a list of filtered tags + model.tags = taggingService.getTags(store, filter); +} + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.json.ftl new file mode 100644 index 0000000000..a879d21096 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.get.json.ftl @@ -0,0 +1,5 @@ +[ + <#list tags as tag> + ${tag}<#if tag_has_next>, + +] \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.desc.xml new file mode 100644 index 0000000000..0bc298110f --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.desc.xml @@ -0,0 +1,8 @@ + + TagNodes + Get the nodes for a given tag + /api/tags/{store_type}/{store_id}/{tag}/nodes + + user + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.js new file mode 100644 index 0000000000..9c6a9c581b --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.js @@ -0,0 +1,21 @@ + +function main() +{ + // Get the store reference + var store = url.templateArgs.store_type + "://" + url.templateArgs.store_id; + + // Get the tag + var tag = url.templateArgs.tag; + if (tag == null) + { + // Error since no tag specified on the URL + status.setCode(404, "No tag specified"); + return; + } + + // do the search + model.nodes = search.tagSearch(store, tag); +} + +main(); + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.json.ftl new file mode 100644 index 0000000000..e67f0025bd --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/tagging/tags.nodes.get.json.ftl @@ -0,0 +1,8 @@ +[ +<#list nodes as node> + { + "nodeRef" : "${node.storeType}://${node.storeId}/${node.id}", + "url" : "${url.serviceContext}/api/node/${node.storeType}/${node.storeId}/${node.id}" + }<#if node_has_next>, + +] \ No newline at end of file diff --git a/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java b/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java index 2d9a45f400..d4aca66e4f 100644 --- a/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java +++ b/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java @@ -332,4 +332,51 @@ public class SiteServiceTest extends BaseWebScriptTest getRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS + "/" + USER_TWO, 404); } + + public void testGetPersonSites() throws Exception + { + // Create a site + String shortName = GUID.generate(); + createSite("myPreset", shortName, "myTitle", "myDescription", true, 200); + String shortName2 = GUID.generate(); + createSite("myPreset", shortName2, "myTitle", "myDescription", true, 200); + + MockHttpServletResponse response = getRequest("/api/people/" + USER_TWO + "/sites", 200); + JSONArray result = new JSONArray(response.getContentAsString()); + + assertNotNull(result); + assertEquals(0, result.length()); + + // Add some memeberships + JSONObject membership = new JSONObject(); + membership.put("role", SiteModel.SITE_CONSUMER); + JSONObject person = new JSONObject(); + person.put("userName", USER_TWO); + membership.put("person", person); + postRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, 200, membership.toString(), "application/json"); + membership = new JSONObject(); + membership.put("role", SiteModel.SITE_CONSUMER); + person = new JSONObject(); + person.put("userName", USER_TWO); + membership.put("person", person); + postRequest(URL_SITES + "/" + shortName2 + URL_MEMBERSHIPS, 200, membership.toString(), "application/json"); + + response = getRequest("/api/people/" + USER_TWO + "/sites", 200); + result = new JSONArray(response.getContentAsString()); + + assertNotNull(result); + assertEquals(2, result.length()); + + response = getRequest("/api/people/" + USER_ONE + "/sites", 200); + result = new JSONArray(response.getContentAsString()); + + assertNotNull(result); + assertEquals(2, result.length()); + + response = getRequest("/api/people/" + USER_THREE + "/sites", 200); + result = new JSONArray(response.getContentAsString()); + + assertNotNull(result); + assertEquals(0, result.length()); + } } diff --git a/source/java/org/alfresco/repo/web/scripts/tagging/TaggingServiceTest.java b/source/java/org/alfresco/repo/web/scripts/tagging/TaggingServiceTest.java index fc7518e0d6..adff99eac6 100644 --- a/source/java/org/alfresco/repo/web/scripts/tagging/TaggingServiceTest.java +++ b/source/java/org/alfresco/repo/web/scripts/tagging/TaggingServiceTest.java @@ -25,12 +25,20 @@ package org.alfresco.repo.web.scripts.tagging; import org.alfresco.model.ContentModel; +import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.web.scripts.BaseWebScriptTest; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.tagging.TaggingService; +import org.alfresco.util.GUID; import org.alfresco.util.PropertyMap; +import org.json.JSONArray; +import org.springframework.mock.web.MockHttpServletResponse; /** * Unit test to test tagging Web Script API @@ -43,9 +51,20 @@ public class TaggingServiceTest extends BaseWebScriptTest private AuthenticationComponent authenticationComponent; private PersonService personService; private TaggingService taggingService; + private FileFolderService fileFolderService; + private Repository repositoryHelper; + private NodeService nodeService; private static final String TEST_USER = "TaggingServiceTestUser"; - + + private static final String TAG_1 = "tagOneREST"; + private static final String TAG_2 = "tagTwoREST"; + private static final String TAG_3 = "tagThreeREST"; + private static final String TAG_4 = "tagFourREST"; + private static final String TAG_5 = "tagFiveREST"; + + private NodeRef nodeOne; + private NodeRef nodeTwo; @Override protected void setUp() throws Exception @@ -55,7 +74,28 @@ public class TaggingServiceTest extends BaseWebScriptTest this.authenticationService = (AuthenticationService)getServer().getApplicationContext().getBean("AuthenticationService"); this.authenticationComponent = (AuthenticationComponent)getServer().getApplicationContext().getBean("authenticationComponent"); this.personService = (PersonService)getServer().getApplicationContext().getBean("PersonService"); - this.taggingService = (TaggingService)getServer().getApplicationContext().getBean("TaggingService"); + this.taggingService = (TaggingService)getServer().getApplicationContext().getBean("TaggingService"); + this.fileFolderService = (FileFolderService)getServer().getApplicationContext().getBean("FileFolderService"); + this.repositoryHelper = (Repository)getServer().getApplicationContext().getBean("repositoryHelper"); + this.nodeService = (NodeService)getServer().getApplicationContext().getBean("NodeService"); + + // Add a load of tags ready to use + this.taggingService.createTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_1); + this.taggingService.createTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_2); + this.taggingService.createTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_3); + this.taggingService.createTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_4); + this.taggingService.createTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_5); + + // Create test node's + NodeRef testRoot = this.repositoryHelper.getCompanyHome(); + String guid = GUID.generate(); + this.nodeOne = this.fileFolderService.create(testRoot, "test_doc1" + guid + ".txt", ContentModel.TYPE_CONTENT).getNodeRef(); + this.nodeTwo = this.fileFolderService.create(testRoot, "test_dco2" + guid + ".txt", ContentModel.TYPE_CONTENT).getNodeRef(); + + // Add tags to test nodes + this.taggingService.addTag(nodeOne, TAG_1); + this.taggingService.addTag(nodeOne, TAG_2); + this.taggingService.addTag(nodeTwo, TAG_2); // Create users createUser(TEST_USER); @@ -85,10 +125,62 @@ public class TaggingServiceTest extends BaseWebScriptTest protected void tearDown() throws Exception { super.tearDown(); + this.authenticationComponent.setCurrentUser("admin"); + + this.taggingService.deleteTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_1); + this.taggingService.deleteTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_2); + this.taggingService.deleteTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_3); + this.taggingService.deleteTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_4); + this.taggingService.deleteTag(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"), TAG_5); + + this.nodeService.deleteNode(this.nodeOne); + this.nodeService.deleteNode(this.nodeTwo); } public void testGetTags() + throws Exception { + MockHttpServletResponse response = getRequest("/api/tags/" + StoreRef.PROTOCOL_WORKSPACE + "/SpacesStore", 200); + JSONArray jsonArray = new JSONArray(response.getContentAsString()); + + assertNotNull(jsonArray); + assertEquals(5, jsonArray.length()); + + response = getRequest("/api/tags/" + StoreRef.PROTOCOL_WORKSPACE + "/SpacesStore?tf=one", 200); + jsonArray = new JSONArray(response.getContentAsString()); + + assertNotNull(jsonArray); + assertEquals(1, jsonArray.length()); + + response = getRequest("/api/tags/" + StoreRef.PROTOCOL_WORKSPACE + "/SpacesStore?tf=none", 200); + jsonArray = new JSONArray(response.getContentAsString()); + + assertNotNull(jsonArray); + assertEquals(0, jsonArray.length()); + } + + public void testGetNodes() + throws Exception + { + MockHttpServletResponse response = getRequest("/api/tags/" + StoreRef.PROTOCOL_WORKSPACE + "/SpacesStore/" + TAG_1 + "/nodes", 200); + JSONArray jsonArray = new JSONArray(response.getContentAsString()); + + assertNotNull(jsonArray); + assertEquals(1, jsonArray.length()); + + System.out.println(response.getContentAsString()); + + response = getRequest("/api/tags/" + StoreRef.PROTOCOL_WORKSPACE + "/SpacesStore/" + TAG_2 + "/nodes", 200); + jsonArray = new JSONArray(response.getContentAsString()); + + assertNotNull(jsonArray); + assertEquals(2, jsonArray.length()); + + response = getRequest("/api/tags/" + StoreRef.PROTOCOL_WORKSPACE + "/SpacesStore/jumk/nodes", 200); + jsonArray = new JSONArray(response.getContentAsString()); + + assertNotNull(jsonArray); + assertEquals(0, jsonArray.length()); }