From b482b405303d1e2a97f1d3196ee53eb5712a88fa Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Mon, 5 Aug 2013 16:55:45 +0000 Subject: [PATCH 01/13] Initial commit for feedback. --- islandora.module | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/islandora.module b/islandora.module index 8a8ee6be..b8109a21 100644 --- a/islandora.module +++ b/islandora.module @@ -52,6 +52,7 @@ define('ISLANDORA_DATASTREAM_INGESTED_HOOK', 'islandora_datastream_ingested'); define('ISLANDORA_DATASTREAM_MODIFIED_HOOK', 'islandora_datastream_modified'); define('ISLANDORA_DATASTREAM_PURGED_HOOK', 'islandora_datastream_purged'); define('ISLANDORA_INGEST_STEP_HOOK', 'islandora_ingest_steps'); +define('ISLANDORA_DERVIATIVE_CREATION_HOOK', 'islandora_derivative'); // Autocomplete paths. define('ISLANDORA_CONTENT_MODELS_AUTOCOMPLETE', 'islandora/autocomplete/content-models'); @@ -1415,3 +1416,36 @@ function islandora_islandora_basic_collection_get_query_filters() { )); } } + +/** + * Implements hook_islandora_datastream_ingested(). + */ +function islandora_islandora_datastream_ingested(AbstractObject $object, AbstractDatastream $datastream) { + $logging_results = islandora_do_derivatives($object); + dd($logging_results, 'logging'); + foreach ($logging_results as $result) { + + } +} + +function islandora_do_derivatives(AbstractObject $object, $force = FALSE, $all = TRUE) { + $hooks = islandora_invoke_hook_list(ISLANDORA_DERVIATIVE_CREATION_HOOK, $object->models, array()); + uasort($hooks, 'drupal_sort_weight'); + $results = array(); + dd($hooks, 'hooks'); + foreach ($hooks as $hook) { + if (!$all && !isset($hook['source_dsid'])) { + continue; + } + if (isset($hook['file'])) { + require_once($hook['file']); + } + foreach ($hook['function'] as $function) { + $logging = call_user_func($function, $object, $force); + if (!empty($logging)) { + $results[] = $logging; + } + } + } + return $results; +} \ No newline at end of file From 5bafbd8151986410929a33e7fe2607a0c8a45694 Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Wed, 7 Aug 2013 13:40:14 +0000 Subject: [PATCH 02/13] Updated with tests. --- islandora.info | 1 + islandora.module | 66 +++++++-- tests/derivatives.test | 185 ++++++++++++++++++++++++ tests/islandora_derivatives_test.info | 7 + tests/islandora_derivatives_test.module | 114 +++++++++++++++ 5 files changed, 362 insertions(+), 11 deletions(-) create mode 100644 tests/derivatives.test create mode 100644 tests/islandora_derivatives_test.info create mode 100644 tests/islandora_derivatives_test.module diff --git a/islandora.info b/islandora.info index fea3ead2..4b48bc29 100644 --- a/islandora.info +++ b/islandora.info @@ -18,4 +18,5 @@ files[] = tests/ingest.test files[] = tests/hooked_access.test files[] = tests/islandora_manage_permissions.test files[] = tests/datastream_versions.test +files[] = tests/derivatives.test php = 5.3 diff --git a/islandora.module b/islandora.module index b8109a21..989dd36e 100644 --- a/islandora.module +++ b/islandora.module @@ -1421,31 +1421,75 @@ function islandora_islandora_basic_collection_get_query_filters() { * Implements hook_islandora_datastream_ingested(). */ function islandora_islandora_datastream_ingested(AbstractObject $object, AbstractDatastream $datastream) { - $logging_results = islandora_do_derivatives($object); - dd($logging_results, 'logging'); - foreach ($logging_results as $result) { + $logging_results = islandora_do_derivatives($object, array( + 'source_dsid' => $datastream->id, + )); + islandora_derivative_logging($logging_results); +} - } +/** + * Implements hook_islandora_datastream_modified(). + */ +function islandora_islandora_datastream_modified(AbstractObject $object, AbstractDatastream $datastream) { + $logging_results = islandora_do_derivatives($object, array( + 'source_dsid' => $datastream->id, + 'force' => TRUE, + )); + islandora_derivative_logging($logging_results); } -function islandora_do_derivatives(AbstractObject $object, $force = FALSE, $all = TRUE) { +function islandora_do_derivatives(AbstractObject $object, array $options = array()) { + $options += array( + 'force' => FALSE, + 'source_dsid' => NULL, + 'destination_dsid' => NULL, + ); $hooks = islandora_invoke_hook_list(ISLANDORA_DERVIATIVE_CREATION_HOOK, $object->models, array()); uasort($hooks, 'drupal_sort_weight'); $results = array(); - dd($hooks, 'hooks'); + + if ($options['source_dsid'] !== NULL) { + $hooks = array_filter($hooks, function($filter_hook) use($options) { + return !isset($filter_hook['source_dsid']) || + (isset($filter_hook['source_dsid']) && $filter_hook['source_dsid'] == $options['source_dsid']); + }); + } + if ($options['destination_dsid'] !== NULL) { + $hooks = array_filter($hooks, function($filter_hook) use($options) { + return !isset($filter_hook['destination_dsid']) || + (isset($filter_hook['destination_dsid']) && $filter_hook['destination_dsid'] == $options['destination_dsid']); + }); + } + dd($hooks, 'hooooooks'); foreach ($hooks as $hook) { - if (!$all && !isset($hook['source_dsid'])) { - continue; - } if (isset($hook['file'])) { - require_once($hook['file']); + require_once $hook['file']; } foreach ($hook['function'] as $function) { - $logging = call_user_func($function, $object, $force); + $logging = call_user_func($function, $object, $options['force']); if (!empty($logging)) { $results[] = $logging; } } } return $results; +} + +function islandora_derivative_logging(array $logging_results) { + foreach ($logging_results as $result) { + foreach ($result['messages'] as $message) { + if ($message['type'] >= WATCHDOG_WARNING) { + if ($message['type'] == WATCHDOG_WARNING) { + $status = 'warning'; + } + else { + $status = 'status'; + } + drupal_set_message(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array()), $status); + } + else { + watchdog('islandora', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), $message['type']); + } + } + } } \ No newline at end of file diff --git a/tests/derivatives.test b/tests/derivatives.test new file mode 100644 index 00000000..a98753f7 --- /dev/null +++ b/tests/derivatives.test @@ -0,0 +1,185 @@ + 'Islandora Derivative Generation', + 'description' => 'Ensure that the derivative generation hooks return appropriate results.', + 'group' => 'Islandora', + ); + } + + /** + * Creates an admin user and a connection to a fedora repository. + * + * @see IslandoraWebTestCase::setUp() + */ + public function setUp() { + parent::setUp( + array( + 'islandora_derivatives_test', + ) + ); + $url = variable_get('islandora_base_url', 'http://localhost:8080/fedora'); + $this->connection = new RepositoryConnection($url, $this->admin->name, $this->admin->pass); + $this->connection->reuseConnection = TRUE; + $this->api = new FedoraApi($this->connection); + $this->cache = new SimpleCache(); + $this->repository = new FedoraRepository($this->api, $this->cache); + $this->pid = $this->randomName() . ":" . $this->randomName(); + } + + /** + * Free any objects/resources created for this test. + * + * @see IslandoraWebTestCase::tearDown() + */ + public function tearDown() { + $tuque = islandora_get_tuque_connection(); + parent::tearDown(); + } + + public function testDerivativeOnIngest() { + global $ingest_method; + $ingest_method = 'modifyDatastream'; + $tuque = islandora_get_tuque_connection(); + $object = $tuque->repository->constructObject($this->pid); + $object->models = array( + 'some:cmodel', + ); + $dsid = 'OBJ'; + $ds = $object->constructDatastream($dsid); + $ds->label = 'Test'; + $ds->content = 'test'; + $object->ingestDatastream($ds); + $tuque->repository->ingestObject($object); + $this->assertDatastreams($object, array( + 'RELS-EXT', + 'DC', + 'OBJ', + 'DERIV', + )); + $this->assertEqual('ingestDatastream', $ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('test some string', $object['DERIV']->content, 'The expected content of the DERIV datastream is "test some string", got "' . $object['DERIV']->content . '".'); + } + + public function testDerivativeOnForceExistingDatastream() { + global $ingest_method; + $ingest_method = 'ingestDatastream'; + $object = $this->constructBaseObject(); + $this->constructDERIVDatastream($object); + $islandora_object = islandora_object_load($this->pid); + islandora_do_derivatives($islandora_object, array( + 'force' => TRUE, + )); + $this->assertEqual('modifyDatastream', $ingest_method, 'The expected ingest method is "modifyDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('FORCEFULLY APPENDING CONTENT TO test', $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO test", got "' . $islandora_object['DERIV']->content . '".'); + } + + public function testDerivativeOnForceNonExistingDatastream() { + global $ingest_method; + $ingest_method = 'modifyDatastream'; + $this->constructBaseObject(); + $object = islandora_object_load($this->pid); + islandora_do_derivatives($object, array( + 'force' => TRUE, + )); + $this->assertEqual('ingestDatastream', $ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('FORCEFULLY APPENDING CONTENT TO test', $object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO test", got "' . $object['DERIV']->content . '".'); + } + + public function testDerivativeOnModifyExistingDatastream() { + global $ingest_method; + $ingest_method = 'ingestDatastream'; + $object = $this->constructBaseObject(); + $this->constructDERIVDatastream($object); + $connection = islandora_get_tuque_connection(); + $connection->cache->resetCache(); + $islandora_object = islandora_object_load($this->pid); + $changed_content = 'islandora beast'; + $islandora_object['OBJ']->content = $changed_content; + $this->assertEqual('modifyDatastream', $ingest_method, 'The expected ingest method is "modifyDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('FORCEFULLY APPENDING CONTENT TO ' . $changed_content, $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO islandora beast", got "' . $islandora_object['DERIV']->content . '".'); + } + + public function testDerivativeOnModifyNonExistingDatastream() { + global $ingest_method; + $ingest_method = 'modifyDatastream'; + $this->constructBaseObject(); + // Need to do this as Tuque caches. + $connection = islandora_get_tuque_connection(); + $connection->cache->resetCache(); + $islandora_object = islandora_object_load($this->pid); + $changed_content = 'islandora beast'; + $islandora_object['OBJ']->content = $changed_content; + $this->assertEqual('ingestDatastream', $ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('FORCEFULLY APPENDING CONTENT TO ' . $changed_content, $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO islandora beast", got "' . $islandora_object['DERIV']->content . '".'); + } + + public function testDerivativeFilteringOnSourceDSID() { + global $derivative_functions; + $derivative_functions = array(); + $this->constructBaseObject(); + $object = islandora_object_load($this->pid); + islandora_do_derivatives($object, array( + 'source_dsid' => 'OBJ', + )); + $this->assertEqual(1, count($derivative_functions), 'Expected 1 derivative function for the source_dsid of "OBJ", got ' . count($derivative_functions) . '.'); + $called_function = (string) reset($derivative_functions); + $this->assertEqual('islandora_derivatives_test_create_deriv_datastream', $called_function, 'Expected derivative function is "islandora_derivatives_test_create_deriv_datastream", got "' . $called_function . '".'); + + // Reset the derivative functions array as we are going to use it again. + $derivative_functions = array(); + islandora_do_derivatives($object, array( + 'source_dsid' => 'SOMEWEIRDDATASTREAM', + )); + $this->assertEqual(1, count($derivative_functions), 'Expected 1 derivative function for the source_dsid of "SOMEWEIRDDATASTREAM", got ' . count($derivative_functions) . '.'); + $called_function = (string) reset($derivative_functions); + $this->assertEqual('islandora_derivatives_test_create_some_weird_datastream', $called_function, 'Expected derivative function is "islandora_derivatives_test_create_some_weird_datastream", got "' . $called_function . '".'); + } + + /** + * Helper function that will construct a base object. + */ + public function constructBaseObject() { + $object = $this->repository->constructObject($this->pid); + $object->models = array( + 'some:cmodel', + ); + $dsid = 'OBJ'; + $ds = $object->constructDatastream($dsid); + $ds->label = 'Test'; + $ds->content = 'test'; + $object->ingestDatastream($ds); + $this->repository->ingestObject($object); + return $object; + } + + public function constructDERIVDatastream(AbstractObject $object) { + $dsid = 'DERIV'; + $ds = $object->constructDatastream($dsid); + $ds->label = 'Test'; + $ds->content = 'test'; + $object->ingestDatastream($ds); + return $object; + } + + } + diff --git a/tests/islandora_derivatives_test.info b/tests/islandora_derivatives_test.info new file mode 100644 index 00000000..338b39fe --- /dev/null +++ b/tests/islandora_derivatives_test.info @@ -0,0 +1,7 @@ +name = Islandora Derivatives Generation testing +description = Tests derivative generation hooks. Do not enable. +core = 7.x +package = Testing +hidden = TRUE +files[] = islandora_derivatives_test.module +dependencies[] = islandora diff --git a/tests/islandora_derivatives_test.module b/tests/islandora_derivatives_test.module new file mode 100644 index 00000000..36b6380c --- /dev/null +++ b/tests/islandora_derivatives_test.module @@ -0,0 +1,114 @@ + 'OBJ', + 'destination_dsid' => 'DERIV', + 'weight' => '0', + 'function' => array( + 'islandora_derivatives_test_create_deriv_datastream', + ), + ), + array( + 'source_dsid' => 'SOMEWEIRDDATASTREAM', + 'destination_dsid' => 'STANLEY', + 'weight' => '-1', + 'function' => array( + 'islandora_derivatives_test_create_some_weird_datastream', + ), + ), + ); +} + +function islandora_derivatives_test_create_deriv_datastream(AbstractObject $object, $force = FALSE) { + global $derivative_functions; + $derivative_functions[] = 'islandora_derivatives_test_create_deriv_datastream'; + $return = ''; + if (!isset($object['DERIV']) || (isset($object['DERIV']) && $force === TRUE)) { + if ($force !== TRUE) { + $deriv_string = $object['OBJ']->content . ' some string'; + } + else { + $deriv_string = "FORCEFULLY APPENDING CONTENT TO " . $object['OBJ']->content; + } + $added_successfully = islandora_derivatives_test_add_datastream($object, 'DERIV', $deriv_string); + if ($added_successfully !== TRUE) { + $return = islandora_derivatives_test_failed_adding($added_successfully); + } + else { + $return = array( + 'success' => TRUE, + 'messages' => array( + array( + 'message' => t('The DERIV datastream was added successfully for @pid!'), + 'message_sub' => array('@pid' => $object->id), + 'type' => WATCHDOG_INFO, + ), + ), + ); + } + return $return; + } +} + +/** + * Stub function that should never actually get called because of DSID filtering. + * + * @param AbstractObject $object + * An AbstractObject representing a Fedora object. + * @param bool $force + * Whether the derivatives are being forcefully generated or not. + */ +function islandora_derivatives_test_create_some_weird_datastream(AbstractObject $object, $force = FALSE) { + global $derivative_functions; + // Add to the global that we got to this function. + $derivative_functions[] = 'islandora_derivatives_test_create_some_weird_datastream'; +} + +function islandora_derivatives_test_add_datastream(AbstractObject $object, $dsid, $deriv_string) { + global $ingest_method; + try { + $ingest = !isset($object[$dsid]); + if ($ingest) { + $ds = $object->constructDatastream($dsid, 'M'); + $ds->label = $dsid; + } + else { + $ds = $object[$dsid]; + } + $ds->content = $deriv_string; + if ($ingest) { + $ingest_method = 'ingestDatastream'; + $object->ingestDatastream($ds); + } + else { + $ingest_method = 'modifyDatastream'; + } + return TRUE; + } + catch (exception $e) { + $message = $e->getMessage(); + return $message; + } +} + +function islandora_derivatives_test_failed_adding($message) { + return array( + 'success' => FALSE, + 'messages' => array( + array( + 'message' => $message, + 'type' => WATCHDOG_ERROR, + ), + ), + ); +} \ No newline at end of file From 30143772f53cafe9193a35865490203fbb8a6dab Mon Sep 17 00:00:00 2001 From: William Panting Date: Wed, 7 Aug 2013 12:49:48 -0300 Subject: [PATCH 03/13] documenting some hooks --- islandora.api.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/islandora.api.php b/islandora.api.php index 4d54a00f..d6867c91 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -541,3 +541,34 @@ function hook_islandora_datastream_access($op, $object, $user) { */ function hook_CMODEL_PID_islandora_datastream_access($op, $object, $user) { } + +/** + * Lets one add to the overview tab in object management. + */ +function hook_islandora_overview_object(AbstractObject $object) { + return drupal_render(drupal_get_form('some_form', $object)); +} + +/** + * Lets one add to the overview tab in object management. + * + * Content model specific. + */ +function hook_CMODEL_PID_islandora_overview_object(AbstractObject $object) { + return drupal_render(drupal_get_form('some_form', $object)); +} +/** + * Lets one alter the overview tab in object management. + */ +function hook_islandora_overview_object_alter(AbstractObject &$object, &$output) { + $output = $output . drupal_render(drupal_get_form('some_form', $object)); +} + +/** + * Lets one alter the overview tab in object management. + * + * Content model specific. + */ +function hook_CMODEL_PID_islandora_overview_object_alter(AbstractObject &$object, &$output) { + $output = $output . drupal_render(drupal_get_form('some_form', $object)); +} From 82da5d74ff3c526f6bd89f4270da130c8fb66e66 Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Wed, 7 Aug 2013 18:34:30 +0000 Subject: [PATCH 04/13] Restructuring to the derivate process, documentation, more tests. --- includes/derivatives.inc | 101 ++++++++++++++ islandora.api.php | 72 ++++++++++ islandora.module | 81 ++++-------- tests/derivatives.test | 169 ++++++++++++++++++++---- tests/islandora_derivatives_test.module | 112 ++++++++++++++-- 5 files changed, 438 insertions(+), 97 deletions(-) create mode 100644 includes/derivatives.inc diff --git a/includes/derivatives.inc b/includes/derivatives.inc new file mode 100644 index 00000000..f5058588 --- /dev/null +++ b/includes/derivatives.inc @@ -0,0 +1,101 @@ + FALSE, + ); + $hooks = islandora_invoke_hook_list(ISLANDORA_DERVIATIVE_CREATION_HOOK, $object->models, array()); + uasort($hooks, 'drupal_sort_weight'); + $results = array(); + + 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']; + }); + } + + foreach ($hooks as $hook) { + if (isset($hook['file'])) { + require_once $hook['file']; + } + foreach ($hook['function'] as $function) { + $logging = call_user_func($function, $object, $options['force']); + if (!empty($logging)) { + $results[] = $logging; + } + } + } + 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') { + drupal_set_message(filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array()), isset($message['severity']) ? $message['severity'] : 'status')); + } + else { + watchdog('islandora', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), isset($message['severity']) ? $message['severity'] : WATCHDOG_NOTICE); + } + } + } +} diff --git a/islandora.api.php b/islandora.api.php index 129787f4..74bdef81 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -519,3 +519,75 @@ function hook_islandora_datastream_access($op, $object, $user) { */ function hook_CMODEL_PID_islandora_datastream_access($op, $object, $user) { } + +/** + * Defines derivative functions to be executed based on certain conditions. + * + * This hook fires when an object/datastream is ingested or a datastream is + * modified. + * + * @return array + * An array containing an entry for each derivative to be created. Each entry + * is 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. + * - weight: A string denoting the weight of the function. This value is + * sorted upon to run functions in order. + * - function: An array of function(s) to be ran when constructing + * derivatives. Functions that are defined to be called for derivation + * creation must have the following structure: + * module_name_derivative_creation_function($object, $force = FALSE) + * These functions must return an array in the structure of: + * - 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 hook_islandora_derivative() { + return array( + array( + 'source_dsid' => 'OBJ', + 'destination_dsid' => 'DERIV', + 'weight' => '0', + 'function' => array( + 'islandora_derivatives_test_create_deriv_datastream', + ), + ), + array( + 'source_dsid' => 'SOMEWEIRDDATASTREAM', + 'destination_dsid' => 'STANLEY', + 'weight' => '-1', + 'function' => array( + 'islandora_derivatives_test_create_some_weird_datastream', + ), + ), + array( + 'source_dsid' => NULL, + 'destination_dsid' => 'NOSOURCE', + 'weight' => '-3', + 'function' => array( + 'islandora_derivatives_test_create_nosource_datastream', + ), + ), + ); +} + +/** + * Content model specific version of hook_islandora_derivative(). + * + * @see hook_islandora_derivative() + */ +function hook_CMODEL_PID_islandora_derivative() { + +} \ No newline at end of file diff --git a/islandora.module b/islandora.module index 989dd36e..9bec87c7 100644 --- a/islandora.module +++ b/islandora.module @@ -1417,10 +1417,30 @@ function islandora_islandora_basic_collection_get_query_filters() { } } + +/** + * Implements hook_islandora_object_ingested(). + * + * On object ingestion we call the case of source_dsid being NULL only as + * the islandora_islandora_datastream_ingested hook will handle the cases + * where specific values of source_dsid can occur. + */ +function islandora_islandora_object_ingested(AbstractObject $object) { + module_load_include('inc', 'islandora', 'includes/derivatives'); + $logging_results = islandora_do_derivatives($object, array( + 'source_dsid' => NULL, + )); + islandora_derivative_logging($logging_results); +} + /** * Implements hook_islandora_datastream_ingested(). + * + * When a datastream is ingested we filter the derivatives on source_dsid being + * equal to the current ingested datastream's id. */ function islandora_islandora_datastream_ingested(AbstractObject $object, AbstractDatastream $datastream) { + module_load_include('inc', 'islandora', 'includes/derivatives'); $logging_results = islandora_do_derivatives($object, array( 'source_dsid' => $datastream->id, )); @@ -1429,67 +1449,16 @@ function islandora_islandora_datastream_ingested(AbstractObject $object, Abstrac /** * Implements hook_islandora_datastream_modified(). + * + * When a datastream is modified we filter the derivatives on source_dsid being + * equal to the current ingested datastream's id. Force is set to TRUE such that + * existing derivatives will be updated to reflect the change in the source. */ function islandora_islandora_datastream_modified(AbstractObject $object, AbstractDatastream $datastream) { + module_load_include('inc', 'islandora', 'includes/derivatives'); $logging_results = islandora_do_derivatives($object, array( 'source_dsid' => $datastream->id, 'force' => TRUE, )); islandora_derivative_logging($logging_results); } - -function islandora_do_derivatives(AbstractObject $object, array $options = array()) { - $options += array( - 'force' => FALSE, - 'source_dsid' => NULL, - 'destination_dsid' => NULL, - ); - $hooks = islandora_invoke_hook_list(ISLANDORA_DERVIATIVE_CREATION_HOOK, $object->models, array()); - uasort($hooks, 'drupal_sort_weight'); - $results = array(); - - if ($options['source_dsid'] !== NULL) { - $hooks = array_filter($hooks, function($filter_hook) use($options) { - return !isset($filter_hook['source_dsid']) || - (isset($filter_hook['source_dsid']) && $filter_hook['source_dsid'] == $options['source_dsid']); - }); - } - if ($options['destination_dsid'] !== NULL) { - $hooks = array_filter($hooks, function($filter_hook) use($options) { - return !isset($filter_hook['destination_dsid']) || - (isset($filter_hook['destination_dsid']) && $filter_hook['destination_dsid'] == $options['destination_dsid']); - }); - } - dd($hooks, 'hooooooks'); - foreach ($hooks as $hook) { - if (isset($hook['file'])) { - require_once $hook['file']; - } - foreach ($hook['function'] as $function) { - $logging = call_user_func($function, $object, $options['force']); - if (!empty($logging)) { - $results[] = $logging; - } - } - } - return $results; -} - -function islandora_derivative_logging(array $logging_results) { - foreach ($logging_results as $result) { - foreach ($result['messages'] as $message) { - if ($message['type'] >= WATCHDOG_WARNING) { - if ($message['type'] == WATCHDOG_WARNING) { - $status = 'warning'; - } - else { - $status = 'status'; - } - drupal_set_message(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array()), $status); - } - else { - watchdog('islandora', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), $message['type']); - } - } - } -} \ No newline at end of file diff --git a/tests/derivatives.test b/tests/derivatives.test index a98753f7..13014880 100644 --- a/tests/derivatives.test +++ b/tests/derivatives.test @@ -34,7 +34,7 @@ class IslandoraDerivativesTestCase extends IslandoraWebTestCase { public function setUp() { parent::setUp( array( - 'islandora_derivatives_test', + 'islandora_derivatives_test', ) ); $url = variable_get('islandora_base_url', 'http://localhost:8080/fedora'); @@ -56,9 +56,12 @@ class IslandoraDerivativesTestCase extends IslandoraWebTestCase { parent::tearDown(); } + /** + * Tests that the islandora_islandora_object_ingested hook gets fired. + */ public function testDerivativeOnIngest() { - global $ingest_method; - $ingest_method = 'modifyDatastream'; + global $_islandora_derivative_test_ingest_method; + $_islandora_derivative_test_ingest_method = 'modifyDatastream'; $tuque = islandora_get_tuque_connection(); $object = $tuque->repository->constructObject($this->pid); $object->models = array( @@ -75,53 +78,70 @@ class IslandoraDerivativesTestCase extends IslandoraWebTestCase { 'DC', 'OBJ', 'DERIV', + 'NOSOURCE', )); - $this->assertEqual('ingestDatastream', $ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('ingestDatastream', $_islandora_derivative_test_ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $_islandora_derivative_test_ingest_method . '".'); $this->assertEqual('test some string', $object['DERIV']->content, 'The expected content of the DERIV datastream is "test some string", got "' . $object['DERIV']->content . '".'); + $this->assertEqual('NOSOURCE', $object['NOSOURCE']->content, 'The expected content of the NOSOURCE datastream is "NOSOURCE", got "' . $object['NOSOURCE']->content . '".'); + } - public function testDerivativeOnForceExistingDatastream() { - global $ingest_method; - $ingest_method = 'ingestDatastream'; + /** + * Tests the ingest method when when forcing on existing datastreams. + */ + public function testDerivativeOnForceExistingDatastream() { + global $_islandora_derivative_test_ingest_method; + $_islandora_derivative_test_ingest_method = 'ingestDatastream'; $object = $this->constructBaseObject(); - $this->constructDERIVDatastream($object); + $object = $this->constructDERIVDatastream($object); + $this->constructNOSOURCEDatastream($object); $islandora_object = islandora_object_load($this->pid); islandora_do_derivatives($islandora_object, array( 'force' => TRUE, )); - $this->assertEqual('modifyDatastream', $ingest_method, 'The expected ingest method is "modifyDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('modifyDatastream', $_islandora_derivative_test_ingest_method, 'The expected ingest method is "modifyDatastream", got "' . $_islandora_derivative_test_ingest_method . '".'); $this->assertEqual('FORCEFULLY APPENDING CONTENT TO test', $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO test", got "' . $islandora_object['DERIV']->content . '".'); } + /** + * Tests the ingest method when forcing on non-existing datastreams. + */ public function testDerivativeOnForceNonExistingDatastream() { - global $ingest_method; - $ingest_method = 'modifyDatastream'; + global $_islandora_derivative_test_ingest_method; + $_islandora_derivative_test_ingest_method = 'modifyDatastream'; $this->constructBaseObject(); $object = islandora_object_load($this->pid); islandora_do_derivatives($object, array( 'force' => TRUE, )); - $this->assertEqual('ingestDatastream', $ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $ingest_method . '".'); - $this->assertEqual('FORCEFULLY APPENDING CONTENT TO test', $object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO test", got "' . $object['DERIV']->content . '".'); + $this->assertEqual('ingestDatastream', $_islandora_derivative_test_ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $_islandora_derivative_test_ingest_method . '".'); + $this->assertEqual('test some string', $object['DERIV']->content, 'The expected content of the DERIV datastream is "test some string", got "' . $object['DERIV']->content . '".'); } + /** + * Tests the islandora_datastream_modified hook when there are existing DSes. + */ public function testDerivativeOnModifyExistingDatastream() { - global $ingest_method; - $ingest_method = 'ingestDatastream'; + global $_islandora_derivative_test_ingest_method; + $_islandora_derivative_test_ingest_method = 'ingestDatastream'; $object = $this->constructBaseObject(); $this->constructDERIVDatastream($object); + // Need to do this as Tuque caches. $connection = islandora_get_tuque_connection(); $connection->cache->resetCache(); $islandora_object = islandora_object_load($this->pid); $changed_content = 'islandora beast'; $islandora_object['OBJ']->content = $changed_content; - $this->assertEqual('modifyDatastream', $ingest_method, 'The expected ingest method is "modifyDatastream", got "' . $ingest_method . '".'); + $this->assertEqual('modifyDatastream', $_islandora_derivative_test_ingest_method, 'The expected ingest method is "modifyDatastream", got "' . $_islandora_derivative_test_ingest_method . '".'); $this->assertEqual('FORCEFULLY APPENDING CONTENT TO ' . $changed_content, $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO islandora beast", got "' . $islandora_object['DERIV']->content . '".'); } + /** + * Tests islandora_datastream_modified hook when there are no existing DSes. + */ public function testDerivativeOnModifyNonExistingDatastream() { - global $ingest_method; - $ingest_method = 'modifyDatastream'; + global $_islandora_derivative_test_ingest_method; + $_islandora_derivative_test_ingest_method = 'modifyDatastream'; $this->constructBaseObject(); // Need to do this as Tuque caches. $connection = islandora_get_tuque_connection(); @@ -129,32 +149,98 @@ class IslandoraDerivativesTestCase extends IslandoraWebTestCase { $islandora_object = islandora_object_load($this->pid); $changed_content = 'islandora beast'; $islandora_object['OBJ']->content = $changed_content; - $this->assertEqual('ingestDatastream', $ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $ingest_method . '".'); - $this->assertEqual('FORCEFULLY APPENDING CONTENT TO ' . $changed_content, $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "FORCEFULLY APPENDING CONTENT TO islandora beast", got "' . $islandora_object['DERIV']->content . '".'); + $this->assertEqual('ingestDatastream', $_islandora_derivative_test_ingest_method, 'The expected ingest method is "ingestDatastream", got "' . $_islandora_derivative_test_ingest_method . '".'); + $this->assertEqual($changed_content . ' some string', $islandora_object['DERIV']->content, 'The expected content of the DERIV datastream is "islandora beast string", got "' . $islandora_object['DERIV']->content . '".'); } + /** + * Tests derivative hook filtering based upon source_dsid. + */ public function testDerivativeFilteringOnSourceDSID() { - global $derivative_functions; - $derivative_functions = array(); + global $_islandora_derivative_test_derivative_functions; + $_islandora_derivative_test_derivative_functions = array(); $this->constructBaseObject(); $object = islandora_object_load($this->pid); islandora_do_derivatives($object, array( 'source_dsid' => 'OBJ', )); - $this->assertEqual(1, count($derivative_functions), 'Expected 1 derivative function for the source_dsid of "OBJ", got ' . count($derivative_functions) . '.'); - $called_function = (string) reset($derivative_functions); + $this->assertEqual(1, count($_islandora_derivative_test_derivative_functions), 'Expected 1 derivative function for the source_dsid of "OBJ", got ' . count($_islandora_derivative_test_derivative_functions) . '.'); + $called_function = (string) reset($_islandora_derivative_test_derivative_functions); $this->assertEqual('islandora_derivatives_test_create_deriv_datastream', $called_function, 'Expected derivative function is "islandora_derivatives_test_create_deriv_datastream", got "' . $called_function . '".'); // Reset the derivative functions array as we are going to use it again. - $derivative_functions = array(); + $_islandora_derivative_test_derivative_functions = array(); islandora_do_derivatives($object, array( 'source_dsid' => 'SOMEWEIRDDATASTREAM', )); - $this->assertEqual(1, count($derivative_functions), 'Expected 1 derivative function for the source_dsid of "SOMEWEIRDDATASTREAM", got ' . count($derivative_functions) . '.'); - $called_function = (string) reset($derivative_functions); + $this->assertEqual(1, count($_islandora_derivative_test_derivative_functions), 'Expected 1 derivative function for the source_dsid of "SOMEWEIRDDATASTREAM", got ' . count($_islandora_derivative_test_derivative_functions) . '.'); + $called_function = (string) reset($_islandora_derivative_test_derivative_functions); $this->assertEqual('islandora_derivatives_test_create_some_weird_datastream', $called_function, 'Expected derivative function is "islandora_derivatives_test_create_some_weird_datastream", got "' . $called_function . '".'); } + /** + * Tests that only functions were the source_dsid is NULL are fired. + */ + public function testNULLSourceDSID() { + global $_islandora_derivative_test_derivative_functions; + $_islandora_derivative_test_derivative_functions = array(); + $this->constructBaseObject(); + $object = islandora_object_load($this->pid); + islandora_do_derivatives($object, array( + 'source_dsid' => NULL, + )); + $this->assertDatastreams($object, array( + 'DC', + 'RELS-EXT', + 'OBJ', + 'NOSOURCE', + )); + $this->assertEqual(1, count($_islandora_derivative_test_derivative_functions), 'Expected 1 derivative function for the source_dsid of "NULL", got ' . count($_islandora_derivative_test_derivative_functions) . '.'); + $called_function = (string) reset($_islandora_derivative_test_derivative_functions); + $this->assertEqual('islandora_derivatives_test_create_nosource_datastream', $called_function, 'Expected derivative function is "islandora_derivatives_test_create_nosource_datastream", got "' . $called_function . '".'); + $this->assertEqual('NOSOURCE', $object['NOSOURCE']->content, 'The expected content of the NOSOURCE datastream is "NOSOURCE", got "' . $object['NOSOURCE']->content . '".'); + } + + /** + * Tests that when no source_dsid all derivative functions are called. + */ + public function testNoSourceDSIDNoForce() { + global $_islandora_derivative_test_derivative_functions; + $_islandora_derivative_test_derivative_functions = array(); + $this->constructBaseObject(); + $object = islandora_object_load($this->pid); + islandora_do_derivatives($object, array()); + $this->assertDatastreams($object, array( + 'DC', + 'RELS-EXT', + 'OBJ', + 'DERIV', + 'NOSOURCE', + )); + $this->assertEqual(3, count($_islandora_derivative_test_derivative_functions), 'Expected 3 derivative functions when there is no source_dsid, got ' . count($_islandora_derivative_test_derivative_functions) . '.'); + } + + /** + * Tests that when no source_dsid all derivative functions are called. + */ + public function testNoSourceDSIDForce() { + global $_islandora_derivative_test_derivative_functions; + $_islandora_derivative_test_derivative_functions = array(); + $this->constructBaseObject(); + $object = islandora_object_load($this->pid); + islandora_do_derivatives($object, array( + 'force' => TRUE, + )); + $this->assertDatastreams($object, array( + 'DC', + 'RELS-EXT', + 'OBJ', + 'DERIV', + 'NOSOURCE', + )); + $this->assertEqual(3, count($_islandora_derivative_test_derivative_functions), 'Expected 3 derivative functions when there is no source_dsid, got ' . count($_islandora_derivative_test_derivative_functions) . '.'); + } + /** * Helper function that will construct a base object. */ @@ -172,14 +258,39 @@ class IslandoraDerivativesTestCase extends IslandoraWebTestCase { return $object; } + /** + * Helper function to construct the DERIV datastream without firing hooks. + * + * @param AbstractObject $object + * An AbstractObject representing a FedoraObject. + * + * @return AbstractObject + * The modified AbstractObject. + */ public function constructDERIVDatastream(AbstractObject $object) { $dsid = 'DERIV'; $ds = $object->constructDatastream($dsid); $ds->label = 'Test'; - $ds->content = 'test'; + $ds->content = 'test some string'; $object->ingestDatastream($ds); return $object; } + /** + * Helper function to construct the NOSOURCE datastream without firing hooks. + * + * @param AbstractObject $object + * An AbstractObject representing a FedoraObject. + * + * @return AbstractObject + * The modified AbstractObject. + */ + public function constructNOSOURCEDatastream(AbstractObject $object) { + $dsid = 'NOSOURCE'; + $ds = $object->constructDatastream($dsid); + $ds->label = 'Test'; + $ds->content = 'NOSOURCE'; + $object->ingestDatastream($ds); + return $object; } - +} diff --git a/tests/islandora_derivatives_test.module b/tests/islandora_derivatives_test.module index 36b6380c..71e043f0 100644 --- a/tests/islandora_derivatives_test.module +++ b/tests/islandora_derivatives_test.module @@ -26,15 +26,35 @@ function islandora_derivatives_test_some_cmodel_islandora_derivative() { 'islandora_derivatives_test_create_some_weird_datastream', ), ), + array( + 'source_dsid' => NULL, + 'destination_dsid' => 'NOSOURCE', + 'weight' => '-3', + 'function' => array( + 'islandora_derivatives_test_create_nosource_datastream', + ), + ), ); } +/** + * Creates the DERIV datastream for use in testing. + * + * @param AbstractObject $object + * An AbstractObject representing a Fedora object. + * @param bool $force + * Whether or not derivative generation is to be forced. + * @return array + * An array detailing the success of the operation. + * + * @see hook_islandora_derivative() + */ function islandora_derivatives_test_create_deriv_datastream(AbstractObject $object, $force = FALSE) { - global $derivative_functions; - $derivative_functions[] = 'islandora_derivatives_test_create_deriv_datastream'; + global $_islandora_derivative_test_derivative_functions; + $_islandora_derivative_test_derivative_functions[] = 'islandora_derivatives_test_create_deriv_datastream'; $return = ''; if (!isset($object['DERIV']) || (isset($object['DERIV']) && $force === TRUE)) { - if ($force !== TRUE) { + if ($force !== TRUE || !isset($object['DERIV'])) { $deriv_string = $object['OBJ']->content . ' some string'; } else { @@ -51,7 +71,7 @@ function islandora_derivatives_test_create_deriv_datastream(AbstractObject $obje array( 'message' => t('The DERIV datastream was added successfully for @pid!'), 'message_sub' => array('@pid' => $object->id), - 'type' => WATCHDOG_INFO, + 'type' => 'dsm', ), ), ); @@ -61,7 +81,7 @@ function islandora_derivatives_test_create_deriv_datastream(AbstractObject $obje } /** - * Stub function that should never actually get called because of DSID filtering. + * Stub function that used only for datastream filtering counts. * * @param AbstractObject $object * An AbstractObject representing a Fedora object. @@ -69,13 +89,69 @@ function islandora_derivatives_test_create_deriv_datastream(AbstractObject $obje * Whether the derivatives are being forcefully generated or not. */ function islandora_derivatives_test_create_some_weird_datastream(AbstractObject $object, $force = FALSE) { - global $derivative_functions; + global $_islandora_derivative_test_derivative_functions; // Add to the global that we got to this function. - $derivative_functions[] = 'islandora_derivatives_test_create_some_weird_datastream'; + $_islandora_derivative_test_derivative_functions[] = 'islandora_derivatives_test_create_some_weird_datastream'; } +/** + * Creates the NOSOURCE datastream for use in testing. + * + * @param AbstractObject $object + * An AbstractObject representing a Fedora object. + * @param bool $force + * Whether or not derivative generation is to be forced. + * @return array + * An array detailing the success of the operation. + * + * @see hook_islandora_derivative() + */ +function islandora_derivatives_test_create_nosource_datastream(AbstractObject $object, $force = FALSE) { + global $_islandora_derivative_test_derivative_functions; + $_islandora_derivative_test_derivative_functions[] = 'islandora_derivatives_test_create_nosource_datastream'; + $return = ''; + if (!isset($object['NOSOURCE']) || (isset($object['NOSOURCE']) && $force === TRUE)) { + if ($force !== TRUE || !isset($object['NOSOURCE'])) { + $deriv_string = 'NOSOURCE'; + } + else { + $deriv_string = "FORCEFULLY APPENDING CONTENT TO " . $object['NOSOURCE']->content; + } + $added_successfully = islandora_derivatives_test_add_datastream($object, 'NOSOURCE', $deriv_string); + if ($added_successfully !== TRUE) { + $return = islandora_derivatives_test_failed_adding($added_successfully); + } + else { + $return = array( + 'success' => TRUE, + 'messages' => array( + array( + 'message' => t('The DERIV datastream was added successfully for @pid!'), + 'message_sub' => array('@pid' => $object->id), + 'type' => 'dsm', + ), + ), + ); + } + return $return; + } +} + +/** + * Helper function that adds/modifies the datastream to the object in testing. + * + * @param AbstractObject $object + * An AbstractObject representing a Fedora object. + * @param string $dsid + * The datastream id for which we are adding/modifying. + * @param string $deriv_string + * The content of the datastream we are adding. + * + * @return bool|string + * A bool if the operation was successfully, the error message otherwise. + */ function islandora_derivatives_test_add_datastream(AbstractObject $object, $dsid, $deriv_string) { - global $ingest_method; + global $_islandora_derivative_test_ingest_method; try { $ingest = !isset($object[$dsid]); if ($ingest) { @@ -87,11 +163,11 @@ function islandora_derivatives_test_add_datastream(AbstractObject $object, $dsid } $ds->content = $deriv_string; if ($ingest) { - $ingest_method = 'ingestDatastream'; + $_islandora_derivative_test_ingest_method = 'ingestDatastream'; $object->ingestDatastream($ds); } else { - $ingest_method = 'modifyDatastream'; + $_islandora_derivative_test_ingest_method = 'modifyDatastream'; } return TRUE; } @@ -101,14 +177,26 @@ function islandora_derivatives_test_add_datastream(AbstractObject $object, $dsid } } +/** + * Returns a message if we failed to add a derivative. + * + * @see hook_islandora_derivative() + * + * @param string $message + * The error message to be returned back. + * + * @return array + * An array describing the outcome of our failure. + */ function islandora_derivatives_test_failed_adding($message) { return array( 'success' => FALSE, 'messages' => array( array( 'message' => $message, - 'type' => WATCHDOG_ERROR, + 'type' => 'watchdog', + 'severity' => WATCHDOG_ERROR, ), ), ); -} \ No newline at end of file +} From 69010df8ea04d8c895b27363cbdab3970a7246c1 Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Wed, 7 Aug 2013 19:06:09 +0000 Subject: [PATCH 05/13] Filter xssing too much, minor doc fixes. --- includes/derivatives.inc | 2 +- islandora.api.php | 4 +++- tests/islandora_derivatives_test.module | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/includes/derivatives.inc b/includes/derivatives.inc index f5058588..f707f88a 100644 --- a/includes/derivatives.inc +++ b/includes/derivatives.inc @@ -91,7 +91,7 @@ function islandora_derivative_logging(array $logging_results) { foreach ($logging_results as $result) { foreach ($result['messages'] as $message) { if ($message['type'] === 'dsm') { - drupal_set_message(filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array()), isset($message['severity']) ? $message['severity'] : 'status')); + drupal_set_message(filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array())), isset($message['severity']) ? $message['severity'] : 'status'); } else { watchdog('islandora', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), isset($message['severity']) ? $message['severity'] : WATCHDOG_NOTICE); diff --git a/islandora.api.php b/islandora.api.php index 74bdef81..da6dae77 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -553,6 +553,8 @@ function hook_CMODEL_PID_islandora_datastream_access($op, $object, $user) { * - severity: (Optional) A severity level / status to be used when * logging messages. Uses the defaults of drupal_set_message and * watchdog if not defined. + * - file: A string denoting the path to the file where the function + * is being called from. */ function hook_islandora_derivative() { return array( @@ -590,4 +592,4 @@ function hook_islandora_derivative() { */ function hook_CMODEL_PID_islandora_derivative() { -} \ No newline at end of file +} diff --git a/tests/islandora_derivatives_test.module b/tests/islandora_derivatives_test.module index 71e043f0..80530296 100644 --- a/tests/islandora_derivatives_test.module +++ b/tests/islandora_derivatives_test.module @@ -6,7 +6,7 @@ */ /** - * Implements hook_islandora_CMODEL_derivative(). + * Implements hook_islandora_CMODEL_PID_derivative(). */ function islandora_derivatives_test_some_cmodel_islandora_derivative() { return array( @@ -146,7 +146,7 @@ function islandora_derivatives_test_create_nosource_datastream(AbstractObject $o * The datastream id for which we are adding/modifying. * @param string $deriv_string * The content of the datastream we are adding. - * + * * @return bool|string * A bool if the operation was successfully, the error message otherwise. */ From 0b53c36cea67c814a641851e8dc81b9ae0d1a22c Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Thu, 8 Aug 2013 18:06:55 +0000 Subject: [PATCH 06/13] Coding standards ignore. --- includes/derivatives.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/includes/derivatives.inc b/includes/derivatives.inc index f707f88a..67979d4a 100644 --- a/includes/derivatives.inc +++ b/includes/derivatives.inc @@ -94,7 +94,11 @@ function islandora_derivative_logging(array $logging_results) { drupal_set_message(filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array())), isset($message['severity']) ? $message['severity'] : 'status'); } else { + // @codingStandardsIgnoreStart + // We know what we are doing here. Passing through the translated + // message and the substitutions needed. watchdog('islandora', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), isset($message['severity']) ? $message['severity'] : WATCHDOG_NOTICE); + // @codingStandardsIgnoreEnd } } } From a0fc2179da3cb212d88e78dc66bdd3a043631e3d Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Thu, 8 Aug 2013 18:45:36 +0000 Subject: [PATCH 07/13] Coder hackery. --- includes/derivatives.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/derivatives.inc b/includes/derivatives.inc index 67979d4a..4a422535 100644 --- a/includes/derivatives.inc +++ b/includes/derivatives.inc @@ -94,11 +94,11 @@ function islandora_derivative_logging(array $logging_results) { drupal_set_message(filter_xss(format_string($message['message'], isset($message['message_sub']) ? $message['message_sub'] : array())), isset($message['severity']) ? $message['severity'] : 'status'); } else { - // @codingStandardsIgnoreStart // We know what we are doing here. Passing through the translated - // message and the substitutions needed. - watchdog('islandora', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), isset($message['severity']) ? $message['severity'] : WATCHDOG_NOTICE); - // @codingStandardsIgnoreEnd + // 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', $message['message'], isset($message['message_sub']) ? $message['message_sub'] : array(), isset($message['severity']) ? $message['severity'] : WATCHDOG_NOTICE); } } } From aaa0a8ddc63408e2d7e237cb15185119a25ac753 Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 13 Aug 2013 14:33:12 +0000 Subject: [PATCH 08/13] Fix TOKEN_TIMEOUT constant. --- includes/authtokens.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/authtokens.inc b/includes/authtokens.inc index 9d5783a9..36e8689f 100644 --- a/includes/authtokens.inc +++ b/includes/authtokens.inc @@ -10,7 +10,7 @@ // Token lifespan(seconds): after this duration the token expires. // 5 minutes. -define('TOKEN_TIMEOUT', 300); +define('ISLANDORA_AUTHTOKEN_TOKEN_TIMEOUT', 300); /** * Request Islandora to construct an object/datastream authentication token. @@ -92,7 +92,7 @@ function islandora_validate_object_token($pid, $dsid, $token) { ->condition('pid', $pid, '=') ->condition('dsid', $dsid, '=') ->condition('time', $time, '<=') - ->condition('time', $time - TOKEN_TIMEOUT, '>') + ->condition('time', $time - ISLANDORA_AUTHTOKEN_TOKEN_TIMEOUT, '>') ->execute() ->fetchAll(); if ($result) { @@ -131,6 +131,6 @@ function islandora_validate_object_token($pid, $dsid, $token) { function islandora_remove_expired_tokens() { $time = time(); db_delete("islandora_authtokens") - ->condition('time', $time - TOKEN_TIMEOUT, '<') + ->condition('time', $time - ISLANDORA_AUTHTOKEN_TOKEN_TIMEOUT, '<') ->execute(); } From febd3a3feef1117ff5afe115995b61c8f050982f Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 13 Aug 2013 15:09:34 +0000 Subject: [PATCH 09/13] Carry through changes. --- includes/object_properties.form.inc | 2 +- includes/utilities.inc | 4 +- islandora.module | 85 +++++++++++++---------- tests/authtokens.test | 2 +- tests/hooked_access.test | 6 +- tests/islandora_hooked_access_test.module | 2 +- tests/islandora_manage_permissions.test | 50 ++++++------- theme/theme.inc | 18 ++--- 8 files changed, 91 insertions(+), 78 deletions(-) diff --git a/includes/object_properties.form.inc b/includes/object_properties.form.inc index 44d016b7..51e48a5f 100644 --- a/includes/object_properties.form.inc +++ b/includes/object_properties.form.inc @@ -60,7 +60,7 @@ function islandora_object_properties_form(array $form, array &$form_state, Abstr ), 'delete' => array( '#type' => 'submit', - '#access' => islandora_object_access(FEDORA_PURGE, $object), + '#access' => islandora_object_access(ISLANDORA_PURGE, $object), '#value' => t('Delete'), '#submit' => array('islandora_object_properties_form_delete'), '#limit_validation_errors' => array(array('pid')), diff --git a/includes/utilities.inc b/includes/utilities.inc index c8d1ae5e..91988918 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -391,10 +391,10 @@ function islandora_get_datastreams_requirements_from_models(array $models) { * - "optional": A boolean indicating if the given stream is optional. */ function islandora_get_datastreams_requirements_from_content_model(AbstractObject $object) { - if (empty($object[DS_COMP_STREAM]) || !islandora_datastream_access(FEDORA_VIEW_OBJECTS, $object[DS_COMP_STREAM])) { + if (empty($object[ISLANDORA_DS_COMP_STREAM]) || !islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $object[ISLANDORA_DS_COMP_STREAM])) { return array(); } - $xml = new SimpleXMLElement($object[DS_COMP_STREAM]->content); + $xml = new SimpleXMLElement($object[ISLANDORA_DS_COMP_STREAM]->content); foreach ($xml->dsTypeModel as $ds) { $dsid = (string) $ds['ID']; $optional = strtolower((string) $ds['optional']); diff --git a/islandora.module b/islandora.module index 7d58c865..6ec9d03a 100644 --- a/islandora.module +++ b/islandora.module @@ -24,15 +24,15 @@ */ // Common datastreams. -define('DS_COMP_STREAM', 'DS-COMPOSITE-MODEL'); +define('ISLANDORA_DS_COMP_STREAM', 'DS-COMPOSITE-MODEL'); // Permissions. -define('FEDORA_VIEW_OBJECTS', 'view fedora repository objects'); -define('FEDORA_METADATA_EDIT', 'edit fedora metadata'); -define('FEDORA_ADD_DS', 'add fedora datastreams'); -define('FEDORA_INGEST', 'ingest fedora objects'); -define('FEDORA_PURGE', 'delete fedora objects and datastreams'); -define('FEDORA_MANAGE_PROPERTIES', 'manage object properties'); +define('ISLANDORA_VIEW_OBJECTS', 'view fedora repository objects'); +define('ISLANDORA_METADATA_EDIT', 'edit fedora metadata'); +define('ISLANDORA_ADD_DS', 'add fedora datastreams'); +define('ISLANDORA_INGEST', 'ingest fedora objects'); +define('ISLANDORA_PURGE', 'delete fedora objects and datastreams'); +define('ISLANDORA_MANAGE_PROPERTIES', 'manage object properties'); define('ISLANDORA_VIEW_DATASTREAM_HISTORY', 'view old datastream versions'); // Hooks. @@ -57,6 +57,19 @@ define('ISLANDORA_INGEST_STEP_HOOK', 'islandora_ingest_steps'); // Autocomplete paths. define('ISLANDORA_CONTENT_MODELS_AUTOCOMPLETE', 'islandora/autocomplete/content-models'); +/** + * @deprecated Constants. + */ +// @codingStandardsIgnoreStart +define('DS_COMP_STREAM', ISLANDORA_DS_COMP_STREAM); +define('FEDORA_VIEW_OBJECTS', ISLANDORA_VIEW_OBJECTS); +define('FEDORA_METADATA_EDIT', ISLANDORA_METADATA_EDIT); +define('FEDORA_ADD_DS', ISLANDORA_ADD_DS); +define('FEDORA_INGEST', ISLANDORA_INGEST); +define('FEDORA_PURGE', ISLANDORA_PURGE); +define('FEDORA_MANAGE_PROPERTIES', ISLANDORA_MANAGE_PROPERTIES); +// @codingStandardsIgnoreEnd + /** * Implements hook_menu(). * @@ -85,7 +98,7 @@ function islandora_menu() { 'title' => 'Solution packs', 'description' => 'Install content models and collections required by installed solution packs.', 'page callback' => 'islandora_solution_packs_admin', - 'access arguments' => array(FEDORA_ADD_DS), + 'access arguments' => array(ISLANDORA_ADD_DS), 'file' => 'includes/solution_packs.inc', 'type' => MENU_NORMAL_ITEM, ); @@ -93,7 +106,7 @@ function islandora_menu() { 'title' => 'Islandora Repository', 'page callback' => 'islandora_view_default_object', 'type' => MENU_NORMAL_ITEM, - 'access arguments' => array(FEDORA_VIEW_OBJECTS), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS), ); $items['islandora/object/%islandora_object'] = array( 'title callback' => 'islandora_drupal_title', @@ -102,14 +115,14 @@ function islandora_menu() { 'page arguments' => array(2), 'type' => MENU_NORMAL_ITEM, 'access callback' => 'islandora_object_access_callback', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 2), ); $items['islandora/object/%islandora_object/print'] = array( 'page callback' => 'islandora_printer_object', 'page arguments' => array(2), 'type' => MENU_NORMAL_ITEM, 'access callback' => 'islandora_object_access_callback', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 2), ); $items['islandora/object/%islandora_object/view'] = array( 'title' => 'View', @@ -129,11 +142,11 @@ function islandora_menu() { 'access callback' => 'islandora_object_manage_access_callback', 'access arguments' => array( array( - FEDORA_MANAGE_PROPERTIES, - FEDORA_METADATA_EDIT, - FEDORA_ADD_DS, - FEDORA_PURGE, - FEDORA_INGEST, + ISLANDORA_MANAGE_PROPERTIES, + ISLANDORA_METADATA_EDIT, + ISLANDORA_ADD_DS, + ISLANDORA_PURGE, + ISLANDORA_INGEST, ), 2), ); @@ -151,9 +164,9 @@ function islandora_menu() { 'access callback' => 'islandora_object_manage_access_callback', 'access arguments' => array( array( - FEDORA_METADATA_EDIT, - FEDORA_ADD_DS, - FEDORA_PURGE, + ISLANDORA_METADATA_EDIT, + ISLANDORA_ADD_DS, + ISLANDORA_PURGE, ), 2), 'weight' => -10, ); @@ -165,7 +178,7 @@ function islandora_menu() { 'page arguments' => array('islandora_object_properties_form', 2), 'type' => MENU_LOCAL_TASK, 'access callback' => 'islandora_object_access_callback', - 'access arguments' => array(FEDORA_MANAGE_PROPERTIES, 2), + 'access arguments' => array(ISLANDORA_MANAGE_PROPERTIES, 2), 'weight' => -5, ); $items['islandora/object/%islandora_object/delete'] = array( @@ -175,7 +188,7 @@ function islandora_menu() { 'page arguments' => array('islandora_delete_object_form', 2), 'type' => MENU_CALLBACK, 'access callback' => 'islandora_object_access_callback', - 'access arguments' => array(FEDORA_PURGE, 2), + 'access arguments' => array(ISLANDORA_PURGE, 2), ); $items['islandora/object/%islandora_object/manage/datastreams/add'] = array( 'title' => 'Add a datastream', @@ -184,7 +197,7 @@ function islandora_menu() { 'page arguments' => array('islandora_add_datastream_form', 2), 'type' => MENU_LOCAL_ACTION, 'access callback' => 'islandora_object_access_callback', - 'access arguments' => array(FEDORA_ADD_DS, 2), + 'access arguments' => array(ISLANDORA_ADD_DS, 2), ); $items['islandora/object/%islandora_object/manage/datastreams/add/autocomplete'] = array( 'file' => 'includes/add_datastream.form.inc', @@ -192,7 +205,7 @@ function islandora_menu() { 'page arguments' => array(2), 'type' => MENU_CALLBACK, 'access callback' => 'islandora_object_access_callback', - 'access arguments' => array(FEDORA_ADD_DS, 2), + 'access arguments' => array(ISLANDORA_ADD_DS, 2), ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream'] = array( 'title' => 'View datastream', @@ -201,7 +214,7 @@ function islandora_menu() { 'type' => MENU_CALLBACK, 'file' => 'includes/datastream.inc', 'access callback' => 'islandora_datastream_access', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 4), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 4), 'load arguments' => array(2), ); // This menu item uses token authentication in islandora_tokened_object. @@ -209,7 +222,7 @@ function islandora_menu() { 'title' => 'View datastream', 'load arguments' => array('%map'), 'access callback' => 'islandora_object_datastream_tokened_access_callback', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2, 4), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 2, 4), 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream/download'] = array( @@ -219,7 +232,7 @@ function islandora_menu() { 'type' => MENU_CALLBACK, 'file' => 'includes/datastream.inc', 'access callback' => 'islandora_datastream_access', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 4), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 4), 'load arguments' => array(2), ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream/edit'] = array( @@ -229,7 +242,7 @@ function islandora_menu() { 'type' => MENU_CALLBACK, 'file' => 'includes/datastream.inc', 'access callback' => 'islandora_datastream_access', - 'access arguments' => array(FEDORA_METADATA_EDIT, 4), + 'access arguments' => array(ISLANDORA_METADATA_EDIT, 4), 'load arguments' => array(2), ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream/delete'] = array( @@ -239,7 +252,7 @@ function islandora_menu() { 'file' => 'includes/delete_datastream.form.inc', 'type' => MENU_CALLBACK, 'access callback' => 'islandora_datastream_access', - 'access arguments' => array(FEDORA_PURGE, 4), + 'access arguments' => array(ISLANDORA_PURGE, 4), 'load arguments' => array(2), ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream/version'] = array( @@ -259,7 +272,7 @@ function islandora_menu() { 'file' => 'includes/datastream.version.inc', 'type' => MENU_CALLBACK, 'access callback' => 'islandora_datastream_access', - 'access arguments' => array(FEDORA_PURGE, 4), + 'access arguments' => array(ISLANDORA_PURGE, 4), 'load arguments' => array(2), ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream/version/%/view'] = array( @@ -277,7 +290,7 @@ function islandora_menu() { 'page arguments' => array(2), 'type' => MENU_CALLBACK, 'access callback' => 'islandora_object_access', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), + 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 2), 'load arguments' => array(2), ); $items[ISLANDORA_CONTENT_MODELS_AUTOCOMPLETE] = array( @@ -390,27 +403,27 @@ function islandora_theme() { */ function islandora_permission() { return array( - FEDORA_VIEW_OBJECTS => array( + ISLANDORA_VIEW_OBJECTS => array( 'title' => t('View repository objects'), 'description' => t('View objects in the repository. Note: Fedora XACML security policies may override this permission.'), ), - FEDORA_ADD_DS => array( + ISLANDORA_ADD_DS => array( 'title' => t('Add datastreams to repository objects'), 'description' => t('Add datastreams to objects in the repository. Note: Fedora XACML security policies may override this position.'), ), - FEDORA_METADATA_EDIT => array( + ISLANDORA_METADATA_EDIT => array( 'title' => t('Edit metadata'), 'description' => t('Edit metadata for objects in the repository.'), ), - FEDORA_INGEST => array( + ISLANDORA_INGEST => array( 'title' => t('Create new repository objects'), 'description' => t('Create new objects in the repository.'), ), - FEDORA_PURGE => array( + ISLANDORA_PURGE => array( 'title' => t('Permanently remove objects from the repository'), 'description' => t('Permanently remove objects from the repository.'), ), - FEDORA_MANAGE_PROPERTIES => array( + ISLANDORA_MANAGE_PROPERTIES => array( 'title' => t('Manage object properties'), 'description' => t('Modify object labels, owner IDs, and states.'), ), diff --git a/tests/authtokens.test b/tests/authtokens.test index ccd3088a..352689e2 100644 --- a/tests/authtokens.test +++ b/tests/authtokens.test @@ -74,7 +74,7 @@ class IslandoraAuthtokensTestCase extends IslandoraWebTestCase { $this->drupalGet("islandora/object/{$newpid}/datastream/JP2/view"); $this->assertResponse(403, 'Page not found as anonymous'); - $account = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS)); + $account = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS)); $this->drupalLogin($account); $this->drupalGet("islandora/object/{$newpid}/datastream/JP2/view"); diff --git a/tests/hooked_access.test b/tests/hooked_access.test index 0039460e..894eee80 100644 --- a/tests/hooked_access.test +++ b/tests/hooked_access.test @@ -37,9 +37,9 @@ class IslandoraHookedAccessTestCase extends IslandoraWebTestCase { $this->objects = array( 'test:testAccessHook', ); - $this->op = FEDORA_VIEW_OBJECTS; - $this->other_op = FEDORA_INGEST; - $this->denied_op = FEDORA_PURGE; + $this->op = ISLANDORA_VIEW_OBJECTS; + $this->other_op = ISLANDORA_INGEST; + $this->denied_op = ISLANDORA_PURGE; $this->purgeTestObjects(); $this->dsid = 'asdf'; $this->createTestObjects(); diff --git a/tests/islandora_hooked_access_test.module b/tests/islandora_hooked_access_test.module index de417738..ea033589 100644 --- a/tests/islandora_hooked_access_test.module +++ b/tests/islandora_hooked_access_test.module @@ -9,7 +9,7 @@ * Implements hook_islandora_object_access(). */ function islandora_hooked_access_test_islandora_object_access($op, $object, $user) { - if ($op == FEDORA_PURGE) { + if ($op == ISLANDORA_PURGE) { return FALSE; } if (isset($_SESSION['islandora_hooked_access_test']) && $_SESSION['islandora_hooked_access_test'] === func_get_args()) { diff --git a/tests/islandora_manage_permissions.test b/tests/islandora_manage_permissions.test index 8fc1549f..e17d1501 100644 --- a/tests/islandora_manage_permissions.test +++ b/tests/islandora_manage_permissions.test @@ -33,16 +33,16 @@ class IslandoraPermissionsTestCase extends IslandoraWebTestCase { * Test manage permissions. */ public function testManagePermissions() { - // Test permission FEDORA_VIEW_OBJECTS. + // Test permission ISLANDORA_VIEW_OBJECTS. // Create a user with permission. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS)); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS)); // Log the user in. $this->drupalLogin($user); $this->clickLink(t('Islandora Repository')); $this->assertNoLink('Manage', 'Manage tab is not on current page.'); - // Test permission FEDORA_VIEW_OBJECTS, FEDORA_MANAGE_PROPERTIES. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS, FEDORA_MANAGE_PROPERTIES)); + // Test permission ISLANDORA_VIEW_OBJECTS, ISLANDORA_MANAGE_PROPERTIES. + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_MANAGE_PROPERTIES)); $this->drupalLogin($user); $this->clickLink(t('Islandora Repository')); $this->assertLink('Manage', 0, 'Manage tab is on current page.'); @@ -51,8 +51,8 @@ class IslandoraPermissionsTestCase extends IslandoraWebTestCase { $this->assertNoLink('Datastreams', 'Datastreams tab is not on current page.'); $this->assertNoLink('Collection', 'Collection tab is not on current page.'); - // Test permission FEDORA_VIEW_OBJECTS, FEDORA_ADD_DS. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS, FEDORA_ADD_DS)); + // Test permission ISLANDORA_VIEW_OBJECTS, ISLANDORA_ADD_DS. + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_ADD_DS)); $this->drupalLogin($user); $this->clickLink(t('Islandora Repository')); $this->assertLink('Manage', 0, 'Manage tab is on current page.'); @@ -61,8 +61,8 @@ class IslandoraPermissionsTestCase extends IslandoraWebTestCase { $this->assertNoLink('Properties', 'Properties tab is not on current page.'); $this->assertNoLink('Collection', 'Collection tab is not on current page.'); - // Test permission FEDORA_VIEW_OBJECTS, FEDORA_METADATA_EDIT. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS, FEDORA_METADATA_EDIT)); + // Test permission ISLANDORA_VIEW_OBJECTS, ISLANDORA_METADATA_EDIT. + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_METADATA_EDIT)); $this->drupalLogin($user); $this->clickLink(t('Islandora Repository')); $this->assertLink('Manage', 0, 'Manage tab is on current page.'); @@ -71,8 +71,8 @@ class IslandoraPermissionsTestCase extends IslandoraWebTestCase { $this->assertNoLink('Properties', 'Properties tab is not on current page.'); $this->assertNoLink('Collection', 'Collection tab is not on current page.'); - // Test permission FEDORA_VIEW_OBJECTS, FEDORA_PURGE. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS, FEDORA_PURGE)); + // Test permission ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE. + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE)); $this->drupalLogin($user); $this->clickLink(t('Islandora Repository')); $this->assertLink('Manage', 0, 'Manage tab is on current page.'); @@ -98,39 +98,39 @@ class IslandoraPermissionsTestCase extends IslandoraWebTestCase { $ret = islandora_user_access($object, array()); $this->assertFalse($ret, 'User access denied when no permissions are provided.'); // Test access with matching permission. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS)); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS), array(), TRUE, $user); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS)); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS), array(), TRUE, $user); $this->assertTrue($ret, 'User access granted when permissions match.'); // Test access with matching permission but access any is FALSE. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS)); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS, FEDORA_PURGE), array(), FALSE, $user); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS)); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE), array(), FALSE, $user); $this->assertFalse($ret, 'User access denied for matching permission but with access any set to FALSE.'); // Test access with non-matching permission. - $user = $this->drupalCreateUser(array(FEDORA_PURGE)); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS), array(), TRUE, $user); + $user = $this->drupalCreateUser(array(ISLANDORA_PURGE)); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS), array(), TRUE, $user); $this->assertFalse($ret, 'User access denied when permissions did not match.'); // Test access with both permissions and content model. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS)); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS)); $model = $object->models; $model = reset($model); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS), array($model), TRUE, $user); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS), array($model), TRUE, $user); $this->assertTrue($ret, 'User access granted for matching permission and model.'); // Test access with matching permissions and non-matching content model. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS)); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS), array('islandora:obviouslyNotACModel'), TRUE, $user); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS)); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS), array('islandora:obviouslyNotACModel'), TRUE, $user); $this->assertFalse($ret, 'User access denied for matching permission and non-matching model.'); // Test access with all matching permissions and one matching model but // access any is FALSE. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS, FEDORA_PURGE)); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE)); $model = $object->models; $model = reset($model); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS, FEDORA_PURGE), array($model, 'islandora:obviouslyNotACModel'), FALSE, $user); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE), array($model, 'islandora:obviouslyNotACModel'), FALSE, $user); $this->assertFalse($ret, 'User access denied for all matching permissions and one matching model but with access any set to FALSE.'); - $ret = islandora_user_access($object, array(FEDORA_VIEW_OBJECTS, FEDORA_PURGE), array($model), FALSE, $user); + $ret = islandora_user_access($object, array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE), array($model), FALSE, $user); $this->assertTrue($ret, 'User access granted for all matching permissions and matching models with access any set to FALSE.'); // Test passing in a Datastream. - $user = $this->drupalCreateUser(array(FEDORA_VIEW_OBJECTS, FEDORA_PURGE)); - $ret = islandora_user_access($object['DC'], array(FEDORA_VIEW_OBJECTS), array(), TRUE, $user); + $user = $this->drupalCreateUser(array(ISLANDORA_VIEW_OBJECTS, ISLANDORA_PURGE)); + $ret = islandora_user_access($object['DC'], array(ISLANDORA_VIEW_OBJECTS), array(), TRUE, $user); $this->assertTrue($ret, 'User access granted for matching permissions, with a datastream given instead of an object.'); } } diff --git a/theme/theme.inc b/theme/theme.inc index d988ee77..10e1cd29 100644 --- a/theme/theme.inc +++ b/theme/theme.inc @@ -115,7 +115,7 @@ function islandora_preprocess_islandora_default(&$variables) { $download_path = islandora_datastream_get_url($ds, 'download'); $datastreams[$id]['id'] = $id; $datastreams[$id]['label'] = $label; - $datastreams[$id]['label_link'] = islandora_datastream_access(FEDORA_VIEW_OBJECTS, $ds) ? + $datastreams[$id]['label_link'] = islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $ds) ? l($label, $download_path) : $label; $datastreams[$id]['download_url'] = $download_path; @@ -130,14 +130,14 @@ function islandora_preprocess_islandora_default(&$variables) { } $variables['datastreams'] = $datastreams; // Objects in fcrepo4 don't always contain a DC datastream. - if (isset($islandora_object['DC']) && islandora_datastream_access(FEDORA_VIEW_OBJECTS, $islandora_object['DC'])) { + if (isset($islandora_object['DC']) && islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $islandora_object['DC'])) { $dc_object = DublinCore::importFromXMLString($islandora_object['DC']->content); $dc_array = $dc_object->asArray(); } $variables['dc_array'] = isset($dc_array) ? $dc_array : array(); $variables['islandora_dublin_core'] = isset($dc_object) ? $dc_object : NULL; $variables['islandora_object_label'] = $islandora_object->label; - if (isset($islandora_object['TN']) && islandora_datastream_access(FEDORA_VIEW_OBJECTS, $islandora_object['TN'])) { + if (isset($islandora_object['TN']) && islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $islandora_object['TN'])) { $variables['islandora_thumbnail_url'] = url("islandora/object/{$islandora_object->id}/datastream/TN/view"); } } @@ -219,11 +219,11 @@ function islandora_preprocess_islandora_objects(array &$variables) { $o = islandora_object_load($o); $url = "islandora/object/{$o->id}"; $link_options = array('html' => TRUE, 'attributes' => array('title' => $o->label)); - $img = islandora_datastream_access(FEDORA_VIEW_OBJECTS, $o['TN']) ? + $img = islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $o['TN']) ? theme('image', array('path' => url("$url/datastream/TN/view"), 'attributes' => array())) : ''; $description = NULL; - if (isset($o['DC']) && islandora_datastream_access(FEDORA_VIEW_OBJECTS, $o['DC'])) { + if (isset($o['DC']) && islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $o['DC'])) { $dc = DublinCore::importFromXMLString($o['DC']->content); if ($dc) { $dc = $dc->asArray(); @@ -260,7 +260,7 @@ function theme_islandora_datastream_download_link(array $vars) { module_load_include('inc', 'islandora', 'includes/utilities'); $label = t('download'); - return islandora_datastream_access(FEDORA_VIEW_OBJECTS, $datastream) ? + return islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $datastream) ? l($label, islandora_datastream_get_url($datastream, 'download')) : ''; } @@ -289,7 +289,7 @@ function theme_islandora_datastream_view_link(array $vars) { } if ($vars['version'] === NULL) { - $perm = FEDORA_VIEW_OBJECTS; + $perm = ISLANDORA_VIEW_OBJECTS; } else { $perm = ISLANDORA_VIEW_DATASTREAM_HISTORY; @@ -319,7 +319,7 @@ function theme_islandora_datastream_delete_link(array $vars) { $datastreams = module_invoke_all('islandora_undeletable_datastreams', $datastream->parent->models); - $can_delete = !in_array($datastream->id, $datastreams) && islandora_datastream_access(FEDORA_PURGE, $datastream); + $can_delete = !in_array($datastream->id, $datastreams) && islandora_datastream_access(ISLANDORA_PURGE, $datastream); if ($vars['version'] !== NULL) { if (count($datastream) == 1) { @@ -354,7 +354,7 @@ function theme_islandora_datastream_edit_link(array $vars) { $edit_registry = module_invoke_all('islandora_edit_datastream_registry', $datastream->parent, $datastream); - $can_edit = count($edit_registry) > 0 && islandora_datastream_access(FEDORA_METADATA_EDIT, $datastream); + $can_edit = count($edit_registry) > 0 && islandora_datastream_access(ISLANDORA_METADATA_EDIT, $datastream); return $can_edit ? l(t('edit'), "islandora/object/{$datastream->parent->id}/datastream/{$datastream->id}/edit") : From 248d7611d7152a3b23cc2e23be61d0780745852f Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Wed, 14 Aug 2013 14:53:50 +0000 Subject: [PATCH 10/13] Add some examples. --- islandora.drush.inc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/islandora.drush.inc b/islandora.drush.inc index b2e75c47..6ba73cb5 100644 --- a/islandora.drush.inc +++ b/islandora.drush.inc @@ -26,6 +26,10 @@ function islandora_drush_command() { 'drupal dependencies' => array( 'islandora', ), + 'examples' => array( + 'drush -u 1 ispiro --module=islandora' => dt('Install missing solution pack objects for the "islandora" module.'), + 'drush -u 1 ispiro --module=islandora --force' => dt('Install all solution pack objects for the "islandora" module, purging any which currently exist.'), + ), 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_LOGIN, ); $commands['islandora-solution-pack-uninstall-required-objects'] = array( @@ -36,13 +40,17 @@ function islandora_drush_command() { 'required' => TRUE, ), 'force' => array( - 'description' => dt('Force reinstallation of the objects.'), + 'description' => dt('Force uninstallation of the objects.'), ), ), 'aliases' => array('ispuro'), 'drupal dependencies' => array( 'islandora', ), + 'examples' => array( + 'drush -u 1 ispuro --module=islandora' => dt('Uninstall solution pack objects for the "islandora" module.'), + 'drush -u 1 ispuro --module=islandora --force' => dt('Force uninstallation of all solution pack objects for the "islandora" module.'), + ), 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_LOGIN, ); $commands['islandora-solution-pack-required-objects-status'] = array( @@ -56,6 +64,10 @@ function islandora_drush_command() { 'drupal dependencies' => array( 'islandora', ), + 'examples' => array( + 'drush -u 1 ispros' => dt('Get the status of all solution pack objects.'), + 'drush -u 1 ispros --module=islandora' => dt('Get the status of solution pack objects for the "islandora" module.'), + ), 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_LOGIN, ); From 430febedb8889e495350d7af999bc735246a12b1 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 14 Aug 2013 18:19:25 +0000 Subject: [PATCH 11/13] Fixed links not working if Drupal is in a subfolder (e.g.: multi-site). --- js/add_print.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/add_print.js b/js/add_print.js index 7af5c3ca..0059ed88 100644 --- a/js/add_print.js +++ b/js/add_print.js @@ -8,11 +8,11 @@ */ (function ($) { $(document).ready(function() { - $('.tabs .primary').append(''); + $('.tabs .primary').append(''); $('#print_btn').css("cursor","pointer"); $('#print_btn').click(function() { - window.location=Drupal.settings.islandora.print_link; + window.location=Drupal.settings.basePath + Drupal.settings.islandora.print_link; }); }); -})(jQuery); - +})(jQuery); + From 9a985d1d0208272bc8d36f137a26404d36096441 Mon Sep 17 00:00:00 2001 From: Christian Selig Date: Wed, 14 Aug 2013 20:11:41 +0000 Subject: [PATCH 12/13] Removed prefixed slashes that caused links to break. --- islandora.module | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/islandora.module b/islandora.module index 7d2c0acb..11595b67 100644 --- a/islandora.module +++ b/islandora.module @@ -796,13 +796,13 @@ function islandora_view_object(AbstractObject $object) { $path = drupal_get_path('module', 'islandora'); drupal_add_js(array( 'islandora' => array( - 'print_img' => $path . '/images/print-icon.png'), + 'print_img' => $path . 'images/print-icon.png'), ), array( 'type' => 'setting')); drupal_add_js(array( 'islandora' => array( - 'print_link' => '/islandora/object/' . $object->id . '/print')), + 'print_link' => 'islandora/object/' . $object->id . '/print')), array('type' => 'setting')); drupal_add_js($path . '/js/add_print.js'); From 2dac96d31211274dda3832289aad2f4d3bf93f83 Mon Sep 17 00:00:00 2001 From: Christian Selig Date: Thu, 15 Aug 2013 13:47:11 +0000 Subject: [PATCH 13/13] Fixed link to print image not being formed correctly. --- islandora.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/islandora.module b/islandora.module index 11595b67..36c43313 100644 --- a/islandora.module +++ b/islandora.module @@ -796,7 +796,7 @@ function islandora_view_object(AbstractObject $object) { $path = drupal_get_path('module', 'islandora'); drupal_add_js(array( 'islandora' => array( - 'print_img' => $path . 'images/print-icon.png'), + 'print_img' => $path . '/images/print-icon.png'), ), array( 'type' => 'setting'));