diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 0df746a28e..f37bdb10f8 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -58,7 +58,8 @@ interface IServerContainer { /** * Returns the tag manager which can get and set tags for different object types * - * @return \OCP\ITags + * @see \OCP\ITagManager::load() + * @return \OCP\ITagManager */ function getTagManager(); diff --git a/lib/public/itagmanager.php b/lib/public/itagmanager.php new file mode 100644 index 0000000000..07e1d12fc0 --- /dev/null +++ b/lib/public/itagmanager.php @@ -0,0 +1,48 @@ + +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see . +* +*/ + +/** + * Factory class creating instances of \OCP\ITags + * + * A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or + * anything else that is either parsed from a vobject or that the user chooses + * to add. + * Tag names are not case-sensitive, but will be saved with the case they + * are entered in. If a user already has a tag 'family' for a type, and + * tries to add a tag named 'Family' it will be silently ignored. + */ + +namespace OCP; + +interface ITagManager { + + /** + * Create a new \OCP\ITags instance and load tags from db. + * + * @see \OCP\ITags + * @param string $type The type identifier e.g. 'contact' or 'event'. + * @param array $defaultTags An array of default tags to be used if none are stored. + * @return \OCP\ITags + */ + public function load($type, $defaultTags=array()); + +} \ No newline at end of file diff --git a/lib/public/itags.php b/lib/public/itags.php index 1264340054..5b1ebd189d 100644 --- a/lib/public/itags.php +++ b/lib/public/itags.php @@ -38,15 +38,6 @@ namespace OCP; interface ITags { - /** - * Load tags from db. - * - * @param string $type The type identifier e.g. 'contact' or 'event'. - * @param array $defaultTags An array of default tags to be used if none are stored. - * @return \OCP\ITags - */ - public function loadTagsFor($type, $defaultTags=array()); - /** * Check if any tags are saved for this type and user. * diff --git a/lib/server.php b/lib/server.php index f3c79aa797..c47f0e2b46 100644 --- a/lib/server.php +++ b/lib/server.php @@ -146,7 +146,8 @@ class Server extends SimpleContainer implements IServerContainer { /** * Returns the tag manager which can get and set tags for different object types * - * @return \OCP\ITags + * @see \OCP\ITagManager::load() + * @return \OCP\ITagManager */ function getTagManager() { return $this->query('TagManager'); diff --git a/lib/tagmanager.php b/lib/tagmanager.php new file mode 100644 index 0000000000..9a371a1125 --- /dev/null +++ b/lib/tagmanager.php @@ -0,0 +1,68 @@ + +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see . +* +*/ + +/** + * Factory class creating instances of \OCP\ITags + * + * A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or + * anything else that is either parsed from a vobject or that the user chooses + * to add. + * Tag names are not case-sensitive, but will be saved with the case they + * are entered in. If a user already has a tag 'family' for a type, and + * tries to add a tag named 'Family' it will be silently ignored. + */ + +namespace OC; + +class TagManager implements \OCP\ITagManager { + + /** + * User + * + * @var string + */ + private $user = null; + + /** + * Constructor. + * + * @param string $user The user whos data the object will operate on. + */ + public function __construct($user) { + + $this->user = $user; + + } + + /** + * Create a new \OCP\ITags instance and load tags from db. + * + * @see \OCP\ITags + * @param string $type The type identifier e.g. 'contact' or 'event'. + * @param array $defaultTags An array of default tags to be used if none are stored. + * @return \OCP\ITags + */ + public function load($type, $defaultTags=array()) { + return new Tags($this->user, $type, $defaultTags); + } + +} \ No newline at end of file diff --git a/lib/tags.php b/lib/tags.php index ff9f35ebc9..9fdb35a7d6 100644 --- a/lib/tags.php +++ b/lib/tags.php @@ -38,15 +38,30 @@ class Tags implements \OCP\ITags { /** * Tags + * + * @var array */ private $tags = array(); /** * Used for storing objectid/categoryname pairs while rescanning. + * + * @var array */ private static $relations = array(); + /** + * Type + * + * @var string + */ private $type = null; + + /** + * User + * + * @var string + */ private $user = null; const TAG_TABLE = '*PREFIX*vcategory'; @@ -59,10 +74,10 @@ class Tags implements \OCP\ITags { * * @param string $user The user whos data the object will operate on. */ - public function __construct($user) { - + public function __construct($user, $type, $defaultTags = array()) { $this->user = $user; - + $this->type = $type; + $this->loadTags($defaultTags); } /** @@ -70,10 +85,8 @@ class Tags implements \OCP\ITags { * * @param string $type The type identifier e.g. 'contact' or 'event'. * @param array $defaultTags An array of default tags to be used if none are stored. - * @return \OCP\ITags */ - public function loadTagsFor($type, $defaultTags=array()) { - $this->type = $type; + protected function loadTags($defaultTags=array()) { $this->tags = array(); $result = null; $sql = 'SELECT `id`, `category` FROM `' . self::TAG_TABLE . '` ' @@ -101,7 +114,6 @@ class Tags implements \OCP\ITags { \OCP\Util::writeLog('core', __METHOD__.', tags: ' . print_r($this->tags, true), \OCP\Util::DEBUG); - return $this; } /** @@ -345,7 +357,7 @@ class Tags implements \OCP\ITags { } } // reload tags to get the proper ids. - $this->loadTagsFor($this->type); + $this->loadTags(); // Loop through temporarily cached objectid/tagname pairs // and save relations. $tags = $this->tags; diff --git a/tests/lib/tags.php b/tests/lib/tags.php index 75db9f50f7..97e3734cfd 100644 --- a/tests/lib/tags.php +++ b/tests/lib/tags.php @@ -34,6 +34,7 @@ class Test_Tags extends PHPUnit_Framework_TestCase { $this->objectType = uniqid('type_'); OC_User::createUser($this->user, 'pass'); OC_User::setUserId($this->user); + $this->tagMgr = new OC\TagManager($this->user); } @@ -45,102 +46,95 @@ class Test_Tags extends PHPUnit_Framework_TestCase { public function testInstantiateWithDefaults() { $defaultTags = array('Friends', 'Family', 'Work', 'Other'); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType, $defaultTags); + $tagger = $this->tagMgr->load($this->objectType, $defaultTags); - $this->assertEquals(4, count($tagMgr->getTags())); + $this->assertEquals(4, count($tagger->getTags())); } public function testAddTags() { $tags = array('Friends', 'Family', 'Work', 'Other'); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType); + $tagger = $this->tagMgr->load($this->objectType); foreach($tags as $tag) { - $result = $tagMgr->add($tag); + $result = $tagger->add($tag); $this->assertGreaterThan(0, $result, 'add() returned an ID <= 0'); $this->assertTrue((bool)$result); } - $this->assertFalse($tagMgr->add('Family')); - $this->assertFalse($tagMgr->add('fAMILY')); + $this->assertFalse($tagger->add('Family')); + $this->assertFalse($tagger->add('fAMILY')); - $this->assertCount(4, $tagMgr->getTags(), 'Wrong number of added tags'); + $this->assertCount(4, $tagger->getTags(), 'Wrong number of added tags'); } public function testAddMultiple() { $tags = array('Friends', 'Family', 'Work', 'Other'); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType); + $tagger = $this->tagMgr->load($this->objectType); foreach($tags as $tag) { - $this->assertFalse($tagMgr->hasTag($tag)); + $this->assertFalse($tagger->hasTag($tag)); } - $result = $tagMgr->addMultiple($tags); + $result = $tagger->addMultiple($tags); $this->assertTrue((bool)$result); foreach($tags as $tag) { - $this->assertTrue($tagMgr->hasTag($tag)); + $this->assertTrue($tagger->hasTag($tag)); } - $this->assertCount(4, $tagMgr->getTags(), 'Not all tags added'); + $this->assertCount(4, $tagger->getTags(), 'Not all tags added'); } public function testIsEmpty() { - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType); + $tagger = $this->tagMgr->load($this->objectType); - $this->assertEquals(0, count($tagMgr->getTags())); - $this->assertTrue($tagMgr->isEmpty()); + $this->assertEquals(0, count($tagger->getTags())); + $this->assertTrue($tagger->isEmpty()); - $result = $tagMgr->add('Tag'); + $result = $tagger->add('Tag'); $this->assertGreaterThan(0, $result, 'add() returned an ID <= 0'); $this->assertNotEquals(false, $result, 'add() returned false'); - $this->assertFalse($tagMgr->isEmpty()); + $this->assertFalse($tagger->isEmpty()); } public function testdeleteTags() { $defaultTags = array('Friends', 'Family', 'Work', 'Other'); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType, $defaultTags); + $tagger = $this->tagMgr->load($this->objectType, $defaultTags); - $this->assertEquals(4, count($tagMgr->getTags())); + $this->assertEquals(4, count($tagger->getTags())); - $tagMgr->delete('family'); - $this->assertEquals(3, count($tagMgr->getTags())); + $tagger->delete('family'); + $this->assertEquals(3, count($tagger->getTags())); - $tagMgr->delete(array('Friends', 'Work', 'Other')); - $this->assertEquals(0, count($tagMgr->getTags())); + $tagger->delete(array('Friends', 'Work', 'Other')); + $this->assertEquals(0, count($tagger->getTags())); } public function testRenameTag() { $defaultTags = array('Friends', 'Family', 'Wrok', 'Other'); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType, $defaultTags); + $tagger = $this->tagMgr->load($this->objectType, $defaultTags); - $this->assertTrue($tagMgr->rename('Wrok', 'Work')); - $this->assertTrue($tagMgr->hasTag('Work')); - $this->assertFalse($tagMgr->hastag('Wrok')); - $this->assertFalse($tagMgr->rename('Wrok', 'Work')); + $this->assertTrue($tagger->rename('Wrok', 'Work')); + $this->assertTrue($tagger->hasTag('Work')); + $this->assertFalse($tagger->hastag('Wrok')); + $this->assertFalse($tagger->rename('Wrok', 'Work')); } public function testTagAs() { $objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType); + $tagger = $this->tagMgr->load($this->objectType); foreach($objids as $id) { - $tagMgr->tagAs($id, 'Family'); + $tagger->tagAs($id, 'Family'); } - $this->assertEquals(1, count($tagMgr->getTags())); - $this->assertEquals(9, count($tagMgr->getIdsForTag('Family'))); + $this->assertEquals(1, count($tagger->getTags())); + $this->assertEquals(9, count($tagger->getIdsForTag('Family'))); } /** @@ -151,24 +145,22 @@ class Test_Tags extends PHPUnit_Framework_TestCase { // Is this "legal"? $this->testTagAs(); - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType); + $tagger = $this->tagMgr->load($this->objectType); foreach($objIds as $id) { - $this->assertTrue(in_array($id, $tagMgr->getIdsForTag('Family'))); - $tagMgr->unTag($id, 'Family'); - $this->assertFalse(in_array($id, $tagMgr->getIdsForTag('Family'))); + $this->assertTrue(in_array($id, $tagger->getIdsForTag('Family'))); + $tagger->unTag($id, 'Family'); + $this->assertFalse(in_array($id, $tagger->getIdsForTag('Family'))); } - $this->assertEquals(1, count($tagMgr->getTags())); - $this->assertEquals(0, count($tagMgr->getIdsForTag('Family'))); + $this->assertEquals(1, count($tagger->getTags())); + $this->assertEquals(0, count($tagger->getIdsForTag('Family'))); } public function testFavorite() { - $tagMgr = new OC\Tags($this->user); - $tagMgr->loadTagsFor($this->objectType); - $this->assertTrue($tagMgr->addToFavorites(1)); - $this->assertTrue($tagMgr->removeFromFavorites(1)); + $tagger = $this->tagMgr->load($this->objectType); + $this->assertTrue($tagger->addToFavorites(1)); + $this->assertTrue($tagger->removeFromFavorites(1)); } }