implement CalendarManager

Signed-off-by: Georg Ehrke <developer@georgehrke.com>
This commit is contained in:
Georg Ehrke 2017-10-31 17:06:01 +01:00
parent 5d206eec69
commit 556b2a2b6f
No known key found for this signature in database
GPG Key ID: 9D98FD9380A1CB43
4 changed files with 373 additions and 0 deletions

View File

@ -0,0 +1,140 @@
<?php
/**
* @copyright 2017, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Calendar;
use OCP\Calendar\ICalendar;
class Manager implements \OCP\Calendar\IManager {
/**
* @var ICalendar[] holds all registered calendars
*/
private $calendars=[];
/**
* @var \Closure[] to call to load/register calendar providers
*/
private $calendarLoaders=[];
/**
* This function is used to search and find objects within the user's calendars.
* In case $pattern is empty all events/journals/todos will be returned.
*
* @param string $pattern which should match within the $searchProperties
* @param array $searchProperties defines the properties within the query pattern should match
* @param array $options - optional parameters:
* ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]]
* @param integer|null $limit - limit number of search results
* @param integer|null $offset - offset for paging of search results
* @return array an array of events/journals/todos which are arrays of arrays of key-value-pairs
* @since 13.0.0
*/
public function search($pattern, array $searchProperties=[], array $options=[], $limit=null, $offset=null) {
$this->loadCalendars();
$result = [];
foreach($this->calendars as $calendar) {
$r = $calendar->search($pattern, $searchProperties, $options, $limit, $offset);
foreach($r as $o) {
$o['calendar-key'] = $calendar->getKey();
$result[] = $o;
}
}
return $result;
}
/**
* Check if calendars are available
*
* @return bool true if enabled, false if not
* @since 13.0.0
*/
public function isEnabled() {
return !empty($this->calendars) || !empty($this->calendarLoaders);
}
/**
* Registers a calendar
*
* @param ICalendar $calendar
* @return void
* @since 13.0.0
*/
public function registerCalendar(ICalendar $calendar) {
$this->calendars[$calendar->getKey()] = $calendar;
}
/**
* Unregisters a calendar
*
* @param ICalendar $calendar
* @return void
* @since 13.0.0
*/
public function unregisterCalendar(ICalendar $calendar) {
unset($this->calendars[$calendar->getKey()]);
}
/**
* In order to improve lazy loading a closure can be registered which will be called in case
* calendars are actually requested
*
* @param \Closure $callable
* @return void
* @since 13.0.0
*/
public function register(\Closure $callable) {
$this->calendarLoaders[] = $callable;
}
/**
* @return ICalendar[]
* @since 13.0.0
*/
public function getCalendars() {
$this->loadCalendars();
return array_values($this->calendars);
}
/**
* removes all registered calendar instances
* @return void
* @since 13.0.0
*/
public function clear() {
$this->calendars = [];
$this->calendarLoaders = [];
}
/**
* loads all calendars
*/
private function loadCalendars() {
foreach($this->calendarLoaders as $callable) {
$callable($this);
}
$this->calendarLoaders = [];
}
}

View File

@ -153,6 +153,9 @@ class Server extends ServerContainer implements IServerContainer {
return $c;
});
$this->registerAlias(\OCP\Calendar\IManager::class, \OC\Calendar\Manager::class);
$this->registerAlias('CalendarManager', \OC\Calendar\Manager::class);
$this->registerAlias(\OCP\Contacts\IManager::class, \OC\ContactsManager::class);
$this->registerAlias('ContactsManager', \OCP\Contacts\IManager::class);
@ -1094,6 +1097,13 @@ class Server extends ServerContainer implements IServerContainer {
});
}
/**
* @return \OCP\Calendar\IManager
*/
public function getCalendarManager() {
return $this->query('CalendarManager');
}
/**
* @return \OCP\Contacts\IManager
*/

View File

@ -57,6 +57,15 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
*/
interface IServerContainer extends IContainer {
/**
* The calendar manager will act as a broker between consumers for calendar information and
* providers which actual deliver the calendar information.
*
* @return \OCP\Calendar\IManager
* @since 13.0.0
*/
public function getCalendarManager();
/**
* The contacts manager will act as a broker between consumers for contacts information and
* providers which actual deliver the contact information.

View File

@ -0,0 +1,214 @@
<?php
/**
* @copyright 2017, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace Test\Calendar;
use \OC\Calendar\Manager;
use OCP\Calendar\ICalendar;
use \Test\TestCase;
class ManagerTest extends TestCase {
/** @var Manager */
private $manager;
protected function setUp() {
parent::setUp();
$this->manager = new Manager();
}
/**
* @dataProvider searchProvider
*/
public function testSearch($search1, $search2, $expected) {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('simple:1'));
$calendar1->expects($this->once())
->method('search')
->with('', [], [], null, null)
->will($this->returnValue($search1));
/** @var ICalendar | PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('simple:2'));
$calendar2->expects($this->once())
->method('search')
->with('', [], [], null, null)
->will($this->returnValue($search2));
$this->manager->registerCalendar($calendar1);
$this->manager->registerCalendar($calendar2);
$result = $this->manager->search('');
$this->assertEquals($expected, $result);
}
/**
* @dataProvider searchProvider
*/
public function testSearchOptions($search1, $search2, $expected) {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('simple:1'));
$calendar1->expects($this->once())
->method('search')
->with('searchTerm', ['SUMMARY', 'DESCRIPTION'],
['timerange' => ['start' => null, 'end' => null]], 5, 20)
->will($this->returnValue($search1));
/** @var ICalendar | PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('simple:2'));
$calendar2->expects($this->once())
->method('search')
->with('searchTerm', ['SUMMARY', 'DESCRIPTION'],
['timerange' => ['start' => null, 'end' => null]], 5, 20)
->will($this->returnValue($search2));
$this->manager->registerCalendar($calendar1);
$this->manager->registerCalendar($calendar2);
$result = $this->manager->search('searchTerm', ['SUMMARY', 'DESCRIPTION'],
['timerange' => ['start' => null, 'end' => null]], 5, 20);
$this->assertEquals($expected, $result);
}
public function searchProvider() {
$search1 = [
[
'id' => 1,
'data' => 'foobar',
],
[
'id' => 2,
'data' => 'barfoo',
]
];
$search2 = [
[
'id' => 3,
'data' => 'blablub',
],
[
'id' => 4,
'data' => 'blubbla',
]
];
$expected = [
[
'id' => 1,
'data' => 'foobar',
'calendar-key' => 'simple:1',
],
[
'id' => 2,
'data' => 'barfoo',
'calendar-key' => 'simple:1',
],
[
'id' => 3,
'data' => 'blablub',
'calendar-key' => 'simple:2',
],
[
'id' => 4,
'data' => 'blubbla',
'calendar-key' => 'simple:2',
]
];
return [
[
$search1,
$search2,
$expected
]
];
}
public function testRegisterUnregister() {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('key1'));
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('key2'));
$this->manager->registerCalendar($calendar1);
$this->manager->registerCalendar($calendar2);
$result = $this->manager->getCalendars();
$this->assertCount(2, $result);
$this->assertContains($calendar1, $result);
$this->assertContains($calendar2, $result);
$this->manager->unregisterCalendar($calendar1);
$result = $this->manager->getCalendars();
$this->assertCount(1, $result);
$this->assertContains($calendar2, $result);
}
public function testGetCalendars() {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('key1'));
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('key2'));
$this->manager->registerCalendar($calendar1);
$this->manager->registerCalendar($calendar2);
$result = $this->manager->getCalendars();
$this->assertCount(2, $result);
$this->assertContains($calendar1, $result);
$this->assertContains($calendar2, $result);
$this->manager->clear();
$result = $this->manager->getCalendars();
$this->assertCount(0, $result);
}
public function testEnabledIfNot() {
$isEnabled = $this->manager->isEnabled();
$this->assertFalse($isEnabled);
}
public function testIfEnabledIfSo() {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar */
$calendar = $this->createMock(ICalendar::class);
$this->manager->registerCalendar($calendar);
$isEnabled = $this->manager->isEnabled();
$this->assertTrue($isEnabled);
}
}