From d7d85440ce4cc791ebdee174c22d945110bc1a87 Mon Sep 17 00:00:00 2001 From: Gunnar Wrobel Date: Sat, 8 Jan 2011 22:59:30 +0100 Subject: [PATCH] Implement the getForeignDefault() query. --- .../lib/Horde/Kolab/Storage/List/Query.php | 3 +- .../lib/Horde/Kolab/Storage/List/Query/Base.php | 37 ++++++++++++++ .../lib/Horde/Kolab/Storage/List/Query/Cache.php | 46 ++++++++++++++--- .../test/Horde/Kolab/Storage/TestCase.php | 30 +++++++++++ .../Kolab/Storage/Unit/List/Query/BaseTest.php | 59 ++++++++++++++++++++++ .../Kolab/Storage/Unit/List/Query/CacheTest.php | 59 ++++++++++++++++++++++ 6 files changed, 226 insertions(+), 8 deletions(-) diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query.php index 0f55dfee0..ac8d42570 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query.php @@ -78,6 +78,5 @@ extends Horde_Kolab_Storage_Query * * @return string|boolean The name of the default folder, false if there is no default. */ -// public function getForeignDefault($owner, $type); - + public function getForeignDefault($owner, $type); } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Base.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Base.php index dbd03133d..31ad236af 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Base.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Base.php @@ -158,6 +158,43 @@ implements Horde_Kolab_Storage_List_Query } /** + * Get the default folder for a certain type from a different owner. + * + * @param string $owner The folder owner. + * @param string $type The type of the share/folder. + * + * @return string|boolean The name of the default folder, false if there is no default. + */ + public function getForeignDefault($owner, $type) + { + $result = null; + $namespace = $this->_list->getNamespace(); + foreach ($this->listFolderTypeAnnotations() as $folder => $annotation) { + if ($annotation->getType() == $type + && $annotation->isDefault() + && ($namespace->getOwner($folder) == $owner)) { + if ($result === null) { + $result = $folder; + } else { + throw new Horde_Kolab_Storage_Exception( + sprintf( + 'Both folders %s and %s are marked as default folder of type %s!', + $result, + $folder, + $type + ) + ); + } + } + } + if ($result === null) { + return false; + } else { + return $result; + } + } + + /** * Synchronize the query data with the information from the backend. * * @return NULL diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Cache.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Cache.php index 856757977..8f6d639e8 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Cache.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Cache.php @@ -152,6 +152,24 @@ implements Horde_Kolab_Storage_List_Query } /** + * Get the default folder for a certain type from a different owner. + * + * @param string $owner The folder owner. + * @param string $type The type of the share/folder. + * + * @return string|boolean The name of the default folder, false if there is no default. + */ + public function getForeignDefault($owner, $type) + { + $defaults = $this->_list_cache->getQuery(self::DEFAULTS); + if (isset($defaults[$owner][$type])) { + return $defaults[$owner][$type]; + } else { + return false; + } + } + + /** * Synchronize the query data with the information from the backend. * * @return NULL @@ -176,26 +194,42 @@ implements Horde_Kolab_Storage_List_Query $this->_list_cache->setQuery(self::OWNERS, $owners); $personal_defaults = array(); + $defaults = array(); $namespace = $this->_list->getNamespace(); foreach ($this->listFolderTypeAnnotations() as $folder => $annotation) { - if ($annotation->isDefault() - && ($namespace->matchNamespace($folder)->getType() - == Horde_Kolab_Storage_Folder_Namespace::PERSONAL)) { + if ($annotation->isDefault()) { $type = $annotation->getType(); - if (!isset($personal_defaults[$type])) { - $personal_defaults[$type] = $folder; + $owner = $namespace->getOwner($folder); + if (!isset($defaults[$owner][$type])) { + $defaults[$owner][$type] = $folder; } else { throw new Horde_Kolab_Storage_Exception( sprintf( 'Both folders %s and %s are marked as default folder of type %s!', - $personal_defaults[$type], + $defaults[$owner][$type], $folder, $type ) ); } + if ($namespace->matchNamespace($folder)->getType() + == Horde_Kolab_Storage_Folder_Namespace::PERSONAL) { + if (!isset($personal_defaults[$type])) { + $personal_defaults[$type] = $folder; + } else { + throw new Horde_Kolab_Storage_Exception( + sprintf( + 'Both folders %s and %s are marked as default folder of type %s!', + $personal_defaults[$type], + $folder, + $type + ) + ); + } + } } } + $this->_list_cache->setQuery(self::DEFAULTS, $defaults); $this->_list_cache->setQuery( self::PERSONAL_DEFAULTS, $personal_defaults ); diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php index d4a5b1d8a..47d2cde3b 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php @@ -321,6 +321,26 @@ extends PHPUnit_Framework_TestCase '/shared/vendor/kolab/folder-type' => 'event.default', ) ), + 'user/test/Notes' => array( + 'annotations' => array( + '/shared/vendor/kolab/folder-type' => 'note.default', + ) + ), + 'user/someone/Calendar' => array( + 'annotations' => array( + '/shared/vendor/kolab/folder-type' => 'event.default', + ) + ), + 'user/someone/Events' => array( + 'annotations' => array( + '/shared/vendor/kolab/folder-type' => 'event', + ) + ), + 'user/someone/Notes' => array( + 'annotations' => array( + '/shared/vendor/kolab/folder-type' => 'note.default', + ) + ), ) ); } @@ -359,6 +379,16 @@ extends PHPUnit_Framework_TestCase '/shared/vendor/kolab/folder-type' => 'event.default', ) ), + 'user/someone/Calendar' => array( + 'annotations' => array( + '/shared/vendor/kolab/folder-type' => 'event.default', + ) + ), + 'user/someone/Events' => array( + 'annotations' => array( + '/shared/vendor/kolab/folder-type' => 'event.default', + ) + ), ) ); } diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php index 6b3f1ef87..011c6fbfa 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php @@ -204,4 +204,63 @@ extends Horde_Kolab_Storage_TestCase $query = $factory->createListQuery('Base', $this->getDoubleEventList($factory)); $query->getDefault('event'); } + + public function testForeignDefaultReturn() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $factory->createListQuery('Base', $this->getEventList($factory)); + $this->assertType( + 'string', + $query->getForeignDefault('someone@example.com', 'event') + ); + } + + public function testForeignDefaultCalendar() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $factory->createListQuery('Base', $this->getEventList($factory)); + $this->assertEquals( + 'user/someone/Calendar', + $query->getForeignDefault('someone@example.com', 'event') + ); + } + + public function testForeignDefaultNotes() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $factory->createListQuery('Base', $this->getEventList($factory)); + $this->assertEquals( + 'user/someone/Notes', + $query->getForeignDefault('someone@example.com', 'note') + ); + } + + public function testMissingForeignDefault() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $factory->createListQuery('Base', $this->getNullList($factory)); + $this->assertFalse( + $query->getForeignDefault('someone@example.com', 'contact') + ); + } + + public function testIdentifyForeignDefault() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $factory->createListQuery('Base', $this->getEventList($factory)); + $this->assertEquals( + 'user/someone/Calendar', + $query->getForeignDefault('someone@example.com', 'event') + ); + } + + /** + * @expectedException Horde_Kolab_Storage_Exception + */ + public function testBailOnDoubleForeignDefault() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $factory->createListQuery('Base', $this->getDoubleEventList($factory)); + $query->getForeignDefault('someone@example.com', 'event'); + } } diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/CacheTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/CacheTest.php index ed52846c1..c9dd17cb8 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/CacheTest.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/CacheTest.php @@ -211,4 +211,63 @@ extends Horde_Kolab_Storage_TestCase $query = $this->getCachedQueryForList($this->getDoubleEventList($factory), $factory); $query->getDefault('event'); } + + public function testForeignDefaultReturn() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $this->getCachedQueryForList($this->getEventList($factory), $factory); + $this->assertType( + 'string', + $query->getForeignDefault('someone@example.com', 'event') + ); + } + + public function testForeignDefaultCalendar() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $this->getCachedQueryForList($this->getEventList($factory), $factory); + $this->assertEquals( + 'user/someone/Calendar', + $query->getForeignDefault('someone@example.com', 'event') + ); + } + + public function testForeignDefaultNotes() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $this->getCachedQueryForList($this->getEventList($factory), $factory); + $this->assertEquals( + 'user/someone/Notes', + $query->getForeignDefault('someone@example.com', 'note') + ); + } + + public function testMissingForeignDefault() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $this->getCachedQueryForList($this->getNullList($factory), $factory); + $this->assertFalse( + $query->getForeignDefault('someone@example.com', 'contact') + ); + } + + public function testIdentifyForeignDefault() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $this->getCachedQueryForList($this->getEventList($factory), $factory); + $this->assertEquals( + 'user/someone/Calendar', + $query->getForeignDefault('someone@example.com', 'event') + ); + } + + /** + * @expectedException Horde_Kolab_Storage_Exception + */ + public function testBailOnDoubleForeignDefault() + { + $factory = new Horde_Kolab_Storage_Factory(); + $query = $this->getCachedQueryForList($this->getDoubleEventList($factory), $factory); + $query->getForeignDefault('someone@example.com', 'event'); + } } -- 2.11.0