Browse Source
Merge pull request #17325 from nextcloud/enh/decouple-register-resource-provider
Merge pull request #17325 from nextcloud/enh/decouple-register-resource-provider
Decouple resource provider registrationpull/18292/head
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 304 additions and 31 deletions
-
8apps/files/lib/AppInfo/Application.php
-
2lib/composer/composer/autoload_classmap.php
-
2lib/composer/composer/autoload_static.php
-
1lib/private/AppFramework/DependencyInjection/DIContainer.php
-
36lib/private/Collaboration/Resources/Manager.php
-
70lib/private/Collaboration/Resources/ProviderManager.php
-
1lib/private/Server.php
-
1lib/public/Collaboration/Resources/IManager.php
-
41lib/public/Collaboration/Resources/IProviderManager.php
-
62tests/lib/Collaboration/Resources/ManagerTest.php
-
111tests/lib/Collaboration/Resources/ProviderManagerTest.php
@ -0,0 +1,70 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
/** |
|||
* @copyright Copyright (c) 2019 Daniel Kesselberg <mail@danielkesselberg.de> |
|||
* |
|||
* @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\Collaboration\Resources; |
|||
|
|||
use OCP\AppFramework\QueryException; |
|||
use OCP\Collaboration\Resources\IProvider; |
|||
use OCP\Collaboration\Resources\IProviderManager; |
|||
use OCP\ILogger; |
|||
use OCP\IServerContainer; |
|||
|
|||
class ProviderManager implements IProviderManager { |
|||
|
|||
/** @var string[] */ |
|||
protected $providers = []; |
|||
|
|||
/** @var IProvider[] */ |
|||
protected $providerInstances = []; |
|||
|
|||
/** @var IServerContainer */ |
|||
protected $serverContainer; |
|||
|
|||
/** @var ILogger */ |
|||
protected $logger; |
|||
|
|||
public function __construct(IServerContainer $serverContainer, ILogger $logger) { |
|||
$this->serverContainer = $serverContainer; |
|||
$this->logger = $logger; |
|||
} |
|||
|
|||
public function getResourceProviders(): array { |
|||
if ($this->providers !== []) { |
|||
foreach ($this->providers as $provider) { |
|||
try { |
|||
$this->providerInstances[] = $this->serverContainer->query($provider); |
|||
} catch (QueryException $e) { |
|||
$this->logger->logException($e, [ |
|||
'message' => "Could not query resource provider $provider: " . $e->getMessage() |
|||
]); |
|||
} |
|||
} |
|||
$this->providers = []; |
|||
} |
|||
|
|||
return $this->providerInstances; |
|||
} |
|||
|
|||
public function registerResourceProvider(string $provider): void { |
|||
$this->providers[] = $provider; |
|||
} |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
/** |
|||
* @copyright Copyright (c) 2019 Daniel Kesselberg <mail@danielkesselberg.de> |
|||
* |
|||
* @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 OCP\Collaboration\Resources; |
|||
|
|||
/** |
|||
* @since 18.0.0 |
|||
*/ |
|||
interface IProviderManager { |
|||
|
|||
/** |
|||
* @return IProvider[] list of resource providers |
|||
* @since 18.0.0 |
|||
*/ |
|||
public function getResourceProviders(): array; |
|||
|
|||
/** |
|||
* @param string $provider provider's class name |
|||
* @since 18.0.0 |
|||
*/ |
|||
public function registerResourceProvider(string $provider): void; |
|||
} |
|||
@ -0,0 +1,62 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
/** |
|||
* @copyright Copyright (c) 2019 Daniel Kesselberg <mail@danielkesselberg.de> |
|||
* |
|||
* @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\Collaboration\Resources; |
|||
|
|||
use OC\Collaboration\Resources\Manager; |
|||
use OCP\Collaboration\Resources\IManager; |
|||
use OCP\Collaboration\Resources\IProviderManager; |
|||
use OCP\IDBConnection; |
|||
use OCP\ILogger; |
|||
use Test\TestCase; |
|||
|
|||
class ManagerTest extends TestCase { |
|||
|
|||
/** @var ILogger */ |
|||
protected $logger; |
|||
/** @var IProviderManager */ |
|||
protected $providerManager; |
|||
/** @var IManager */ |
|||
protected $manager; |
|||
|
|||
protected function setUp(): void { |
|||
parent::setUp(); |
|||
|
|||
$this->logger = $this->createMock(ILogger::class); |
|||
$this->providerManager = $this->createMock(IProviderManager::class); |
|||
|
|||
/** @var IDBConnection $connection */ |
|||
$connection = $this->createMock(IDBConnection::class); |
|||
$this->manager = new Manager($connection, $this->providerManager, $this->logger); |
|||
} |
|||
|
|||
public function testRegisterResourceProvider(): void { |
|||
$this->logger->expects($this->once()) |
|||
->method('debug') |
|||
->with($this->equalTo('\OC\Collaboration\Resources\Manager::registerResourceProvider is deprecated'), $this->equalTo(['provider' => 'AwesomeResourceProvider'])); |
|||
$this->providerManager->expects($this->once()) |
|||
->method('registerResourceProvider') |
|||
->with($this->equalTo('AwesomeResourceProvider')); |
|||
|
|||
$this->manager->registerResourceProvider('AwesomeResourceProvider'); |
|||
} |
|||
} |
|||
@ -0,0 +1,111 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
/** |
|||
* @copyright Copyright (c) 2019 Daniel Kesselberg <mail@danielkesselberg.de> |
|||
* |
|||
* @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\Collaboration\Resources; |
|||
|
|||
use OC\Collaboration\Resources\ProviderManager; |
|||
use OCA\Files\Collaboration\Resources\ResourceProvider; |
|||
use OCP\AppFramework\QueryException; |
|||
use OCP\Collaboration\Resources\IProviderManager; |
|||
use OCP\ILogger; |
|||
use OCP\IServerContainer; |
|||
use Test\TestCase; |
|||
|
|||
class ProviderManagerTest extends TestCase { |
|||
|
|||
/** @var IServerContainer */ |
|||
protected $serverContainer; |
|||
/** @var ILogger */ |
|||
protected $logger; |
|||
/** @var IProviderManager */ |
|||
protected $providerManager; |
|||
|
|||
protected function setUp(): void { |
|||
parent::setUp(); |
|||
|
|||
$this->serverContainer = $this->createMock(IServerContainer::class); |
|||
$this->logger = $this->createMock(ILogger::class); |
|||
|
|||
$this->providerManager = new class($this->serverContainer, $this->logger) extends ProviderManager { |
|||
public function countProviders(): int { |
|||
return count($this->providers); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
public function testRegisterResourceProvider(): void { |
|||
$this->providerManager->registerResourceProvider('AwesomeResourceProvider'); |
|||
$this->assertSame(1, $this->providerManager->countProviders()); |
|||
} |
|||
|
|||
public function testGetResourceProvidersNoProvider(): void { |
|||
$this->assertCount(0, $this->providerManager->getResourceProviders()); |
|||
} |
|||
|
|||
public function testGetResourceProvidersValidProvider(): void { |
|||
$this->serverContainer->expects($this->once()) |
|||
->method('query') |
|||
->with($this->equalTo(ResourceProvider::class)) |
|||
->willReturn($this->createMock(ResourceProvider::class)); |
|||
|
|||
$this->providerManager->registerResourceProvider(ResourceProvider::class); |
|||
$resourceProviders = $this->providerManager->getResourceProviders(); |
|||
|
|||
$this->assertCount(1, $resourceProviders); |
|||
$this->assertInstanceOf(ResourceProvider::class, $resourceProviders[0]); |
|||
} |
|||
|
|||
public function testGetResourceProvidersInvalidProvider(): void { |
|||
$this->serverContainer->expects($this->once()) |
|||
->method('query') |
|||
->with($this->equalTo('InvalidResourceProvider')) |
|||
->willThrowException(new QueryException('A meaningful error message')); |
|||
|
|||
$this->logger->expects($this->once()) |
|||
->method('logException'); |
|||
|
|||
$this->providerManager->registerResourceProvider('InvalidResourceProvider'); |
|||
$resourceProviders = $this->providerManager->getResourceProviders(); |
|||
|
|||
$this->assertCount(0, $resourceProviders); |
|||
} |
|||
|
|||
public function testGetResourceProvidersValidAndInvalidProvider(): void { |
|||
$this->serverContainer->expects($this->at(0)) |
|||
->method('query') |
|||
->with($this->equalTo('InvalidResourceProvider')) |
|||
->willThrowException(new QueryException('A meaningful error message')); |
|||
$this->serverContainer->expects($this->at(1)) |
|||
->method('query') |
|||
->with($this->equalTo(ResourceProvider::class)) |
|||
->willReturn($this->createMock(ResourceProvider::class)); |
|||
|
|||
$this->logger->expects($this->once()) |
|||
->method('logException'); |
|||
|
|||
$this->providerManager->registerResourceProvider('InvalidResourceProvider'); |
|||
$this->providerManager->registerResourceProvider(ResourceProvider::class); |
|||
$resourceProviders = $this->providerManager->getResourceProviders(); |
|||
|
|||
$this->assertCount(1, $resourceProviders); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue