Merge branch '2013.10' into 2014.11
[tine20] / tine20 / Tinebase / Container.php
index 760e39c..2736966 100644 (file)
@@ -383,20 +383,23 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
      * used to get a list of all containers accesssible by the current user
      * 
      * @param   string|Tinebase_Model_User          $accountId
-     * @param   string                              $applicationName
+     * @param   string|Tinebase_Model_Application   $recordClass
      * @param   array|string                        $grant
      * @param   bool                                $onlyIds return only ids
      * @param   bool                                $ignoreACL
      * @return  Tinebase_Record_RecordSet|array
      * @throws  Tinebase_Exception_NotFound
      */
-    public function getContainerByACL($accountId, $applicationName, $grant, $onlyIds = FALSE, $ignoreACL = FALSE)
+    public function getContainerByACL($accountId, $recordClass, $grant, $onlyIds = FALSE, $ignoreACL = FALSE)
     {
+        // legacy handling 
+        $meta = $this->_resolveRecordClassArgument($recordClass);
+        
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
-            . ' app: ' . $applicationName . ' / account: ' . $accountId . ' / grant: ' . implode('/', (array)$grant));
+            . ' app: ' . $meta['appName'] . ' / account: ' . $accountId . ' / grant:' . implode('/', (array)$grant));
         
         $accountId     = Tinebase_Model_User::convertUserIdToInt($accountId);
-        $applicationId = Tinebase_Application::getInstance()->getApplicationByName($applicationName)->getId();
+        $applicationId = Tinebase_Application::getInstance()->getApplicationByName($meta['appName'])->getId();
         $grant         = $ignoreACL ? '*' : $grant;
         
         // always bring values in the same order for $classCacheId 
@@ -404,7 +407,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
             sort($grant);
         }
         
-        $classCacheId = convertCacheId($accountId . $applicationId . implode('', (array)$grant) . (int)$onlyIds . (int)$ignoreACL);
+        $classCacheId = Tinebase_Helper::convertCacheId($accountId . $applicationId . implode('', (array)$grant) . (int)$onlyIds . (int)$ignoreACL);
         
         try {
             return $this->loadFromClassCache(__FUNCTION__, $classCacheId);
@@ -439,7 +442,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         // any account should have at least one personal folder
         // @todo add test for empty case
         if (empty($result)) {
-            $personalContainer = $this->getDefaultContainer($applicationName, $accountId);
+            $personalContainer = $this->getDefaultContainer($meta['appName'], $accountId);
             if ($personalContainer instanceof Tinebase_Model_Container) {
                 $result = ($onlyIds) ? 
                     array($personalContainer->getId()) : 
@@ -510,16 +513,19 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
     /**
      * return a container by container name
      *
-     * @param   string $appName app name
-     * @param   int|Tinebase_Model_Container $containerName
-     * @param   string $type
-     * @param   string $ownerId
+     * @param   string|Tinebase_Model_Application  $recordClass app name
+     * @param   int|Tinebase_Model_Container       $containerName
+     * @param   string                             $type
+     * @param   string                             $ownerId
      * @return  Tinebase_Model_Container
      * @throws  Tinebase_Exception_NotFound
      * @throws  Tinebase_Exception_UnexpectedValue
      */
-    public function getContainerByName($appName, $containerName, $type, $ownerId = NULL)
+    public function getContainerByName($recordClass, $containerName, $type, $ownerId = NULL)
     {
+        // legacy handling
+        $meta = $this->_resolveRecordClassArgument($recordClass);
+        
         if (! in_array($type, array(Tinebase_Model_Container::TYPE_PERSONAL, Tinebase_Model_Container::TYPE_SHARED))) {
             throw new Tinebase_Exception_UnexpectedValue ("Invalid type $type supplied.");
         }
@@ -530,7 +536,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         
         $ownerId = $ownerId instanceof Tinebase_Model_User ? $ownerId->getId() : $ownerId;
         
-        $applicationId = Tinebase_Application::getInstance()->getApplicationByName($appName)->getId();
+        $applicationId = Tinebase_Application::getInstance()->getApplicationByName($meta['appName'])->getId();
 
         $select = $this->_getSelect()
             ->where("{$this->_db->quoteIdentifier('container.application_id')} = ?", $applicationId)
@@ -577,7 +583,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         $grant       = $_ignoreACL ? '*' : $_grant;
         $application = Tinebase_Application::getInstance()->getApplicationByName($meta['appName']);
         
-        $classCacheId = convertCacheId(
+        $classCacheId = Tinebase_Helper::convertCacheId(
             $accountId .
             $application->getId() .
             ($meta['recordClass'] ? $meta['recordClass'] : null) .
@@ -758,19 +764,21 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
      * returns the shared container for a given application accessible by the current user
      *
      * @param   string|Tinebase_Model_User          $_accountId
-     * @param   string|Tinebase_Model_Application   $_application
+     * @param   string|Tinebase_Model_Application   $recordClass
      * @param   array|string                        $_grant
      * @param   bool                                $_ignoreACL
      * @return  Tinebase_Record_RecordSet set of Tinebase_Model_Container
      * @throws  Tinebase_Exception_NotFound
      */
-    public function getSharedContainer($_accountId, $_application, $_grant, $_ignoreACL = FALSE)
+    public function getSharedContainer($_accountId, $recordClass, $_grant, $_ignoreACL = FALSE)
     {
+        // legacy handling
+        $meta = $this->_resolveRecordClassArgument($recordClass);
+        $application = Tinebase_Application::getInstance()->getApplicationByName($meta['appName']);
         $accountId   = Tinebase_Model_User::convertUserIdToInt($_accountId);
-        $application = Tinebase_Application::getInstance()->getApplicationByName($_application);
         $grant       = $_ignoreACL ? '*' : $_grant;
         
-        $classCacheId = convertCacheId(
+        $classCacheId = Tinebase_Helper::convertCacheId(
             $accountId .
             $application->getId() .
             implode('', (array)$grant) .
@@ -815,14 +823,15 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
      * return users which made personal containers accessible to given account
      *
      * @param   string|Tinebase_Model_User          $_accountId
-     * @param   string|Tinebase_Model_Application   $_application
+     * @param   string|Tinebase_Model_Application   $recordClass
      * @param   array|string                        $_grant
      * @param   bool                                $_ignoreACL
      * @return  Tinebase_Record_RecordSet set of Tinebase_Model_User
      */
-    public function getOtherUsers($_accountId, $_application, $_grant, $_ignoreACL = FALSE)
+    public function getOtherUsers($_accountId, $recordClass, $_grant, $_ignoreACL = FALSE)
     {
-        $userIds = $this->_getOtherAccountIds($_accountId, $_application, $_grant, $_ignoreACL);
+        $meta = $this->_resolveRecordClassArgument($recordClass);
+        $userIds = $this->_getOtherAccountIds($_accountId, $meta['appName'], $_grant, $_ignoreACL);
         
         $users = Tinebase_User::getInstance()->getMultiple($userIds);
         $users->sort('accountDisplayName');
@@ -845,7 +854,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         $application = Tinebase_Application::getInstance()->getApplicationByName($_application);
         $grant       = $_ignoreACL ? '*' : $_grant;
 
-        $classCacheId = convertCacheId($accountId . $application->getId() . implode('', (array)$grant) .(int)$_ignoreACL);
+        $classCacheId = Tinebase_Helper::convertCacheId($accountId . $application->getId() . implode('', (array)$grant) .(int)$_ignoreACL);
         try {
             return $this->loadFromClassCache(__FUNCTION__, $classCacheId);
         } catch (Tinebase_Exception_NotFound $tenf) {
@@ -906,15 +915,17 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
      * return set of all personal container of other users made accessible to the given account 
      *
      * @param   string|Tinebase_Model_User          $_accountId
-     * @param   string|Tinebase_Model_Application   $_application
+     * @param   string|Tinebase_Model_Application   $recordClass
      * @param   array|string                        $_grant
      * @param   bool                                $_ignoreACL
      * @return  Tinebase_Record_RecordSet set of Tinebase_Model_Container
      */
-    public function getOtherUsersContainer($_accountId, $_application, $_grant, $_ignoreACL = FALSE)
+    public function getOtherUsersContainer($_accountId, $recordClass, $_grant, $_ignoreACL = FALSE)
     {
-        $result = $this->_getOtherUsersContainerData($_accountId, $_application, $_grant, $_ignoreACL);
-        
+        // legacy handling
+        $meta = $this->_resolveRecordClassArgument($recordClass);
+        $result = $this->_getOtherUsersContainerData($_accountId, $meta['appName'], $_grant, $_ignoreACL);
+
         return $result;
     }
     
@@ -933,7 +944,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         $application = Tinebase_Application::getInstance()->getApplicationByName($_application);
         $grant       = $_ignoreACL ? '*' : $_grant;
         
-        $classCacheId = convertCacheId(
+        $classCacheId = Tinebase_Helper::convertCacheId(
             $accountId .
             $application->getId() .
             implode('', (array)$grant) .
@@ -1024,7 +1035,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
                     throw new Tinebase_Exception_InvalidArgument('Can delete personal or shared containers only.');
                 }
             }
-            $this->deleteContainerContents($container);
+            $this->deleteContainerContents($container, $_ignoreAcl);
             $deletedContainer = $this->_setRecordMetaDataAndUpdate($container, 'delete');
             
         } catch (Exception $e) {
@@ -1063,13 +1074,16 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
      * 
      * @param Tinebase_Model_Container $container
      */
-    public function deleteContainerContents($container)
+    public function deleteContainerContents($container, $_ignoreAcl = FALSE)
     {
         // set records belonging to this container to deleted
         $model = $container->model;
         if ($model) {
             $controller = Tinebase_Core::getApplicationInstance($model);
             $filterName = $model . 'Filter';
+            if($_ignoreAcl === TRUE && method_exists($controller, 'doContainerACLChecks')) {
+                $acl = $controller->doContainerACLChecks(FALSE);
+            }
             if ($controller && class_exists($filterName)) {
                 $filter = new $filterName(array(
                     array(
@@ -1085,6 +1099,9 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
                     'AND');
                 $controller::getInstance()->deleteByFilter($filter);
             }
+            if ($_ignoreAcl === TRUE && method_exists($controller, 'doContainerACLChecks')) {
+                $controller->doContainerACLChecks($acl);
+            }
         }
     }
     
@@ -1170,8 +1187,8 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
             . ' account: ' . $accountId . ' / containerId: ' . $containerId . ' / grant:' . implode('/', (array)$_grant));
         
-        $classCacheId = convertCacheId($accountId . $containerId);
-        
+        $classCacheId = Tinebase_Helper::convertCacheId($accountId . $containerId . implode('', (array)$_grant));
+
         try {
             $allGrants = $this->loadFromClassCache(__FUNCTION__, $classCacheId);
         } catch (Tinebase_Exception_NotFound $tenf) {
@@ -1272,7 +1289,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
         $containerId        = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
         $container          = ($_containerId instanceof Tinebase_Model_Container) ? $_containerId : $this->getContainerById($_containerId);
         
-        $cacheKey = convertCacheId('getGrantsOfAccount' . $containerId . $accountId . $container->seq);
+        $cacheKey = Tinebase_Helper::convertCacheId('getGrantsOfAccount' . $containerId . $accountId . $container->seq);
         $cache = Tinebase_Core::getCache();
         $grants = $cache->load($cacheKey);
         if ($grants === FALSE) {
@@ -1602,8 +1619,6 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract
      * @param string $action
      * @param string $recordId
      * @return integer new content seq
-     * 
-     * @todo clear cache? perhaps not, we have getContentSequence() for that
      */
     public function increaseContentSequence($containerId, $action = NULL, $recordId = NULL)
     {