]> source.dussan.org Git - nextcloud-server.git/commitdiff
Use a php class for the definitions to avoid loading problems
authorJoas Schilling <coding@schilljs.com>
Tue, 8 Nov 2016 14:56:39 +0000 (15:56 +0100)
committerJoas Schilling <coding@schilljs.com>
Wed, 9 Nov 2016 07:52:07 +0000 (08:52 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/private/Notification/Manager.php
lib/private/RichObjectStrings/Validator.php
lib/private/Server.php
lib/public/RichObjectStrings/Definitions.php [new file with mode: 0644]
lib/public/RichObjectStrings/definitions.json [deleted file]
tests/lib/Notification/ManagerTest.php
tests/lib/RichObjectStrings/ValidatorTest.php

index 4b57db4bac9d170a1c7cc41fe673ea3300c85602..c5cad7f2db35a6f14bad842c46795c7a1691df05 100644 (file)
 namespace OC\Notification;
 
 
-use OC\RichObjectStrings\Validator;
 use OCP\Notification\IApp;
 use OCP\Notification\IManager;
 use OCP\Notification\INotification;
 use OCP\Notification\INotifier;
+use OCP\RichObjectStrings\IValidator;
 
 class Manager implements IManager {
+       /** @var IValidator */
+       protected $validator;
+
        /** @var IApp[] */
        protected $apps;
 
@@ -49,7 +52,13 @@ class Manager implements IManager {
        /** @var \Closure[] */
        protected $notifiersInfoClosures;
 
-       public function __construct() {
+       /**
+        * Manager constructor.
+        *
+        * @param IValidator $validator
+        */
+       public function __construct(IValidator $validator) {
+               $this->validator = $validator;
                $this->apps = [];
                $this->notifiers = [];
                $this->notifiersInfo = [];
@@ -150,9 +159,7 @@ class Manager implements IManager {
         * @since 8.2.0
         */
        public function createNotification() {
-               return new Notification(
-                       new Validator()
-               );
+               return new Notification($this->validator);
        }
 
        /**
@@ -214,7 +221,6 @@ class Manager implements IManager {
 
        /**
         * @param INotification $notification
-        * @return null
         */
        public function markProcessed(INotification $notification) {
                $apps = $this->getApps();
index 2729b4a3f1bcea5a677b78c557e1f830c615116c..de7afa7a7e3154f2e167a5ac5d135d5a7cac0247 100644 (file)
@@ -22,6 +22,7 @@
 namespace OC\RichObjectStrings;
 
 
+use OCP\RichObjectStrings\Definitions;
 use OCP\RichObjectStrings\InvalidObjectExeption;
 use OCP\RichObjectStrings\IValidator;
 
@@ -31,9 +32,9 @@ use OCP\RichObjectStrings\IValidator;
  * @package OCP\RichObjectStrings
  * @since 9.2.0
  */
-class Validator implements IValidator  {
+class Validator implements IValidator {
 
-       /** @var array[] */
+       /** @var Definitions */
        protected $definitions;
 
        /** @var array[] */
@@ -41,9 +42,11 @@ class Validator implements IValidator  {
 
        /**
         * Constructor
+        *
+        * @param Definitions $definitions
         */
-       public function __construct() {
-               $this->definitions = json_decode(file_get_contents(__DIR__ . '/../../public/RichObjectStrings/definitions.json'), true);
+       public function __construct(Definitions $definitions) {
+               $this->definitions = $definitions;
        }
 
        /**
@@ -76,11 +79,13 @@ class Validator implements IValidator  {
         * @throws InvalidObjectExeption
         */
        protected function validateParameter(array $parameter) {
-               if (!isset($parameter['type']) || !isset($this->definitions[$parameter['type']])) {
+               if (!isset($parameter['type'])) {
                        throw new InvalidObjectExeption('Object type is undefined');
                }
 
-               $requiredParameters = $this->getRequiredParameters($parameter['type']);
+               $definition = $this->definitions->getDefinition($parameter['type']);
+               $requiredParameters = $this->getRequiredParameters($parameter['type'], $definition);
+
                $missingKeys = array_diff($requiredParameters, array_keys($parameter));
                if (!empty($missingKeys)) {
                        throw new InvalidObjectExeption('Object is invalid');
@@ -89,15 +94,16 @@ class Validator implements IValidator  {
 
        /**
         * @param string $type
+        * @param array $definition
         * @return string[]
         */
-       protected function getRequiredParameters($type) {
+       protected function getRequiredParameters($type, $definition) {
                if (isset($this->requiredParameters[$type])) {
                        return $this->requiredParameters[$type];
                }
 
                $this->requiredParameters[$type] = [];
-               foreach ($this->definitions[$type]['parameters'] as $parameter => $data) {
+               foreach ($definition['parameters'] as $parameter => $data) {
                        if ($data['required']) {
                                $this->requiredParameters[$type][] = $parameter;
                        }
index 8f4e7d9ca2d5002853b64decac191aabe6ee5e64..79efeb18d178a390508a718ba812cc89d11f23d0 100644 (file)
@@ -72,6 +72,7 @@ use OC\Lock\NoopLockingProvider;
 use OC\Mail\Mailer;
 use OC\Memcache\ArrayCache;
 use OC\Notification\Manager;
+use OC\RichObjectStrings\Validator;
 use OC\Security\Bruteforce\Throttler;
 use OC\Security\CertificateManager;
 use OC\Security\CSP\ContentSecurityPolicyManager;
@@ -659,8 +660,10 @@ class Server extends ServerContainer implements IServerContainer {
                                $c->getDatabaseConnection()
                        );
                });
-               $this->registerService('NotificationManager', function () {
-                       return new Manager();
+               $this->registerService('NotificationManager', function (Server $c) {
+                       return new Manager(
+                               $c->query(Validator::class)
+                       );
                });
                $this->registerService('CapabilitiesManager', function (Server $c) {
                        $manager = new \OC\CapabilitiesManager($c->getLogger());
diff --git a/lib/public/RichObjectStrings/Definitions.php b/lib/public/RichObjectStrings/Definitions.php
new file mode 100644 (file)
index 0000000..d3e6b15
--- /dev/null
@@ -0,0 +1,296 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
+ *
+ * @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\RichObjectStrings;
+
+
+/**
+ * Class Definitions
+ *
+ * @package OCP\RichObjectStrings
+ * @since 9.2.0
+ */
+class Definitions {
+       /**
+        * @var array
+        * @since 9.2.0
+        */
+       public $definitions = [
+               'addressbook' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'dav',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the addressbook on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the addressbook which should be used in the visual representation',
+                                       'example' => 'Contacts',
+                               ],
+                       ],
+               ],
+               'addressbook-contact' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'dav',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the contact on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the contact which should be used in the visual representation',
+                                       'example' => 'John Doe',
+                               ],
+                       ],
+               ],
+               'announcement' => [
+                       'author' => 'Joas Schilling',
+                       'app' => 'announcementcenter',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true, 'description' => 'The id used to identify the announcement on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The announcement subject which should be used in the visual representation',
+                                       'example' => 'file.txt',
+                               ],
+                               'link' => [
+                                       'since' => '9.2.0',
+                                       'required' => false,
+                                       'description' => 'The full URL to the file',
+                                       'example' => 'http://localhost/index.php/apps/announcements/#23',
+                               ],
+                       ],
+               ],
+               'calendar' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'dav',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the calendar on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the calendar which should be used in the visual representation',
+                                       'example' => 'Personal',
+                               ],
+                       ],
+               ],
+               'calendar-event' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'dav',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the event on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the event which should be used in the visual representation',
+                                       'example' => 'Workout',
+                               ],
+                       ],
+               ],
+               'email' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'sharebymail',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The mail-address used to identify the event on the instance',
+                                       'example' => 'test@localhost',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of a matching contact or the email (fallback) which should be used in the visual representation',
+                                       'example' => 'Foo Bar',
+                               ],
+                       ],
+               ],
+               'file' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'dav',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the file on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The file name which should be used in the visual representation',
+                                       'example' => 'file.txt',
+                               ],
+                               'path' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The full path of the file for the user',
+                                       'example' => 'path/to/file.txt',
+                               ],
+                               'link' => [
+                                       'since' => '9.2.0',
+                                       'required' => false,
+                                       'description' => 'The full URL to the file',
+                                       'example' => 'http://localhost/index.php/f/42',
+                               ],
+                       ],
+               ],
+               'pending-federated-share' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'dav',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the federated share on the instance',
+                                       'example' => '42',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The name of the shared item which should be used in the visual representation',
+                                       'example' => 'file.txt',
+                               ],
+                       ],
+               ],
+               'systemtag' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'core',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the systemtag on the instance',
+                                       'example' => '23',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the systemtag which should be used in the visual representation',
+                                       'example' => 'Project 1',
+                               ],
+                               'visibility' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'If the user can see the systemtag',
+                                       'example' => '1',
+                               ],
+                               'assignable' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'If the user can assign the systemtag',
+                                       'example' => '0',
+                               ],
+                       ],
+               ],
+               'user' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'core',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the user on the instance',
+                                       'example' => 'johndoe',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the user which should be used in the visual representation',
+                                       'example' => 'John Doe',
+                               ],
+                               'server' => [
+                                       'since' => '9.2.0',
+                                       'required' => false,
+                                       'description' => 'The URL of the instance the user lives on',
+                                       'example' => 'localhost',
+                               ],
+                       ],
+               ],
+               'user-group' => [
+                       'author' => 'Nextcloud',
+                       'app' => 'core',
+                       'since' => '9.2.0',
+                       'parameters' => [
+                               'id' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The id used to identify the group on the instance',
+                                       'example' => 'supportteam',
+                               ],
+                               'name' => [
+                                       'since' => '9.2.0',
+                                       'required' => true,
+                                       'description' => 'The display name of the group which should be used in the visual representation',
+                                       'example' => 'Support Team',
+                               ],
+                       ],
+               ],
+       ];
+
+       /**
+        * @param string $type
+        * @return array
+        * @throws InvalidObjectExeption
+        * @since 9.2.0
+        */
+       public function getDefinition($type) {
+               if (isset($this->definitions[$type])) {
+                       return $this->definitions[$type];
+               }
+
+               throw new InvalidObjectExeption('Object type is undefined');
+       }
+}
diff --git a/lib/public/RichObjectStrings/definitions.json b/lib/public/RichObjectStrings/definitions.json
deleted file mode 100644 (file)
index 494e96c..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-{
-  "addressbook": {
-    "author": "Nextcloud",
-    "app": "dav",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the addressbook on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the addressbook which should be used in the visual representation",
-        "example": "Contacts"
-      }
-    }
-  },
-  "addressbook-contact": {
-    "author": "Nextcloud",
-    "app": "dav",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the contact on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the contact which should be used in the visual representation",
-        "example": "John Doe"
-      }
-    }
-  },
-  "announcement": {
-    "author": "Joas Schilling",
-    "app": "announcementcenter",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the announcement on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The announcement subject which should be used in the visual representation",
-        "example": "file.txt"
-      },
-      "link": {
-        "since": "9.2.0",
-        "required": false,
-        "description": "The full URL to the file",
-        "example": "http://localhost/index.php/apps/announcements/#23"
-      }
-    }
-  },
-  "calendar": {
-    "author": "Nextcloud",
-    "app": "dav",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the calendar on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the calendar which should be used in the visual representation",
-        "example": "Personal"
-      }
-    }
-  },
-  "calendar-event": {
-    "author": "Nextcloud",
-    "app": "dav",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the event on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the event which should be used in the visual representation",
-        "example": "Workout"
-      }
-    }
-  },
-  "file": {
-    "author": "Nextcloud",
-    "app": "dav",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the file on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The file name which should be used in the visual representation",
-        "example": "file.txt"
-      },
-      "path": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The full path of the file for the user",
-        "example": "path/to/file.txt"
-      },
-      "link": {
-        "since": "9.2.0",
-        "required": false,
-        "description": "The full URL to the file",
-        "example": "http://localhost/index.php/f/42"
-      }
-    }
-  },
-  "pending-federated-share": {
-    "author": "Nextcloud",
-    "app": "dav",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the federated share on the instance",
-        "example": "42"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The name of the shared item which should be used in the visual representation",
-        "example": "file.txt"
-      }
-    }
-  },
-  "systemtag": {
-    "author": "Nextcloud",
-    "app": "core",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the systemtag on the instance",
-        "example": "23"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the systemtag which should be used in the visual representation",
-        "example": "Project 1"
-      },
-      "visibility": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "If the user can see the systemtag",
-        "example": "1"
-      },
-      "assignable": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "If the user can assign the systemtag",
-        "example": "0"
-      }
-    }
-  },
-  "user": {
-    "author": "Nextcloud",
-    "app": "core",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the user on the instance",
-        "example": "johndoe"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the user which should be used in the visual representation",
-        "example": "John Doe"
-      },
-      "server": {
-        "since": "9.2.0",
-        "required": false,
-        "description": "The URL of the instance the user lives on",
-        "example": "localhost"
-      }
-    }
-  },
-  "user-group": {
-    "author": "Nextcloud",
-    "app": "core",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The id used to identify the group on the instance",
-        "example": "supportteam"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of the group which should be used in the visual representation",
-        "example": "Support Team"
-      }
-    }
-  },
-  "email": {
-    "author": "Nextcloud",
-    "app": "sharebymail",
-    "since": "9.2.0",
-    "parameters": {
-      "id": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The mail-address used to identify the event on the instance",
-        "example": "test@localhost"
-      },
-      "name": {
-        "since": "9.2.0",
-        "required": true,
-        "description": "The display name of a matching contact or the email (fallback) which should be used in the visual representation",
-        "example": "Foo Bar"
-      }
-    }
-  }
-}
index 4410781bc3104ad0ceef325881dae94cc680b26e..e280838424b6d559197dc55930059f4f90ae4365 100644 (file)
@@ -23,6 +23,7 @@ namespace Test\Notification;
 
 use OC\Notification\Manager;
 use OCP\Notification\IManager;
+use OCP\RichObjectStrings\IValidator;
 use Test\TestCase;
 
 class ManagerTest extends TestCase {
@@ -31,7 +32,8 @@ class ManagerTest extends TestCase {
 
        public function setUp() {
                parent::setUp();
-               $this->manager = new Manager();
+               $validator = $this->createMock(IValidator::class);
+               $this->manager = new Manager($validator);
        }
 
        public function testRegisterApp() {
index b97388ab8e013e6217a30fafacdf074a60816f80..f18d1bdd90843c12ca254694c911f0ec3fc26257 100644 (file)
@@ -23,12 +23,13 @@ namespace Test\RichObjectStrings;
 
 
 use OC\RichObjectStrings\Validator;
+use OCP\RichObjectStrings\Definitions;
 use Test\TestCase;
 
 class ValidatorTest extends TestCase {
 
        public function test() {
-               $v = new Validator();
+               $v = new Validator(new Definitions());
                $v->validate('test', []);
                $v->validate('test {string1} test {foo} test {bar}.', [
                        'string1' => [