|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* Defines functions used when constructing derivatives.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Kicks off derivative functions based upon hooks and conditions.
|
|
|
|
*
|
|
|
|
* @param AbstractObject $object
|
|
|
|
* An AbstractObject representing a FedoraObject.
|
|
|
|
* @param array $options
|
|
|
|
* An array of parameters containing:
|
|
|
|
* - force: Bool denoting whether we are forcing the generation of
|
|
|
|
* derivatives.
|
|
|
|
* - source_dsid: (Optional) String of the datastream id we are generating
|
|
|
|
* from or NULL if it's the object itself.
|
|
|
|
* - destination_dsid: (Optional) String of the datastream id that is being
|
|
|
|
* created. To be used in the UI.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
* An array of messages describing the outcome of the derivative events.
|
|
|
|
* Each individual message array has the following structure:
|
|
|
|
* - success: Bool denoting whether the operation was successful.
|
|
|
|
* - messages: An array structure containing:
|
|
|
|
* - message: A string passed through t() describing the
|
|
|
|
* outcome of the operation.
|
|
|
|
* - message_sub: (Optional) Substitutions to be passed along to t() or
|
|
|
|
* watchdog.
|
|
|
|
* - type: A string denoting whether the output is to be
|
|
|
|
* drupal_set_messaged (dsm) or watchdogged (watchdog).
|
|
|
|
* - severity: (Optional) A severity level / status to be used when
|
|
|
|
* logging messages. Uses the defaults of drupal_set_message and
|
|
|
|
* watchdog if not defined.
|
|
|
|
*/
|
|
|
|
function islandora_do_derivatives(AbstractObject $object, array $options) {
|
|
|
|
module_load_include('inc', 'islandora', 'includes/utilities');
|
|
|
|
$options += array(
|
|
|
|
'force' => FALSE,
|
|
|
|
);
|
|
|
|
$hooks = islandora_invoke_hook_list(ISLANDORA_DERVIATIVE_CREATION_HOOK, $object->models, array($object));
|
|
|
|
uasort($hooks, 'drupal_sort_weight');
|
|
|
|
$results = array();
|
|
|
|
$hooks = islandora_filter_derivatives($hooks, $options, $object);
|
|
|
|
|
|
|
|
foreach ($hooks as $hook) {
|
|
|
|
if (isset($hook['file'])) {
|
|
|
|
require_once $hook['file'];
|
|
|
|
}
|
|
|
|
foreach ($hook['function'] as $function) {
|
|
|
|
if (function_exists($function)) {
|
|
|
|
$logging = call_user_func($function, $object, $options['force'], $hook);
|
|
|
|
if (!empty($logging)) {
|
|
|
|
$results[] = $logging;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
watchdog('islandora', 'Unable to call derivative function @function as it was not found!', array('@function' => $function), WATCHDOG_ERROR);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $results;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles the logging of derivative messages.
|
|
|
|
*
|
|
|
|
* @param array $logging_results
|
|
|
|
* An array of messages describing the outcome of the derivative events.
|
|
|
|
* Each individual message array has the following structure:
|
|
|
|
* - success: Bool denoting whether the operation was successful.
|
|
|
|
* - messages: An array structure containing:
|
|
|
|
* - message: A string passed through t() describing the
|
|
|
|
* outcome of the operation.
|
|
|
|
* - message_sub: (Optional) Substitutions to be passed along to t() or
|
|
|
|
* watchdog.
|
|
|
|
* - type: A string denoting whether the output is to be
|
|
|
|
* drupal_set_messaged (dsm) or watchdogged (watchdog).
|
|
|
|
* - severity: (Optional) A severity level / status to be used when
|
|
|
|
* logging messages. Uses the defaults of drupal_set_message and
|
|
|
|
* watchdog if not defined.
|
|
|
|
*/
|
|
|
|
function islandora_derivative_logging(array $logging_results) {
|
|
|
|
foreach ($logging_results as $result) {
|
|
|
|
foreach ($result['messages'] as $message) {
|
|
|
|
if ($message['type'] === 'dsm') {
|
|
|
|
if (isset($message['severity']) && $message['severity'] != 'status') {
|
|
|
|
drupal_set_message(filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array())), $message['severity']);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (!isset($_SESSION['islandora_event_messages'])) {
|
|
|
|
$_SESSION['islandora_event_messages'] = array();
|
|
|
|
}
|
|
|
|
$_SESSION['islandora_event_messages'][] = array(
|
|
|
|
'message' => filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array())),
|
|
|
|
'severity' => 'status',
|
|
|
|
);
|
|
|
|
drupal_set_message(l(t('Derivatives successfully created.'), 'islandora/event-status'), 'status', FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// We know what we are doing here. Passing through the translated
|
|
|
|
// message and the substitutions needed. We are using
|
|
|
|
// call_user_func until such time as the @ignore changes
|
|
|
|
// are merged into the standard release for Coder.
|
|
|
|
call_user_func('watchdog', 'islandora_derivatives', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), isset($message['severity']) ? $message['severity'] : WATCHDOG_NOTICE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Kicks off derivative functions based upon hooks and conditions.
|
|
|
|
*
|
|
|
|
* @param AbstractObject $object
|
|
|
|
* An AbstractObject representing a FedoraObject.
|
|
|
|
* @param array $options
|
|
|
|
* An array of parameters containing:
|
|
|
|
* - force: Bool denoting whether we are forcing the generation of
|
|
|
|
* derivatives.
|
|
|
|
* - source_dsid: (Optional) String of the datastream id we are generating
|
|
|
|
* from or NULL if it's the object itself.
|
|
|
|
* - destination_dsid: (Optional) String of the datastream id that is being
|
|
|
|
* created. To be used in the UI.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
* An array of operations to be called from within a batch.
|
|
|
|
*/
|
|
|
|
function islandora_do_batch_derivatives(AbstractObject $object, array $options) {
|
|
|
|
module_load_include('inc', 'islandora', 'includes/utilities');
|
|
|
|
$options += array(
|
|
|
|
'force' => FALSE,
|
|
|
|
);
|
|
|
|
$hooks = islandora_invoke_hook_list(ISLANDORA_DERVIATIVE_CREATION_HOOK, $object->models, array($object));
|
|
|
|
uasort($hooks, 'drupal_sort_weight');
|
|
|
|
$operations = array();
|
|
|
|
|
|
|
|
$hooks = islandora_filter_derivatives($hooks, $options, $object);
|
|
|
|
foreach ($hooks as $hook) {
|
|
|
|
$file = FALSE;
|
|
|
|
if (isset($hook['file'])) {
|
|
|
|
$file = $hook['file'];
|
|
|
|
}
|
|
|
|
foreach ($hook['function'] as $function) {
|
|
|
|
$operations[] = array(
|
|
|
|
'islandora_derivative_perform_batch_operation',
|
|
|
|
array(
|
|
|
|
$function,
|
|
|
|
$file,
|
|
|
|
$object->id,
|
|
|
|
$options['force'],
|
|
|
|
$hook,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $operations;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Filter the derivative functions to only call those which are valid.
|
|
|
|
*
|
|
|
|
* @param array $hooks
|
|
|
|
* An array of hooks to be filtered depending on options.
|
|
|
|
* @param array $options
|
|
|
|
* An array of options for the derivative generation.
|
|
|
|
* @param AbstractObject $object
|
|
|
|
* An AbstractObject representing an object within Fedora.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
* Returns the filtered array of hooks to be ran.
|
|
|
|
*/
|
|
|
|
function islandora_filter_derivatives($hooks, $options, AbstractObject $object) {
|
|
|
|
if (array_key_exists('source_dsid', $options)) {
|
|
|
|
$hooks = array_filter($hooks, function ($filter_hook) use ($options) {
|
|
|
|
return array_key_exists('source_dsid', $filter_hook) &&
|
|
|
|
$filter_hook['source_dsid'] == $options['source_dsid'];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (array_key_exists('destination_dsid', $options)) {
|
|
|
|
$hooks = array_filter($hooks, function ($filter_hook) use ($options) {
|
|
|
|
return array_key_exists('destination_dsid', $filter_hook) &&
|
|
|
|
$filter_hook['destination_dsid'] == $options['destination_dsid'];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// Do a final filtering to make sure that the source DSID exists on the object
|
|
|
|
// where needed. Using a defined function as opposed to the way above as
|
|
|
|
// it seems to break PHPCS as of 1.4.8.
|
|
|
|
$filter_function = function ($filter_hook) use ($object) {
|
|
|
|
$to_return = FALSE;
|
|
|
|
if (array_key_exists('source_dsid', $filter_hook)) {
|
|
|
|
if ($filter_hook['source_dsid'] != NULL) {
|
|
|
|
if (isset($object[$filter_hook['source_dsid']])) {
|
|
|
|
$to_return = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$to_return = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $to_return;
|
|
|
|
};
|
|
|
|
$hooks = array_filter($hooks, $filter_function);
|
|
|
|
return $hooks;
|
|
|
|
}
|