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