Add the query infrastructure.
authorGunnar Wrobel <p@rdus.de>
Wed, 29 Dec 2010 09:39:08 +0000 (10:39 +0100)
committerGunnar Wrobel <p@rdus.de>
Tue, 4 Jan 2011 07:54:17 +0000 (08:54 +0100)
18 files changed:
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Base.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Factory.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Type.php [new file with mode: 0644]
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Base.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Decorator/Log.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Query/Base.php [new file with mode: 0644]
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Queriable.php [new file with mode: 0644]
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Query.php [new file with mode: 0644]
framework/Kolab_Storage/package.xml
framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/BaseTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Decorator/LogTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/FactoryTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Folder/TypeTest.php [new file with mode: 0644]
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/BaseTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Decorator/LogTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php [new file with mode: 0644]

index 859f760..217e8e5 100644 (file)
@@ -36,15 +36,25 @@ implements Horde_Kolab_Storage
     private $_master;
 
     /**
+     * The factory for generating additional resources.
+     *
+     * @var Horde_Kolab_Storage_Factory
+     */
+    private $_factory;
+
+    /**
      * Constructor.
      *
-     * @param Horde_Kolab_Storage_Driver $master The primary connection driver.
-     * @param string $driver The driver used for the primary storage connection.
-     * @param array  $params Additional connection parameters.
+     * @param Horde_Kolab_Storage_Driver  $master  The primary connection driver.
+     * @param Horde_Kolab_Storage_Factory $factory The factory.
+.
      */
-    public function __construct(Horde_Kolab_Storage_Driver $master)
-    {
-        $this->_master = $master;
+    public function __construct(
+        Horde_Kolab_Storage_Driver $master,
+        Horde_Kolab_Storage_Factory $factory
+    ) {
+        $this->_master  = $master;
+        $this->_factory = $factory;
     }
 
     /**
@@ -56,7 +66,8 @@ implements Horde_Kolab_Storage
     public function getList()
     {
         return new Horde_Kolab_Storage_List_Base(
-            $this->_master
+            $this->_master,
+            $this->_factory
         );
     }
 
index 323496a..a56a3c6 100644 (file)
 class Horde_Kolab_Storage_Factory
 {
     /**
+     * Folder type instances.
+     *
+     * @var array
+     */
+    private $_folder_types;
+
+    /**
      * Create the storage handler.
      *
      * @param Horde_Kolab_Storage_Driver $driver The required driver for access
@@ -37,7 +44,7 @@ class Horde_Kolab_Storage_Factory
      */
     public function create(Horde_Kolab_Storage_Driver $driver)
     {
-        return new Horde_Kolab_Storage_Base($driver);
+        return new Horde_Kolab_Storage_Base($driver, $this);
     }
 
     /**
@@ -57,7 +64,8 @@ class Horde_Kolab_Storage_Factory
     public function createFromParams(array $params)
     {
         $storage = new Horde_Kolab_Storage_Base(
-            $this->createDriverFromParams($params)
+            $this->createDriverFromParams($params),
+            $this
         );
         if (!empty($params['logger'])) {
             $storage = new Horde_Kolab_Storage_Decorator_Log(
@@ -206,4 +214,19 @@ class Horde_Kolab_Storage_Factory
         }
         return new $class($params);
     }
+
+    /**
+     * Create a folder type handler.
+     *
+     * @param string $annotation The folder type annotation value.
+     *
+     * @return Horde_Kolab_Storage_Folder_Type The folder type handler.
+     */
+    public function createFoldertype($annotation)
+    {
+        if (!isset($this->_folder_types[$annotation])) {
+           $this->_folder_types[$annotation] = new Horde_Kolab_Storage_Folder_Type($annotation);
+        }
+        return $this->_folder_types[$annotation];
+    }
 }
\ No newline at end of file
diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Type.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Type.php
new file mode 100644 (file)
index 0000000..2ea37ea
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Handles folder types.
+ *
+ * PHP version 5
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ * Handles folder types.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+class Horde_Kolab_Storage_Folder_Type
+{
+    /**
+     * Folder type.
+     *
+     * @var string
+     */
+    private $_type;
+
+    /**
+     * Default folder?
+     *
+     * @var boolean
+     */
+    private $_default;
+
+    /**
+     * Constructor.
+     *
+     * @param string $annotation The folder type annotation value.
+     */
+    public function __construct($annotation)
+    {
+        $elements = explode('.', $annotation);
+        $this->_type = $elements[0];
+        $this->_default = isset($elements[1]) && $elements[1] == 'default';
+    }
+
+    /**
+     * Return the folder type.
+     *
+     * @return string The folder type.
+     */
+    public function getType()
+    {
+        return $this->_type;
+    }
+
+    /**
+     * Indicates if this is a default folder.
+     *
+     * @return boolean True if it is a default folder.
+     */
+    public function isDefault()
+    {
+        return $this->_default;
+    }
+}
\ No newline at end of file
index d2eb68b..a670999 100644 (file)
@@ -26,6 +26,7 @@
  * @link     http://pear.horde.org/index.php?package=Kolab_Storage
  */
 interface Horde_Kolab_Storage_List
+extends Horde_Kolab_Storage_Queriable
 {
     /**
      * Returns the list of folders visible to the current user.
@@ -41,4 +42,12 @@ interface Horde_Kolab_Storage_List
      *               type as values.
      */
     public function listTypes();
+
+    /**
+     * Returns the folder type annotation as associative array.
+     *
+     * @return array The list folder types with the folder names as key and the
+     *               type handler as values.
+     */
+    public function listFolderTypeAnnotations();
 }
index 43eb0b9..82cf680 100644 (file)
@@ -36,13 +36,24 @@ implements Horde_Kolab_Storage_List
     private $_driver;
 
     /**
+     * The factory for generating additional resources.
+     *
+     * @var Horde_Kolab_Storage_Factory
+     */
+    private $_factory;
+
+    /**
      * Constructor.
      *
-     * @param Horde_Kolab_Storage_Driver $driver The primary connection driver.
+     * @param Horde_Kolab_Storage_Driver  $driver  The primary connection driver.
+     * @param Horde_Kolab_Storage_Factory $factory The factory.
      */
-    public function __construct(Horde_Kolab_Storage_Driver $driver)
-    {
-        $this->_driver = $driver;
+    public function __construct(
+        Horde_Kolab_Storage_Driver $driver,
+        Horde_Kolab_Storage_Factory $factory
+    ) {
+        $this->_driver  = $driver;
+        $this->_factory = $factory;
     }
 
     /**
@@ -63,8 +74,47 @@ implements Horde_Kolab_Storage_List
      */
     public function listTypes()
     {
-        return $this->_driver->listAnnotation(
+        $result = array();
+        $list = $this->listFolderTypeAnnotations();
+        foreach ($list as $folder => $annotation) {
+            $result[$folder] = $annotation->getType();
+        }
+        return $result;
+    }
+
+    /**
+     * Returns the folder type annotation as associative array.
+     *
+     * @return array The list folder types with the folder names as key and the
+     *               type handler as values.
+     */
+    public function listFolderTypeAnnotations()
+    {
+        $result = array();
+        $list = $this->_driver->listAnnotation(
             '/shared/vendor/kolab/folder-type'
         );
+        foreach ($list as $folder => $annotation) {
+            $result[$folder] = $this->_factory->createFolderType($annotation);
+        }
+        return $result;
+    }
+
+    /**
+     * Return the specified query type.
+     *
+     * @param string $name The query name.
+     *
+     * @return Horde_Kolab_Storage_Query A query handler.
+     *
+     * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
+     */
+    public function getQuery($name)
+    {
+        $class = 'Horde_Kolab_Storage_List_Query_' . $name;
+        if (class_exists($class)) {
+            return new $class($this);
+        }
+        throw new Horde_Kolab_Storage_Exception(sprintf('No such query "%s"!', $name));
     }
 }
\ No newline at end of file
index 5bcc65b..074d10d 100644 (file)
@@ -87,4 +87,35 @@ implements Horde_Kolab_Storage_List
         );
         return $result;
     }
+
+    /**
+     * Returns the folder type annotation as associative array.
+     *
+     * @return array The list folder types with the folder names as key and the
+     *               type handler as values.
+     */
+    public function listFolderTypeAnnotations()
+    {
+        $this->_logger->info('Listing folder type annotations.');
+        $result = $this->_list->listFolderTypeAnnotations();
+        $this->_logger->info(
+            sprintf('List contained %s folders and annotations.', count($result))
+        );
+        return $result;
+    }
+
+    /**
+     * Return the specified query type.
+     *
+     * @param string $name The query name.
+     *
+     * @return Horde_Kolab_Storage_Query A query handler.
+     *
+     * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
+     */
+    public function getQuery($name)
+    {
+        return $this->_list->getQuery($name);
+    }
+
 }
\ 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
new file mode 100644 (file)
index 0000000..82125a9
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * The basic list query.
+ *
+ * PHP version 5
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ * The basic list query.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+class Horde_Kolab_Storage_List_Query_Base
+implements Horde_Kolab_Storage_Query
+{
+    /**
+     * The queriable list.
+     *
+     * @var Horde_Kolab_Storage_Queriable
+     */
+    private $_queriable;
+
+    /**
+     * Constructor.
+     *
+     * @param Horde_Kolab_Storage_Queriable $queriable The queriable list.
+     */
+    public function __construct(Horde_Kolab_Storage_Queriable $queriable)
+    {
+        $this->_queriable = $queriable;
+    }
+
+    /**
+     * List all folders of a specific type.
+     *
+     * @param string $type The folder type the listing should be limited to.
+     *
+     * @return array The list of folders.
+     */
+    public function listByType($type)
+    {
+        $result = array();
+        foreach ($this->_queriable->listTypes() as $folder => $folder_type) {
+            if ($folder_type == $type) {
+                $result[] = $folder;
+            }
+        }
+        return $result;
+    }
+}
\ No newline at end of file
diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Queriable.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Queriable.php
new file mode 100644 (file)
index 0000000..4cf5d45
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Marks a queriable class.
+ *
+ * PHP version 5
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ * Marks a queriable class.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+interface Horde_Kolab_Storage_Queriable
+{
+    /**
+     * Return the specified query type.
+     *
+     * @param string $name The query name.
+     *
+     * @return Horde_Kolab_Storage_Query A query handler.
+     *
+     * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
+     */
+    public function getQuery($name);
+}
+
diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Query.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Query.php
new file mode 100644 (file)
index 0000000..c353350
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Represents a query handler.
+ *
+ * PHP version 5
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ * Represents a query handler.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category Kolab
+ * @package  Kolab_Storage
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+interface Horde_Kolab_Storage_Query
+{
+    /**
+     * Constructor.
+     *
+     * @param Horde_Kolab_Storage_Queriable $queriable The queriable object.
+     */
+    public function __construct(Horde_Kolab_Storage_Queriable $queriable);
+}
+
index 8dc40a2..c43be12 100644 (file)
@@ -31,8 +31,8 @@
   <email>jan@horde.org</email>
   <active>yes</active>
  </lead>
- <date>2010-12-22</date>
- <time>06:20:15</time>
+ <date>2010-12-28</date>
+ <time>22:52:37</time>
  <version>
   <release>0.4.0</release>
   <api>0.1.0</api>
         <file name="Cached.php" role="php" />
         <file name="Namespace.php" role="php" />
         <file name="Permission.php" role="php" />
+        <file name="Type.php" role="php" />
        </dir> <!-- /lib/Horde/Kolab/Storage/Folder -->
        <dir name="List">
         <dir name="Decorator">
          <file name="Log.php" role="php" />
         </dir> <!-- /lib/Horde/Kolab/Storage/List/Decorator -->
+        <dir name="Query">
+         <file name="Base.php" role="php" />
+        </dir> <!-- /lib/Horde/Kolab/Storage/List/Query -->
         <file name="Base.php" role="php" />
        </dir> <!-- /lib/Horde/Kolab/Storage/List -->
-       <file name="#Factory.php#" role="php" />
        <file name="Base.php" role="php" />
        <file name="Cache.php" role="php" />
        <file name="Data.php" role="php" />
        <file name="Factory.php" role="php" />
        <file name="Folder.php" role="php" />
        <file name="List.php" role="php" />
+       <file name="Queriable.php" role="php" />
+       <file name="Query.php" role="php" />
        <file name="Translation.php" role="php">
         <tasks:replace from="@data_dir@" to="data_dir" type="pear-config" />
        </file>
         <dir name="Driver">
          <dir name="Decorator">
           <file name="LogTest.php" role="test" />
+          <file name="TimerTest.php" role="test" />
          </dir> <!-- /test/Horde/Kolab/Storage/Unit/Driver/Decorator -->
          <file name="CclientTest.php" role="test" />
          <file name="ImapTest.php" role="test" />
         </dir> <!-- /test/Horde/Kolab/Storage/Unit/Driver -->
         <dir name="Folder">
          <file name="NamespaceTest.php" role="test" />
+         <file name="TypeTest.php" role="test" />
         </dir> <!-- /test/Horde/Kolab/Storage/Unit/Folder -->
         <dir name="List">
          <dir name="Decorator">
           <file name="LogTest.php" role="test" />
          </dir> <!-- /test/Horde/Kolab/Storage/Unit/List/Decorator -->
+         <dir name="Query">
+          <file name="BaseTest.php" role="test" />
+         </dir> <!-- /test/Horde/Kolab/Storage/Unit/List/Query -->
          <file name="BaseTest.php" role="test" />
         </dir> <!-- /test/Horde/Kolab/Storage/Unit/List -->
         <file name="BaseTest.php" role="test" />
    <install as="Horde/Kolab/Storage/list.php" name="examples/Horde/Kolab/Storage/list.php" />
    <install as="Horde/Kolab/Storage.php" name="lib/Horde/Kolab/Storage.php" />
    <install as="Horde/Kolab/Storage_Old.php" name="lib/Horde/Kolab/Storage_Old.php" />
-   <install as="Horde/Kolab/Storage/#Factory.php#" name="lib/Horde/Kolab/Storage/#Factory.php#" />
    <install as="Horde/Kolab/Storage/Base.php" name="lib/Horde/Kolab/Storage/Base.php" />
    <install as="Horde/Kolab/Storage/Cache.php" name="lib/Horde/Kolab/Storage/Cache.php" />
    <install as="Horde/Kolab/Storage/Data.php" name="lib/Horde/Kolab/Storage/Data.php" />
    <install as="Horde/Kolab/Storage/Factory.php" name="lib/Horde/Kolab/Storage/Factory.php" />
    <install as="Horde/Kolab/Storage/Folder.php" name="lib/Horde/Kolab/Storage/Folder.php" />
    <install as="Horde/Kolab/Storage/List.php" name="lib/Horde/Kolab/Storage/List.php" />
+   <install as="Horde/Kolab/Storage/Queriable.php" name="lib/Horde/Kolab/Storage/Queriable.php" />
+   <install as="Horde/Kolab/Storage/Query.php" name="lib/Horde/Kolab/Storage/Query.php" />
    <install as="Horde/Kolab/Storage/Translation.php" name="lib/Horde/Kolab/Storage/Translation.php" />
    <install as="Horde/Kolab/Storage/Decorator/Log.php" name="lib/Horde/Kolab/Storage/Decorator/Log.php" />
    <install as="Horde/Kolab/Storage/Driver/Base.php" name="lib/Horde/Kolab/Storage/Driver/Base.php" />
    <install as="Horde/Kolab/Storage/Folder/Cached.php" name="lib/Horde/Kolab/Storage/Folder/Cached.php" />
    <install as="Horde/Kolab/Storage/Folder/Namespace.php" name="lib/Horde/Kolab/Storage/Folder/Namespace.php" />
    <install as="Horde/Kolab/Storage/Folder/Permission.php" name="lib/Horde/Kolab/Storage/Folder/Permission.php" />
+   <install as="Horde/Kolab/Storage/Folder/Type.php" name="lib/Horde/Kolab/Storage/Folder/Type.php" />
    <install as="Horde/Kolab/Storage/Folder/Decorator/Base.php" name="lib/Horde/Kolab/Storage/Folder/Decorator/Base.php" />
    <install as="Horde/Kolab/Storage/Folder/Decorator/Trigger.php" name="lib/Horde/Kolab/Storage/Folder/Decorator/Trigger.php" />
    <install as="Horde/Kolab/Storage/Folder/Namespace/Config.php" name="lib/Horde/Kolab/Storage/Folder/Namespace/Config.php" />
    <install as="Horde/Kolab/Storage/Folder/Permission/Element/User.php" name="lib/Horde/Kolab/Storage/Folder/Permission/Element/User.php" />
    <install as="Horde/Kolab/Storage/List/Base.php" name="lib/Horde/Kolab/Storage/List/Base.php" />
    <install as="Horde/Kolab/Storage/List/Decorator/Log.php" name="lib/Horde/Kolab/Storage/List/Decorator/Log.php" />
+   <install as="Horde/Kolab/Storage/List/Query/Base.php" name="lib/Horde/Kolab/Storage/List/Query/Base.php" />
    <install as="locale/Horde_Kolab_Storage.pot" name="locale/Horde_Kolab_Storage.pot" />
    <install as="locale/ar/LC_MESSAGES/Horde_Kolab_Storage.mo" name="locale/ar/LC_MESSAGES/Horde_Kolab_Storage.mo" />
    <install as="locale/ar/LC_MESSAGES/Horde_Kolab_Storage.po" name="locale/ar/LC_MESSAGES/Horde_Kolab_Storage.po" />
    <install as="Horde/Kolab/Storage/Unit/Driver/MockTest.php" name="test/Horde/Kolab/Storage/Unit/Driver/MockTest.php" />
    <install as="Horde/Kolab/Storage/Unit/Driver/PearTest.php" name="test/Horde/Kolab/Storage/Unit/Driver/PearTest.php" />
    <install as="Horde/Kolab/Storage/Unit/Driver/Decorator/LogTest.php" name="test/Horde/Kolab/Storage/Unit/Driver/Decorator/LogTest.php" />
+   <install as="Horde/Kolab/Storage/Unit/Driver/Decorator/TimerTest.php" name="test/Horde/Kolab/Storage/Unit/Driver/Decorator/TimerTest.php" />
    <install as="Horde/Kolab/Storage/Unit/Folder/NamespaceTest.php" name="test/Horde/Kolab/Storage/Unit/Folder/NamespaceTest.php" />
+   <install as="Horde/Kolab/Storage/Unit/Folder/TypeTest.php" name="test/Horde/Kolab/Storage/Unit/Folder/TypeTest.php" />
    <install as="Horde/Kolab/Storage/Unit/List/BaseTest.php" name="test/Horde/Kolab/Storage/Unit/List/BaseTest.php" />
    <install as="Horde/Kolab/Storage/Unit/List/Decorator/LogTest.php" name="test/Horde/Kolab/Storage/Unit/List/Decorator/LogTest.php" />
+   <install as="Horde/Kolab/Storage/Unit/List/Query/BaseTest.php" name="test/Horde/Kolab/Storage/Unit/List/Query/BaseTest.php" />
    <install as="TODO" name="TODO" />
   </filelist>
  </phprelease>
     <release>alpha</release>
     <api>alpha</api>
    </stability>
-   <date>2010-12-22</date>
+   <date>2010-12-28</date>
    <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
    <notes>
 * Added namespace support (Bug #6691).
index 08e0c74..d70c056 100644 (file)
 class Horde_Kolab_Storage_TestCase
 extends PHPUnit_Framework_TestCase
 {
-    protected function getNullMock()
+    protected function completeFactory($factory)
     {
+        if ($factory === null) {
+            return new Horde_Kolab_Storage_Factory();
+        }
+        return $factory;
+    }
+
+    protected function getNullMock($factory = null)
+    {
+        $factory = $this->completeFactory($factory);
         return new Horde_Kolab_Storage_Driver_Mock(
-            new Horde_Kolab_Storage_Factory()
+            $factory
+        );
+    }
+
+    protected function getNullList()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        return new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock($factory),
+            $factory
         );
     }
 
@@ -53,14 +71,6 @@ extends PHPUnit_Framework_TestCase
         );
     }
 
-    protected function getTwoFolderMock()
-    {
-        return new Horde_Kolab_Storage_Driver_Mock(
-            new Horde_Kolab_Storage_Factory(),
-            $this->getTwoFolderAccount()
-        );
-    }
-
     protected function getTwoFolderAccount()
     {
         return array(
@@ -72,11 +82,21 @@ extends PHPUnit_Framework_TestCase
         );
     }
 
-    protected function getAnnotatedMock()
+    protected function getTwoFolderMock($factory = null)
     {
+        $factory = $this->completeFactory($factory);
         return new Horde_Kolab_Storage_Driver_Mock(
-            new Horde_Kolab_Storage_Factory(),
-            $this->getAnnotatedAccount()
+            $factory,
+            $this->getTwoFolderAccount()
+        );
+    }
+
+    protected function getTwoFolderList()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        return new Horde_Kolab_Storage_List_Base(
+            $this->getTwoFolderMock($factory),
+            $factory
         );
     }
 
@@ -111,11 +131,21 @@ extends PHPUnit_Framework_TestCase
         );
     }
 
-    protected function getGermanAnnotatedMock()
+    protected function getAnnotatedMock($factory = null)
     {
+        $factory = $this->completeFactory($factory);
         return new Horde_Kolab_Storage_Driver_Mock(
-            new Horde_Kolab_Storage_Factory(),
-            $this->getGermanAnnotatedAccount()
+            $factory,
+            $this->getAnnotatedAccount()
+        );
+    }
+
+    protected function getAnnotatedList()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        return new Horde_Kolab_Storage_List_Base(
+            $this->getAnnotatedMock($factory),
+            $factory
         );
     }
 
@@ -150,6 +180,14 @@ extends PHPUnit_Framework_TestCase
         );
     }
 
+    protected function getGermanAnnotatedMock()
+    {
+        return new Horde_Kolab_Storage_Driver_Mock(
+            new Horde_Kolab_Storage_Factory(),
+            $this->getGermanAnnotatedAccount()
+        );
+    }
+
     protected function getMockLogger()
     {
         $this->logHandler = new Horde_Log_Handler_Mock();
index 438e2a0..d75304b 100644 (file)
@@ -37,6 +37,10 @@ extends Horde_Kolab_Storage_TestCase
 {
     public function testConstruction()
     {
-        new Horde_Kolab_Storage_Base(new Horde_Kolab_Storage_Driver_Mock(new Horde_Kolab_Storage_Factory()));
+        $factory = new Horde_Kolab_Storage_Factory();
+        new Horde_Kolab_Storage_Base(
+            new Horde_Kolab_Storage_Driver_Mock($factory),
+            $factory
+        );
     }
 }
index de9e136..ebec7ef 100644 (file)
@@ -38,7 +38,10 @@ extends Horde_Kolab_Storage_TestCase
     public function testListLogsEntry()
     {
         $storage = new Horde_Kolab_Storage_Decorator_Log(
-            new Horde_Kolab_Storage_Base($this->getNullMock()),
+            new Horde_Kolab_Storage_Base(
+                $this->getNullMock(),
+                new Horde_Kolab_Storage_Factory()
+            ),
             $this->getMockLogger()
         );
         $this->assertInstanceOf(
index d3cfd70..ecbb3fd 100644 (file)
@@ -152,5 +152,14 @@ extends Horde_Kolab_Storage_TestCase
         $this->assertLogRegExp('/REQUEST OUT IMAP:.*construct.*/');
     }
 
-
+    public function testCreateTypeReturnsType()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $this->assertInstanceOf(
+            'Horde_Kolab_Storage_Folder_Type',
+            $factory->createFolderType(
+                'event'
+            )
+        );
+    }
 }
diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Folder/TypeTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Folder/TypeTest.php
new file mode 100644 (file)
index 0000000..ff1722c
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Test the folder type handler.
+ *
+ * PHP version 5
+ *
+ * @category   Kolab
+ * @package    Kolab_Storage
+ * @subpackage UnitTests
+ * @author     Gunnar Wrobel <wrobel@pardus.de>
+ * @license    http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link       http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ * Prepare the test setup.
+ */
+require_once dirname(__FILE__) . '/../../Autoload.php';
+
+/**
+ * Test the folder type handler.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category   Kolab
+ * @package    Kolab_Storage
+ * @subpackage UnitTests
+ * @author     Gunnar Wrobel <wrobel@pardus.de>
+ * @license    http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link       http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+class Horde_Kolab_Storage_Unit_Folder_TypeTest
+extends Horde_Kolab_Storage_TestCase
+{
+    public function testConstruction()
+    {
+        new Horde_Kolab_Storage_Folder_Type('event');
+    }
+
+    public function testTypeEvent()
+    {
+        $type = new Horde_Kolab_Storage_Folder_Type('event');
+        $this->assertEquals('event', $type->getType());
+    }
+
+    public function testTypeContact()
+    {
+        $type = new Horde_Kolab_Storage_Folder_Type('contact');
+        $this->assertEquals('contact', $type->getType());
+    }
+
+    public function testTypeDefaultEvent()
+    {
+        $type = new Horde_Kolab_Storage_Folder_Type('event.default');
+        $this->assertEquals('event', $type->getType());
+    }
+
+    public function testTypeDefaultIsDefault()
+    {
+        $type = new Horde_Kolab_Storage_Folder_Type('contact.default');
+        $this->assertTrue($type->isDefault());
+    }
+
+    public function testNoDefault()
+    {
+        $type = new Horde_Kolab_Storage_Folder_Type('contact');
+        $this->assertFalse($type->isDefault());
+    }
+
+}
index 693829a..efc9a4d 100644 (file)
@@ -37,13 +37,19 @@ extends Horde_Kolab_Storage_TestCase
 {
     public function testListReturnsArray()
     {
-        $list = new Horde_Kolab_Storage_List_Base($this->getNullMock());
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
         $this->assertType('array', $list->listFolders());
     }
 
     public function testListReturnsFolders()
     {
-        $list = new Horde_Kolab_Storage_List_Base($this->getTwoFolderMock());
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getTwoFolderMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
         $this->assertEquals(
             array('INBOX', 'INBOX/a'),
             $list->listFolders()
@@ -52,22 +58,68 @@ extends Horde_Kolab_Storage_TestCase
 
     public function testTypeReturnsArray()
     {
-        $list = new Horde_Kolab_Storage_List_Base($this->getNullMock());
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
         $this->assertType('array', $list->listTypes());
     }
 
     public function testTypeReturnsAnnotations()
     {
-        $list = new Horde_Kolab_Storage_List_Base($this->getAnnotatedMock());
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getAnnotatedMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
         $this->assertEquals(
             array(
-                'INBOX/Calendar' => 'event.default',
-                'INBOX/Contacts' => 'contact.default',
-                'INBOX/Notes' => 'note.default',
-                'INBOX/Tasks' => 'task.default',
+                'INBOX/Calendar' => 'event',
+                'INBOX/Contacts' => 'contact',
+                'INBOX/Notes' => 'note',
+                'INBOX/Tasks' => 'task',
             ),
             $list->listTypes()
         );
     }
 
+    public function testAnnotationsReturnsHandlers()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getAnnotatedMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        foreach ($list->listFolderTypeAnnotations() as $folder => $type) {
+            $this->assertInstanceOf('Horde_Kolab_Storage_Folder_Type', $type);
+        };
+    }
+
+    public function testListQueriable()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        $this->assertTrue($list instanceOf Horde_Kolab_Storage_Queriable);
+    }
+
+    /**
+     * @expectedException Horde_Kolab_Storage_Exception
+     */
+    public function testGetQueryForUnsupported()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        $list->getQuery('NO_SUCH_QUERY');
+    }
+
+    public function testQueryReturnsQuery()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        $this->assertInstanceOf('Horde_Kolab_Storage_Query', $list->getQuery('Base'));
+    }
 }
index 71f3eb8..d41762a 100644 (file)
@@ -38,7 +38,7 @@ extends Horde_Kolab_Storage_TestCase
     public function testListFolderCount()
     {
         $list = new Horde_Kolab_Storage_List_Decorator_Log(
-            new Horde_Kolab_Storage_List_Base($this->getNullMock()),
+            $this->getNullList(),
             $this->getMockLogger()
         );
         $list->listFolders();
@@ -48,7 +48,7 @@ extends Horde_Kolab_Storage_TestCase
     public function testListLogsEntry()
     {
         $list = new Horde_Kolab_Storage_List_Decorator_Log(
-            new Horde_Kolab_Storage_List_Base($this->getTwoFolderMock()),
+            $this->getTwoFolderList(),
             $this->getMockLogger()
         );
         $list->listFolders();
@@ -58,7 +58,7 @@ extends Horde_Kolab_Storage_TestCase
     public function testListTypesFolderCount()
     {
         $list = new Horde_Kolab_Storage_List_Decorator_Log(
-            new Horde_Kolab_Storage_List_Base($this->getNullMock()),
+            $this->getNullList(),
             $this->getMockLogger()
         );
         $list->listTypes();
@@ -68,10 +68,32 @@ extends Horde_Kolab_Storage_TestCase
     public function testListTypesLogsEntry()
     {
         $list = new Horde_Kolab_Storage_List_Decorator_Log(
-            new Horde_Kolab_Storage_List_Base($this->getAnnotatedMock()),
+            $this->getAnnotatedList(),
             $this->getMockLogger()
         );
-        $list->listtypes();
+        $list->listTypes();
         $this->assertLogContains('List contained 4 folders and types.');
     }
+
+    public function testListAnnotationsLogsEntry()
+    {
+        $list = new Horde_Kolab_Storage_List_Decorator_Log(
+            $this->getAnnotatedList(),
+            $this->getMockLogger()
+        );
+        $list->listFolderTypeAnnotations();
+        $this->assertLogContains('List contained 4 folders and annotations.');
+    }
+
+    public function testGetQueryReturnsQuery()
+    {
+        $list = new Horde_Kolab_Storage_List_Decorator_Log(
+            $this->getNullList(),
+            $this->getMockLogger()
+        );
+        $this->assertInstanceOf(
+            'Horde_Kolab_Storage_Query',
+            $list->getQuery('Base')
+        );
+    }
 }
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
new file mode 100644 (file)
index 0000000..76e389b
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Test the basic list query.
+ *
+ * PHP version 5
+ *
+ * @category   Kolab
+ * @package    Kolab_Storage
+ * @subpackage UnitTests
+ * @author     Gunnar Wrobel <wrobel@pardus.de>
+ * @license    http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link       http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ * Prepare the test setup.
+ */
+require_once dirname(__FILE__) . '/../../../Autoload.php';
+
+/**
+ * Test the basic list query.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category   Kolab
+ * @package    Kolab_Storage
+ * @subpackage UnitTests
+ * @author     Gunnar Wrobel <wrobel@pardus.de>
+ * @license    http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link       http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+class Horde_Kolab_Storage_Unit_List_Query_BaseTest
+extends Horde_Kolab_Storage_TestCase
+{
+    public function testByTypeReturnsArray()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        $query = $list->getQuery('Base');
+        $this->assertType('array', $query->listByType('test'));
+    }
+
+    public function testListCalendarsListsCalendars()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getAnnotatedMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        $query = $list->getQuery('Base');
+        $this->assertEquals(array('INBOX/Calendar'), $query->listByType('event'));
+    }
+
+    public function testListTasklistsListsTasklists()
+    {
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getAnnotatedMock(),
+            new Horde_Kolab_Storage_Factory()
+        );
+        $query = $list->getQuery('Base');
+        $this->assertEquals(array('INBOX/Tasks'), $query->listByType('task'));
+    }
+}