diff --git a/lib/private/Calendar/Manager.php b/lib/private/Calendar/Manager.php index 30ee60e4943..3fa4b55d1ea 100644 --- a/lib/private/Calendar/Manager.php +++ b/lib/private/Calendar/Manager.php @@ -31,6 +31,11 @@ use OCP\Calendar\ICalendar; use OCP\Calendar\ICalendarProvider; use OCP\Calendar\ICalendarQuery; use OCP\Calendar\IManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Throwable; +use function array_map; +use function array_merge; class Manager implements IManager { @@ -47,8 +52,18 @@ class Manager implements IManager { /** @var Coordinator */ private $coordinator; - public function __construct(Coordinator $coordinator) { + /** @var ContainerInterface */ + private $container; + + /** @var LoggerInterface */ + private $logger; + + public function __construct(Coordinator $coordinator, + ContainerInterface $container, + LoggerInterface $logger) { $this->coordinator = $coordinator; + $this->container = $container; + $this->logger = $logger; } /** @@ -159,9 +174,21 @@ class Manager implements IManager { } /** @var CalendarQuery $query */ - $calendars = array_merge(...array_map(static function (ICalendarProvider $p) use ($query) { - return $p->getCalendars($query->getPrincipalUri(), $query->getCalendarUris()); - }, $context->getCalendarProviders())); + $calendars = array_merge( + ...array_map(function ($registration) use ($query) { + try { + /** @var ICalendarProvider $provider */ + $provider = $this->container->get($registration->getService()); + } catch (Throwable $e) { + $this->logger->error('Could not load calendar provider ' . $registration->getService() . ': ' . $e->getMessage(), [ + 'exception' => $e, + ]); + return []; + } + + return $provider->getCalendars($query->getPrincipalUri(), $query->getCalendarUris()); + }, $context->getCalendarProviders()) + ); $results = []; /** @var ICalendar $calendar */ diff --git a/tests/lib/Calendar/ManagerTest.php b/tests/lib/Calendar/ManagerTest.php index 70f7dbe2437..a4d9d45fdb2 100644 --- a/tests/lib/Calendar/ManagerTest.php +++ b/tests/lib/Calendar/ManagerTest.php @@ -27,6 +27,8 @@ use OC\AppFramework\Bootstrap\Coordinator; use OC\Calendar\Manager; use OCP\Calendar\ICalendar; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; use Test\TestCase; class ManagerTest extends TestCase { @@ -34,6 +36,12 @@ class ManagerTest extends TestCase { /** @var Coordinator|MockObject */ private $coordinator; + /** @var MockObject|ContainerInterface */ + private $container; + + /** @var MockObject|LoggerInterface */ + private $logger; + /** @var Manager */ private $manager; @@ -41,9 +49,13 @@ class ManagerTest extends TestCase { parent::setUp(); $this->coordinator = $this->createMock(Coordinator::class); + $this->container = $this->createMock(ContainerInterface::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->manager = new Manager( - $this->coordinator + $this->coordinator, + $this->container, + $this->logger ); }