From f4701d7721453b8356a5be401bb5063d22f851c6 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 24 Nov 2014 15:54:42 +0100 Subject: [PATCH 1/2] Add public api for mount configurations --- apps/files_sharing/lib/external/manager.php | 6 +- apps/files_sharing/lib/external/mount.php | 5 +- apps/files_sharing/lib/sharedmount.php | 4 +- .../files/config/mountprovidercollection.php | 55 ++++++++++++++++++ lib/private/files/filesystem.php | 17 ++++-- lib/private/files/mount/manager.php | 16 ++--- .../files/mount/{mount.php => mountpoint.php} | 22 +++---- lib/private/files/node/folder.php | 2 +- lib/private/files/node/root.php | 14 ++--- .../{loader.php => storagefactory.php} | 13 ++++- lib/private/files/utils/scanner.php | 4 +- lib/private/files/view.php | 4 +- lib/private/server.php | 12 ++++ lib/public/files/config/imountprovider.php | 26 +++++++++ .../files/config/imountprovidercollection.php | 31 ++++++++++ lib/public/files/mount/imountpoint.php | 58 +++++++++++++++++++ lib/public/files/storage/istoragefactory.php | 32 ++++++++++ lib/public/iservercontainer.php | 5 ++ tests/lib/files/mount/manager.php | 10 ++-- tests/lib/files/mount/mount.php | 10 ++-- tests/lib/files/node/folder.php | 12 ++-- tests/lib/files/utils/scanner.php | 12 ++-- 22 files changed, 298 insertions(+), 72 deletions(-) create mode 100644 lib/private/files/config/mountprovidercollection.php rename lib/private/files/mount/{mount.php => mountpoint.php} (90%) rename lib/private/files/storage/{loader.php => storagefactory.php} (71%) create mode 100644 lib/public/files/config/imountprovider.php create mode 100644 lib/public/files/config/imountprovidercollection.php create mode 100644 lib/public/files/mount/imountpoint.php create mode 100644 lib/public/files/storage/istoragefactory.php diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index 8176302a86..762fe31eb6 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -24,7 +24,7 @@ class Manager { private $mountManager; /** - * @var \OC\Files\Storage\Loader + * @var \OC\Files\Storage\StorageFactory */ private $storageLoader; @@ -37,10 +37,10 @@ class Manager { * @param \OCP\IDBConnection $connection * @param \OC\Files\Mount\Manager $mountManager * @param \OC\User\Session $userSession - * @param \OC\Files\Storage\Loader $storageLoader + * @param \OC\Files\Storage\StorageFactory $storageLoader */ public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager, - \OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) { + \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession) { $this->connection = $connection; $this->mountManager = $mountManager; $this->userSession = $userSession; diff --git a/apps/files_sharing/lib/external/mount.php b/apps/files_sharing/lib/external/mount.php index e564dded69..6fd9882cb2 100644 --- a/apps/files_sharing/lib/external/mount.php +++ b/apps/files_sharing/lib/external/mount.php @@ -8,9 +8,10 @@ namespace OCA\Files_Sharing\External; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; -class Mount extends \OC\Files\Mount\Mount implements MoveableMount { +class Mount extends MountPoint implements MoveableMount { /** * @var \OCA\Files_Sharing\External\Manager @@ -22,7 +23,7 @@ class Mount extends \OC\Files\Mount\Mount implements MoveableMount { * @param string $mountpoint * @param array $options * @param \OCA\Files_Sharing\External\Manager $manager - * @param \OC\Files\Storage\Loader $loader + * @param \OC\Files\Storage\StorageFactory $loader */ public function __construct($storage, $mountpoint, $options, $manager, $loader = null) { parent::__construct($storage, $mountpoint, $options, $loader); diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index a93ecfb3b1..d16dbf89cc 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -8,13 +8,13 @@ namespace OCA\Files_Sharing; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; /** * Shared mount points can be moved by the user */ -class SharedMount extends Mount implements MoveableMount { +class SharedMount extends MountPoint implements MoveableMount { /** * @var \OC\Files\Storage\Shared $storage */ diff --git a/lib/private/files/config/mountprovidercollection.php b/lib/private/files/config/mountprovidercollection.php new file mode 100644 index 0000000000..49d026f1bd --- /dev/null +++ b/lib/private/files/config/mountprovidercollection.php @@ -0,0 +1,55 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Config; + +use OCP\Files\Config\IMountProviderCollection; +use OCP\Files\Config\IMountProvider; +use OCP\Files\Storage\IStorageFactory; +use OCP\IUser; + +class MountProviderCollection implements IMountProviderCollection { + /** + * @var \OCP\Files\Config\IMountProvider[] + */ + private $providers = array(); + + /** + * @var \OCP\Files\Storage\IStorageFactory + */ + private $loader; + + /** + * @param \OCP\Files\Storage\IStorageFactory $loader + */ + public function __construct(IStorageFactory $loader) { + $this->loader = $loader; + } + + /** + * Get all configured mount points for the user + * + * @param \OCP\IUser $user + * @return \OCP\Files\Mount\IMountPoint[] + */ + public function getMountsForUser(IUser $user) { + $loader = $this->loader; + return array_reduce($this->providers, function ($mounts, IMountProvider $provider) use ($user, $loader) { + return array_merge($mounts, $provider->getMountsForUser($user, $loader)); + }, array()); + } + + /** + * Add a provider for mount points + * + * @param \OCP\Files\Config\IMountProvider $provider + */ + public function registerProvider(IMountProvider $provider) { + $this->providers[] = $provider; + } +} diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php index 6c8fa8c90b..90643839e2 100644 --- a/lib/private/files/filesystem.php +++ b/lib/private/files/filesystem.php @@ -30,7 +30,7 @@ namespace OC\Files; -use OC\Files\Storage\Loader; +use OC\Files\Storage\StorageFactory; class Filesystem { @@ -165,7 +165,7 @@ class Filesystem { const signal_param_users = 'users'; /** - * @var \OC\Files\Storage\Loader $loader + * @var \OC\Files\Storage\StorageFactory $loader */ private static $loader; @@ -183,7 +183,7 @@ class Filesystem { public static function getLoader() { if (!self::$loader) { - self::$loader = new Loader(); + self::$loader = new StorageFactory(); } return self::$loader; } @@ -250,7 +250,7 @@ class Filesystem { /** * @param string $id - * @return Mount\Mount[] + * @return Mount\MountPoint[] */ public static function getMountByStorageId($id) { if (!self::$mounts) { @@ -261,7 +261,7 @@ class Filesystem { /** * @param int $id - * @return Mount\Mount[] + * @return Mount\MountPoint[] */ public static function getMountByNumericId($id) { if (!self::$mounts) { @@ -370,6 +370,11 @@ class Filesystem { self::mountCacheDir($user); // Chance to mount for other storages + if($userObject) { + $mountConfigManager = \OC::$server->getMountProviderCollection(); + $mounts = $mountConfigManager->getMountsForUser($userObject); + array_walk($mounts, array(self::$mounts, 'addMount')); + } \OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', array('user' => $user, 'user_dir' => $root)); } @@ -447,7 +452,7 @@ class Filesystem { if (!self::$mounts) { \OC_Util::setupFS(); } - $mount = new Mount\Mount($class, $mountpoint, $arguments, self::getLoader()); + $mount = new Mount\MountPoint($class, $mountpoint, $arguments, self::getLoader()); self::$mounts->addMount($mount); } diff --git a/lib/private/files/mount/manager.php b/lib/private/files/mount/manager.php index 0ccf42941d..8472ebc976 100644 --- a/lib/private/files/mount/manager.php +++ b/lib/private/files/mount/manager.php @@ -12,14 +12,14 @@ use \OC\Files\Filesystem; class Manager { /** - * @var Mount[] + * @var MountPoint[] */ private $mounts = array(); /** - * @param Mount $mount + * @param MountPoint $mount */ - public function addMount(Mount $mount) { + public function addMount(MountPoint $mount) { $this->mounts[$mount->getMountPoint()] = $mount; } @@ -47,7 +47,7 @@ class Manager { * Find the mount for $path * * @param string $path - * @return Mount + * @return MountPoint */ public function find($path) { \OC_Util::setupFS(); @@ -75,7 +75,7 @@ class Manager { * Find all mounts in $path * * @param string $path - * @return Mount[] + * @return MountPoint[] */ public function findIn($path) { \OC_Util::setupFS(); @@ -99,7 +99,7 @@ class Manager { * Find mounts by storage id * * @param string $id - * @return Mount[] + * @return MountPoint[] */ public function findByStorageId($id) { \OC_Util::setupFS(); @@ -116,7 +116,7 @@ class Manager { } /** - * @return Mount[] + * @return MountPoint[] */ public function getAll() { return $this->mounts; @@ -126,7 +126,7 @@ class Manager { * Find mounts by numeric storage id * * @param int $id - * @return Mount[] + * @return MountPoint[] */ public function findByNumericId($id) { $storageId = \OC\Files\Cache\Storage::getStorageId($id); diff --git a/lib/private/files/mount/mount.php b/lib/private/files/mount/mountpoint.php similarity index 90% rename from lib/private/files/mount/mount.php rename to lib/private/files/mount/mountpoint.php index 48c9d88c23..b2c50f9d88 100644 --- a/lib/private/files/mount/mount.php +++ b/lib/private/files/mount/mountpoint.php @@ -9,10 +9,11 @@ namespace OC\Files\Mount; use \OC\Files\Filesystem; -use OC\Files\Storage\Loader; +use OC\Files\Storage\StorageFactory; use OC\Files\Storage\Storage; +use OCP\Files\Mount\IMountPoint; -class Mount { +class MountPoint implements IMountPoint { /** * @var \OC\Files\Storage\Storage $storage */ @@ -23,7 +24,7 @@ class Mount { protected $mountPoint; /** - * @var \OC\Files\Storage\Loader $loader + * @var \OC\Files\Storage\StorageFactory $loader */ private $loader; @@ -31,14 +32,14 @@ class Mount { * @param string|\OC\Files\Storage\Storage $storage * @param string $mountpoint * @param array $arguments (optional)\ - * @param \OC\Files\Storage\Loader $loader + * @param \OCP\Files\Storage\IStorageFactory $loader */ public function __construct($storage, $mountpoint, $arguments = null, $loader = null) { if (is_null($arguments)) { $arguments = array(); } if (is_null($loader)) { - $this->loader = new Loader(); + $this->loader = new StorageFactory(); } else { $this->loader = $loader; } @@ -67,15 +68,6 @@ class Mount { return $this->mountPoint; } - /** - * get name of the mount point - * - * @return string - */ - public function getMountPointName() { - return basename(rtrim($this->mountPoint, '/')); - } - /** * @param string $mountPoint new mount point */ @@ -91,7 +83,7 @@ class Mount { private function createStorage() { if (class_exists($this->class)) { try { - return $this->loader->load($this->mountPoint, $this->class, $this->arguments); + return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments); } catch (\Exception $exception) { if ($this->mountPoint === '/') { // the root storage could not be initialized, show the user! diff --git a/lib/private/files/node/folder.php b/lib/private/files/node/folder.php index 54a699be53..6fdcff13e1 100644 --- a/lib/private/files/node/folder.php +++ b/lib/private/files/node/folder.php @@ -301,7 +301,7 @@ class Folder extends Node implements \OCP\Files\Folder { $nodes = array(); foreach ($mounts as $mount) { /** - * @var \OC\Files\Mount\Mount $mount + * @var \OC\Files\Mount\MountPoint $mount */ if ($mount->getStorage()) { $cache = $mount->getStorage()->getCache(); diff --git a/lib/private/files/node/root.php b/lib/private/files/node/root.php index 1e8387dc5c..35132f5458 100644 --- a/lib/private/files/node/root.php +++ b/lib/private/files/node/root.php @@ -10,7 +10,7 @@ namespace OC\Files\Node; use OC\Files\Cache\Cache; use OC\Files\Mount\Manager; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OC\Hooks\Emitter; @@ -106,13 +106,13 @@ class Root extends Folder implements Emitter { * @param array $arguments */ public function mount($storage, $mountPoint, $arguments = array()) { - $mount = new Mount($storage, $mountPoint, $arguments); + $mount = new MountPoint($storage, $mountPoint, $arguments); $this->mountManager->addMount($mount); } /** * @param string $mountPoint - * @return \OC\Files\Mount\Mount + * @return \OC\Files\Mount\MountPoint */ public function getMount($mountPoint) { return $this->mountManager->find($mountPoint); @@ -120,7 +120,7 @@ class Root extends Folder implements Emitter { /** * @param string $mountPoint - * @return \OC\Files\Mount\Mount[] + * @return \OC\Files\Mount\MountPoint[] */ public function getMountsIn($mountPoint) { return $this->mountManager->findIn($mountPoint); @@ -128,7 +128,7 @@ class Root extends Folder implements Emitter { /** * @param string $storageId - * @return \OC\Files\Mount\Mount[] + * @return \OC\Files\Mount\MountPoint[] */ public function getMountByStorageId($storageId) { return $this->mountManager->findByStorageId($storageId); @@ -136,14 +136,14 @@ class Root extends Folder implements Emitter { /** * @param int $numericId - * @return Mount[] + * @return MountPoint[] */ public function getMountByNumericStorageId($numericId) { return $this->mountManager->findByNumericId($numericId); } /** - * @param \OC\Files\Mount\Mount $mount + * @param \OC\Files\Mount\MountPoint $mount */ public function unMount($mount) { $this->mountManager->remove($mount); diff --git a/lib/private/files/storage/loader.php b/lib/private/files/storage/storagefactory.php similarity index 71% rename from lib/private/files/storage/loader.php rename to lib/private/files/storage/storagefactory.php index c75a0a976a..c9e8d422f9 100644 --- a/lib/private/files/storage/loader.php +++ b/lib/private/files/storage/storagefactory.php @@ -8,7 +8,9 @@ namespace OC\Files\Storage; -class Loader { +use OCP\Files\Storage\IStorageFactory; + +class StorageFactory implements IStorageFactory { /** * @var callable[] $storageWrappers */ @@ -19,6 +21,7 @@ class Loader { * * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage * + * @param string $wrapperName * @param callable $callback */ public function addStorageWrapper($wrapperName, $callback) { @@ -26,15 +29,21 @@ class Loader { } /** + * Create an instance of a storage and apply the registered storage wrappers + * * @param string|boolean $mountPoint * @param string $class + * @param array $arguments + * @return \OCP\Files\Storage */ - public function load($mountPoint, $class, $arguments) { + public function getInstance($mountPoint, $class, $arguments) { return $this->wrap($mountPoint, new $class($arguments)); } /** * @param string|boolean $mountPoint + * @param \OCP\Files\Storage $storage + * @return \OCP\Files\Storage */ public function wrap($mountPoint, $storage) { foreach ($this->storageWrappers as $wrapper) { diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php index adb66497be..19a2ed38e1 100644 --- a/lib/private/files/utils/scanner.php +++ b/lib/private/files/utils/scanner.php @@ -53,7 +53,7 @@ class Scanner extends PublicEmitter { * get all storages for $dir * * @param string $dir - * @return \OC\Files\Mount\Mount[] + * @return \OC\Files\Mount\MountPoint[] */ protected function getMounts($dir) { //TODO: move to the node based fileapi once that's done @@ -72,7 +72,7 @@ class Scanner extends PublicEmitter { /** * attach listeners to the scanner * - * @param \OC\Files\Mount\Mount $mount + * @param \OC\Files\Mount\MountPoint $mount */ protected function attachListener($mount) { $scanner = $mount->getStorage()->getScanner(); diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 331ab9ba6c..4b3d167f8e 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -465,7 +465,7 @@ class View { if ($internalPath1 === '' and $mount instanceof MoveableMount) { if ($this->isTargetAllowed($absolutePath2)) { /** - * @var \OC\Files\Mount\Mount | \OC\Files\Mount\MoveableMount $mount + * @var \OC\Files\Mount\MountPoint | \OC\Files\Mount\MoveableMount $mount */ $sourceMountPoint = $mount->getMountPoint(); $result = $mount->moveMount($absolutePath2); @@ -1227,7 +1227,7 @@ class View { $mounts = array_reverse($mounts); foreach ($mounts as $mount) { /** - * @var \OC\Files\Mount\Mount $mount + * @var \OC\Files\Mount\MountPoint $mount */ if ($mount->getStorage()) { $cache = $mount->getStorage()->getCache(); diff --git a/lib/private/server.php b/lib/private/server.php index 7bd7f8ca45..971ffca943 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -9,6 +9,7 @@ use OC\Cache\UserCache; use OC\Diagnostics\NullQueryLogger; use OC\Diagnostics\EventLogger; use OC\Diagnostics\QueryLogger; +use OC\Files\Config\StorageManager; use OC\Security\CertificateManager; use OC\DB\ConnectionWrapper; use OC\Files\Node\Root; @@ -250,6 +251,10 @@ class Server extends SimpleContainer implements IServerContainer { $groupManager = $c->getGroupManager(); return new \OC\App\AppManager($userSession, $appConfig, $groupManager); }); + $this->registerService('MountConfigManager', function () { + $loader = \OC\Files\Filesystem::getLoader(); + return new \OC\Files\Config\MountProviderCollection($loader); + }); } /** @@ -647,4 +652,11 @@ class Server extends SimpleContainer implements IServerContainer { function getWebRoot() { return $this->webRoot; } + + /** + * @return \OCP\Files\Config\IMountProviderCollection + */ + function getMountProviderCollection(){ + return $this->query('MountConfigManager'); + } } diff --git a/lib/public/files/config/imountprovider.php b/lib/public/files/config/imountprovider.php new file mode 100644 index 0000000000..5a39e6c894 --- /dev/null +++ b/lib/public/files/config/imountprovider.php @@ -0,0 +1,26 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP\Files\Config; + +use OCP\Files\Storage\IStorageFactory; +use OCP\IUser; + +/** + * Provides + */ +interface IMountProvider { + /** + * Get all mountpoints applicable for the user + * + * @param \OCP\IUser $user + * @param \OCP\Files\Storage\IStorageFactory $loader + * @return \OCP\Files\Mount\IMountPoint[] + */ + public function getMountsForUser(IUser $user, IStorageFactory $loader); +} diff --git a/lib/public/files/config/imountprovidercollection.php b/lib/public/files/config/imountprovidercollection.php new file mode 100644 index 0000000000..52797414ab --- /dev/null +++ b/lib/public/files/config/imountprovidercollection.php @@ -0,0 +1,31 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP\Files\Config; + +use OCP\IUser; + +/** + * Manages the different mount providers + */ +interface IMountProviderCollection { + /** + * Get all configured mount points for the user + * + * @param \OCP\IUser $user + * @return \OCP\Files\Mount\IMountPoint[] + */ + public function getMountsForUser(IUser $user); + + /** + * Add a provider for mount points + * + * @param \OCP\Files\Config\IMountProvider $provider + */ + public function registerProvider(IMountProvider $provider); +} diff --git a/lib/public/files/mount/imountpoint.php b/lib/public/files/mount/imountpoint.php new file mode 100644 index 0000000000..dac634bae4 --- /dev/null +++ b/lib/public/files/mount/imountpoint.php @@ -0,0 +1,58 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP\Files\Mount; + +/** + * A storage mounted to folder on the filesystem + */ +interface IMountPoint { + + /** + * get complete path to the mount point + * + * @return string + */ + public function getMountPoint(); + + /** + * Set the mountpoint + * + * @param string $mountPoint new mount point + */ + public function setMountPoint($mountPoint); + + /** + * Get the storage that is mounted + * + * @return \OC\Files\Storage\Storage + */ + public function getStorage(); + + /** + * Get the id of the storages + * + * @return string + */ + public function getStorageId(); + + /** + * Get the path relative to the mountpoint + * + * @param string $path absolute path to a file or folder + * @return string + */ + public function getInternalPath($path); + + /** + * Apply a storage wrapper to the mounted storage + * + * @param callable $wrapper + */ + public function wrapStorage($wrapper); +} diff --git a/lib/public/files/storage/istoragefactory.php b/lib/public/files/storage/istoragefactory.php new file mode 100644 index 0000000000..769d7011de --- /dev/null +++ b/lib/public/files/storage/istoragefactory.php @@ -0,0 +1,32 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP\Files\Storage; + +/** + * Creates storage instances and manages and applies storage wrappers + */ +interface IStorageFactory { + /** + * allow modifier storage behaviour by adding wrappers around storages + * + * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage + * + * @param string $wrapperName + * @param callable $callback + */ + public function addStorageWrapper($wrapperName, $callback); + + /** + * @param string|boolean $mountPoint + * @param string $class + * @param array $arguments + * @return \OCP\Files\Storage + */ + public function getInstance($mountPoint, $class, $arguments); +} diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 301f47c68f..657c9be423 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -305,4 +305,9 @@ interface IServerContainer { * @return string */ function getWebRoot(); + + /** + * @return \OCP\Files\Config\IMountProviderCollection + */ + function getMountProviderCollection(); } diff --git a/tests/lib/files/mount/manager.php b/tests/lib/files/mount/manager.php index 051b76ccf2..78322b47d5 100644 --- a/tests/lib/files/mount/manager.php +++ b/tests/lib/files/mount/manager.php @@ -30,33 +30,33 @@ class Manager extends \Test\TestCase { public function testFind() { $this->assertNull($this->manager->find('/')); - $rootMount = new \OC\Files\Mount\Mount(new Temporary(array()), '/'); + $rootMount = new \OC\Files\Mount\MountPoint(new Temporary(array()), '/'); $this->manager->addMount($rootMount); $this->assertEquals($rootMount, $this->manager->find('/')); $this->assertEquals($rootMount, $this->manager->find('/foo/bar')); $storage = new Temporary(array()); - $mount1 = new \OC\Files\Mount\Mount($storage, '/foo'); + $mount1 = new \OC\Files\Mount\MountPoint($storage, '/foo'); $this->manager->addMount($mount1); $this->assertEquals($rootMount, $this->manager->find('/')); $this->assertEquals($mount1, $this->manager->find('/foo/bar')); $this->assertEquals(1, count($this->manager->findIn('/'))); - $mount2 = new \OC\Files\Mount\Mount(new Temporary(array()), '/bar'); + $mount2 = new \OC\Files\Mount\MountPoint(new Temporary(array()), '/bar'); $this->manager->addMount($mount2); $this->assertEquals(2, count($this->manager->findIn('/'))); $id = $mount1->getStorageId(); $this->assertEquals(array($mount1), $this->manager->findByStorageId($id)); - $mount3 = new \OC\Files\Mount\Mount($storage, '/foo/bar'); + $mount3 = new \OC\Files\Mount\MountPoint($storage, '/foo/bar'); $this->manager->addMount($mount3); $this->assertEquals(array($mount1, $mount3), $this->manager->findByStorageId($id)); } public function testLong() { $storage = new LongId(array()); - $mount = new \OC\Files\Mount\Mount($storage, '/foo'); + $mount = new \OC\Files\Mount\MountPoint($storage, '/foo'); $this->manager->addMount($mount); $id = $mount->getStorageId(); diff --git a/tests/lib/files/mount/mount.php b/tests/lib/files/mount/mount.php index 5ee3d934e9..584766de83 100644 --- a/tests/lib/files/mount/mount.php +++ b/tests/lib/files/mount/mount.php @@ -9,7 +9,7 @@ namespace Test\Files\Mount; -use OC\Files\Storage\Loader; +use OC\Files\Storage\StorageFactory; use OC\Files\Storage\Wrapper\Wrapper; class Mount extends \Test\TestCase { @@ -17,12 +17,12 @@ class Mount extends \Test\TestCase { $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary') ->disableOriginalConstructor() ->getMock(); - $mount = new \OC\Files\Mount\Mount($storage, '/foo'); + $mount = new \OC\Files\Mount\MountPoint($storage, '/foo'); $this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage()); } public function testFromStorageClassname() { - $mount = new \OC\Files\Mount\Mount('\OC\Files\Storage\Temporary', '/foo'); + $mount = new \OC\Files\Mount\MountPoint('\OC\Files\Storage\Temporary', '/foo'); $this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage()); } @@ -34,13 +34,13 @@ class Mount extends \Test\TestCase { return new Wrapper(array('storage' => $storage)); }; - $loader = new Loader(); + $loader = new StorageFactory(); $loader->addStorageWrapper('test_wrapper', $wrapper); $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary') ->disableOriginalConstructor() ->getMock(); - $mount = new \OC\Files\Mount\Mount($storage, '/foo', array(), $loader); + $mount = new \OC\Files\Mount\MountPoint($storage, '/foo', array(), $loader); $this->assertInstanceOf('\OC\Files\Storage\Wrapper\Wrapper', $mount->getStorage()); } } diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php index 4aa57aa937..d8c047a2b7 100644 --- a/tests/lib/files/node/folder.php +++ b/tests/lib/files/node/folder.php @@ -10,7 +10,7 @@ namespace Test\Files\Node; use OC\Files\Cache\Cache; use OC\Files\FileInfo; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Node\Node; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; @@ -419,7 +419,7 @@ class Folder extends \Test\TestCase { $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $subCache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $subStorage = $this->getMock('\OC\Files\Storage\Storage'); - $subMount = $this->getMock('\OC\Files\Mount\Mount', array(), array(null, '')); + $subMount = $this->getMock('\OC\Files\Mount\MountPoint', array(), array(null, '')); $subMount->expects($this->once()) ->method('getStorage') @@ -487,7 +487,7 @@ class Folder extends \Test\TestCase { ->method('getUser') ->will($this->returnValue($this->user)); $storage = $this->getMock('\OC\Files\Storage\Storage'); - $mount = new Mount($storage, '/bar'); + $mount = new MountPoint($storage, '/bar'); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $view->expects($this->once()) @@ -530,7 +530,7 @@ class Folder extends \Test\TestCase { ->method('getUser') ->will($this->returnValue($this->user)); $storage = $this->getMock('\OC\Files\Storage\Storage'); - $mount = new Mount($storage, '/bar'); + $mount = new MountPoint($storage, '/bar'); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $storage->expects($this->once()) @@ -568,8 +568,8 @@ class Folder extends \Test\TestCase { ->method('getUser') ->will($this->returnValue($this->user)); $storage = $this->getMock('\OC\Files\Storage\Storage'); - $mount1 = new Mount($storage, '/bar'); - $mount2 = new Mount($storage, '/bar/foo/asd'); + $mount1 = new MountPoint($storage, '/bar'); + $mount2 = new MountPoint($storage, '/bar/foo/asd'); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $view->expects($this->any()) diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php index f729be81bd..65ddfe4751 100644 --- a/tests/lib/files/utils/scanner.php +++ b/tests/lib/files/utils/scanner.php @@ -9,17 +9,17 @@ namespace Test\Files\Utils; use OC\Files\Filesystem; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Storage\Temporary; class TestScanner extends \OC\Files\Utils\Scanner { /** - * @var \OC\Files\Mount\Mount[] $mounts + * @var \OC\Files\Mount\MountPoint[] $mounts */ private $mounts = array(); /** - * @param \OC\Files\Mount\Mount $mount + * @param \OC\Files\Mount\MountPoint $mount */ public function addMount($mount) { $this->mounts[] = $mount; @@ -56,7 +56,7 @@ class Scanner extends \Test\TestCase { public function testReuseExistingRoot() { $storage = new Temporary(array()); - $mount = new Mount($storage, ''); + $mount = new MountPoint($storage, ''); Filesystem::getMountManager()->addMount($mount); $cache = $storage->getCache(); @@ -78,7 +78,7 @@ class Scanner extends \Test\TestCase { public function testReuseExistingFile() { $storage = new Temporary(array()); - $mount = new Mount($storage, ''); + $mount = new MountPoint($storage, ''); Filesystem::getMountManager()->addMount($mount); $cache = $storage->getCache(); @@ -105,7 +105,7 @@ class Scanner extends \Test\TestCase { $propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false); $storage = new Temporary(array()); - $mount = new Mount($storage, '/foo'); + $mount = new MountPoint($storage, '/foo'); Filesystem::getMountManager()->addMount($mount); $cache = $storage->getCache(); From a369d7812463c2afddf1640c42643de6312ab9ba Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 3 Dec 2014 14:14:31 +0100 Subject: [PATCH 2/2] Use the mount config api for files_external --- apps/files_external/appinfo/app.php | 2 + apps/files_external/lib/config.php | 16 ------- .../lib/config/configadapter.php | 44 +++++++++++++++++++ apps/files_external/lib/personalmount.php | 4 +- 4 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 apps/files_external/lib/config/configadapter.php diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index ea14f7adbc..707563096f 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -177,3 +177,5 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP', array( 'password' => '*'.$l->t('Password'), 'root' => '&'.$l->t('Root')))); +$mountProvider = new \OCA\Files_External\Config\ConfigAdapter(); +\OC::$server->getMountProviderCollection()->registerProvider($mountProvider); diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 9400bbdedc..44cf90b4f9 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -103,22 +103,6 @@ class OC_Mount_Config { * @param array $data */ public static function initMountPointsHook($data) { - $mountPoints = self::getAbsoluteMountPoints($data['user']); - $loader = \OC\Files\Filesystem::getLoader(); - $manager = \OC\Files\Filesystem::getMountManager(); - foreach ($mountPoints as $mountPoint => $options) { - if (isset($options['options']['objectstore'])) { - $objectClass = $options['options']['objectstore']['class']; - $options['options']['objectstore'] = new $objectClass($options['options']['objectstore']); - } - if (isset($options['personal']) && $options['personal']) { - $mount = new \OCA\Files_External\PersonalMount($options['class'], $mountPoint, $options['options'], $loader); - } else{ - $mount = new \OC\Files\Mount\Mount($options['class'], $mountPoint, $options['options'], $loader); - } - $manager->addMount($mount); - } - if ($data['user']) { $user = \OC::$server->getUserManager()->get($data['user']); if (!$user) { diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php new file mode 100644 index 0000000000..6294e27a77 --- /dev/null +++ b/apps/files_external/lib/config/configadapter.php @@ -0,0 +1,44 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_External\Config; + +use OC\Files\Mount\MountPoint; +use OCP\Files\Storage\IStorageFactory; +use OCA\Files_External\PersonalMount; +use OCP\Files\Config\IMountProvider; +use OCP\IUser; + +/** + * Make the old files_external config work with the new public mount config api + */ +class ConfigAdapter implements IMountProvider { + /** + * Get all mountpoints applicable for the user + * + * @param \OCP\IUser $user + * @param \OCP\Files\Storage\IStorageFactory $loader + * @return \OCP\Files\Mount\IMountPoint[] + */ + public function getMountsForUser(IUser $user, IStorageFactory $loader) { + $mountPoints = \OC_Mount_Config::getAbsoluteMountPoints($user->getUID()); + $mounts = array(); + foreach ($mountPoints as $mountPoint => $options) { + if (isset($options['options']['objectstore'])) { + $objectClass = $options['options']['objectstore']['class']; + $options['options']['objectstore'] = new $objectClass($options['options']['objectstore']); + } + if (isset($options['personal']) && $options['personal']) { + $mounts[] = new PersonalMount($options['class'], $mountPoint, $options['options'], $loader); + } else { + $mounts[] = new MountPoint($options['class'], $mountPoint, $options['options'], $loader); + } + } + return $mounts; + } +} diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php index 708128d644..0c74117913 100644 --- a/apps/files_external/lib/personalmount.php +++ b/apps/files_external/lib/personalmount.php @@ -8,13 +8,13 @@ namespace OCA\Files_External; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; /** * Person mount points can be moved by the user */ -class PersonalMount extends Mount implements MoveableMount { +class PersonalMount extends MountPoint implements MoveableMount { /** * Move the mount point to $target *