From ccfbee2af953924c6b290104cdac1d5c6139f15b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 21 May 2019 17:14:47 +0200 Subject: add way for version backends to programmatically specify if they should be used this allows for backends that should only be used if specific conditions are met Signed-off-by: Robin Appelman --- .../lib/Versions/IVersionBackend.php | 12 +++++++ .../lib/Versions/LegacyVersionsBackend.php | 5 +++ .../files_versions/lib/Versions/VersionManager.php | 40 +++++++++++++++------- 3 files changed, 45 insertions(+), 12 deletions(-) (limited to 'apps/files_versions/lib/Versions') diff --git a/apps/files_versions/lib/Versions/IVersionBackend.php b/apps/files_versions/lib/Versions/IVersionBackend.php index 616d535f7fd..913745c9850 100644 --- a/apps/files_versions/lib/Versions/IVersionBackend.php +++ b/apps/files_versions/lib/Versions/IVersionBackend.php @@ -25,12 +25,24 @@ use OCP\Files\File; use OCP\Files\FileInfo; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\Storage\IStorage; use OCP\IUser; /** * @since 15.0.0 */ interface IVersionBackend { + /** + * Whether or not this version backend should be used for a storage + * + * If false is returned then the next applicable backend will be used + * + * @param IStorage $storage + * @return bool + * @since 17.0.0 + */ + public function useBackendForStorage(IStorage $storage): bool; + /** * Get all versions for a file * diff --git a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php index 99424f54564..aceddef29d2 100644 --- a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php +++ b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php @@ -29,6 +29,7 @@ use OCP\Files\FileInfo; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; +use OCP\Files\Storage\IStorage; use OCP\IUser; use OCP\IUserManager; @@ -43,6 +44,10 @@ class LegacyVersionsBackend implements IVersionBackend { $this->userManager = $userManager; } + public function useBackendForStorage(IStorage $storage): bool { + return true; + } + public function getVersionsForFile(IUser $user, FileInfo $file): array { $storage = $file->getStorage(); if ($storage->instanceOfStorage(SharedStorage::class)) { diff --git a/apps/files_versions/lib/Versions/VersionManager.php b/apps/files_versions/lib/Versions/VersionManager.php index 757b6002710..99fa9f62bc8 100644 --- a/apps/files_versions/lib/Versions/VersionManager.php +++ b/apps/files_versions/lib/Versions/VersionManager.php @@ -27,15 +27,18 @@ use OCP\Files\Storage\IStorage; use OCP\IUser; class VersionManager implements IVersionManager { - /** @var IVersionBackend[] */ + /** @var (IVersionBackend[])[] */ private $backends = []; public function registerBackend(string $storageType, IVersionBackend $backend) { - $this->backends[$storageType] = $backend; + if (!isset($this->backends[$storageType])) { + $this->backends[$storageType] = []; + } + $this->backends[$storageType][] = $backend; } /** - * @return IVersionBackend[] + * @return (IVersionBackend[])[] */ private function getBackends(): array { return $this->backends; @@ -49,20 +52,29 @@ class VersionManager implements IVersionManager { public function getBackendForStorage(IStorage $storage): IVersionBackend { $fullType = get_class($storage); $backends = $this->getBackends(); - $foundType = array_reduce(array_keys($backends), function ($type, $registeredType) use ($storage) { + + $foundType = ''; + $foundBackend = null; + + foreach ($backends as $type => $backendsForType) { if ( - $storage->instanceOfStorage($registeredType) && - ($type === '' || is_subclass_of($registeredType, $type)) + $storage->instanceOfStorage($type) && + ($foundType === '' || is_subclass_of($type, $foundType)) ) { - return $registeredType; - } else { - return $type; + foreach ($backendsForType as $backend) { + /** @var IVersionBackend $backend */ + if ($backend->useBackendForStorage($storage)) { + $foundBackend = $backend; + $foundType = $type; + } + } } - }, ''); - if ($foundType === '') { + } + + if ($foundType === '' || $foundBackend === null) { throw new BackendNotFoundException("Version backend for $fullType not found"); } else { - return $backends[$foundType]; + return $foundBackend; } } @@ -90,4 +102,8 @@ class VersionManager implements IVersionManager { $backend = $this->getBackendForStorage($sourceFile->getStorage()); return $backend->getVersionFile($user, $sourceFile, $revision); } + + public function useBackendForStorage(IStorage $storage): bool { + return false; + } } -- cgit v1.2.3