/** * Deletes the given PersistentResource from the ResourceRepository and, if the storage data is no longer used in another * PersistentResource object, also deletes the data from the storage. * * This method will also remove the PersistentResource object from the (internal) ResourceRepository. * * @param PersistentResource $resource The resource to delete * @param boolean $unpublishResource If the resource should be unpublished before deleting it from the storage * @return boolean true if the resource was deleted, otherwise FALSE * @api */ public function deleteResource(PersistentResource $resource, $unpublishResource = true) { $this->initialize(); $collectionName = $resource->getCollectionName(); $result = $this->resourceRepository->findBySha1($resource->getSha1()); if (count($result) > 1) { $this->systemLogger->log(sprintf('Not removing storage data of resource %s (%s) because it is still in use by %s other PersistentResource object(s).', $resource->getFilename(), $resource->getSha1(), count($result) - 1), LOG_DEBUG); } else { if (!isset($this->collections[$collectionName])) { $this->systemLogger->log(sprintf('Could not remove storage data of resource %s (%s) because it refers to the unknown collection "%s".', $resource->getFilename(), $resource->getSha1(), $collectionName), LOG_WARNING); return false; } $storage = $this->collections[$collectionName]->getStorage(); if (!$storage instanceof WritableStorageInterface) { $this->systemLogger->log(sprintf('Could not remove storage data of resource %s (%s) because it its collection "%s" is read-only.', $resource->getFilename(), $resource->getSha1(), $collectionName), LOG_WARNING); return false; } try { $storage->deleteResource($resource); } catch (\Exception $exception) { $this->systemLogger->log(sprintf('Could not remove storage data of resource %s (%s): %s.', $resource->getFilename(), $resource->getSha1(), $exception->getMessage()), LOG_WARNING); return false; } if ($unpublishResource) { /** @var TargetInterface $target */ $target = $this->collections[$collectionName]->getTarget(); $target->unpublishResource($resource); $this->systemLogger->log(sprintf('Removed storage data and unpublished resource %s (%s) because it not used by any other PersistentResource object.', $resource->getFilename(), $resource->getSha1()), LOG_DEBUG); } else { $this->systemLogger->log(sprintf('Removed storage data of resource %s (%s) because it not used by any other PersistentResource object.', $resource->getFilename(), $resource->getSha1()), LOG_DEBUG); } } $resource->setDeleted(); $this->resourceRepository->remove($resource); return true; }