improves calendar import
authorPhilipp Schüle <p.schuele@metaways.de>
Mon, 18 Aug 2014 10:30:47 +0000 (12:30 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Thu, 4 Sep 2014 09:26:41 +0000 (11:26 +0200)
* sha1(calendar uri) to get valid uuid for container
* adds caching to user principals and home sets to handle authentication
problems
* improves logging

Change-Id: I9553fbde4bd56cf65d60730ed41b2e74b3781b84
Reviewed-on: http://gerrit.tine20.com/customers/1006
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
Tested-by: Philipp Schüle <p.schuele@metaways.de>
tine20/Calendar/Import/CalDav/Client.php
tine20/Tinebase/Import/CalDav/Client.php

index 3333c80..f937db5 100644 (file)
@@ -79,7 +79,14 @@ class Calendar_Import_CalDav_Client extends Tinebase_Import_CalDav_Client
         if ($this->calendarHomeSet[strlen($this->calendarHomeSet)-1] !== '/')
             $this->calendarHomeSet .= '/';
         
-        $result = $this->calDavRequest('PROPFIND', $this->calendarHomeSet, $this->decorator->preparefindAllCalendarsRequest(self::findAllCalendarsRequest), 1);
+        try {
+            $result = $this->calDavRequest('PROPFIND', $this->calendarHomeSet, $this->decorator->preparefindAllCalendarsRequest(self::findAllCalendarsRequest), 1);
+        } catch (Tinebase_Exception $te) {
+            if (Tinebase_Core::isLogLevel(Zend_Log::WARN))
+                Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' request failed');
+            Tinebase_Exception::log($te);
+            return false;
+        }
         
         foreach ($result as $uri => $response) {
             if (isset($response['{DAV:}resourcetype']) && isset($response['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']) && 
@@ -117,21 +124,20 @@ class Calendar_Import_CalDav_Client extends Tinebase_Import_CalDav_Client
         if (count($this->calendarICSs) > 0) {
             return true;
         } else {
-            if (Tinebase_Core::isLogLevel(Zend_Log::WARN))
-                Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' all found calendars are empty');
+            if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE))
+                Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' all found calendars are empty');
             return false;
         }
     }
     
     protected function findContainerForCalendar($calendarUri, $displayname, $defaultCalendarsName, $type, $application_id, $modelName)
     {
-        if (! preg_match('@__uids__/([^/]+)@', $calendarUri, $matches)) {
-            throw new Exception('no uuid found in calendar uri');
-        }
-        $uuid = $matches[1];
+        // sha1() the whole calendar uri as it is very hard to separate a uuid string from the uri otherwise
+        $uuid = sha1($calendarUri);
         
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__
-                . ' $displayname = ' . $displayname . ' $defaultCalendarsName = ' . $defaultCalendarsName . ' $uuid = ' . $uuid);
+                . ' $calendarUri = ' . $calendarUri . ' / $displayname = ' . $displayname 
+                . ' / $defaultCalendarsName = ' . $defaultCalendarsName . ' / $uuid = ' . $uuid);
         
         $filter = new Tinebase_Model_ContainerFilter(array(
             array(
@@ -209,11 +215,13 @@ class Calendar_Import_CalDav_Client extends Tinebase_Import_CalDav_Client
         
         $modelName = Tinebase_Core::getApplicationInstance('Calendar')->getDefaultModel();
         $application_id = Tinebase_Application::getInstance()->getApplicationByName('Calendar')->getId();
-        $type = Tinebase_Model_Container::TYPE_PERSONAL; //Tinebase_Model_Container::TYPE_SHARED;
-        $defaultContainer = Tinebase_Container::getInstance()->getDefaultContainer('Calendar_Model_Event');
+        $type = Tinebase_Model_Container::TYPE_PERSONAL;
         
         $defaultCalendarsName = $this->_getDefaultCalendarsName();
         
+        if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__
+            . ' Calendar uris to import: ' . print_r(array_keys($this->calendars), true));
+        
         foreach ($this->calendars as $calUri => $cal) {
             $container = $this->findContainerForCalendar($calUri, $cal['displayname'], $defaultCalendarsName,
                     $type, $application_id, $modelName);
@@ -324,14 +332,18 @@ class Calendar_Import_CalDav_Client extends Tinebase_Import_CalDav_Client
             $this->calendarICSs = $newICSs;
             $this->importAllCalendarData($onlyCurrentUserOrganizer, /* $update = */ true);
         } else {
-            if (Tinebase_Core::isLogLevel(Zend_Log::WARN))
-                Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' no changes found for: ' . $this->userName);
+            if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE))
+                Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' no changes found for: ' . $this->userName);
         }
     }
     
     protected function _getEventIdFromName($name)
     {
-        return ($pos = strpos($name, '.')) === false ? $name : substr($name, 0, $pos);
+        $id = ($pos = strpos($name, '.')) === false ? $name : substr($name, 0, $pos);
+        if (strlen($id) > 40) {
+            $id = sha1($id);
+        }
+        return $id;
     }
     
     public function importAllCalendarData($onlyCurrentUserOrganizer = false, $update = false)
index 673bc8e..14b35ec 100644 (file)
@@ -8,8 +8,6 @@
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @author      Paul Mehrer <p.mehrer@metaways.de>
  * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
- * 
- * @todo        
  */
 
 /**
@@ -64,8 +62,24 @@ class Tinebase_Import_CalDav_Client extends \Sabre\DAV\Client
         $this->propertyMap['{DAV:}group-member-set'] = 'Tinebase_Import_CalDav_GroupMemberSet';
     }
     
+    /**
+     * findCurrentUserPrincipal
+     * - result ($this->currentUserPrincipal) is cached for 1 week
+     * 
+     * @param number $tries
+     * @return boolean
+     */
     public function findCurrentUserPrincipal($tries = 1)
     {
+        $cacheId = convertCacheId('findCurrentUserPrincipal' . $this->userName);
+        if (Tinebase_Core::getCache()->test($cacheId)) {
+            $this->currentUserPrincipal = Tinebase_Core::getCache()->load($cacheId);
+            $this->principals[$this->currentUserPrincipal] = Tinebase_User::getInstance()->getUserByLoginName($this->userName, 'Tinebase_Model_FullUser');
+            if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . ' ' . __LINE__
+                    . ' Loading user principal from cache');
+            return true;
+        }
+        
         $result = $this->calDavRequest('PROPFIND', '/principals/', self::findCurrentUserPrincipalRequest, 0, $tries);
         if (isset($result['{DAV:}current-user-principal']))
         {
@@ -80,6 +94,7 @@ class Tinebase_Import_CalDav_Client extends \Sabre\DAV\Client
             }
             $this->currentUserPrincipal = $result['{DAV:}current-user-principal'];
             $this->principals[$this->currentUserPrincipal] = $user;
+            Tinebase_Core::getCache()->save($this->currentUserPrincipal, $cacheId, array(), /* 1 week */ 24*3600*7);
             return true;
         }
         
@@ -111,19 +126,31 @@ class Tinebase_Import_CalDav_Client extends \Sabre\DAV\Client
         return count($users) > 0;
     }
     
+    /**
+     * findCalendarHomeSet
+     * - result ($this->calendarHomeSet) is cached for 1 week
+     * 
+     * @return boolean
+     */
     public function findCalendarHomeSet()
     {
+        $cacheId = convertCacheId('findCalendarHomeSet' . $this->userName);
+        if (Tinebase_Core::getCache()->test($cacheId)) {
+            $this->calendarHomeSet = Tinebase_Core::getCache()->load($cacheId);
+            if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . ' ' . __LINE__
+                    . ' Loading user home set from cache');
+            return true;
+        }
+        
         if ('' == $this->currentUserPrincipal && ! $this->findCurrentUserPrincipal(/* tries = */ 3)) {
             return false;
         }
         
-        // @todo add caching here
-        //Tinebase_Core::getCache()
-        
         $result = $this->calDavRequest('PROPFIND', $this->currentUserPrincipal, self::findCalendarHomeSetRequest);
         
         if (isset($result['{urn:ietf:params:xml:ns:caldav}calendar-home-set'])) {
             $this->calendarHomeSet = $result['{urn:ietf:params:xml:ns:caldav}calendar-home-set'];
+            Tinebase_Core::getCache()->save($this->calendarHomeSet, $cacheId, array(), /* 1 week */ 24*3600*7);
             return true;
         }