Register queries on the list handlers and also retrieve them from there.
authorGunnar Wrobel <p@rdus.de>
Tue, 4 Jan 2011 06:29:52 +0000 (07:29 +0100)
committerGunnar Wrobel <p@rdus.de>
Tue, 4 Jan 2011 07:54:28 +0000 (08:54 +0100)
14 files changed:
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Base.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Decorator/Cache.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Factory.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Base.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Decorator/Cache.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/List/Decorator/Log.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/lib/Horde/Kolab/Storage/Queriable.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Stub/FactoryQuery.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/TestCase.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Decorator/CacheTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/FactoryTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/List/BaseTest.php

index 217e8e5..98529c7 100644 (file)
@@ -65,10 +65,12 @@ implements Horde_Kolab_Storage
      */
     public function getList()
     {
-        return new Horde_Kolab_Storage_List_Base(
+        $list = new Horde_Kolab_Storage_List_Base(
             $this->_master,
             $this->_factory
         );
+        $this->_factory->createListQuery('Base', $list);
+        return $list;
     }
 
     /**
index 8be9402..d9327a0 100644 (file)
@@ -43,17 +43,27 @@ implements Horde_Kolab_Storage
     private $_cache;
 
     /**
+     * The factory for generating additional resources.
+     *
+     * @var Horde_Kolab_Storage_Factory
+     */
+    private $_factory;
+
+    /**
      * Constructor.
      *
      * @param Horde_Kolab_Storage       $storage The storage handler.
      * @param Horde_Kolab_Storage_Cache $cache   The cache.
+     * @param Horde_Kolab_Storage_Factory $factory The factory.
      */
     public function __construct(
         Horde_Kolab_Storage $storage, 
-        Horde_Kolab_Storage_Cache $cache
+        Horde_Kolab_Storage_Cache $cache,
+        Horde_Kolab_Storage_Factory $factory
     ) {
         $this->_storage = $storage;
         $this->_cache = $cache;
+        $this->_factory = $factory;
     }
 
     /**
@@ -64,12 +74,17 @@ implements Horde_Kolab_Storage
      */
     public function getList()
     {
-        return new Horde_Kolab_Storage_List_Decorator_Cache(
+        $list_cache = new Horde_Kolab_Storage_Cache_List(
+            $this->_cache
+        );
+        $list = new Horde_Kolab_Storage_List_Decorator_Cache(
             $this->_storage->getList(),
-            new Horde_Kolab_Storage_Cache_List(
-                $this->_cache
-            )
+            $list_cache
+        );
+        $this->_factory->createListQuery(
+            'Cache', $list, array('cache' => $list_cache)
         );
+        return $list;
     }
 
     /**
index 533993d..23d5219 100644 (file)
@@ -197,28 +197,30 @@ class Horde_Kolab_Storage_Factory
     /**
      * Create the specified list query type.
      *
-     * @param string                   $name The query name.
-     * @param Horde_Kolab_Storage_List $list The list that should be queried.
+     * @param string                   $name   The query name.
+     * @param Horde_Kolab_Storage_List $list   The list that should be queried.
+     * @param array                    $params Additional parameters provided
+     *                                        to the query constructor.
      *
      * @return Horde_Kolab_Storage_Query A query handler.
      *
      * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
      */
-    public function createListQuery($name, Horde_Kolab_Storage_List $list)
+    public function createListQuery($name, Horde_Kolab_Storage_List $list, $params = array())
     {
         if (class_exists($name)) {
-            $query = new $name($list);
+            $constructor_params = array_merge(
+                array('factory' => $this), $params
+            );
+            $query = new $name($list, $constructor_params);
         } else if (strpos($name, 'Horde_Kolab_Storage_List_Query_') === false) {
             $query = $this->createListQuery(
-                'Horde_Kolab_Storage_List_Query_' . $name, $list
+                'Horde_Kolab_Storage_List_Query_' . $name, $list, $params
             );
         } else {
             throw new Horde_Kolab_Storage_Exception(sprintf('No such query "%s"!', $name));
         }
-        if (method_exists($query, 'setFactory')) {
-            $query->setFactory($this);
-        }
-        $list->registerQuery($query);
+        $list->registerQuery($name, $query);
         return $query;
     }
 
index 5bae4b3..6bcae18 100644 (file)
@@ -94,7 +94,7 @@ implements Horde_Kolab_Storage_List
      */
     public function synchronize()
     {
-        foreach ($this->_queries as $query) {
+        foreach ($this->_queries as $name => $query) {
             $query->synchronize();
         }
     }
@@ -102,12 +102,29 @@ implements Horde_Kolab_Storage_List
     /**
      * Register a query to be updated if the underlying data changes.
      *
+     * @param string                    $name  The query name.
      * @param Horde_Kolab_Storage_Query $query The query to register.
      *
      * @return NULL
      */
-    public function registerQuery(Horde_Kolab_Storage_Query $query)
+    public function registerQuery($name, Horde_Kolab_Storage_Query $query)
     {
-        $this->_queries[] = $query;
+        $this->_queries[$name] = $query;
+    }
+
+    /**
+     * Return a registered query.
+     *
+     * @param string $name The query name.
+     *
+     * @return NULL
+     */
+    public function getQuery($name)
+    {
+        if (isset($this->_queries[$name])) {
+            return $this->_queries[$name];
+        } else {
+            throw new Horde_Kolab_Storage_Exception('No such query!');
+        }
     }
 }
\ No newline at end of file
index 8eba1b2..0a4b804 100644 (file)
@@ -135,12 +135,25 @@ implements Horde_Kolab_Storage_List
     /**
      * Register a query to be updated if the underlying data changes.
      *
+     * @param string                    $name  The query name.
      * @param Horde_Kolab_Storage_Query $query The query to register.
      *
      * @return NULL
      */
-    public function registerQuery(Horde_Kolab_Storage_Query $query)
+    public function registerQuery($name, Horde_Kolab_Storage_Query $query)
     {
-        $this->_list->registerQuery($query);
+        $this->_list->registerQuery($name, $query);
+    }
+
+    /**
+     * Return a registered query.
+     *
+     * @param string $name The query name.
+     *
+     * @return NULL
+     */
+    public function getQuery($name)
+    {
+        $this->_list->getQuery($name);
     }
 }
\ No newline at end of file
index 6e02167..b97374b 100644 (file)
@@ -135,12 +135,25 @@ implements Horde_Kolab_Storage_List
     /**
      * Register a query to be updated if the underlying data changes.
      *
+     * @param string                    $name  The query name.
      * @param Horde_Kolab_Storage_Query $query The query to register.
      *
      * @return NULL
      */
-    public function registerQuery(Horde_Kolab_Storage_Query $query)
+    public function registerQuery($name, Horde_Kolab_Storage_Query $query)
     {
-        $this->_list->registerQuery($query);
+        $this->_list->registerQuery($name, $query);
+    }
+
+    /**
+     * Return a registered query.
+     *
+     * @param string $name The query name.
+     *
+     * @return NULL
+     */
+    public function getQuery($name)
+    {
+        $this->_list->getQuery($name);
     }
 }
\ No newline at end of file
index 4d34266..7aff095 100644 (file)
@@ -45,23 +45,15 @@ implements Horde_Kolab_Storage_List_Query
     /**
      * Constructor.
      *
-     * @param Horde_Kolab_Storage_List $list The queriable list.
+     * @param Horde_Kolab_Storage_List $list   The queriable list.
+     * @param array                    $params Additional parameters.
      */
-    public function __construct(Horde_Kolab_Storage_List $list)
-    {
+    public function __construct(
+        Horde_Kolab_Storage_List $list,
+        $params
+    ) {
         $this->_list = $list;
-    }
-
-    /**
-     * Inject the factory.
-     *
-     * @param Horde_Kolab_Storage_Factory $factory The factory.
-     *
-     * @return NULL
-     */
-    public function setFactory(Horde_Kolab_Storage_Factory $factory)
-    {
-        $this->_factory = $factory;
+        $this->_factory = $params['factory'];
     }
 
     /**
index 86c43c3..de3a299 100644 (file)
@@ -58,18 +58,16 @@ implements Horde_Kolab_Storage_List_Query
     /**
      * Constructor.
      *
-     * @param Horde_Kolab_Storage_List       $list       The queriable list.
-     * @param Horde_Kolab_Storage_Factory    $factory    The factory.
-     * @param Horde_Kolab_Storage_Cache_List $list_cache The list cache.
+     * @param Horde_Kolab_Storage_List $list   The queriable list.
+     * @param array                    $params Additional parameters.
      */
     public function __construct(
         Horde_Kolab_Storage_List $list,
-        Horde_Kolab_Storage_Factory $factory,
-        Horde_Kolab_Storage_Cache_List $list_cache
+        $params
     ) {
         $this->_list = $list;
-        $this->_list_cache = $list_cache;
-        $this->_factory = $factory;
+        $this->_list_cache = $params['cache'];
+        $this->_factory = $params['factory'];
     }
 
     /**
index 9d110ba..905242c 100644 (file)
@@ -30,10 +30,20 @@ interface Horde_Kolab_Storage_Queriable
     /**
      * Register a query to be updated if the underlying data changes.
      *
+     * @param string                    $name  The query name.
      * @param Horde_Kolab_Storage_Query $query The query to register.
      *
      * @return NULL
      */
-    public function registerQuery(Horde_Kolab_Storage_Query $query);
+    public function registerQuery($name, Horde_Kolab_Storage_Query $query);
+
+    /**
+     * Return a registered query.
+     *
+     * @param string $name The query name.
+     *
+     * @return NULL
+     */
+    public function getQuery($name);
 }
 
index cba9c59..6fcc634 100644 (file)
@@ -15,18 +15,6 @@ implements Horde_Kolab_Storage_Query
     }
 
     /**
-     * Inject the factory.
-     *
-     * @param Horde_Kolab_Storage_Factory $factory The factory.
-     *
-     * @return NULL
-     */
-    public function setFactory(Horde_Kolab_Storage_Factory $factory)
-    {
-        $this->called = true;
-    }
-
-    /**
      * Synchronize the query data with the information from the backend.
      *
      * @return NULL
index 835dd67..b303ac2 100644 (file)
@@ -197,10 +197,12 @@ extends PHPUnit_Framework_TestCase
         );
         $query = new Horde_Kolab_Storage_List_Query_Cache(
             $list,
-            $factory,
-            $list_cache
+            array(
+                'factory' => $factory,
+                'cache' => $list_cache
+            )
         );
-        $list->registerQuery($query);
+        $list->registerQuery('test', $query);
         $list->synchronize();
         return $query;
     }
index 80e84da..2210be2 100644 (file)
@@ -37,12 +37,14 @@ extends Horde_Kolab_Storage_TestCase
 {
     public function testDecoratedList()
     {
+        $factory = new Horde_Kolab_Storage_Factory();
         $storage = new Horde_Kolab_Storage_Decorator_Cache(
             new Horde_Kolab_Storage_Base(
-                $this->getNullMock(),
-                new Horde_Kolab_Storage_Factory()
+                $this->getNullMock($factory),
+                $factory
             ),
-            new Horde_Kolab_Storage_Cache(null)
+            new Horde_Kolab_Storage_Cache(null),
+            $factory
         );
         $this->assertInstanceOf(
             'Horde_Kolab_Storage_List_Decorator_Cache',
index 2e10c80..37e3f3e 100644 (file)
@@ -217,19 +217,4 @@ extends Horde_Kolab_Storage_TestCase
             )
         );
     }
-
-    public function testQueryFactoryInjection()
-    {
-        $list = new Horde_Kolab_Storage_List_Base(
-            $this->getNullMock(),
-            new Horde_Kolab_Storage_Factory()
-        );
-        $factory = new Horde_Kolab_Storage_Factory();
-        $query = $factory->createListQuery(
-            'Horde_Kolab_Storage_Stub_FactoryQuery',
-            $list
-        );
-        $this->assertTrue($query->called);
-    }
-
 }
index a4a2b47..4cac408 100644 (file)
@@ -85,8 +85,25 @@ extends Horde_Kolab_Storage_TestCase
             'Horde_Kolab_Storage_Stub_FactoryQuery',
             $list
         );
-        $list->registerQuery($query);
+        $list->registerQuery('stub', $query);
         $list->synchronize();
         $this->assertTrue($query->synchronized);
     }
+
+    public function testGetQuery()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $list = new Horde_Kolab_Storage_List_Base(
+            $this->getNullMock(),
+            $factory
+        );
+        $query = $factory->createListQuery(
+            'Horde_Kolab_Storage_Stub_FactoryQuery',
+            $list
+        );
+        $this->assertInstanceOf(
+            'Horde_Kolab_Storage_Stub_FactoryQuery',
+            $list->getQuery('Horde_Kolab_Storage_Stub_FactoryQuery')
+        );
+    }
 }