diff options
author | Robin Appelman <robin@icewind.nl> | 2019-05-21 17:14:47 +0200 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2019-05-21 17:14:47 +0200 |
commit | ccfbee2af953924c6b290104cdac1d5c6139f15b (patch) | |
tree | 4981cec01844a161dee62d98ccbb074f4ade85fd /apps/files_versions/lib | |
parent | a3b4410283a0517b458deacc8ee704c12ec028bd (diff) | |
download | nextcloud-server-ccfbee2af953924c6b290104cdac1d5c6139f15b.tar.gz nextcloud-server-ccfbee2af953924c6b290104cdac1d5c6139f15b.zip |
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 <robin@icewind.nl>
Diffstat (limited to 'apps/files_versions/lib')
-rw-r--r-- | apps/files_versions/lib/Versions/IVersionBackend.php | 12 | ||||
-rw-r--r-- | apps/files_versions/lib/Versions/LegacyVersionsBackend.php | 5 | ||||
-rw-r--r-- | apps/files_versions/lib/Versions/VersionManager.php | 40 |
3 files changed, 45 insertions, 12 deletions
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,6 +25,7 @@ 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; /** @@ -32,6 +33,17 @@ use OCP\IUser; */ 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 * * @param IUser $user 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; + } } |