Create namespace handlers in the factory.
authorGunnar Wrobel <p@rdus.de>
Thu, 16 Dec 2010 20:00:39 +0000 (21:00 +0100)
committerGunnar Wrobel <p@rdus.de>
Tue, 4 Jan 2011 07:54:10 +0000 (08:54 +0100)
14 files changed:
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Base.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Mock.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Pear.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Rcube.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Factory.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Namespace/Imap.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/AclTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/BaseTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Driver/CclientTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Driver/ImapTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Driver/MockTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/Driver/PearTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/FactoryTest.php

index 46a244a..1d5a2ba 100644 (file)
@@ -29,6 +29,13 @@ abstract class Horde_Kolab_Storage_Driver_Base
 implements Horde_Kolab_Storage_Driver
 {
     /**
+     * Factory for generating helper objects.
+     *
+     * @var Horde_Kolab_Storage_Factory
+     */
+    private $_factory;
+
+    /**
      * Additional connection parameters.
      *
      * @var array
@@ -38,11 +45,15 @@ implements Horde_Kolab_Storage_Driver
     /**
      * Constructor.
      *
-     * @param array $params        Connection parameters.
+     * @param Horde_Kolab_Storage_Factory $factory A factory for helper objects.
+     * @param array $params                        Connection parameters.
      */
-    public function __construct($params = array())
-    {
-        $this->_params = $params;
+    public function __construct(
+        Horde_Kolab_Storage_Factory $factory,
+        $params = array()
+    ) {
+        $this->_factory = $factory;
+        $this->_params  = $params;
     }
 
     /**
@@ -59,6 +70,16 @@ implements Horde_Kolab_Storage_Driver
     }
 
     /**
+     * Return the factory.
+     *
+     * @return Horde_Kolab_Storage_Factory The factory.
+     */
+    protected function getFactory()
+    {
+        return $this->_factory;
+    }
+
+    /**
      * Retrieve the namespace information for this connection.
      *
      * @return Horde_Kolab_Storage_Folder_Namespace The initialized namespace handler.
@@ -66,10 +87,10 @@ implements Horde_Kolab_Storage_Driver
     public function getNamespace()
     {
         if (isset($this->_params['namespaces'])) {
-            return new Horde_Kolab_Storage_Folder_Namespace_Config(
-                $this->_params['namespaces']
+            return $factory->createNamespace(
+                'config', $this->_params['namespaces']
             );
         }
-        return new Horde_Kolab_Storage_Folder_Namespace_Fixed();
+        return $this->_factory->createNamespace('fixed');
     }
 }
\ No newline at end of file
index eef647e..d070c59 100644 (file)
@@ -38,15 +38,17 @@ extends Horde_Kolab_Storage_Driver_Base
     /**
      * Constructor.
      *
-     * @param Horde_Imap_Client_Base $imap   The IMAP connection handler.
-     * @param array                  $params Connection parameters.
+     * @param Horde_Imap_Client_Base      $imap    The IMAP connection handler.
+     * @param Horde_Kolab_Storage_Factory $factory A factory for helper objects.
+     * @param array                       $params  Connection parameters.
      */
     public function __construct(
         Horde_Imap_Client_Base $imap,
+        Horde_Kolab_Storage_Factory $factory,
         $params = array()
     ) {
         $this->_imap = $imap;
-        parent::__construct($params);
+        parent::__construct($factory, $params);
     }
 
     /**
@@ -406,10 +408,15 @@ extends Horde_Kolab_Storage_Driver_Base
     public function getNamespace()
     {
         if ($this->_imap->queryCapability('NAMESPACE') === true) {
-            return new Horde_Kolab_Storage_Folder_Namespace_Imap(
-                $this->_imap->getNamespaces(),
-                $this->getParam('namespaces', array())
-            );
+            $c = array();
+            $configuration = $this->getParam('namespaces', array());
+            foreach ($this->_imap->getNamespaces() as $namespace) {
+                if (in_array($namespace['name'], array_keys($configuration))) {
+                    $namespace = array_merge($namespace, $configuration[$namespace['name']]);
+                }
+                $c[] = $namespace;
+            }
+            return $this->getFactory()->createNamespace('imap', $c);
         }
         return parent::getNamespace();
     }
index be73326..664f317 100644 (file)
@@ -52,17 +52,20 @@ extends Horde_Kolab_Storage_Driver_Base
     /**
      * Constructor.
      *
-     * @param array $params Connection parameters.
+     * @param Horde_Kolab_Storage_Factory $factory A factory for helper objects.
+     * @param array $params                        Connection parameters.
      */
-    public function __construct($params = array())
-    {
+    public function __construct(
+        Horde_Kolab_Storage_Factory $factory,
+        $params = array()
+    ) {
         if (isset($params['data'])) {
             $this->_data = $params['data'];
             unset($params['data']);
         } else {
             $this->_data = array();
         }
-        parent::__construct($params);
+        parent::__construct($factory, $params);
     }
 
     /**
index 121d32e..d44714e 100644 (file)
@@ -38,15 +38,17 @@ extends Horde_Kolab_Storage_Driver_Base
     /**
      * Constructor.
      *
-     * @param Net_IMAP $imap      The IMAP connection handler.
-     * @param array $params        Connection parameters.
+     * @param Net_IMAP                    $imap    The IMAP connection handler.
+     * @param Horde_Kolab_Storage_Factory $factory A factory for helper objects.
+     * @param array                       $params  Connection parameters.
      */
     public function __construct(
         Net_IMAP $imap,
+        Horde_Kolab_Storage_Factory $factory,
         $params = array()
     ) {
         $this->_imap = $imap;
-        parent::__construct($params);
+        parent::__construct($factory, $params);
     }
 
     /**
index 5f15ced..d206478 100644 (file)
@@ -38,15 +38,17 @@ extends Horde_Kolab_Storage_Driver_Base
     /**
      * Constructor.
      *
-     * @param rcube_imap_generic $imap   The IMAP connection handler.
-     * @param array              $params Connection parameters.
+     * @param rcube_imap_generic          $imap    The IMAP connection handler.
+     * @param Horde_Kolab_Storage_Factory $factory A factory for helper objects.
+     * @param array                       $params  Connection parameters.
      */
     public function __construct(
         rcube_imap_generic $imap,
+        Horde_Kolab_Storage_Factory $factory,
         $params = array()
     ) {
         $this->_imap = $imap;
-        parent::__construct($params);
+        parent::__construct($factory, $params);
     }
 
     /**
index a0319a0..cc2289a 100644 (file)
@@ -92,14 +92,15 @@ class Horde_Kolab_Storage_Factory
         switch ($params['driver']) {
         case 'mock':
             $config['data'] = array('user/test' => array());
-            return new Horde_Kolab_Storage_Driver_Mock($config);
+            return new Horde_Kolab_Storage_Driver_Mock($this, $config);
         case 'horde':
             $config['hostspec'] = $config['host'];
             unset($config['host']);
             return new Horde_Kolab_Storage_Driver_Imap(
                 new Horde_Imap_Client_Socket(
                     $config
-                )
+                ),
+                $this
             );
         case 'horde-php':
             $config['hostspec'] = $config['host'];
@@ -107,17 +108,18 @@ class Horde_Kolab_Storage_Factory
             return new Horde_Kolab_Storage_Driver_Imap(
                 new Horde_Imap_Client_Cclient(
                     $config
-                )
+                ),
+                $this
             );
         case 'php':
-            return new Horde_Kolab_Storage_Driver_Cclient($config);
+            return new Horde_Kolab_Storage_Driver_Cclient($this, $config);
         case 'pear':
             $client = new Net_IMAP($config['host']);
             Horde_Kolab_Storage_Exception_Pear::catchError(
                 $client->login($config['username'], $config['password'])
             );
             return new Horde_Kolab_Storage_Driver_Pear(
-                $client, $config
+                $client, $this, $config
             );
         case 'roundcube':
             $client = new rcube_imap_generic();
@@ -132,7 +134,7 @@ class Horde_Kolab_Storage_Factory
                 )
             );
             return new Horde_Kolab_Storage_Driver_Rcube(
-                $client, $config
+                $client, $this, $config
             );
         default:
             throw new Horde_Kolab_Storage_Exception(
@@ -146,4 +148,27 @@ class Horde_Kolab_Storage_Factory
         }
     }
 
+    /**
+     * Create a namespace handler.
+     *
+     * @param string $type   The namespace type.
+     * @param array  $params The parameters for the namespace. See 
+     *
+     * @return Horde_Kolab_Storage_Folder_Namespace The namespace handler.
+     */
+    public function createNamespace($type, array $params = array())
+    {
+        $class = 'Horde_Kolab_Storage_Folder_Namespace_' . ucfirst($type);
+        if (!class_exists($class)) {
+            throw new Horde_Kolab_Storage_Exception(
+                sprintf(
+                    Horde_Kolab_Storage_Translation::t(
+                        'Invalid "namespace" type "%s"!'
+                    ),
+                    $type
+                )
+            );
+        }
+        return new $class($params);
+    }
 }
\ No newline at end of file
index e1a456b..c178b20 100644 (file)
 class Horde_Kolab_Storage_Folder_Namespace_Imap
 extends  Horde_Kolab_Storage_Folder_Namespace_Config
 {
-    /**
-     * Constructor.
-     */
-    public function __construct(array $namespaces, array $configuration = array())
-    {
-        $c = array();
-        foreach ($namespaces as $namespace) {
-            if (in_array($namespace['name'], array_keys($configuration))) {
-                $namespace = array_merge($namespace, $configuration[$namespace['name']]);
-            }
-            $c[] = $namespace;
-        }
-        parent::__construct($c);
-    }
 }
\ No newline at end of file
index 0cb0e4c..0a9b8ca 100644 (file)
@@ -36,7 +36,10 @@ class Horde_Kolab_Storage_AclTest extends PHPUnit_Framework_TestCase
     {
         $this->_storage = $this->getMock('Horde_Kolab_Storage', array(), array(), '', false, false);
         $this->_imap = $this->getMock('Horde_Imap_Client_Socket', array(), array(), '', false, false);
-        $this->_connection = new Horde_Kolab_Storage_Driver_Imap($this->_imap);
+        $this->_connection = new Horde_Kolab_Storage_Driver_Imap(
+            $this->_imap,
+            new Horde_Kolab_Storage_Factory()
+        );
         $this->_imap->expects($this->any())
             ->method('getNamespaces')
             ->will(
index 409577b..438e2a0 100644 (file)
@@ -37,6 +37,6 @@ extends Horde_Kolab_Storage_TestCase
 {
     public function testConstruction()
     {
-        new Horde_Kolab_Storage_Base(new Horde_Kolab_Storage_Driver_Mock());
+        new Horde_Kolab_Storage_Base(new Horde_Kolab_Storage_Driver_Mock(new Horde_Kolab_Storage_Factory()));
     }
 }
index 963b98b..1834061 100644 (file)
@@ -38,7 +38,7 @@ extends PHPUnit_Framework_TestCase
     public function testGetNamespaceReturnsNamespaceHandler()
     {
         $driver = new Horde_Kolab_Storage_Driver_Cclient(
-            array()
+            new Horde_Kolab_Storage_Factory(), array()
         );
         $this->assertType(
             'Horde_Kolab_Storage_Folder_Namespace',
@@ -49,7 +49,7 @@ extends PHPUnit_Framework_TestCase
     public function testGetNamespaceReturnsExpectedNamespaces()
     {
         $driver = new Horde_Kolab_Storage_Driver_Cclient(
-            array()
+            new Horde_Kolab_Storage_Factory(), array()
         );
         $namespaces = array();
         foreach ($driver->getNamespace() as $namespace) {
index dd69c85..8e06088 100644 (file)
@@ -39,6 +39,7 @@ extends PHPUnit_Framework_TestCase
     {
         $driver = new Horde_Kolab_Storage_Driver_Imap(
             $this->_getNamespaceMock(),
+            new Horde_Kolab_Storage_Factory(),
             array()
         );
         $this->assertType(
@@ -51,6 +52,7 @@ extends PHPUnit_Framework_TestCase
     {
         $driver = new Horde_Kolab_Storage_Driver_Imap(
             $this->_getNamespaceMock(),
+            new Horde_Kolab_Storage_Factory(),
             array()
         );
         $namespaces = array();
index 5578895..0d76c6b 100644 (file)
@@ -53,7 +53,7 @@ extends PHPUnit_Framework_TestCase
     public function testGetNamespaceReturnsNamespaceHandler()
     {
         $driver = new Horde_Kolab_Storage_Driver_Mock(
-            array()
+            new Horde_Kolab_Storage_Factory(), array()
         );
         $this->assertType(
             'Horde_Kolab_Storage_Folder_Namespace',
@@ -64,7 +64,7 @@ extends PHPUnit_Framework_TestCase
     public function testGetNamespaceReturnsExpectedNamespaces()
     {
         $driver = new Horde_Kolab_Storage_Driver_Mock(
-            array()
+            new Horde_Kolab_Storage_Factory(), array()
         );
         $namespaces = array();
         foreach ($driver->getNamespace() as $namespace) {
index 2248f88..050881b 100644 (file)
@@ -39,6 +39,7 @@ extends PHPUnit_Framework_TestCase
     {
         $driver = new Horde_Kolab_Storage_Driver_Pear(
             $this->_getNamespaceMock(),
+            new Horde_Kolab_Storage_Factory(),
             array()
         );
         $this->assertType(
@@ -51,6 +52,7 @@ extends PHPUnit_Framework_TestCase
     {
         $driver = new Horde_Kolab_Storage_Driver_Pear(
             $this->_getNamespaceMock(),
+            new Horde_Kolab_Storage_Factory(),
             array()
         );
         $namespaces = array();
index 9786c98..7204391 100644 (file)
@@ -40,7 +40,11 @@ extends Horde_Kolab_Storage_TestCase
         $factory = new Horde_Kolab_Storage_Factory();
         $this->assertType(
             'Horde_Kolab_Storage_Base',
-            $factory->create(new Horde_Kolab_Storage_Driver_Mock())
+            $factory->create(
+                new Horde_Kolab_Storage_Driver_Mock(
+                    new Horde_Kolab_Storage_Factory()
+                )
+            )
         );
     }
 
@@ -81,4 +85,26 @@ extends Horde_Kolab_Storage_TestCase
             )
         );
     }
+
+    /**
+     * @expectedException Horde_Kolab_Storage_Exception
+     */
+    public function testInvalidNamespace()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $factory->createNamespace(
+            'undefined'
+        );
+    }
+
+    public function testFixedNamespace()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $this->assertInstanceOf(
+            'Horde_Kolab_Storage_Folder_Namespace_Fixed',
+            $factory->createNamespace(
+                'fixed'
+            )
+        );
+    }
 }