From 20901c59d47e74179a04ca7938afe1ff131f6576 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 3 Sep 2019 12:30:10 +0200 Subject: [PATCH] emit file events via Dispatcher, too another step to get rid of hooks and emitters Signed-off-by: Arthur Schiwon --- lib/private/Files/Node/File.php | 2 +- lib/private/Files/Node/Folder.php | 14 +++++--------- lib/private/Files/Node/HookConnector.php | 20 +++++++++++++++++++- lib/private/Files/Node/Node.php | 24 ++++++++++++++---------- lib/private/Server.php | 2 +- 5 files changed, 40 insertions(+), 22 deletions(-) diff --git a/lib/private/Files/Node/File.php b/lib/private/Files/Node/File.php index a3eabbcc44..b504c7a29d 100644 --- a/lib/private/Files/Node/File.php +++ b/lib/private/Files/Node/File.php @@ -119,7 +119,7 @@ class File extends Node implements \OCP\Files\File { $fileInfo = $this->getFileInfo(); $this->view->unlink($this->path); $nonExisting = new NonExistingFile($this->root, $this->view, $this->path, $fileInfo); - $this->root->emit('\OC\Files', 'postDelete', array($nonExisting)); + $this->sendHooks(['postDelete'], [$nonExisting]); $this->exists = false; $this->fileInfo = null; } else { diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index 19f0404877..8b2a93ffdc 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -156,14 +156,12 @@ class Folder extends Node implements \OCP\Files\Folder { if ($this->checkPermissions(\OCP\Constants::PERMISSION_CREATE)) { $fullPath = $this->getFullPath($path); $nonExisting = new NonExistingFolder($this->root, $this->view, $fullPath); - $this->root->emit('\OC\Files', 'preWrite', array($nonExisting)); - $this->root->emit('\OC\Files', 'preCreate', array($nonExisting)); + $this->sendHooks(['preWrite', 'preCreate'], [$nonExisting]); if(!$this->view->mkdir($fullPath)) { throw new NotPermittedException('Could not create folder'); } $node = new Folder($this->root, $this->view, $fullPath); - $this->root->emit('\OC\Files', 'postWrite', array($node)); - $this->root->emit('\OC\Files', 'postCreate', array($node)); + $this->sendHooks(['postWrite', 'postCreate'], [$node]); return $node; } else { throw new NotPermittedException('No create permission for folder'); @@ -179,14 +177,12 @@ class Folder extends Node implements \OCP\Files\Folder { if ($this->checkPermissions(\OCP\Constants::PERMISSION_CREATE)) { $fullPath = $this->getFullPath($path); $nonExisting = new NonExistingFile($this->root, $this->view, $fullPath); - $this->root->emit('\OC\Files', 'preWrite', array($nonExisting)); - $this->root->emit('\OC\Files', 'preCreate', array($nonExisting)); + $this->sendHooks(['preWrite', 'preCreate'], [$nonExisting]); if (!$this->view->touch($fullPath)) { throw new NotPermittedException('Could not create path'); } $node = new File($this->root, $this->view, $fullPath); - $this->root->emit('\OC\Files', 'postWrite', array($node)); - $this->root->emit('\OC\Files', 'postCreate', array($node)); + $this->sendHooks(['postWrite', 'postCreate'], [$node]); return $node; } throw new NotPermittedException('No create permission for path'); @@ -341,7 +337,7 @@ class Folder extends Node implements \OCP\Files\Folder { $fileInfo = $this->getFileInfo(); $this->view->rmdir($this->path); $nonExisting = new NonExistingFolder($this->root, $this->view, $this->path, $fileInfo); - $this->root->emit('\OC\Files', 'postDelete', array($nonExisting)); + $this->sendHooks(['postDelete'], [$nonExisting]); $this->exists = false; } else { throw new NotPermittedException('No delete permission for path'); diff --git a/lib/private/Files/Node/HookConnector.php b/lib/private/Files/Node/HookConnector.php index f5adcde4a0..4783a71b07 100644 --- a/lib/private/Files/Node/HookConnector.php +++ b/lib/private/Files/Node/HookConnector.php @@ -26,6 +26,8 @@ use OCP\Files\FileInfo; use OC\Files\Filesystem; use OC\Files\View; use OCP\Util; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; class HookConnector { /** @@ -42,6 +44,8 @@ class HookConnector { * @var FileInfo[] */ private $deleteMetaCache = []; + /** @var EventDispatcherInterface */ + private $dispatcher; /** * HookConnector constructor. @@ -49,9 +53,10 @@ class HookConnector { * @param Root $root * @param View $view */ - public function __construct(Root $root, View $view) { + public function __construct(Root $root, View $view, EventDispatcherInterface $dispatcher) { $this->root = $root; $this->view = $view; + $this->dispatcher = $dispatcher; } public function viewToNode() { @@ -79,72 +84,85 @@ class HookConnector { public function write($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'preWrite', [$node]); + $this->dispatcher->dispatch('\OCP\Files::preWrite', new GenericEvent($node)); } public function postWrite($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'postWrite', [$node]); + $this->dispatcher->dispatch('\OCP\Files::postWrite', new GenericEvent($node)); } public function create($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'preCreate', [$node]); + $this->dispatcher->dispatch('\OCP\Files::preCreate', new GenericEvent($node)); } public function postCreate($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'postCreate', [$node]); + $this->dispatcher->dispatch('\OCP\Files::postCreate', new GenericEvent($node)); } public function delete($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->deleteMetaCache[$node->getPath()] = $node->getFileInfo(); $this->root->emit('\OC\Files', 'preDelete', [$node]); + $this->dispatcher->dispatch('\OCP\Files::preDelete', new GenericEvent($node)); } public function postDelete($arguments) { $node = $this->getNodeForPath($arguments['path']); unset($this->deleteMetaCache[$node->getPath()]); $this->root->emit('\OC\Files', 'postDelete', [$node]); + $this->dispatcher->dispatch('\OCP\Files::postDelete', new GenericEvent($node)); } public function touch($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'preTouch', [$node]); + $this->dispatcher->dispatch('\OCP\Files::preTouch', new GenericEvent($node)); } public function postTouch($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'postTouch', [$node]); + $this->dispatcher->dispatch('\OCP\Files::postTouch', new GenericEvent($node)); } public function rename($arguments) { $source = $this->getNodeForPath($arguments['oldpath']); $target = $this->getNodeForPath($arguments['newpath']); $this->root->emit('\OC\Files', 'preRename', [$source, $target]); + $this->dispatcher->dispatch('\OCP\Files::preRename', new GenericEvent([$source, $target])); } public function postRename($arguments) { $source = $this->getNodeForPath($arguments['oldpath']); $target = $this->getNodeForPath($arguments['newpath']); $this->root->emit('\OC\Files', 'postRename', [$source, $target]); + $this->dispatcher->dispatch('\OCP\Files::postRename', new GenericEvent([$source, $target])); } public function copy($arguments) { $source = $this->getNodeForPath($arguments['oldpath']); $target = $this->getNodeForPath($arguments['newpath']); $this->root->emit('\OC\Files', 'preCopy', [$source, $target]); + $this->dispatcher->dispatch('\OCP\Files::preCopy', new GenericEvent([$source, $target])); } public function postCopy($arguments) { $source = $this->getNodeForPath($arguments['oldpath']); $target = $this->getNodeForPath($arguments['newpath']); $this->root->emit('\OC\Files', 'postCopy', [$source, $target]); + $this->dispatcher->dispatch('\OCP\Files::postCopy', new GenericEvent([$source, $target])); } public function read($arguments) { $node = $this->getNodeForPath($arguments['path']); $this->root->emit('\OC\Files', 'read', [$node]); + $this->dispatcher->dispatch('\OCP\Files::read', new GenericEvent([$node])); } private function getNodeForPath($path) { diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php index dc025b7957..c440dd4a8f 100644 --- a/lib/private/Files/Node/Node.php +++ b/lib/private/Files/Node/Node.php @@ -33,6 +33,7 @@ use OCP\Files\FileInfo; use OCP\Files\InvalidPathException; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; +use Symfony\Component\EventDispatcher\GenericEvent; // FIXME: this class really should be abstract class Node implements \OCP\Files\Node { @@ -104,9 +105,12 @@ class Node implements \OCP\Files\Node { /** * @param string[] $hooks */ - protected function sendHooks($hooks) { + protected function sendHooks($hooks, array $args = null) { + $args = !empty($args) ? $args : [$this]; + $dispatcher = \OC::$server->getEventDispatcher(); foreach ($hooks as $hook) { - $this->root->emit('\OC\Files', $hook, array($this)); + $this->root->emit('\OC\Files', $hook, $args); + $dispatcher->dispatch('\OCP\Files::' . $hook, new GenericEvent($args)); } } @@ -394,14 +398,14 @@ class Node implements \OCP\Files\Node { $parent = $this->root->get(dirname($targetPath)); if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { $nonExisting = $this->createNonExistingNode($targetPath); - $this->root->emit('\OC\Files', 'preCopy', [$this, $nonExisting]); - $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]); + $this->sendHooks(['preCopy'], [$this, $nonExisting]); + $this->sendHooks(['preWrite'], [$nonExisting]); if (!$this->view->copy($this->path, $targetPath)) { throw new NotPermittedException('Could not copy ' . $this->path . ' to ' . $targetPath); } $targetNode = $this->root->get($targetPath); - $this->root->emit('\OC\Files', 'postCopy', [$this, $targetNode]); - $this->root->emit('\OC\Files', 'postWrite', [$targetNode]); + $this->sendHooks(['postCopy'], [$this, $targetNode]); + $this->sendHooks(['postWrite'], [$targetNode]); return $targetNode; } else { throw new NotPermittedException('No permission to copy to path ' . $targetPath); @@ -425,14 +429,14 @@ class Node implements \OCP\Files\Node { ) ) { $nonExisting = $this->createNonExistingNode($targetPath); - $this->root->emit('\OC\Files', 'preRename', [$this, $nonExisting]); - $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]); + $this->sendHooks(['preRename'], [$this, $nonExisting]); + $this->sendHooks(['preWrite'], [$nonExisting]); if (!$this->view->rename($this->path, $targetPath)) { throw new NotPermittedException('Could not move ' . $this->path . ' to ' . $targetPath); } $targetNode = $this->root->get($targetPath); - $this->root->emit('\OC\Files', 'postRename', [$this, $targetNode]); - $this->root->emit('\OC\Files', 'postWrite', [$targetNode]); + $this->sendHooks(['postRename'], [$this, $targetNode]); + $this->sendHooks(['postWrite'], [$targetNode]); $this->path = $targetPath; return $targetNode; } else { diff --git a/lib/private/Server.php b/lib/private/Server.php index bce4f0feae..433ee044fa 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -298,7 +298,7 @@ class Server extends ServerContainer implements IServerContainer { $this->getLogger(), $this->getUserManager() ); - $connector = new HookConnector($root, $view); + $connector = new HookConnector($root, $view, $c->getEventDispatcher()); $connector->viewToNode(); $previewConnector = new \OC\Preview\WatcherConnector($root, $c->getSystemConfig());