diff --git a/config/alfresco/calendar-services-context.xml b/config/alfresco/calendar-services-context.xml index 3552799721..0fc2cd2b2a 100644 --- a/config/alfresco/calendar-services-context.xml +++ b/config/alfresco/calendar-services-context.xml @@ -12,6 +12,7 @@ getCalendarEntry listCalendarEntries + listOutlookCalendarEntries diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml index eaecb4f732..2f6a34a05c 100644 --- a/config/alfresco/public-services-security-context.xml +++ b/config/alfresco/public-services-security-context.xml @@ -1007,6 +1007,7 @@ org.alfresco.service.cmr.calendar.CalendarService.listCalendarEntries=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties + org.alfresco.service.cmr.calendar.CalendarService.listOutlookCalendarEntries=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 6295c87edc..3bf0098090 100644 --- a/source/java/org/alfresco/repo/calendar/CalendarServiceImpl.java +++ b/source/java/org/alfresco/repo/calendar/CalendarServiceImpl.java @@ -35,6 +35,10 @@ import org.alfresco.query.PagingResults; import org.alfresco.repo.calendar.cannedqueries.GetCalendarEntriesCannedQuery; import org.alfresco.repo.calendar.cannedqueries.GetCalendarEntriesCannedQueryFactory; import org.alfresco.repo.domain.node.NodeDAO; +import org.alfresco.repo.node.getchildren.FilterProp; +import org.alfresco.repo.node.getchildren.FilterPropBoolean; +import org.alfresco.repo.node.getchildren.FilterPropString; +import org.alfresco.repo.node.getchildren.FilterPropString.FilterTypeString; import org.alfresco.repo.node.getchildren.GetChildrenCannedQuery; import org.alfresco.repo.node.getchildren.GetChildrenCannedQueryFactory; import org.alfresco.repo.site.SiteServiceImpl; @@ -348,6 +352,54 @@ public class CalendarServiceImpl implements CalendarService return cq.execute(); } + @Override + public PagingResults listOutlookCalendarEntries(String siteShortName, String outlookUID, + PagingRequest paging) + { + NodeRef container = getSiteCalendarContainer(siteShortName, false); + if (container == null) + { + // No events + return new EmptyPagingResults(); + } + + // Build our sorting, by date + // There is a limit on the number of filter and sorts, so we can't + // do all that much sorting + List> sort = new ArrayList>(); + sort.add(new Pair(CalendarModel.PROP_FROM_DATE, true)); + sort.add(new Pair(CalendarModel.PROP_TO_DATE, true)); + + // We only want calendar entries + Set types = new HashSet(); + types.add(CalendarModel.TYPE_EVENT); + + // Filtering is OR based, so we can't filder on both IS_OUTLOOK and OUTLOOK_UID + // Luckily, OUTLOOK_UID implies IS_OUTLOOK + List filters = new ArrayList(); + if (outlookUID != null) + { + // Filter by the UID, will get only outlook ones implicitly + filters.add(new FilterPropString( + CalendarModel.PROP_OUTLOOK_UID, outlookUID, FilterTypeString.EQUALS + )); + } + else + { + // Find all Outlook ones + filters.add(new FilterPropBoolean(CalendarModel.PROP_IS_OUTLOOK, Boolean.TRUE)); + } + + // Run the canned query + GetChildrenCannedQueryFactory getChildrenCannedQueryFactory = (GetChildrenCannedQueryFactory)cannedQueryRegistry.getNamedObject(CANNED_QUERY_GET_CHILDREN); + GetChildrenCannedQuery cq = (GetChildrenCannedQuery)getChildrenCannedQueryFactory.getCannedQuery( + container, null, null, types, filters, sort, paging); + + // Execute the canned query + CannedQueryResults results = cq.execute(); + return wrap(results, container); + } + /** * Our class to wrap up paged results of NodeRefs as * CalendarEntry instances diff --git a/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java b/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java index 7d658931a9..36161b39b6 100644 --- a/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java +++ b/source/java/org/alfresco/repo/calendar/CalendarServiceImplTest.java @@ -503,6 +503,41 @@ public class CalendarServiceImplTest results = CALENDAR_SERVICE.listCalendarEntries(CALENDAR_SITE.getShortName(), paging); assertEquals(1, results.getPage().size()); assertEquals("TitleC", results.getPage().get(0).getTitle()); + + + // Currently, none of the events are Outlook ones, so an outlook list should find none + paging = new PagingRequest(3); + results = CALENDAR_SERVICE.listOutlookCalendarEntries(CALENDAR_SITE.getShortName(), null, paging); + assertEquals(0, results.getPage().size()); + + + // Make two of them be outlook ones, will both be found if no UID restriction is given + String uidB = "THIS_is_A_fake_UID_123"; + String uidC = "THIS_is_A_fake_UID_4321"; + ((CalendarEntryDTO)entryB).setOutlook(true); + ((CalendarEntryDTO)entryB).setOutlookUID(uidB); + ((CalendarEntryDTO)entryC).setOutlook(true); + ((CalendarEntryDTO)entryC).setOutlookUID(uidC); + CALENDAR_SERVICE.updateCalendarEntry(entryB); + CALENDAR_SERVICE.updateCalendarEntry(entryC); + + paging = new PagingRequest(3); + results = CALENDAR_SERVICE.listOutlookCalendarEntries(CALENDAR_SITE.getShortName(), null, paging); + assertEquals(2, results.getPage().size()); + assertEquals("TitleB", results.getPage().get(0).getTitle()); + assertEquals("TitleC", results.getPage().get(1).getTitle()); + + + // Restrict by UID + paging = new PagingRequest(3); + results = CALENDAR_SERVICE.listOutlookCalendarEntries(CALENDAR_SITE.getShortName(), uidB, paging); + assertEquals(1, results.getPage().size()); + assertEquals("TitleB", results.getPage().get(0).getTitle()); + + paging = new PagingRequest(3); + results = CALENDAR_SERVICE.listOutlookCalendarEntries(CALENDAR_SITE.getShortName(), uidC, paging); + assertEquals(1, results.getPage().size()); + assertEquals("TitleC", results.getPage().get(0).getTitle()); } /** diff --git a/source/java/org/alfresco/service/cmr/calendar/CalendarService.java b/source/java/org/alfresco/service/cmr/calendar/CalendarService.java index 9ffcbdaa30..c3632a0382 100644 --- a/source/java/org/alfresco/service/cmr/calendar/CalendarService.java +++ b/source/java/org/alfresco/service/cmr/calendar/CalendarService.java @@ -82,4 +82,11 @@ public interface CalendarService */ @NotAuditable PagingResults listCalendarEntries(String[] siteShortNames, Date from, Date to, PagingRequest paging); + + /** + * Retrieves all Outlook based {@link CalendarEntry} instances in the repository + * for the given site, optionally filtered by the Outlook Event UID. + */ + @NotAuditable + PagingResults listOutlookCalendarEntries(String siteShortName, String outlookUID, PagingRequest paging); }