diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml index b0f32255d3..74d1fa2bf6 100644 --- a/config/alfresco/public-services-security-context.xml +++ b/config/alfresco/public-services-security-context.xml @@ -1034,25 +1034,25 @@ - + - + - + - org.alfresco.service.cmr.wiki.WikiPageService.listWikiPages=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties + org.alfresco.service.cmr.wiki.WikiService.listWikiPages=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties - - - + + + diff --git a/config/alfresco/wiki-services-context.xml b/config/alfresco/wiki-services-context.xml index a2eba8c54b..54086232de 100644 --- a/config/alfresco/wiki-services-context.xml +++ b/config/alfresco/wiki-services-context.xml @@ -3,26 +3,26 @@ - - + + - org.alfresco.service.cmr.wiki.WikiPageService + org.alfresco.service.cmr.wiki.WikiService - + - + - + - - + @@ -46,11 +46,11 @@ - + - - + + diff --git a/source/java/org/alfresco/repo/wiki/WikiPageServiceImplTest.java b/source/java/org/alfresco/repo/wiki/WikiPageServiceImplTest.java deleted file mode 100644 index adba041d2e..0000000000 --- a/source/java/org/alfresco/repo/wiki/WikiPageServiceImplTest.java +++ /dev/null @@ -1,782 +0,0 @@ -/* - * Copyright (C) 2005-2011 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.wiki; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.alfresco.model.ContentModel; -import org.alfresco.query.PagingRequest; -import org.alfresco.query.PagingResults; -import org.alfresco.repo.policy.BehaviourFilter; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.site.SiteModel; -import org.alfresco.repo.transaction.RetryingTransactionHelper; -import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; -import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.links.LinkInfo; -import org.alfresco.service.cmr.links.LinksService; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.security.MutableAuthenticationService; -import org.alfresco.service.cmr.security.PermissionService; -import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.cmr.site.SiteInfo; -import org.alfresco.service.cmr.site.SiteService; -import org.alfresco.service.cmr.site.SiteVisibility; -import org.alfresco.service.cmr.tagging.TaggingService; -import org.alfresco.service.cmr.wiki.WikiPageInfo; -import org.alfresco.service.cmr.wiki.WikiPageService; -import org.alfresco.service.transaction.TransactionService; -import org.alfresco.util.ApplicationContextHelper; -import org.alfresco.util.PropertyMap; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.context.ApplicationContext; - -/** - * Test cases for {@link WikiPageServiceImpl}. - * - * @author Nick Burch - * @since 4.0 - */ -public class WikiPageServiceImplTest -{ - private static final String TEST_SITE_PREFIX = "WikiSiteTest"; - private static final long ONE_DAY_MS = 24*60*60*1000; - - private static final ApplicationContext testContext = ApplicationContextHelper.getApplicationContext(); - - // injected services - private static MutableAuthenticationService AUTHENTICATION_SERVICE; - private static BehaviourFilter BEHAVIOUR_FILTER; - private static WikiPageService WIKI_PAGE_SERVICE; - private static DictionaryService DICTIONARY_SERVICE; - private static NodeService NODE_SERVICE; - private static NodeService PUBLIC_NODE_SERVICE; - private static PersonService PERSON_SERVICE; - private static RetryingTransactionHelper TRANSACTION_HELPER; - private static TransactionService TRANSACTION_SERVICE; - private static PermissionService PERMISSION_SERVICE; - private static SiteService SITE_SERVICE; - private static TaggingService TAGGING_SERVICE; - - private static final String TEST_USER = WikiPageServiceImplTest.class.getSimpleName() + "_testuser"; - private static final String ADMIN_USER = AuthenticationUtil.getAdminUserName(); - - private static SiteInfo WIKI_SITE; - private static SiteInfo ALTERNATE_WIKI_SITE; - - /** - * Temporary test nodes (created during a test method) that need deletion after the test method. - */ - private List testNodesToTidy = new ArrayList(); - /** - * Temporary test nodes (created BeforeClass) that need deletion after this test class. - */ - private static List CLASS_TEST_NODES_TO_TIDY = new ArrayList(); - - @BeforeClass public static void initTestsContext() throws Exception - { - AUTHENTICATION_SERVICE = (MutableAuthenticationService)testContext.getBean("authenticationService"); - BEHAVIOUR_FILTER = (BehaviourFilter)testContext.getBean("policyBehaviourFilter"); - WIKI_PAGE_SERVICE = (WikiPageService)testContext.getBean("WikiPageService"); - DICTIONARY_SERVICE = (DictionaryService)testContext.getBean("dictionaryService"); - NODE_SERVICE = (NodeService)testContext.getBean("nodeService"); - PUBLIC_NODE_SERVICE = (NodeService)testContext.getBean("NodeService"); - PERSON_SERVICE = (PersonService)testContext.getBean("personService"); - TRANSACTION_HELPER = (RetryingTransactionHelper)testContext.getBean("retryingTransactionHelper"); - TRANSACTION_SERVICE = (TransactionService)testContext.getBean("TransactionService"); - PERMISSION_SERVICE = (PermissionService)testContext.getBean("permissionService"); - SITE_SERVICE = (SiteService)testContext.getBean("siteService"); - TAGGING_SERVICE = (TaggingService)testContext.getBean("TaggingService"); - - // Do the setup as admin - AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); - createUser(TEST_USER); - - // We need to create the test site as the test user so that they can contribute content to it in tests below. - AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); - createTestSites(); - } - - @Test public void createNewEntry() throws Exception - { - WikiPageInfo page; - - // Nothing to start with - PagingResults results = - WIKI_PAGE_SERVICE.listWikiPages(WIKI_SITE.getShortName(), new PagingRequest(10)); - assertEquals(0, results.getPage().size()); - - - // Get with an arbitrary name gives nothing - page = WIKI_PAGE_SERVICE.getWikiPage(WIKI_SITE.getShortName(), "madeUp"); - assertEquals(null, page); - - page = WIKI_PAGE_SERVICE.getWikiPage(WIKI_SITE.getShortName(), "madeUp2"); - assertEquals(null, page); - - // Create one - page = WIKI_PAGE_SERVICE.createWikiPage( - WIKI_SITE.getShortName(), "Title", "This Is Some Content" - ); - - - // Ensure it got a noderef, and the correct site - assertNotNull(page.getNodeRef()); - assertNotNull(page.getSystemName()); - - NodeRef container = NODE_SERVICE.getPrimaryParent(page.getNodeRef()).getParentRef(); - NodeRef site = NODE_SERVICE.getPrimaryParent(container).getParentRef(); - assertEquals(WIKI_SITE.getNodeRef(), site); - - - // Check the details on the object - assertEquals("Title", page.getTitle()); - assertEquals("This Is Some Content", page.getContents()); - assertEquals(ADMIN_USER, page.getCreator()); - assertEquals(0, page.getTags().size()); - - - // Fetch it, and check the details - page = WIKI_PAGE_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); - assertEquals("Title", page.getTitle()); - assertEquals("This Is Some Content", page.getContents()); - assertEquals(ADMIN_USER, page.getCreator()); - assertEquals(0, page.getTags().size()); - - - // Mark it as done with - testNodesToTidy.add(page.getNodeRef()); - } - - @Test public void createUpdateDeleteEntry() throws Exception - { - WikiPageInfo page; - - // Run as the test user instead - AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); - - - // Create a link - page = WIKI_PAGE_SERVICE.createWikiPage( - WIKI_SITE.getShortName(), "Title", "This Is Some Content" - ); - - - // Check it - assertEquals("Title", page.getSystemName()); - assertEquals("Title", page.getTitle()); - assertEquals("This Is Some Content", page.getContents()); - assertEquals(TEST_USER, page.getCreator()); - assertEquals(0, page.getTags().size()); - - - // Change it - page.setTitle("New Title"); - page.setContents("This is new content"); - - page = WIKI_PAGE_SERVICE.updateWikiPage(page); - - - // Fetch, and check - page = WIKI_PAGE_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); - assertEquals("New Title", page.getSystemName()); - assertEquals("New Title", page.getTitle()); - assertEquals("This is new content", page.getContents()); - assertEquals(TEST_USER, page.getCreator()); - assertEquals(0, page.getTags().size()); - - - // Delete it - WIKI_PAGE_SERVICE.deleteWikiPage(page); - - // Check it went - assertEquals(null, WIKI_PAGE_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName())); - } - - /** - * Ensures that when we try to write an entry to the - * container of a new site, it is correctly setup for us. - * This test does it's own transactions - */ - @Test public void newContainerSetup() throws Exception - { - final String TEST_SITE_NAME = "WikiTestNewTestSite"; - - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - if(SITE_SERVICE.getSite(TEST_SITE_NAME) != null) - { - SITE_SERVICE.deleteSite(TEST_SITE_NAME); - } - SITE_SERVICE.createSite( - TEST_SITE_PREFIX, TEST_SITE_NAME, "Test", "Test", SiteVisibility.PUBLIC - ); - - // Won't have the container to start with - assertFalse(SITE_SERVICE.hasContainer(TEST_SITE_NAME, WikiPageServiceImpl.WIKI_COMPONENT)); - - // Create a link - WIKI_PAGE_SERVICE.createWikiPage( - TEST_SITE_NAME, "Title", "TextTextText" - ); - - // It will now exist - assertTrue(SITE_SERVICE.hasContainer(TEST_SITE_NAME, WikiPageServiceImpl.WIKI_COMPONENT)); - - // It'll be a tag scope too - NodeRef container = SITE_SERVICE.getContainer(TEST_SITE_NAME, WikiPageServiceImpl.WIKI_COMPONENT); - assertTrue(TAGGING_SERVICE.isTagScope(container)); - - // Tidy up - SITE_SERVICE.deleteSite(TEST_SITE_NAME); - return null; - } - }); - } - -// @Test public void tagging() throws Exception -// { -// LinkInfo link; -// final String TAG_1 = "link_tag_1"; -// final String TAG_2 = "link_tag_2"; -// final String TAG_3 = "link_tag_3"; -// -// // Create one without tagging -// link = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "Title", "Description", -// "http://www.alfresco.com/", false -// ); -// testNodesToTidy.add(link.getNodeRef()); -// -// // Check -// assertEquals(0, link.getTags().size()); -// -// link = WIKI_PAGE_SERVICE.getLink(WIKI_SITE.getShortName(), link.getSystemName()); -// assertEquals(0, link.getTags().size()); -// -// -// // Update it to have tags -// link.getTags().add(TAG_1); -// link.getTags().add(TAG_2); -// link.getTags().add(TAG_1); -// assertEquals(3, link.getTags().size()); -// WIKI_PAGE_SERVICE.updateLink(link); -// -// // Check -// link = WIKI_PAGE_SERVICE.getLink(WIKI_SITE.getShortName(), link.getSystemName()); -// assertEquals(2, link.getTags().size()); -// assertEquals(true, link.getTags().contains(TAG_1)); -// assertEquals(true, link.getTags().contains(TAG_2)); -// assertEquals(false, link.getTags().contains(TAG_3)); -// -// -// // Update it to have different tags -// link.getTags().remove(TAG_2); -// link.getTags().add(TAG_3); -// link.getTags().add(TAG_1); -// WIKI_PAGE_SERVICE.updateLink(link); -// -// // Check it as-is -// assertEquals(3, link.getTags().size()); // Includes duplicate tag until re-loaded -// assertEquals(true, link.getTags().contains(TAG_1)); -// assertEquals(false, link.getTags().contains(TAG_2)); -// assertEquals(true, link.getTags().contains(TAG_3)); -// -// // Now load and re-check -// link = WIKI_PAGE_SERVICE.getLink(WIKI_SITE.getShortName(), link.getSystemName()); -// assertEquals(2, link.getTags().size()); // Duplicate now gone -// assertEquals(true, link.getTags().contains(TAG_1)); -// assertEquals(false, link.getTags().contains(TAG_2)); -// assertEquals(true, link.getTags().contains(TAG_3)); -// -// -// // Update it to have no tags -// link.getTags().clear(); -// WIKI_PAGE_SERVICE.updateLink(link); -// -// // Check -// link = WIKI_PAGE_SERVICE.getLink(WIKI_SITE.getShortName(), link.getSystemName()); -// assertEquals(0, link.getTags().size()); -// -// -// // Update it to have tags again -// link.getTags().add(TAG_1); -// link.getTags().add(TAG_2); -// link.getTags().add(TAG_3); -// WIKI_PAGE_SERVICE.updateLink(link); -// -// // Check -// link = WIKI_PAGE_SERVICE.getLink(WIKI_SITE.getShortName(), link.getSystemName()); -// assertEquals(3, link.getTags().size()); -// assertEquals(true, link.getTags().contains(TAG_1)); -// assertEquals(true, link.getTags().contains(TAG_2)); -// assertEquals(true, link.getTags().contains(TAG_3)); -// -// // Tidy -// WIKI_PAGE_SERVICE.deleteLink(link); -// } -// -// /** -// * Tests for listing the links of a site, possibly by user or date range -// */ -// @Test public void linksListing() throws Exception -// { -// PagingRequest paging = new PagingRequest(10); -// AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); -// -// // Nothing to start with -// PagingResults results = -// WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(0, results.getPage().size()); -// -// // Add a few -// LinkInfo linkA = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "TitleA", "Description", -// "http://www.alfresco.com/", false -// ); -// LinkInfo linkB = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "TitleB", "Description", -// "http://www.alfresco.com/", false -// ); -// LinkInfo linkC = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "TitleC", "Description", -// "http://www.alfresco.com/", false -// ); -// testNodesToTidy.add(linkA.getNodeRef()); -// testNodesToTidy.add(linkB.getNodeRef()); -// testNodesToTidy.add(linkC.getNodeRef()); -// -// // Check now, should be newest first -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(3, results.getPage().size()); -// assertEquals("TitleC", results.getPage().get(0).getTitle()); -// assertEquals("TitleB", results.getPage().get(1).getTitle()); -// assertEquals("TitleA", results.getPage().get(2).getTitle()); -// -// // Add one more, as a different user, and drop the page size -// AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); -// LinkInfo linkD = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "TitleD", "Description", -// "http://www.alfresco.com/", false -// ); -// testNodesToTidy.add(linkD.getNodeRef()); -// AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); -// -// paging = new PagingRequest(3); -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(3, results.getPage().size()); -// assertEquals("TitleD", results.getPage().get(0).getTitle()); -// assertEquals("TitleC", results.getPage().get(1).getTitle()); -// assertEquals("TitleB", results.getPage().get(2).getTitle()); -// -// paging = new PagingRequest(3, 3); -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(1, results.getPage().size()); -// assertEquals("TitleA", results.getPage().get(0).getTitle()); -// -// -// // Now check filtering by user -// paging = new PagingRequest(10); -// -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), TEST_USER, paging); -// assertEquals(3, results.getPage().size()); -// assertEquals("TitleC", results.getPage().get(0).getTitle()); -// assertEquals("TitleB", results.getPage().get(1).getTitle()); -// assertEquals("TitleA", results.getPage().get(2).getTitle()); -// -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), ADMIN_USER, paging); -// assertEquals(1, results.getPage().size()); -// assertEquals("TitleD", results.getPage().get(0).getTitle()); -// -// -// // Now check filtering by date range -// pushCreatedDateBack(linkB, 10); -// pushCreatedDateBack(linkC, 100); -// -// Date today = new Date(); -// Date tomorrow = new Date(today.getTime()+ONE_DAY_MS); -// Date yesterday = new Date(today.getTime()-ONE_DAY_MS); -// Date twoWeeksAgo = new Date(today.getTime()-14*ONE_DAY_MS); -// -// // Very recent ones -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), yesterday, tomorrow, paging); -// assertEquals(2, results.getPage().size()); -// assertEquals("TitleD", results.getPage().get(0).getTitle()); -// assertEquals("TitleA", results.getPage().get(1).getTitle()); -// -// // Fairly old ones -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), twoWeeksAgo, yesterday, paging); -// assertEquals(1, results.getPage().size()); -// assertEquals("TitleB", results.getPage().get(0).getTitle()); -// -// // Fairly old to current -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), twoWeeksAgo, tomorrow, paging); -// assertEquals(3, results.getPage().size()); -// assertEquals("TitleD", results.getPage().get(0).getTitle()); -// assertEquals("TitleA", results.getPage().get(1).getTitle()); -// assertEquals("TitleB", results.getPage().get(2).getTitle()); -// -// -// // Tidy -// paging = new PagingRequest(10); -// AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// for(LinkInfo link : results.getPage()) -// { -// PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); -// } -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// for(LinkInfo link : results.getPage()) -// { -// PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); -// } -// } -// -// /** -// * Checks that the correct permission checking occurs on fetching -// * links listings (which go through canned queries) -// */ -// @Test public void linksListingPermissionsChecking() throws Exception -// { -// PagingRequest paging = new PagingRequest(10); -// PagingResults results; -// -// // Nothing to start with in either site -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(0, results.getPage().size()); -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// assertEquals(0, results.getPage().size()); -// -// // Double check that we're only allowed to see the 1st site -// assertEquals(true, SITE_SERVICE.isMember(WIKI_SITE.getShortName(), TEST_USER)); -// assertEquals(false, SITE_SERVICE.isMember(ALTERNATE_WIKI_SITE.getShortName(), TEST_USER)); -// -// -// // Now become the test user -// AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); -// -// -// // Add two events to one site and three to the other -// // Note - add the events as a different user for the site that the -// // test user isn't a member of! -// LinkInfo linkA = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "TitleA", "Description", -// "http://www.alfresco.com/", false -// ); -// LinkInfo linkB = WIKI_PAGE_SERVICE.createLink( -// WIKI_SITE.getShortName(), "TitleB", "Description", -// "http://www.alfresco.com/", false -// ); -// testNodesToTidy.add(linkA.getNodeRef()); -// testNodesToTidy.add(linkB.getNodeRef()); -// -// AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); -// LinkInfo linkPrivA = WIKI_PAGE_SERVICE.createLink( -// ALTERNATE_WIKI_SITE.getShortName(), "PrivTitleA", "Description", -// "http://team.alfresco.com/", false -// ); -// LinkInfo linkPrivB = WIKI_PAGE_SERVICE.createLink( -// ALTERNATE_WIKI_SITE.getShortName(), "PrivTitleB", "Description", -// "http://team.alfresco.com/", false -// ); -// LinkInfo linkPrivC = WIKI_PAGE_SERVICE.createLink( -// ALTERNATE_WIKI_SITE.getShortName(), "PrivTitleC", "Description", -// "http://team.alfresco.com/", false -// ); -// testNodesToTidy.add(linkPrivA.getNodeRef()); -// testNodesToTidy.add(linkPrivB.getNodeRef()); -// testNodesToTidy.add(linkPrivC.getNodeRef()); -// AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); -// -// -// // Check again, as we're not in the 2nd site won't see any there -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(2, results.getPage().size()); -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// assertEquals(0, results.getPage().size()); -// -// -// // Join the site, now we can see both -// TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() -// { -// @Override -// public Void execute() throws Throwable -// { -// AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); -// SITE_SERVICE.setMembership(ALTERNATE_WIKI_SITE.getShortName(), TEST_USER, SiteModel.SITE_COLLABORATOR); -// AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); -// return null; -// } -// }); -// -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(2, results.getPage().size()); -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// assertEquals(3, results.getPage().size()); -// -// -// // Explicitly remove their permissions from one node, check it vanishes from the list -// PERMISSION_SERVICE.setInheritParentPermissions(linkPrivC.getNodeRef(), false); -// PERMISSION_SERVICE.clearPermission(linkPrivC.getNodeRef(), TEST_USER); -// -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(2, results.getPage().size()); -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// assertEquals(2, results.getPage().size()); -// -// -// // Leave, they go away again -// TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() -// { -// @Override -// public Void execute() throws Throwable -// { -// AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); -// SITE_SERVICE.removeMembership(ALTERNATE_WIKI_SITE.getShortName(), TEST_USER); -// AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); -// return null; -// } -// }); -// -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// assertEquals(2, results.getPage().size()); -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// assertEquals(0, results.getPage().size()); -// -// -// // Tidy -// paging = new PagingRequest(10); -// AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); -// results = WIKI_PAGE_SERVICE.listLinks(WIKI_SITE.getShortName(), paging); -// for(LinkInfo link : results.getPage()) -// { -// PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); -// } -// results = WIKI_PAGE_SERVICE.listLinks(ALTERNATE_WIKI_SITE.getShortName(), paging); -// for(LinkInfo link : results.getPage()) -// { -// PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); -// } -// } - - - // -------------------------------------------------------------------------------- - - - /** - * Alters the created date on a wiki page for testing - */ - private void pushCreatedDateBack(WikiPageInfo page, int daysAgo) throws Exception - { - final NodeRef node = page.getNodeRef(); - - final Date created = page.getCreatedAt(); - final Date newCreated = new Date(created.getTime() - daysAgo*ONE_DAY_MS); - - // Update the created date - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() { - @Override - public Void execute() throws Throwable { - BEHAVIOUR_FILTER.disableBehaviour(ContentModel.ASPECT_AUDITABLE); - NODE_SERVICE.setProperty(node, ContentModel.PROP_CREATED, newCreated); - return null; - } - }, false, true); - // Change something else too in the public nodeservice, to force a re-index - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() { - @Override - public Void execute() throws Throwable { - BEHAVIOUR_FILTER.disableBehaviour(ContentModel.ASPECT_AUDITABLE); - PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_CREATED, newCreated); - PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_DESCRIPTION, "Forced Change"); - return null; - } - }, false, true); - // Check it was taken - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() { - @Override - public Void execute() throws Throwable { - assertEquals(newCreated, NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED)); - assertEquals(newCreated, PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED)); - return null; - } - }, false, true); - - // Update the object itself - ((WikiPageInfoImpl)page).setCreatedAt(newCreated); - } - - private static void createTestSites() throws Exception - { - final WikiPageServiceImpl privateWikiPageService = (WikiPageServiceImpl)testContext.getBean("wikiPageService"); - - WIKI_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() - { - @Override - public SiteInfo execute() throws Throwable - { - SiteInfo site = SITE_SERVICE.createSite( - TEST_SITE_PREFIX, - WikiPageServiceImplTest.class.getSimpleName() + "_testSite" + System.currentTimeMillis(), - "test site title", "test site description", - SiteVisibility.PUBLIC - ); - privateWikiPageService.getSiteWikiContainer(site.getShortName(), true); - CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef()); - return site; - } - }); - - // Create the alternate site as admin - AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); - ALTERNATE_WIKI_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() - { - @Override - public SiteInfo execute() throws Throwable - { - SiteInfo site = SITE_SERVICE.createSite( - TEST_SITE_PREFIX, - WikiPageServiceImplTest.class.getSimpleName() + "_testAltSite" + System.currentTimeMillis(), - "alternate site title", "alternate site description", - SiteVisibility.PRIVATE - ); - privateWikiPageService.getSiteWikiContainer(site.getShortName(), true); - CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef()); - return site; - } - }); - AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); - } - - /** - * By default, all tests are run as the admin user. - */ - @Before public void setAdminUser() - { - AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); - } - - @After public void deleteTestNodes() throws Exception - { - performDeletionOfNodes(testNodesToTidy); - } - - @AfterClass public static void deleteClassTestNodesAndUsers() throws Exception - { - performDeletionOfNodes(CLASS_TEST_NODES_TO_TIDY); - deleteUser(TEST_USER); - } - - /** - * Deletes the specified NodeRefs, if they exist. - * @param nodesToDelete - */ - private static void performDeletionOfNodes(final List nodesToDelete) - { - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); - - for (NodeRef node : nodesToDelete) - { - if (NODE_SERVICE.exists(node)) - { - // st:site nodes can only be deleted via the SiteService - if (NODE_SERVICE.getType(node).equals(SiteModel.TYPE_SITE)) - { - - SiteInfo siteInfo = SITE_SERVICE.getSite(node); - SITE_SERVICE.deleteSite(siteInfo.getShortName()); - } - else - { - NODE_SERVICE.deleteNode(node); - } - } - } - - return null; - } - }); - } - - private static void createUser(final String userName) - { - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - if (!AUTHENTICATION_SERVICE.authenticationExists(userName)) - { - AUTHENTICATION_SERVICE.createAuthentication(userName, "PWD".toCharArray()); - } - - if (!PERSON_SERVICE.personExists(userName)) - { - PropertyMap ppOne = new PropertyMap(); - ppOne.put(ContentModel.PROP_USERNAME, userName); - ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); - ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); - ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); - ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); - - PERSON_SERVICE.createPerson(ppOne); - } - - return null; - } - }); - } - - private static void deleteUser(final String userName) - { - TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - if (PERSON_SERVICE.personExists(userName)) - { - PERSON_SERVICE.deletePerson(userName); - } - - return null; - } - }); - } -} diff --git a/source/java/org/alfresco/repo/wiki/WikiPageServiceImpl.java b/source/java/org/alfresco/repo/wiki/WikiServiceImpl.java similarity index 93% rename from source/java/org/alfresco/repo/wiki/WikiPageServiceImpl.java rename to source/java/org/alfresco/repo/wiki/WikiServiceImpl.java index 22a6b909fb..0dd87e3b29 100644 --- a/source/java/org/alfresco/repo/wiki/WikiPageServiceImpl.java +++ b/source/java/org/alfresco/repo/wiki/WikiServiceImpl.java @@ -29,6 +29,7 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.query.CannedQueryFactory; import org.alfresco.query.CannedQueryResults; +import org.alfresco.query.CannedQuerySortDetails; import org.alfresco.query.EmptyPagingResults; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; @@ -46,7 +47,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.tagging.TaggingService; import org.alfresco.service.cmr.wiki.WikiPageInfo; -import org.alfresco.service.cmr.wiki.WikiPageService; +import org.alfresco.service.cmr.wiki.WikiService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.Pair; @@ -58,7 +59,7 @@ import org.apache.commons.logging.LogFactory; * @author Nick Burch (based on existing webscript controllers in the REST API) * @since 4.0 */ -public class WikiPageServiceImpl implements WikiPageService +public class WikiServiceImpl implements WikiService { public static final String WIKI_COMPONENT = "wiki"; @@ -68,7 +69,7 @@ public class WikiPageServiceImpl implements WikiPageService * The logger */ @SuppressWarnings("unused") - private static Log logger = LogFactory.getLog(WikiPageServiceImpl.class); + private static Log logger = LogFactory.getLog(WikiServiceImpl.class); private NodeService nodeService; private SiteService siteService; @@ -305,11 +306,16 @@ public class WikiPageServiceImpl implements WikiPageService return new EmptyPagingResults(); } - // Run the canned query + // Grab the factory GetChildrenAuditableCannedQueryFactory getChildrenCannedQueryFactory = (GetChildrenAuditableCannedQueryFactory)cannedQueryRegistry.getNamedObject(CANNED_QUERY_GET_CHILDREN); + + // Do the sorting, newest first by created date + CannedQuerySortDetails sorting = getChildrenCannedQueryFactory.createDateDescendingCQSortDetails(); + + // Run the canned query GetChildrenAuditableCannedQuery cq = (GetChildrenAuditableCannedQuery)getChildrenCannedQueryFactory.getCannedQuery( container, ContentModel.TYPE_CONTENT, username, createdFrom, createdTo, null, - modifiedFrom, modifiedTo, getChildrenCannedQueryFactory.createDateDescendingCQSortDetails(), paging); + modifiedFrom, modifiedTo, sorting, paging); // Execute the canned query CannedQueryResults results = cq.execute(); diff --git a/source/java/org/alfresco/repo/wiki/WikiServiceImplTest.java b/source/java/org/alfresco/repo/wiki/WikiServiceImplTest.java new file mode 100644 index 0000000000..48a3cf7760 --- /dev/null +++ b/source/java/org/alfresco/repo/wiki/WikiServiceImplTest.java @@ -0,0 +1,820 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.wiki; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.query.PagingRequest; +import org.alfresco.query.PagingResults; +import org.alfresco.repo.policy.BehaviourFilter; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.site.SiteModel; +import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.security.MutableAuthenticationService; +import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.cmr.site.SiteInfo; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.service.cmr.site.SiteVisibility; +import org.alfresco.service.cmr.tagging.TaggingService; +import org.alfresco.service.cmr.wiki.WikiPageInfo; +import org.alfresco.service.cmr.wiki.WikiService; +import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.ApplicationContextHelper; +import org.alfresco.util.PropertyMap; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.context.ApplicationContext; + +/** + * Test cases for {@link WikiServiceImpl}. + * + * @author Nick Burch + * @since 4.0 + */ +public class WikiServiceImplTest +{ + private static final String TEST_SITE_PREFIX = "WikiSiteTest"; + private static final long ONE_DAY_MS = 24*60*60*1000; + + private static final ApplicationContext testContext = ApplicationContextHelper.getApplicationContext(); + + // injected services + private static MutableAuthenticationService AUTHENTICATION_SERVICE; + private static BehaviourFilter BEHAVIOUR_FILTER; + private static WikiService WIKI_SERVICE; + private static DictionaryService DICTIONARY_SERVICE; + private static NodeService NODE_SERVICE; + private static NodeService PUBLIC_NODE_SERVICE; + private static PersonService PERSON_SERVICE; + private static RetryingTransactionHelper TRANSACTION_HELPER; + private static TransactionService TRANSACTION_SERVICE; + private static PermissionService PERMISSION_SERVICE; + private static SiteService SITE_SERVICE; + private static TaggingService TAGGING_SERVICE; + + private static final String TEST_USER = WikiServiceImplTest.class.getSimpleName() + "_testuser"; + private static final String ADMIN_USER = AuthenticationUtil.getAdminUserName(); + + private static SiteInfo WIKI_SITE; + private static SiteInfo ALTERNATE_WIKI_SITE; + + /** + * Temporary test nodes (created during a test method) that need deletion after the test method. + */ + private List testNodesToTidy = new ArrayList(); + /** + * Temporary test nodes (created BeforeClass) that need deletion after this test class. + */ + private static List CLASS_TEST_NODES_TO_TIDY = new ArrayList(); + + @BeforeClass public static void initTestsContext() throws Exception + { + AUTHENTICATION_SERVICE = (MutableAuthenticationService)testContext.getBean("authenticationService"); + BEHAVIOUR_FILTER = (BehaviourFilter)testContext.getBean("policyBehaviourFilter"); + WIKI_SERVICE = (WikiService)testContext.getBean("WikiService"); + DICTIONARY_SERVICE = (DictionaryService)testContext.getBean("dictionaryService"); + NODE_SERVICE = (NodeService)testContext.getBean("nodeService"); + PUBLIC_NODE_SERVICE = (NodeService)testContext.getBean("NodeService"); + PERSON_SERVICE = (PersonService)testContext.getBean("personService"); + TRANSACTION_HELPER = (RetryingTransactionHelper)testContext.getBean("retryingTransactionHelper"); + TRANSACTION_SERVICE = (TransactionService)testContext.getBean("TransactionService"); + PERMISSION_SERVICE = (PermissionService)testContext.getBean("permissionService"); + SITE_SERVICE = (SiteService)testContext.getBean("siteService"); + TAGGING_SERVICE = (TaggingService)testContext.getBean("TaggingService"); + + // Do the setup as admin + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + createUser(TEST_USER); + + // We need to create the test site as the test user so that they can contribute content to it in tests below. + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + createTestSites(); + } + + @Test public void createNewEntry() throws Exception + { + WikiPageInfo page; + + // Nothing to start with + PagingResults results = + WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), new PagingRequest(10)); + assertEquals(0, results.getPage().size()); + + + // Get with an arbitrary name gives nothing + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), "madeUp"); + assertEquals(null, page); + + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), "madeUp2"); + assertEquals(null, page); + + // Create one + page = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "Title", "This Is Some Content" + ); + + + // Ensure it got a noderef, and the correct site + assertNotNull(page.getNodeRef()); + assertNotNull(page.getSystemName()); + + NodeRef container = NODE_SERVICE.getPrimaryParent(page.getNodeRef()).getParentRef(); + NodeRef site = NODE_SERVICE.getPrimaryParent(container).getParentRef(); + assertEquals(WIKI_SITE.getNodeRef(), site); + + + // Check the details on the object + assertEquals("Title", page.getTitle()); + assertEquals("This Is Some Content", page.getContents()); + assertEquals(ADMIN_USER, page.getCreator()); + assertEquals(0, page.getTags().size()); + + + // Fetch it, and check the details + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals("Title", page.getTitle()); + assertEquals("This Is Some Content", page.getContents()); + assertEquals(ADMIN_USER, page.getCreator()); + assertEquals(0, page.getTags().size()); + + + // Mark it as done with + testNodesToTidy.add(page.getNodeRef()); + } + + @Test public void createUpdateDeleteEntry() throws Exception + { + WikiPageInfo page; + + // Run as the test user instead + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + + + // Create a page + page = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "Title", "This Is Some Content" + ); + + + // Check it + assertEquals("Title", page.getSystemName()); + assertEquals("Title", page.getTitle()); + assertEquals("This Is Some Content", page.getContents()); + assertEquals(TEST_USER, page.getCreator()); + assertEquals(0, page.getTags().size()); + + + // Change it + page.setTitle("New Title"); + page.setContents("This is new content"); + + page = WIKI_SERVICE.updateWikiPage(page); + + + // Fetch, and check + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals("New Title", page.getSystemName()); + assertEquals("New Title", page.getTitle()); + assertEquals("This is new content", page.getContents()); + assertEquals(TEST_USER, page.getCreator()); + assertEquals(0, page.getTags().size()); + + + // Delete it + WIKI_SERVICE.deleteWikiPage(page); + + // Check it went + assertEquals(null, WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName())); + } + + /** + * Ensures that when we try to write an entry to the + * container of a new site, it is correctly setup for us. + * This test does it's own transactions + */ + @Test public void newContainerSetup() throws Exception + { + final String TEST_SITE_NAME = "WikiTestNewTestSite"; + + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + if(SITE_SERVICE.getSite(TEST_SITE_NAME) != null) + { + SITE_SERVICE.deleteSite(TEST_SITE_NAME); + } + SITE_SERVICE.createSite( + TEST_SITE_PREFIX, TEST_SITE_NAME, "Test", "Test", SiteVisibility.PUBLIC + ); + + // Won't have the container to start with + assertFalse(SITE_SERVICE.hasContainer(TEST_SITE_NAME, WikiServiceImpl.WIKI_COMPONENT)); + + // Create a link + WIKI_SERVICE.createWikiPage( + TEST_SITE_NAME, "Title", "TextTextText" + ); + + // It will now exist + assertTrue(SITE_SERVICE.hasContainer(TEST_SITE_NAME, WikiServiceImpl.WIKI_COMPONENT)); + + // It'll be a tag scope too + NodeRef container = SITE_SERVICE.getContainer(TEST_SITE_NAME, WikiServiceImpl.WIKI_COMPONENT); + assertTrue(TAGGING_SERVICE.isTagScope(container)); + + // Tidy up + SITE_SERVICE.deleteSite(TEST_SITE_NAME); + return null; + } + }); + } + + @Test public void tagging() throws Exception + { + WikiPageInfo page; + final String TAG_1 = "link_tag_1"; + final String TAG_2 = "link_tag_2"; + final String TAG_3 = "link_tag_3"; + + // Create one without tagging + page = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "Title", "This Is Some Content" + ); + testNodesToTidy.add(page.getNodeRef()); + + // Check + assertEquals(0, page.getTags().size()); + + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals(0, page.getTags().size()); + + + // Update it to have tags + page.getTags().add(TAG_1); + page.getTags().add(TAG_2); + page.getTags().add(TAG_1); + assertEquals(3, page.getTags().size()); + WIKI_SERVICE.updateWikiPage(page); + + // Check + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals(2, page.getTags().size()); + assertEquals(true, page.getTags().contains(TAG_1)); + assertEquals(true, page.getTags().contains(TAG_2)); + assertEquals(false, page.getTags().contains(TAG_3)); + + + // Update it to have different tags + page.getTags().remove(TAG_2); + page.getTags().add(TAG_3); + page.getTags().add(TAG_1); + WIKI_SERVICE.updateWikiPage(page); + + // Check it as-is + assertEquals(3, page.getTags().size()); // Includes duplicate tag until re-loaded + assertEquals(true, page.getTags().contains(TAG_1)); + assertEquals(false, page.getTags().contains(TAG_2)); + assertEquals(true, page.getTags().contains(TAG_3)); + + // Now load and re-check + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals(2, page.getTags().size()); // Duplicate now gone + assertEquals(true, page.getTags().contains(TAG_1)); + assertEquals(false, page.getTags().contains(TAG_2)); + assertEquals(true, page.getTags().contains(TAG_3)); + + + // Update it to have no tags + page.getTags().clear(); + WIKI_SERVICE.updateWikiPage(page); + + // Check + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals(0, page.getTags().size()); + + + // Update it to have tags again + page.getTags().add(TAG_1); + page.getTags().add(TAG_2); + page.getTags().add(TAG_3); + WIKI_SERVICE.updateWikiPage(page); + + // Check + page = WIKI_SERVICE.getWikiPage(WIKI_SITE.getShortName(), page.getSystemName()); + assertEquals(3, page.getTags().size()); + assertEquals(true, page.getTags().contains(TAG_1)); + assertEquals(true, page.getTags().contains(TAG_2)); + assertEquals(true, page.getTags().contains(TAG_3)); + + // Tidy + WIKI_SERVICE.deleteWikiPage(page); + } + + /** + * Tests for listing the wiki pages of a site, possibly by user or date range + */ + @Test public void pagesListing() throws Exception + { + PagingRequest paging = new PagingRequest(10); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + + // Nothing to start with + PagingResults results = + WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + + // Add a few + WikiPageInfo pageA = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "TitleA", "ContentA" + ); + WikiPageInfo pageB = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "TitleB", "ContentB" + ); + WikiPageInfo pageC = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "TitleC", "ContentC" + ); + testNodesToTidy.add(pageA.getNodeRef()); + testNodesToTidy.add(pageB.getNodeRef()); + testNodesToTidy.add(pageC.getNodeRef()); + + // Check now, should be newest first + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(3, results.getPage().size()); + assertEquals("TitleC", results.getPage().get(0).getTitle()); + assertEquals("TitleB", results.getPage().get(1).getTitle()); + assertEquals("TitleA", results.getPage().get(2).getTitle()); + + // Add one more, as a different user, and drop the page size + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + WikiPageInfo pageD = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "TitleD", "ContentD" + ); + testNodesToTidy.add(pageD.getNodeRef()); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + + paging = new PagingRequest(3); + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(3, results.getPage().size()); + assertEquals("TitleD", results.getPage().get(0).getTitle()); + assertEquals("TitleC", results.getPage().get(1).getTitle()); + assertEquals("TitleB", results.getPage().get(2).getTitle()); + + paging = new PagingRequest(3, 3); + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(1, results.getPage().size()); + assertEquals("TitleA", results.getPage().get(0).getTitle()); + + + // Now check filtering by user + paging = new PagingRequest(10); + + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), TEST_USER, paging); + assertEquals(3, results.getPage().size()); + assertEquals("TitleC", results.getPage().get(0).getTitle()); + assertEquals("TitleB", results.getPage().get(1).getTitle()); + assertEquals("TitleA", results.getPage().get(2).getTitle()); + + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), ADMIN_USER, paging); + assertEquals(1, results.getPage().size()); + assertEquals("TitleD", results.getPage().get(0).getTitle()); + + + // Now check filtering by date range + // Arrange it so that the orders are: + // Created -> C B A D + // Modified -> D C B A + pushAuditableDatesBack(pageB, 10, 0); + pushAuditableDatesBack(pageC, 100, 10); + pushAuditableDatesBack(pageD, 0, 100); + pageA.setContents("UpdatedContentsA"); + pageA = WIKI_SERVICE.updateWikiPage(pageA); + + + Date today = new Date(); + Date tomorrow = new Date(today.getTime()+ONE_DAY_MS); + Date yesterday = new Date(today.getTime()-ONE_DAY_MS); + Date twoWeeksAgo = new Date(today.getTime()-14*ONE_DAY_MS); + + + // Check by created date + + // Very recent ones + results = WIKI_SERVICE.listWikiPagesByCreated(WIKI_SITE.getShortName(), yesterday, tomorrow, paging); + assertEquals(2, results.getPage().size()); + assertEquals("TitleD", results.getPage().get(0).getTitle()); + assertEquals("TitleA", results.getPage().get(1).getTitle()); + + // Fairly old ones + results = WIKI_SERVICE.listWikiPagesByCreated(WIKI_SITE.getShortName(), twoWeeksAgo, yesterday, paging); + assertEquals(1, results.getPage().size()); + assertEquals("TitleB", results.getPage().get(0).getTitle()); + + // Fairly old to current + results = WIKI_SERVICE.listWikiPagesByCreated(WIKI_SITE.getShortName(), twoWeeksAgo, tomorrow, paging); + assertEquals(3, results.getPage().size()); + assertEquals("TitleD", results.getPage().get(0).getTitle()); + assertEquals("TitleA", results.getPage().get(1).getTitle()); + assertEquals("TitleB", results.getPage().get(2).getTitle()); + + + // Check by modified date + + // Very recent ones + results = WIKI_SERVICE.listWikiPagesByModified(WIKI_SITE.getShortName(), yesterday, tomorrow, paging); + assertEquals(2, results.getPage().size()); + assertEquals("TitleA", results.getPage().get(0).getTitle()); + assertEquals("TitleB", results.getPage().get(1).getTitle()); + + // Fairly old ones + results = WIKI_SERVICE.listWikiPagesByModified(WIKI_SITE.getShortName(), twoWeeksAgo, yesterday, paging); + assertEquals(1, results.getPage().size()); + assertEquals("TitleC", results.getPage().get(0).getTitle()); + + // Fairly old to current + results = WIKI_SERVICE.listWikiPagesByModified(WIKI_SITE.getShortName(), twoWeeksAgo, tomorrow, paging); + assertEquals(3, results.getPage().size()); + assertEquals("TitleA", results.getPage().get(0).getTitle()); + assertEquals("TitleB", results.getPage().get(1).getTitle()); + assertEquals("TitleC", results.getPage().get(2).getTitle()); + + + // Bring C back to current and re-check + pageC.setContents("Changed C"); + pageC = WIKI_SERVICE.updateWikiPage(pageC); + + // Order doesn't change, sorting is by created date not modified date + results = WIKI_SERVICE.listWikiPagesByModified(WIKI_SITE.getShortName(), twoWeeksAgo, tomorrow, paging); + assertEquals(3, results.getPage().size()); + assertEquals("TitleA", results.getPage().get(0).getTitle()); + assertEquals("TitleB", results.getPage().get(1).getTitle()); + assertEquals("TitleC", results.getPage().get(2).getTitle()); + + + // Tidy + paging = new PagingRequest(10); + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + for(WikiPageInfo link : results.getPage()) + { + PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); + } + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + for(WikiPageInfo link : results.getPage()) + { + PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); + } + } + + /** + * Checks that the correct permission checking occurs on fetching + * links listings (which go through canned queries) + */ + @Test public void linksListingPermissionsChecking() throws Exception + { + PagingRequest paging = new PagingRequest(10); + PagingResults results; + + // Nothing to start with in either site + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + + // Double check that we're only allowed to see the 1st site + assertEquals(true, SITE_SERVICE.isMember(WIKI_SITE.getShortName(), TEST_USER)); + assertEquals(false, SITE_SERVICE.isMember(ALTERNATE_WIKI_SITE.getShortName(), TEST_USER)); + + + // Now become the test user + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + + + // Add two events to one site and three to the other + // Note - add the events as a different user for the site that the + // test user isn't a member of! + WikiPageInfo pageA = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "TitleA", "ContentA" + ); + WikiPageInfo pageB = WIKI_SERVICE.createWikiPage( + WIKI_SITE.getShortName(), "TitleB", "ContentB" + ); + testNodesToTidy.add(pageA.getNodeRef()); + testNodesToTidy.add(pageB.getNodeRef()); + + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + WikiPageInfo pagePrivA = WIKI_SERVICE.createWikiPage( + ALTERNATE_WIKI_SITE.getShortName(), "PrivTitleA", "Contents A" + ); + WikiPageInfo pagePrivB = WIKI_SERVICE.createWikiPage( + ALTERNATE_WIKI_SITE.getShortName(), "PrivTitleB", "Contents B" + ); + WikiPageInfo pagePrivC = WIKI_SERVICE.createWikiPage( + ALTERNATE_WIKI_SITE.getShortName(), "PrivTitleC", "Contents C" + ); + testNodesToTidy.add(pagePrivA.getNodeRef()); + testNodesToTidy.add(pagePrivB.getNodeRef()); + testNodesToTidy.add(pagePrivC.getNodeRef()); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + + + // Check again, as we're not in the 2nd site won't see any there + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + + + // Join the site, now we can see both + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + SITE_SERVICE.setMembership(ALTERNATE_WIKI_SITE.getShortName(), TEST_USER, SiteModel.SITE_COLLABORATOR); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + return null; + } + }); + + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + assertEquals(3, results.getPage().size()); + + + // Explicitly remove their permissions from one node, check it vanishes from the list + PERMISSION_SERVICE.setInheritParentPermissions(pagePrivC.getNodeRef(), false); + PERMISSION_SERVICE.clearPermission(pagePrivC.getNodeRef(), TEST_USER); + + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + + + // Leave, they go away again + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + SITE_SERVICE.removeMembership(ALTERNATE_WIKI_SITE.getShortName(), TEST_USER); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + return null; + } + }); + + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + + + // Tidy + paging = new PagingRequest(10); + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + results = WIKI_SERVICE.listWikiPages(WIKI_SITE.getShortName(), paging); + for(WikiPageInfo link : results.getPage()) + { + PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); + } + results = WIKI_SERVICE.listWikiPages(ALTERNATE_WIKI_SITE.getShortName(), paging); + for(WikiPageInfo link : results.getPage()) + { + PUBLIC_NODE_SERVICE.deleteNode(link.getNodeRef()); + } + } + + + // -------------------------------------------------------------------------------- + + + /** + * Alters the created date on a wiki page for testing + */ + private void pushAuditableDatesBack(WikiPageInfo page, int createdDaysAgo, int modifiedDaysAgo) throws Exception + { + final NodeRef node = page.getNodeRef(); + + final Date created = page.getCreatedAt(); + final Date newCreated = new Date(created.getTime() - createdDaysAgo*ONE_DAY_MS); + final Date modified = page.getModifiedAt(); + final Date newModified = new Date(modified.getTime() - modifiedDaysAgo*ONE_DAY_MS); + + // Update the created date + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() { + @Override + public Void execute() throws Throwable { + BEHAVIOUR_FILTER.disableBehaviour(ContentModel.ASPECT_AUDITABLE); + NODE_SERVICE.setProperty(node, ContentModel.PROP_CREATED, newCreated); + NODE_SERVICE.setProperty(node, ContentModel.PROP_MODIFIED, newModified); + return null; + } + }, false, true); + // Change something else too in the public nodeservice, to force a re-index + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() { + @Override + public Void execute() throws Throwable { + BEHAVIOUR_FILTER.disableBehaviour(ContentModel.ASPECT_AUDITABLE); + PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_CREATED, newCreated); + PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_MODIFIED, newModified); + PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_DESCRIPTION, "Forced Change"); + return null; + } + }, false, true); + // Check it was taken + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() { + @Override + public Void execute() throws Throwable { + assertEquals(newCreated, NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED)); + assertEquals(newCreated, PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED)); + assertEquals(newModified, NODE_SERVICE.getProperty(node, ContentModel.PROP_MODIFIED)); + assertEquals(newModified, PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_MODIFIED)); + return null; + } + }, false, true); + + // Update the object itself + ((WikiPageInfoImpl)page).setCreatedAt(newCreated); + ((WikiPageInfoImpl)page).setModifiedAt(newModified); + } + + private static void createTestSites() throws Exception + { + final WikiServiceImpl privateWikiPageService = (WikiServiceImpl)testContext.getBean("wikiService"); + + WIKI_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public SiteInfo execute() throws Throwable + { + SiteInfo site = SITE_SERVICE.createSite( + TEST_SITE_PREFIX, + WikiServiceImplTest.class.getSimpleName() + "_testSite" + System.currentTimeMillis(), + "test site title", "test site description", + SiteVisibility.PUBLIC + ); + privateWikiPageService.getSiteWikiContainer(site.getShortName(), true); + CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef()); + return site; + } + }); + + // Create the alternate site as admin + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + ALTERNATE_WIKI_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public SiteInfo execute() throws Throwable + { + SiteInfo site = SITE_SERVICE.createSite( + TEST_SITE_PREFIX, + WikiServiceImplTest.class.getSimpleName() + "_testAltSite" + System.currentTimeMillis(), + "alternate site title", "alternate site description", + SiteVisibility.PRIVATE + ); + privateWikiPageService.getSiteWikiContainer(site.getShortName(), true); + CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef()); + return site; + } + }); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); + } + + /** + * By default, all tests are run as the admin user. + */ + @Before public void setAdminUser() + { + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + } + + @After public void deleteTestNodes() throws Exception + { + performDeletionOfNodes(testNodesToTidy); + } + + @AfterClass public static void deleteClassTestNodesAndUsers() throws Exception + { + performDeletionOfNodes(CLASS_TEST_NODES_TO_TIDY); + deleteUser(TEST_USER); + } + + /** + * Deletes the specified NodeRefs, if they exist. + * @param nodesToDelete + */ + private static void performDeletionOfNodes(final List nodesToDelete) + { + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + + for (NodeRef node : nodesToDelete) + { + if (NODE_SERVICE.exists(node)) + { + // st:site nodes can only be deleted via the SiteService + if (NODE_SERVICE.getType(node).equals(SiteModel.TYPE_SITE)) + { + + SiteInfo siteInfo = SITE_SERVICE.getSite(node); + SITE_SERVICE.deleteSite(siteInfo.getShortName()); + } + else + { + NODE_SERVICE.deleteNode(node); + } + } + } + + return null; + } + }); + } + + private static void createUser(final String userName) + { + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + if (!AUTHENTICATION_SERVICE.authenticationExists(userName)) + { + AUTHENTICATION_SERVICE.createAuthentication(userName, "PWD".toCharArray()); + } + + if (!PERSON_SERVICE.personExists(userName)) + { + PropertyMap ppOne = new PropertyMap(); + ppOne.put(ContentModel.PROP_USERNAME, userName); + ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); + ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); + ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); + ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); + + PERSON_SERVICE.createPerson(ppOne); + } + + return null; + } + }); + } + + private static void deleteUser(final String userName) + { + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + if (PERSON_SERVICE.personExists(userName)) + { + PERSON_SERVICE.deletePerson(userName); + } + + return null; + } + }); + } +} diff --git a/source/java/org/alfresco/service/cmr/wiki/WikiPageService.java b/source/java/org/alfresco/service/cmr/wiki/WikiService.java similarity index 97% rename from source/java/org/alfresco/service/cmr/wiki/WikiPageService.java rename to source/java/org/alfresco/service/cmr/wiki/WikiService.java index 0a5fd3468c..f757d44c24 100644 --- a/source/java/org/alfresco/service/cmr/wiki/WikiPageService.java +++ b/source/java/org/alfresco/service/cmr/wiki/WikiService.java @@ -25,12 +25,12 @@ import org.alfresco.query.PagingResults; import org.alfresco.service.NotAuditable; /** - * The Wiki Page service. + * The Wiki service. * * @author Nick Burch * @since 4.0 */ -public interface WikiPageService { +public interface WikiService { /** * Creates a new {@link WikiPageInfo} in the given site, with the * specified contents