/**
  * propagate changes
  */
 public function propagate()
 {
     $updater = $this->getUpdater();
     if (!$updater) {
         return;
     }
     $updater->propagate($this->backend->getId(), $this->getPrivateUri(), $this->getUserId());
 }
 /**
  * @param IBackend $backend
  * @param string $privateUri
  * @param string $userId
  * @return null|ICalendar
  */
 protected function getRemoteAndDeleteIfNecessary(IBackend $backend, $privateUri, $userId)
 {
     $calendarAPI = $backend->getCalendarAPI();
     $msg = 'CalendarManager \'' . $backend->getId() . '\'::';
     $msg .= '\'' . $privateUri . '\' of \'' . $userId . '\'';
     try {
         return $calendarAPI->find($privateUri, $userId);
     } catch (DoesNotExistException $ex) {
         $msg .= 'is not available, deleting from cache';
         $this->logger->debug($msg);
         $this->removeFromCache($backend->getId(), $privateUri, $userId);
         return null;
     } catch (MultipleObjectsReturnedException $ex) {
         $msg .= 'available multiple times (please check backend!) ';
         $msg .= 'deleting from cache';
         $this->logger->debug($msg);
         $this->removeFromCache($backend->getId(), $privateUri, $userId);
         return null;
     } catch (TemporarilyNotAvailableException $ex) {
         $msg .= 'temporarily not available, skipping for now';
         $this->logger->debug($msg);
         return null;
     } catch (CorruptDataException $ex) {
         $msg .= 'is corrupted on backend, deleting from cache';
         $this->logger->debug($msg);
         $this->removeFromCache($backend->getId(), $privateUri, $userId);
         return null;
     }
 }