diff --git a/includes/tuque_wrapper.inc b/includes/tuque_wrapper.inc index d14a86b3..ef2a2991 100644 --- a/includes/tuque_wrapper.inc +++ b/includes/tuque_wrapper.inc @@ -56,7 +56,7 @@ function islandora_alter_datastream(AbstractObject $object, AbstractDatastream $ } /** - * Constructs a list of hooks from the given paramenters and invokes them. + * Constructs a list of hooks from the given parameters and invokes them. */ function islandora_invoke_object_hooks($hook, array $models) { module_load_include('inc', 'islandora', 'includes/utilities'); @@ -64,7 +64,7 @@ function islandora_invoke_object_hooks($hook, array $models) { } /** - * Constructs a list of hooks from the given paramenters and invokes them. + * Constructs a list of hooks from the given parameters and invokes them. */ function islandora_invoke_datastream_hooks($hook, array $models, $dsid) { module_load_include('inc', 'islandora', 'includes/utilities'); @@ -233,6 +233,54 @@ class IslandoraFedoraObject extends FedoraObject { throw $e; } } + + /** + * Purge a datastream. + * + * Invokes datastream altered/purged hooks and calls the API-M method. + * + * @see FedoraObject::purgeObject() + */ + public function purgeDatastream($id) { + $this->populateDatastreams(); + + if (!array_key_exists($id, $this->datastreams)) { + return FALSE; + } + $context = array( + 'action' => 'purge', + 'purge' => TRUE, + 'delete' => FALSE, + 'block' => FALSE, + ); + try { + islandora_alter_datastream($this, $this[$id], $context); + $action = $context['block'] ? 'block' : FALSE; + $action = (!$action && $context['delete']) ? 'delete' : $action; + $action = !$action ? 'purge' : $action; + switch ($action) { + case 'block': + throw new Exception('Purge Datastream was blocked.'); + + case 'delete': + $this[$id]->state = 'D'; + return array(); + + default: + $to_return = parent::purgeDatastream($id); + islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_PURGED_HOOK, $this->models, $id, $this, $id); + return $to_return; + } + } + catch (Exception $e) { + watchdog('islandora', 'Failed to purge datastream @dsid from @pid
code: @code
message: @msg', array( + '@pid' => $this->id, + '@dsid' => $id, + '@code' => $e->getCode(), + '@msg' => $e->getMessage()), WATCHDOG_ERROR); + throw $e; + } + } } class IslandoraRepositoryConnection extends RepositoryConnection {} @@ -276,8 +324,10 @@ class IslandoraFedoraApiM extends FedoraApiM { ); islandora_alter_datastream($object, $datastream, $context); $params = $context['params']; - if (isset($params['lastModifiedDate'])) { - $params['lastModifiedDate'] = (string) $object[$dsid]->createdDate; + // Anything may be altered during the alter_datastream hook invocation so + // we need to update our time to the change we know about. + if (isset($params['lastModifiedDate']) && $params['lastModifiedDate'] < (string) $object->lastModifiedDate) { + $params['lastModifiedDate'] = (string) $object->lastModifiedDate; } if ($context['block']) { throw new Exception('Modify Datastream was blocked.'); @@ -305,55 +355,6 @@ class IslandoraFedoraApiM extends FedoraApiM { return parent::modifyObject($pid, $params); } - /** - * Purge a datastream from from Fedora. - * - * @see FedoraApiM::purgeDatastream - */ - public function purgeDatastream($pid, $dsid, $params = array()) { - $object = islandora_object_load($pid); - $context = array( - 'action' => 'purge', - 'purge' => TRUE, - 'delete' => FALSE, - 'block' => FALSE, - ); - islandora_alter_datastream($object, $object[$dsid], $context); - try { - $action = $context['block'] ? 'block' : FALSE; - $action = (!$action && $context['delete']) ? 'delete' : $action; - $action = !$action ? 'purge' : $action; - switch ($action) { - case 'block': - throw new Exception('Purge Datastream was blocked.'); - - case 'delete': - $object[$dsid]->state = 'D'; - return array(); - - default: - $ret = parent::purgeDatastream($pid, $dsid, $params); - // We need to remove this object from the cache and reload it as - // Tuque may not have an updated copy. That is the datastream could - // still be present within the object even though it's purged out of - // Fedora. - $tuque = islandora_get_tuque_connection(); - $tuque->cache->delete($pid); - $non_cached_object = islandora_object_load($pid); - islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_PURGED_HOOK, $non_cached_object->models, $dsid, $non_cached_object, $dsid); - return $ret; - } - } - catch (Exception $e) { - watchdog('islandora', 'Failed to purge datastream @dsid from @pid
code: @code
message: @msg', array( - '@pid' => $pid, - '@dsid' => $dsid, - '@code' => $e->getCode(), - '@msg' => $e->getMessage()), WATCHDOG_ERROR); - throw $e; - } - } - /** * Purge an object. * diff --git a/tests/includes/utilities.inc b/tests/includes/utilities.inc index 4eef5255..eefae4cc 100644 --- a/tests/includes/utilities.inc +++ b/tests/includes/utilities.inc @@ -315,7 +315,7 @@ class IslandoraTestUtilities extends IslandoraTestUtilityClass { * * @return bool * TRUE if all objects were removed, or FALSE if any of them still remained - * after removal. + * after removal. */ public function deleteUserCreatedObjects($username) { if ($username === $this->configuration['admin_user']) {