|
|
|
@ -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</br>code: @code<br/>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</br>code: @code<br/>message: @msg', array( |
|
|
|
|
'@pid' => $pid, |
|
|
|
|
'@dsid' => $dsid, |
|
|
|
|
'@code' => $e->getCode(), |
|
|
|
|
'@msg' => $e->getMessage()), WATCHDOG_ERROR); |
|
|
|
|
throw $e; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Purge an object. |
|
|
|
|
* |
|
|
|
|