Rough draft of listing folders on the command line.
authorGunnar Wrobel <p@rdus.de>
Tue, 14 Dec 2010 15:36:52 +0000 (16:36 +0100)
committerGunnar Wrobel <p@rdus.de>
Tue, 14 Dec 2010 17:26:58 +0000 (18:26 +0100)
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Cli.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Mock.php
framework/Kolab_Storage/lib/Horde/Kolab/Storage/Factory.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/CliTest.php
framework/Kolab_Storage/test/Horde/Kolab/Storage/Unit/FactoryTest.php

index d118a2c..2c5d832 100644 (file)
@@ -55,6 +55,15 @@ class Horde_Kolab_Storage_Cli
         } else {
             switch ($arguments[0]) {
             case 'folder':
+                $factory = new Horde_Kolab_Storage_Factory();
+                var_dump(
+                    $factory->createFromParams(
+                        array(
+                            'driver' => $options['driver'],
+                            'params' => $options
+                        )
+                    )->listFolders()
+                );
                 break;
             default:
                 $parser->printHelp();
@@ -76,7 +85,24 @@ class Horde_Kolab_Storage_Cli
                 array(
                     'action' => 'store',
                     'choices' => array('horde', 'php', 'pear', 'roundcube', 'mock'),
-                    'help'   => Horde_Kolab_Storage_Translation::t('The IMAP driver that should be used')
+                    'help'   => Horde_Kolab_Storage_Translation::t(
+"The Kolab backend driver that should be used.
+Choices are:
+
+ - horde     [IMAP]: The Horde_Imap_Client driver
+ - php       [IMAP]: The PHP imap_* functions which are based on c-client
+ - pear      [IMAP]: The PEAR-Net_IMAP driver
+ - roundcube [IMAP]: The roundcube IMAP driver
+ - mock    [Memory]: A dummy driver."
+                    )
+                )
+            ),
+            new Horde_Argv_Option(
+                '-u',
+                '--user',
+                array(
+                    'action' => 'store',
+                    'help'   => Horde_Kolab_Storage_Translation::t('The user accessing the backend.')
                 )
             ),
         );
index 3a94beb..b58e604 100644 (file)
@@ -29,6 +29,13 @@ class Horde_Kolab_Storage_Driver_Mock
 extends Horde_Kolab_Storage_Driver_Base
 {
     /**
+     * The data of the mailboxes.
+     *
+     * @var array
+     */
+    private $_data;
+
+    /**
      * The data of the mailbox currently opened
      *
      * @var array
@@ -43,6 +50,22 @@ extends Horde_Kolab_Storage_Driver_Base
     private $_mboxname = null;
 
     /**
+     * Constructor.
+     *
+     * @param array $params        Connection parameters.
+     */
+    public function __construct($params = array())
+    {
+        if (isset($params['data'])) {
+            $this->_data = $params['data'];
+            unset($params['data']);
+        } else {
+            $this->_data = array();
+        }
+        parent::__construct($params);
+    }
+
+    /**
      * Parse the folder name into an id for this mock driver.
      *
      * @return string The folder id.
@@ -50,7 +73,7 @@ extends Horde_Kolab_Storage_Driver_Base
     private function _parseFolder($folder)
     {
         if (substr($folder, 0, 5) == 'INBOX') {
-            $user = split('@', $this->_user);
+            $user = explode('@', $this->_user);
             return 'user/' . $user[0] . substr($folder, 5);
         }
         return $folder;
@@ -63,7 +86,7 @@ extends Horde_Kolab_Storage_Driver_Base
      */
     public function getAuth()
     {
-        return $this->_imap->getParam('username');
+        return $this->getParam('user');
     }
 
     /**
@@ -73,7 +96,13 @@ extends Horde_Kolab_Storage_Driver_Base
      */
     public function getMailboxes()
     {
-        return $this->_imap->listMailboxes('*', Horde_Imap_Client::MBOX_ALL, array('flat' => true));
+        $user = explode('@', $this->getAuth());
+        $pattern = '#^user/' . $user[0] . '#';
+        $result = array();
+        foreach (array_keys($this->_data) as $mbox) {
+            $result[] = preg_replace($pattern, 'INBOX', $mbox);
+        }
+        return $result;
     }
 
     /**
index 8b71d0e..3b18cf3 100644 (file)
@@ -30,6 +30,9 @@ class Horde_Kolab_Storage_Factory
     /**
      * Create the storage handler.
      *
+     * @param Horde_Kolab_Storage_Driver $driver The required driver for access
+     *                                           to the storage backend.
+     *
      * @return Horde_Kolab_Storage The storage handler.
      */
     public function create(Horde_Kolab_Storage_Driver $driver)
@@ -37,4 +40,69 @@ class Horde_Kolab_Storage_Factory
         return new Horde_Kolab_Storage_Base($driver);
     }
 
+    /**
+     * Create the storage handler based on a set of configuration parameters.
+     *
+     * @param array $params The parameters for the backend access. See create().
+     * <pre>
+     *  - driver : The type of backend driver. One of "mock", "php", "pear",
+     *             "horde", "horde-socket", and "roundcube".
+     *  - params : Backend specific connection parameters.
+     *
+     *    
+     * </pre>
+     *
+     * @return Horde_Kolab_Storage The storage handler.
+     */
+    public function createFromParams(array $params)
+    {
+        return new Horde_Kolab_Storage_Base(
+            $this->createDriverFromParams($params)
+        );
+    }
+
+    /**
+     * Create the storage backend driver based on a set of parameters.
+     *
+     * @param array $params The parameters for the backend access. See create().
+     * <pre>
+     *  - driver : The type of backend driver. One of "mock", "php", "pear",
+     *             "horde", "horde-socket", and "roundcube".
+     *  - params : Backend specific connection parameters.
+     *
+     *    
+     * </pre>
+     *
+     * @return Horde_Kolab_Storage_Driver The storage handler.
+     */
+    public function createDriverFromParams(array $params)
+    {
+        if (!isset($params['driver'])) {
+            throw new Horde_Kolab_Storage_Exception(
+                Horde_Kolab_Storage_Translation::t(
+                    'Missing "driver" parameter!'
+                )
+            );
+        }
+        if (isset($params['params'])) {
+            $config = $params['params'];
+        } else {
+            $config = array();
+        }
+        switch ($params['driver']) {
+        case 'mock':
+            $config['data'] = array('user/test' => array());
+            return new Horde_Kolab_Storage_Driver_Mock($config);
+        default:
+            throw new Horde_Kolab_Storage_Exception(
+                sprintf(
+                    Horde_Kolab_Storage_Translation::t(
+                        'Invalid "driver" parameter "%s". Please use one of "mock", "php", "pear", "horde", "horde-socket", and "roundcube"!'
+                    ),
+                    $params['driver']
+                )
+            );
+        }
+    }
+
 }
\ No newline at end of file
index 938cfad..ce12434 100644 (file)
@@ -43,11 +43,24 @@ extends Horde_Kolab_Storage_TestCase
         $this->runCli();
     }
 
+    public function testUsage()
+    {
+        $_SERVER['argv'] = array(
+            'kolab-storage',
+            '--driver=mock',
+            '--user=test',
+            'DOESNOTEXISTS'
+        );
+        $this->assertContains('Usage:', $this->runCli());
+    }
+
     public function testFolderList()
     {
         $_SERVER['argv'] = array(
             'kolab-storage',
-            'list'
+            '--driver=mock',
+            '--user=test',
+            'folder'
         );
         $this->assertContains('INBOX', $this->runCli());
     }
index 03941b8..9786c98 100644 (file)
@@ -35,7 +35,7 @@ require_once dirname(__FILE__) . '/../Autoload.php';
 class Horde_Kolab_Storage_Unit_FactoryTest
 extends Horde_Kolab_Storage_TestCase
 {
-    public function testConstruction()
+    public function testCreation()
     {
         $factory = new Horde_Kolab_Storage_Factory();
         $this->assertType(
@@ -43,4 +43,42 @@ extends Horde_Kolab_Storage_TestCase
             $factory->create(new Horde_Kolab_Storage_Driver_Mock())
         );
     }
+
+    public function testCreationFromParams()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $this->assertType(
+            'Horde_Kolab_Storage_Base',
+            $factory->createFromParams(array('driver' => 'mock'))
+        );
+    }
+
+    /**
+     * @expectedException Horde_Kolab_Storage_Exception
+     */
+    public function testMissingDriver()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $factory->createDriverFromParams(array());
+    }
+
+    /**
+     * @expectedException Horde_Kolab_Storage_Exception
+     */
+    public function testInvalidDriver()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $factory->createDriverFromParams(array('driver' => 'something'));
+    }
+
+    public function testMockDriver()
+    {
+        $factory = new Horde_Kolab_Storage_Factory();
+        $this->assertType(
+            'Horde_Kolab_Storage_Driver_Mock',
+            $factory->createDriverFromParams(
+                array('driver' => 'mock')
+            )
+        );
+    }
 }