From 128d5c9afcb18145fe1b62bce40833a104cdadf3 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 13 Jul 2011 15:26:58 +0000 Subject: [PATCH] ALF-9156 Switch the Calender basic listing to using a canned query directly, and start on a permissions check for it (currently disabled) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28986 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/calendar-services-context.xml | 24 ++- .../public-services-security-context.xml | 27 ++++ .../repo/calendar/CalendarServiceImpl.java | 68 ++++++--- .../calendar/CalendarServiceImplTest.java | 144 +++++++++++++++++- 4 files changed, 231 insertions(+), 32 deletions(-) diff --git a/config/alfresco/calendar-services-context.xml b/config/alfresco/calendar-services-context.xml index b73e2a86b9..75cb97ea32 100644 --- a/config/alfresco/calendar-services-context.xml +++ b/config/alfresco/calendar-services-context.xml @@ -16,7 +16,7 @@ - + @@ -34,9 +34,23 @@ - - + + + + + + + + + + + + + + + + + @@ -44,9 +58,9 @@ - + diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml index c2b8e0e754..a26c6b5db2 100644 --- a/config/alfresco/public-services-security-context.xml +++ b/config/alfresco/public-services-security-context.xml @@ -962,6 +962,33 @@ + + + + + + + + + + + + + + + + org.alfresco.service.cmr.calendar.CalendarService.listCalendarEntries=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties + + + + + + + + + + + diff --git a/source/java/org/alfresco/repo/calendar/CalendarServiceImpl.java b/source/java/org/alfresco/repo/calendar/CalendarServiceImpl.java index 12f37aaa16..48cb70999e 100644 --- a/source/java/org/alfresco/repo/calendar/CalendarServiceImpl.java +++ b/source/java/org/alfresco/repo/calendar/CalendarServiceImpl.java @@ -28,14 +28,16 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; +import org.alfresco.query.CannedQueryFactory; +import org.alfresco.query.CannedQueryResults; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; +import org.alfresco.repo.node.getchildren.GetChildrenCannedQuery; +import org.alfresco.repo.node.getchildren.GetChildrenCannedQueryFactory; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.calendar.CalendarEntry; import org.alfresco.service.cmr.calendar.CalendarService; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.search.SearchService; @@ -45,6 +47,7 @@ import org.alfresco.service.cmr.tagging.TaggingService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.Pair; +import org.alfresco.util.registry.NamedObjectRegistry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -62,6 +65,8 @@ public class CalendarServiceImpl implements CalendarService * is replaced by a database query. */ private static final int MAX_QUERY_ENTRY_COUNT = 10000; + + private static final String CANNED_QUERY_GET_CHILDREN = "calendarGetChildrenCannedQueryFactory"; /** * The logger @@ -72,9 +77,9 @@ public class CalendarServiceImpl implements CalendarService private SiteService siteService; private SearchService searchService; // TODO Temp only private TaggingService taggingService; - private FileFolderService fileFolderService; // TODO Temp only private PermissionService permissionService; private TransactionService transactionService; + private NamedObjectRegistry> cannedQueryRegistry; public void setNodeService(NodeService nodeService) { @@ -99,14 +104,6 @@ public class CalendarServiceImpl implements CalendarService this.taggingService = taggingService; } - /** - * TODO Temp only - */ - public void setFileFolderService(FileFolderService fileFolderService) - { - this.fileFolderService = fileFolderService; - } - public void setPermissionService(PermissionService permissionService) { this.permissionService = permissionService; @@ -117,6 +114,14 @@ public class CalendarServiceImpl implements CalendarService this.transactionService = transactionService; } + /** + * Set the registry of {@link CannedQueryFactory canned queries} + */ + public void setCannedQueryRegistry(NamedObjectRegistry> cannedQueryRegistry) + { + this.cannedQueryRegistry = cannedQueryRegistry; + } + /** * Fetches the Calendar Container on a site, creating as required if requested. */ @@ -362,9 +367,6 @@ public class CalendarServiceImpl implements CalendarService public PagingResults listCalendarEntries( String siteShortName, PagingRequest paging) { - // TODO Switch to this - //return listCalendarEntries(new String[] { siteShortName }, paging); - NodeRef container = getSiteCalendarContainer(siteShortName, false); if(container == null) { @@ -372,11 +374,22 @@ public class CalendarServiceImpl implements CalendarService return null; } - // Ask the file folder service + // Build our sorting, by date List> sort = new ArrayList>(); sort.add(new Pair(CalendarModel.PROP_FROM_DATE, true)); - sort.add(new Pair(CalendarModel.PROP_TO_DATE, true)); - PagingResults results = fileFolderService.list(container, true, false, null, sort, paging); + sort.add(new Pair(CalendarModel.PROP_TO_DATE, true)); + + // We only want calendar entries + Set types = new HashSet(); + types.add(CalendarModel.TYPE_EVENT); + + // Run the canned query + GetChildrenCannedQueryFactory getChildrenCannedQueryFactory = (GetChildrenCannedQueryFactory)cannedQueryRegistry.getNamedObject(CANNED_QUERY_GET_CHILDREN); + GetChildrenCannedQuery cq = (GetChildrenCannedQuery)getChildrenCannedQueryFactory.getCannedQuery( + container, types, null, sort, paging); + + // Execute the canned query + CannedQueryResults results = cq.execute(); return wrap(results); } @@ -384,6 +397,12 @@ public class CalendarServiceImpl implements CalendarService public PagingResults listCalendarEntries( String[] siteShortNames, PagingRequest paging) { + // If we only have the one site, use the list above + if(siteShortNames != null && siteShortNames.length == 1) + { + return listCalendarEntries(siteShortNames[0], paging); + } + // TODO Use search for now return null; } @@ -397,9 +416,10 @@ public class CalendarServiceImpl implements CalendarService } /** - * TODO Temp hack! + * Our class to wrap up paged results of NodeRefs as + * CalendarEntry instances */ - private PagingResults wrap(final PagingResults results) + private PagingResults wrap(final PagingResults results) { return new PagingResults() { @@ -412,11 +432,13 @@ public class CalendarServiceImpl implements CalendarService public List getPage() { List entries = new ArrayList(); - for(FileInfo file : results.getPage()) + for(NodeRef nodeRef : results.getPage()) { - CalendarEntryImpl entry = new CalendarEntryImpl(file.getNodeRef(), file.getName()); - entry.populate(nodeService.getProperties(file.getNodeRef())); - entry.setTags(taggingService.getTags(file.getNodeRef())); + String entryName = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + + CalendarEntryImpl entry = new CalendarEntryImpl(nodeRef, entryName); + entry.populate(nodeService.getProperties(nodeRef)); + entry.setTags(taggingService.getTags(nodeRef)); entries.add(entry); } return entries; diff --git a/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java b/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java index 6ee3c0acc9..87cbcb79d2 100644 --- a/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java +++ b/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java @@ -42,7 +42,9 @@ import org.alfresco.service.cmr.calendar.CalendarService; 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.AccessStatus; 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; @@ -75,8 +77,10 @@ public class CalendarServiceImplTest private static CalendarService CALENDAR_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 PermissionService PERMISSION_SERVICE; private static SiteService SITE_SERVICE; private static TaggingService TAGGING_SERVICE; @@ -84,6 +88,7 @@ public class CalendarServiceImplTest private static final String ADMIN_USER = AuthenticationUtil.getAdminUserName(); private static SiteInfo CALENDAR_SITE; + private static SiteInfo ALTERNATE_CALENDAR_SITE; /** * Temporary test nodes (created during a test method) that need deletion after the test method. @@ -101,8 +106,10 @@ public class CalendarServiceImplTest CALENDAR_SERVICE = (CalendarService)testContext.getBean("CalendarService"); 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"); + PERMISSION_SERVICE = (PermissionService)testContext.getBean("permissionService"); SITE_SERVICE = (SiteService)testContext.getBean("siteService"); TAGGING_SERVICE = (TaggingService)testContext.getBean("TaggingService"); @@ -111,7 +118,7 @@ public class CalendarServiceImplTest // 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); - createTestSite(); + createTestSites(); } @Test public void createNewEntry() throws Exception @@ -468,6 +475,15 @@ public class CalendarServiceImplTest results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); assertEquals(1, results.getPage().size()); assertEquals("TitleC", results.getPage().get(0).getTitle()); + + + // Tidy + paging = new PagingRequest(10); + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); + for(CalendarEntry entry : results.getPage()) + { + testNodesToTidy.add(entry.getNodeRef()); + } } @Test public void calendarMultiSiteListing() throws Exception @@ -475,19 +491,139 @@ public class CalendarServiceImplTest // TODO } - private static void createTestSite() throws Exception + /** + * Checks that the correct permission checking occurs on fetching + * calendar listings (which go through canned queries) + * TODO FIX + */ + public void DISABLEDcalendarListingPermissionsChecking() throws Exception + { + PagingRequest paging = new PagingRequest(10); + PagingResults results; + + // TODO This shouldn't be needed... + PERMISSION_SERVICE.clearPermission(ALTERNATE_CALENDAR_SITE.getNodeRef(), TEST_USER); + System.err.println(PERMISSION_SERVICE.getPermissions(ALTERNATE_CALENDAR_SITE.getNodeRef())); + System.err.println(PERMISSION_SERVICE.getAllSetPermissions(ALTERNATE_CALENDAR_SITE.getNodeRef())); + System.err.println(NODE_SERVICE.getChildAssocs(ALTERNATE_CALENDAR_SITE.getNodeRef())); + System.err.println(PUBLIC_NODE_SERVICE.getChildAssocs(ALTERNATE_CALENDAR_SITE.getNodeRef())); + + + // Nothing to start with in either site + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); +// assertEquals(0, results.getPage().size()); + results = CALENDAR_SERVICE.listCalendarEntries(ALTERNATE_CALENDAR_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(CALENDAR_SITE.getShortName(), TEST_USER)); + assertEquals(false, SITE_SERVICE.isMember(ALTERNATE_CALENDAR_SITE.getShortName(), TEST_USER)); + assertEquals(AccessStatus.ALLOWED, PERMISSION_SERVICE.hasReadPermission(CALENDAR_SITE.getNodeRef())); + assertEquals(AccessStatus.DENIED, PERMISSION_SERVICE.hasReadPermission(ALTERNATE_CALENDAR_SITE.getNodeRef())); + + + // Add two events to one site and three to the other + CALENDAR_SERVICE.createCalendarEntry(CALENDAR_SITE.getShortName(), new CalendarEntryDTO( + "TitleA", "Description", "Location", new Date(1302431400), new Date(1302435000) + )); + CALENDAR_SERVICE.createCalendarEntry(CALENDAR_SITE.getShortName(), new CalendarEntryDTO( + "TitleB", "Description", "Location", new Date(1302431400), new Date(1302442200) + )); + + CALENDAR_SERVICE.createCalendarEntry(ALTERNATE_CALENDAR_SITE.getShortName(), new CalendarEntryDTO( + "PrivateTitleA", "Description", "Location", new Date(1302431400), new Date(1302435000) + )); + CALENDAR_SERVICE.createCalendarEntry(ALTERNATE_CALENDAR_SITE.getShortName(), new CalendarEntryDTO( + "PrivateTitleB", "Description", "Location", new Date(1302431400), new Date(1302442200) + )); + NodeRef priv3 = CALENDAR_SERVICE.createCalendarEntry(ALTERNATE_CALENDAR_SITE.getShortName(), new CalendarEntryDTO( + "PrivateTitleC", "Description", "Location", new Date(1302431400), new Date(1302442200) + )).getNodeRef(); + + + // Check again, as we're not in the 2nd site won't see any there + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = CALENDAR_SERVICE.listCalendarEntries(ALTERNATE_CALENDAR_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + + + // Join the site, now we can see both + SITE_SERVICE.setMembership(ALTERNATE_CALENDAR_SITE.getShortName(), TEST_USER, SiteModel.SITE_CONTRIBUTOR); + + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = CALENDAR_SERVICE.listCalendarEntries(ALTERNATE_CALENDAR_SITE.getShortName(), paging); + assertEquals(3, results.getPage().size()); + + + // Explicitly remove their permissions from one node, check it vanishes from the list + PERMISSION_SERVICE.setInheritParentPermissions(priv3, false); + PERMISSION_SERVICE.clearPermission(priv3, TEST_USER); + + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = CALENDAR_SERVICE.listCalendarEntries(ALTERNATE_CALENDAR_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + + + // Leave, they go away again + SITE_SERVICE.removeMembership(ALTERNATE_CALENDAR_SITE.getShortName(), TEST_USER); + + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); + assertEquals(2, results.getPage().size()); + results = CALENDAR_SERVICE.listCalendarEntries(ALTERNATE_CALENDAR_SITE.getShortName(), paging); + assertEquals(0, results.getPage().size()); + + + // Tidy + paging = new PagingRequest(10); + results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); + for(CalendarEntry entry : results.getPage()) + { + testNodesToTidy.add(entry.getNodeRef()); + } + } + + private static void createTestSites() throws Exception { CALENDAR_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() { @Override public SiteInfo execute() throws Throwable { - SiteInfo site = SITE_SERVICE.createSite(TEST_SITE_PREFIX, CalendarServiceImplTest.class.getSimpleName() + "_testSite" + System.currentTimeMillis(), - "test site title", "test site description", SiteVisibility.PUBLIC); + SiteInfo site = SITE_SERVICE.createSite( + TEST_SITE_PREFIX, + CalendarServiceImplTest.class.getSimpleName() + "_testSite" + System.currentTimeMillis(), + "test site title", "test site description", + SiteVisibility.PUBLIC + ); CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef()); return site; } }); + + // Create the alternate site as admin + AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER); + ALTERNATE_CALENDAR_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public SiteInfo execute() throws Throwable + { + SiteInfo site = SITE_SERVICE.createSite( + TEST_SITE_PREFIX, + CalendarServiceImplTest.class.getSimpleName() + "_testAltSite" + System.currentTimeMillis(), + "alternate site title", "alternate site description", + SiteVisibility.PRIVATE + ); + SITE_SERVICE.createContainer( + site.getShortName(), CalendarServiceImpl.CALENDAR_COMPONENT, null, null + ); + CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef()); + return site; + } + }); + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER); } /**