Implement the getForeignDefault() query.
authorGunnar Wrobel <p@rdus.de>
Sat, 8 Jan 2011 21:59:30 +0000 (22:59 +0100)
committerGunnar Wrobel <p@rdus.de>
Sat, 8 Jan 2011 21:59:30 +0000 (22:59 +0100)
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Base.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Cache.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/CacheTest.php

index 0f55dfe..ac8d425 100644 (file)
@@ -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
index dbd0313..31ad236 100644 (file)
@@ -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
index 8567579..8f6d639 100644 (file)
@@ -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
         );
index d4a5b1d..47d2cde 100644 (file)
@@ -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',
+                    )
+                ),
             )
         );
     }
index 6b3f1ef..011c6fb 100644 (file)
@@ -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');
+    }
 }
index ed52846..c9dd17c 100644 (file)
@@ -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');
+    }
 }