From 24cb55c7261b723f4d26de2af2311bb7c373254b Mon Sep 17 00:00:00 2001 From: Alan Stanley Date: Thu, 6 Feb 2014 16:17:23 -0400 Subject: [PATCH 01/52] wrapped command to avoid errors for uninstalled objects --- islandora.drush.inc | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/islandora.drush.inc b/islandora.drush.inc index acf3994f..4013c9a6 100644 --- a/islandora.drush.inc +++ b/islandora.drush.inc @@ -177,23 +177,25 @@ function drush_islandora_solution_pack_install_content_models() { $objects_to_add = array(); foreach ($info['objects'] as $key => $candidate) { $object = islandora_object_load($candidate); - if (in_array('fedora-system:ContentModel-3.0', $object->models)) { + if ($object && in_array('fedora-system:ContentModel-3.0', $object->models)) { $objects_to_add[] = $candidate; } } - foreach ($objects_to_add as $object_to_add) { - $old_object = islandora_object_load($object_to_add->id); - if ($old_object) { - $deleted = islandora_delete_object($old_object); - if (!$deleted) { - drush_log(dt('@object did not delete.', array('@object' => $old_object->id), 'error')); - continue; + if (count($objects_to_add) > 0) { + foreach ($objects_to_add as $object_to_add) { + $old_object = islandora_object_load($object_to_add->id); + if ($old_object) { + $deleted = islandora_delete_object($old_object); + if (!$deleted) { + drush_log(dt('@object did not delete.', array('@object' => $old_object->id), 'error')); + continue; + } + } + $new_object = islandora_add_object($object_to_add); + $verb = $deleted ? dt("Replaced") : dt("Added"); + if ($new_object) { + drush_log("$verb " . $object_to_add->id . " - " . $object_to_add->label); } - } - $new_object = islandora_add_object($object_to_add); - $verb = $deleted ? dt("Replaced") : dt("Added"); - if ($new_object) { - drush_log("$verb " . $object_to_add->id . " - " . $object_to_add->label); } } } From 024cf013fd79f1b712ba2a9160e20cc0596756e3 Mon Sep 17 00:00:00 2001 From: Jared Whiklo Date: Fri, 7 Mar 2014 16:14:39 -0600 Subject: [PATCH 02/52] Check for hostname You can enter the Djatoka URL as a relative path or full hostname. I did hostname and didn't get any errors. But this function assumes it is a path and sticks http(s):// in front which causes you to get a blank Jpeg when downloading the clip. --- islandora.module | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/islandora.module b/islandora.module index 9e7809eb..3c4ce68d 100644 --- a/islandora.module +++ b/islandora.module @@ -1540,9 +1540,12 @@ function islandora_entity_property_info() { */ function islandora_download_clip(AbstractObject $object) { if (isset($_GET['clip'])) { - $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on'; - $http_protocol = $is_https ? 'https' : 'http'; - $url = $http_protocol . '://' . $_SERVER['HTTP_HOST'] . $_GET['clip']; + $url = $_GET['clip']; + if (!preg_match('/^https?:\/\//',$url)) { + $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on'; + $http_protocol = $is_https ? 'https' : 'http'; + $url = $http_protocol . '://' . $_SERVER['HTTP_HOST'] . $url; + } $filename = $object->label; header("Content-Disposition: attachment; filename=\"{$filename}.jpg\""); header("Content-type: image/jpeg"); From ab437cceb20f156ffc424911a85a1c68e75ab05d Mon Sep 17 00:00:00 2001 From: Jared Whiklo Date: Mon, 10 Mar 2014 12:59:32 -0500 Subject: [PATCH 03/52] You wouldn't like Travis when he's angry. --- islandora.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/islandora.module b/islandora.module index 3c4ce68d..97e339d7 100644 --- a/islandora.module +++ b/islandora.module @@ -1541,7 +1541,7 @@ function islandora_entity_property_info() { function islandora_download_clip(AbstractObject $object) { if (isset($_GET['clip'])) { $url = $_GET['clip']; - if (!preg_match('/^https?:\/\//',$url)) { + if (!preg_match('/^https?:\/\//', $url)) { $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on'; $http_protocol = $is_https ? 'https' : 'http'; $url = $http_protocol . '://' . $_SERVER['HTTP_HOST'] . $url; From 07d082dc7683b9f84701c41cfc8f99598433fe87 Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Fri, 23 May 2014 17:26:22 +0000 Subject: [PATCH 04/52] Fix error due to incorrect include. --- theme/theme.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/theme.inc b/theme/theme.inc index c81a918d..06fc55b7 100644 --- a/theme/theme.inc +++ b/theme/theme.inc @@ -276,7 +276,7 @@ function islandora_preprocess_islandora_objects(array &$variables) { */ function theme_islandora_datastream_download_link(array $vars) { $datastream = $vars['datastream']; - module_load_include('inc', 'islandora', 'includes/utilities'); + module_load_include('inc', 'islandora', 'includes/datastream'); $label = t('download'); return islandora_datastream_access(ISLANDORA_VIEW_OBJECTS, $datastream) ? From b0ca737cf82ab25ed240a00c8230272fe7486518 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Mon, 2 Jun 2014 14:02:22 -0300 Subject: [PATCH 05/52] no need for bin mappings --- includes/mime_detect.inc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/includes/mime_detect.inc b/includes/mime_detect.inc index c1be1b92..a602ace2 100644 --- a/includes/mime_detect.inc +++ b/includes/mime_detect.inc @@ -203,8 +203,6 @@ class MimeDetect { "inp" => "chemical/x-gamess-input", // GAMESS Output. "gam" => "chemical/x-gamess-input", - // General output file. - "out" => "application/octet-stream", // Gaussian Cube. "cub" => "chemical/x-gaussian-cube", // Gaussian 98/03 Cartesian Input. @@ -217,8 +215,6 @@ class MimeDetect { "dx" => "chemical/x-jcamp-dx", // MOPAC Cartesian. "mop" => "chemical/x-mopac-input", - // General Input File. - "in" => "application/octet-stream", // Compressed formats: // (note: http://svn.cleancode.org/svn/email/trunk/mime.types) "tgz" => "application/x-gzip", From f8e7f8062b65f95fb255058eb19b627e7d066826 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Mon, 2 Jun 2014 14:32:58 -0300 Subject: [PATCH 06/52] chem mime fixes --- includes/mime_detect.inc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/includes/mime_detect.inc b/includes/mime_detect.inc index a602ace2..310aa115 100644 --- a/includes/mime_detect.inc +++ b/includes/mime_detect.inc @@ -191,6 +191,8 @@ class MimeDetect { "xyz" => "chemical/x-xyz", // PDB. "pdb" => "chemical/x-pdb", + // ChemDraw CDX. + 'cdx' => 'chemical/x-cdx', // ChemDraw 3D. "c3d" => "chemical/x-chem3d", // ChemDraw file. @@ -208,7 +210,7 @@ class MimeDetect { // Gaussian 98/03 Cartesian Input. "gau" => "chemical/x-gaussian-input", // Corel Multimedia Manager v6 Album. - "gal" => "application/octet-stream", + 'gal' => 'chemical/x-gaussian', // JCAMP Spectroscopic Data Exchange Format. "jdx" => "chemical/x-jcamp-dx", // OpenDX Grid. From 7488ec6f1a8e7e31f665f2ced673c99711f887e3 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Wed, 4 Jun 2014 15:42:44 -0300 Subject: [PATCH 07/52] better chem mimes --- includes/mime_detect.inc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/includes/mime_detect.inc b/includes/mime_detect.inc index 310aa115..03ece01f 100644 --- a/includes/mime_detect.inc +++ b/includes/mime_detect.inc @@ -204,13 +204,11 @@ class MimeDetect { // GAMESS Input. "inp" => "chemical/x-gamess-input", // GAMESS Output. - "gam" => "chemical/x-gamess-input", + "gam" => "chemical/x-gamess-output", // Gaussian Cube. "cub" => "chemical/x-gaussian-cube", // Gaussian 98/03 Cartesian Input. "gau" => "chemical/x-gaussian-input", - // Corel Multimedia Manager v6 Album. - 'gal' => 'chemical/x-gaussian', // JCAMP Spectroscopic Data Exchange Format. "jdx" => "chemical/x-jcamp-dx", // OpenDX Grid. From 0b7b08a254d2ef37453c85fdafd074ecbb0b8cfb Mon Sep 17 00:00:00 2001 From: nruest Date: Fri, 6 Jun 2014 12:06:03 -0400 Subject: [PATCH 08/52] Address ISLANDORA-860 --- includes/utilities.inc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/includes/utilities.inc b/includes/utilities.inc index fd6c1c3e..050921cc 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -445,8 +445,9 @@ function islandora_get_datastreams_requirements_from_content_model(AbstractObjec /** * Prepare an ingestable object. * - * @param string $namespace - * The namespace in which the PID for the new object will be created. + * @param string $name_source + * Either a pid or namespace in which the PID for the new object will be + * created. * @param string $label * An optional label to apply to the object. * @param array $datastreams @@ -471,10 +472,10 @@ function islandora_get_datastreams_requirements_from_content_model(AbstractObjec * @return NewFedoraObject * An ingestable NewFedoraObject. */ -function islandora_prepare_new_object($namespace = NULL, $label = NULL, $datastreams = array(), $content_models = array(), $relationships = array()) { +function islandora_prepare_new_object($name_source = NULL, $label = NULL, $datastreams = array(), $content_models = array(), $relationships = array()) { global $user; $tuque = islandora_get_tuque_connection(); - $object = isset($namespace) ? $tuque->repository->constructObject($namespace) : new IslandoraNewFedoraObject(NULL, $tuque->repository); + $object = isset($name_source) ? $tuque->repository->constructObject($name_source) : new IslandoraNewFedoraObject(NULL, $tuque->repository); $object->owner = isset($user->name) ? $user->name : $object->owner; $object->label = isset($label) ? $label : $object->label; foreach ($content_models as $content_model) { From ab434c379a9df3aaf090900ce5792d2f57a1690e Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Thu, 12 Jun 2014 12:58:26 +0000 Subject: [PATCH 09/52] Attempt to get use the new drush release. --- tests/scripts/travis_setup.sh | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/scripts/travis_setup.sh b/tests/scripts/travis_setup.sh index 66061c72..8cee24dd 100755 --- a/tests/scripts/travis_setup.sh +++ b/tests/scripts/travis_setup.sh @@ -18,19 +18,11 @@ pear upgrade --force pear pear channel-discover pear.drush.org # "prefer-source" required due to SSL shenanigans on the Travis boxes... -composer global require --prefer-source 'squizlabs/php_codesniffer=*' 'sebastian/phpcpd=*' +composer global require --prefer-source 'squizlabs/php_codesniffer=*' 'sebastian/phpcpd=*' 'drush/drush:6.3.0' # Because we can't add to the PATH here and this file is used in many repos, # let's just throw symlinks in. find $HOME/.composer/vendor/bin -executable \! -type d -exec sudo ln -s {} /usr/local/sbin/ \; -# Install Drush -git clone https://github.com/drush-ops/drush.git -pushd drush -git checkout 5.9.0 -chmod +x drush -popd -sudo ln -s $HOME/drush/drush /usr/local/sbin - phpenv rehash drush dl --yes drupal cd drupal-* From fe615ea78ed247ec66176f8728349a01814afd1c Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Thu, 26 Jun 2014 14:34:37 +0000 Subject: [PATCH 10/52] Change how the print works. --- islandora.module | 50 ++++++++++++++++++++++++++++++++++++------------ js/add_print.js | 18 ----------------- 2 files changed, 38 insertions(+), 30 deletions(-) delete mode 100644 js/add_print.js diff --git a/islandora.module b/islandora.module index ff077212..0cc2153a 100644 --- a/islandora.module +++ b/islandora.module @@ -142,9 +142,11 @@ function islandora_menu() { 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 2), ); $items['islandora/object/%islandora_object/print_object'] = array( + 'title' => 'Print Object', + 'weight' => 20, 'page callback' => 'islandora_printer_object', 'page arguments' => array(2), - 'type' => MENU_NORMAL_ITEM, + 'type' => MENU_LOCAL_TASK, 'access callback' => 'islandora_object_access', 'access arguments' => array(ISLANDORA_VIEW_OBJECTS, 2), ); @@ -182,6 +184,7 @@ function islandora_menu() { ISLANDORA_INGEST, ), 2), ); + $islandora_path = drupal_get_path('module', 'islandora'); $items['islandora/object/%islandora_object/manage/overview'] = array( 'title' => 'Overview', 'type' => MENU_DEFAULT_LOCAL_TASK, @@ -1024,17 +1027,6 @@ function islandora_view_object(AbstractObject $object) { module_load_include('inc', 'islandora', 'includes/breadcrumb'); module_load_include('inc', 'islandora', 'includes/utilities'); - // Add the print button via JavaScript. - $path = drupal_get_path('module', 'islandora'); - drupal_add_js(array( - 'islandora' => array( - 'print_img' => $path . '/images/print-icon.png'), - ), array( - 'type' => 'setting')); - - drupal_add_js(array('islandora' => array('print_link' => 'islandora/object/' . $object->id . '/print_object')), array('type' => 'setting')); - drupal_add_js($path . '/js/add_print.js'); - drupal_set_title($object->label); drupal_set_breadcrumb(islandora_get_breadcrumbs($object)); @@ -1913,3 +1905,37 @@ function islandora_find_package($package_name) { } return $found && user_access('administer site configuration'); } + +/** + * Implements hook_menu_local_tasks_alter(). + */ +function islandora_menu_local_tasks_alter(&$data, $router_item, $root_path) { + if (strpos($root_path, 'islandora/object/%') === 0) { + if (isset($data['tabs'][0]['output'])) { + foreach ($data['tabs'][0]['output'] as $key => &$tab) { + if ($tab['#link']['path'] == 'islandora/object/%/print_object') { + if ($root_path == 'islandora/object/%') { + $islandora_path = drupal_get_path('module', 'islandora'); + $tab['#theme'] = 'link'; + $tab['#text'] = theme('image', array( + 'path' => "$islandora_path/images/print-icon.png", + 'alt' => t('Print Object'), + 'attributes' => array( + 'id' => 'print_btn', + ), + )); + $tab['#path'] = "{$router_item['href']}/print_object"; + $tab['#options'] = array( + 'attributes' => array(), + 'html' => TRUE, + ); + } + else { + unset($data['tabs'][0]['output'][$key]); + break; + } + } + } + } + } +} \ No newline at end of file diff --git a/js/add_print.js b/js/add_print.js deleted file mode 100644 index 0059ed88..00000000 --- a/js/add_print.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @file -* JavaScript file responsable for the print button behaviour. -* -* The print button is added automatically to every view, as metadata -* can be printed from every object. -* -*/ -(function ($) { - $(document).ready(function() { - $('.tabs .primary').append(''); - $('#print_btn').css("cursor","pointer"); - $('#print_btn').click(function() { - window.location=Drupal.settings.basePath + Drupal.settings.islandora.print_link; - }); - }); -})(jQuery); - From 09aaf345142a412345b3d3c7b21d1dcdb45b8eac Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Thu, 26 Jun 2014 15:57:02 +0000 Subject: [PATCH 11/52] Newline. --- islandora.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/islandora.module b/islandora.module index 0cc2153a..31ea4e65 100644 --- a/islandora.module +++ b/islandora.module @@ -1938,4 +1938,4 @@ function islandora_menu_local_tasks_alter(&$data, $router_item, $root_path) { } } } -} \ No newline at end of file +} From 58a65f77454b4e0c8730d3484323b5a3be09e939 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Thu, 26 Jun 2014 15:17:44 -0300 Subject: [PATCH 12/52] stray include removal --- theme/theme.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/theme/theme.inc b/theme/theme.inc index 06fc55b7..884025b4 100644 --- a/theme/theme.inc +++ b/theme/theme.inc @@ -203,7 +203,6 @@ function theme_islandora_object_print(array &$variables) { * Implements hook_preprocess_theme(). */ function islandora_preprocess_islandora_objects(array &$variables) { - module_load_include('inc', 'islandora_paged_content', 'includes/utilities'); $display = (empty($_GET['display'])) ? 'grid' : $_GET['display']; $grid_display = $display == 'grid'; $list_display = !$grid_display; From 0fb4a6d7b6ab6b41a8dd413efd53c541f44d40f0 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Sat, 28 Jun 2014 22:36:11 +0000 Subject: [PATCH 13/52] removing deprecated function islandora_datastream_get_delete_link --- includes/datastream.inc | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/includes/datastream.inc b/includes/datastream.inc index ba2872c2..fde9ab47 100644 --- a/includes/datastream.inc +++ b/includes/datastream.inc @@ -290,24 +290,6 @@ function islandora_datastream_get_url(AbstractDatastream $datastream, $type = 'd } } -/** - * Gets the delete link. - * - * @param AbstractDatastream $datastream - * The datastream to generated the url to. - * - * @return string - * Markup containing the link to the confirm form to delete the datastream. - */ -function islandora_datastream_get_delete_link(AbstractDatastream $datastream) { - $message = islandora_deprecated('7.x-1.2', 'Use the "islandora_datastream_delete_link" theme implementation.'); - trigger_error(filter_xss($message), E_USER_DEPRECATED); - - return theme('islandora_datastream_delete_link', array( - 'datastream' => $datastream, - )); -} - /** * Gets the edit link. * From bba12090fd8b6c9ed6911b6ee1c391dfac1dd98c Mon Sep 17 00:00:00 2001 From: willtp87 Date: Sat, 28 Jun 2014 23:00:09 +0000 Subject: [PATCH 14/52] removing deprecated function islandora_datastream_edit_get_link --- includes/datastream.inc | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/includes/datastream.inc b/includes/datastream.inc index fde9ab47..a082a013 100644 --- a/includes/datastream.inc +++ b/includes/datastream.inc @@ -290,24 +290,6 @@ function islandora_datastream_get_url(AbstractDatastream $datastream, $type = 'd } } -/** - * Gets the edit link. - * - * @param AbstractDatastream $datastream - * The datastream to generated the url to. - * - * @return string - * Markup containing the link to edit the datastream. - */ -function islandora_datastream_edit_get_link(AbstractDatastream $datastream) { - $message = islandora_deprecated('7.x-1.2', 'Use the "islandora_datastream_edit_link" theme implementation.'); - trigger_error(filter_xss($message), E_USER_DEPRECATED); - - return theme('islandora_datastream_edit_link', array( - 'datastream' => $datastream, - )); -} - /** * Display the edit datastream page. * From 17057c267646e97b42db383afc6585863a625bce Mon Sep 17 00:00:00 2001 From: willtp87 Date: Sat, 28 Jun 2014 23:17:03 +0000 Subject: [PATCH 15/52] removing deprecated function islandora_datastream_get_download_link --- includes/datastream.inc | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/includes/datastream.inc b/includes/datastream.inc index a082a013..94b819d7 100644 --- a/includes/datastream.inc +++ b/includes/datastream.inc @@ -337,25 +337,6 @@ function islandora_edit_datastream_registry_render(array $edit_registry) { ); } -/** - * Get markup for a download link. - * - * @param AbstractDatastream $datastream - * The datastream for which to generate a link. - * - * @return string - * Either the link markup if the user has access or an empty string if the - * user is not allowed to see the given datastream. - */ -function islandora_datastream_get_download_link(AbstractDatastream $datastream) { - $message = islandora_deprecated('7.x-1.2', 'Use the "islandora_datastream_download_link" theme implementation.'); - trigger_error(filter_xss($message), E_USER_DEPRECATED); - - return theme('islandora_datastream_download_link', array( - 'datastream' => $datastream, - )); -} - /** * Get markup for a view link. * From ddd9642d829386ee3a53d8dc4df94b9fb9f669a5 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Mon, 30 Jun 2014 00:32:22 +0000 Subject: [PATCH 16/52] removing deprecated function islandora_datastream_get_view_link --- includes/datastream.inc | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/includes/datastream.inc b/includes/datastream.inc index 94b819d7..42d9ed96 100644 --- a/includes/datastream.inc +++ b/includes/datastream.inc @@ -337,25 +337,6 @@ function islandora_edit_datastream_registry_render(array $edit_registry) { ); } -/** - * Get markup for a view link. - * - * @param AbstractDatastream $datastream - * The datastream for which to generate a link. - * - * @return string - * Either the link markup if the user has access or a string containing the - * datastream ID if the user is not allowed to see the given datastream. - */ -function islandora_datastream_get_view_link(AbstractDatastream $datastream) { - $message = islandora_deprecated('7.x-1.2', 'Use the "islandora_datastream_view_link" theme implementation.'); - trigger_error(filter_xss($message), E_USER_DEPRECATED); - - return theme('islandora_datastream_view_link', array( - 'datastream' => $datastream, - )); -} - /** * Set the headers for the chunking of our content. * From 9014acf085ebcb21245fe1d585477c75870249bc Mon Sep 17 00:00:00 2001 From: willtp87 Date: Mon, 30 Jun 2014 17:28:54 +0000 Subject: [PATCH 17/52] better xsl handling --- includes/mime_detect.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/includes/mime_detect.inc b/includes/mime_detect.inc index 03ece01f..8aae5393 100644 --- a/includes/mime_detect.inc +++ b/includes/mime_detect.inc @@ -132,7 +132,8 @@ class MimeDetect { 'wbxml' => 'application/vnd.wap.wbxml', 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', - 'xsl' => 'text/xml', + 'xsl' => 'text/xsl', + 'xslt' => 'text/xsl', 'xml' => 'text/xml', 'csv' => 'text/csv', 'tsv' => 'text/tab-separated-values', From 9ea9eeed6001f7423b5f489acaac97c7627f5dd6 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Mon, 30 Jun 2014 18:45:34 +0000 Subject: [PATCH 18/52] datastream replacing mimes more accurate --- includes/datastream.version.inc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/includes/datastream.version.inc b/includes/datastream.version.inc index f245830c..515094bd 100644 --- a/includes/datastream.version.inc +++ b/includes/datastream.version.inc @@ -280,17 +280,16 @@ function islandora_datastream_version_replace_form($form, &$form_state, Abstract $form_state['object_id'] = $object->id; $form_state['dsid'] = $datastream->id; $form_state['object'] = $object; - $extensions = islandora_get_object_extensions($object); + $datastream_mime_map = islandora_get_object_extensions($object); $mime_detect = new MimeDetect(); $ext = array(); - if (isset($extensions[$datastream->id])) { - foreach ($extensions[$datastream->id]['mime'] as $key => $value) { - $str = $mime_detect->getExtension($value); - array_push($ext, $str); + if (isset($datastream_mime_map[$datastream->id])) { + foreach ($datastream_mime_map[$datastream->id]['mime'] as $key => $value) { + $extensions = $mime_detect->getValidExtensions($value); + $ext = array_merge($ext, $extensions); } } - $comma = count($ext) > 1 ? "," : ""; - $ext = array(implode($comma, $ext)); + $upload_size = min((int) ini_get('post_max_size'), (int) ini_get('upload_max_filesize')); return array( 'dsid_fieldset' => array( From 2a127bb1533eb7fb48151667776407607bc49018 Mon Sep 17 00:00:00 2001 From: nruest Date: Wed, 2 Jul 2014 23:08:38 -0400 Subject: [PATCH 19/52] I suppose we should have warc in here if we have a web archive solution pack. --- includes/mime_detect.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/includes/mime_detect.inc b/includes/mime_detect.inc index 8aae5393..74b87fd6 100644 --- a/includes/mime_detect.inc +++ b/includes/mime_detect.inc @@ -225,6 +225,8 @@ class MimeDetect { "zip" => "application/x-zip", // others: 'bin' => 'application/octet-stream', + // Web Archives: + "warc" => "application/warc", ); protected $protectedFileExtensions; protected $extensionExceptions = array( From 022842a0a04271676cd69df2e8a631dbb830e12b Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Thu, 3 Jul 2014 17:21:24 +0000 Subject: [PATCH 20/52] Move hooks calls a little higher. Where they were in the API, modifications triggering other modifications were causing old data to be used, so the second (and later) modifications would fail due to "locking"... We now allow modifications to complete to the point where they update the lastModifiedDate on instances of Tuque objects before invoking our hooks. --- includes/tuque_wrapper.inc | 92 +++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/includes/tuque_wrapper.inc b/includes/tuque_wrapper.inc index 573d7c62..33881193 100644 --- a/includes/tuque_wrapper.inc +++ b/includes/tuque_wrapper.inc @@ -173,6 +173,30 @@ class IslandoraFedoraObject extends FedoraObject { throw $e; } } + + /** + * Inherits. + * + * Calls parent and invokes object modified and deleted(/purged) hooks. + * + * @see FedoraObject::modifyObject() + */ + protected function modifyObject($params) { + try { + parent::modifyObject($params); + islandora_invoke_object_hooks(ISLANDORA_OBJECT_MODIFIED_HOOK, $this->models, $this); + if ($this->state == 'D') { + islandora_invoke_object_hooks(ISLANDORA_OBJECT_PURGED_HOOK, $this->models, $this->id); + } + } + catch (Exception $e) { + watchdog('islandora', 'Failed to modify object: @pid
code: @code
message: @msg', array( + '@pid' => $this->id, + '@code' => $e->getCode(), + '@msg' => $e->getMessage()), WATCHDOG_ERROR); + throw $e; + } + } } class IslandoraRepositoryConnection extends RepositoryConnection {} @@ -219,25 +243,10 @@ class IslandoraFedoraApiM extends FedoraApiM { if (isset($params['lastModifiedDate'])) { $params['lastModifiedDate'] = (string) $object[$dsid]->createdDate; } - try { - if ($context['block']) { - throw new Exception('Modify Datastream was blocked.'); - } - $ret = parent::modifyDatastream($pid, $dsid, $params); - islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_MODIFIED_HOOK, $object->models, $dsid, $object, $datastream); - if (isset($params['dsState']) && $params['dsState'] == 'D') { - islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_PURGED_HOOK, $object->models, $dsid, $object, $dsid); - } - return $ret; - } - catch (Exception $e) { - watchdog('islandora', 'Failed to modify datastream @dsid from @pid
code: @code
message: @msg', array( - '@pid' => $pid, - '@dsid' => $dsid, - '@code' => $e->getCode(), - '@msg' => $e->getMessage()), WATCHDOG_ERROR); - throw $e; + if ($context['block']) { + throw new Exception('Modify Datastream was blocked.'); } + return parent::modifyDatastream($pid, $dsid, $params); } /** @@ -254,24 +263,10 @@ class IslandoraFedoraApiM extends FedoraApiM { ); islandora_alter_object($object, $context); $params = $context['params']; - try { - if ($context['block']) { - throw new Exception('Modify Object was blocked.'); - } - $ret = parent::modifyObject($pid, $params); - islandora_invoke_object_hooks(ISLANDORA_OBJECT_MODIFIED_HOOK, $object->models, $object); - if (isset($params['state']) && $params['state'] == 'D') { - islandora_invoke_object_hooks(ISLANDORA_OBJECT_PURGED_HOOK, $object->models, $object->id); - } - return $ret; - } - catch (Exception $e) { - watchdog('islandora', 'Failed to modify object: @pid
code: @code
message: @msg', array( - '@pid' => $pid, - '@code' => $e->getCode(), - '@msg' => $e->getMessage()), WATCHDOG_ERROR); - throw $e; + if ($context['block']) { + throw new Exception('Modify Object was blocked.'); } + return parent::modifyObject($pid, $params); } /** @@ -377,6 +372,33 @@ class IslandoraNewFedoraDatastream extends NewFedoraDatastream { class IslandoraFedoraDatastream extends FedoraDatastream { protected $fedoraRelsIntClass = 'IslandoraFedoraRelsInt'; protected $fedoraDatastreamVersionClass = 'IslandoraFedoraDatastreamVersion'; + + /** + * Inherits. + * + * Calls parent and invokes modified and purged hooks. + * + * @see FedoraDatastream::modifyDatastream() + */ + protected function modifyDatastream(array $args) { + try { + parent::modifyDatastream($args); + // XXX: Reload datastream from parent. + $datastream = $this->parent[$this->id]; + islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_MODIFIED_HOOK, $this->parent->models, $this->id, $this->parent, $datastream); + if ($datastream->state == 'D') { + islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_PURGED_HOOK, $this->parent->models, $this->id, $this->parent, $this->id); + } + } + catch (Exception $e) { + watchdog('islandora', 'Failed to modify datastream @dsid from @pid
code: @code
message: @msg', array( + '@pid' => $this->parent->id, + '@dsid' => $this->id, + '@code' => $e->getCode(), + '@msg' => $e->getMessage()), WATCHDOG_ERROR); + throw $e; + } + } } class IslandoraFedoraDatastreamVersion extends FedoraDatastreamVersion { From 2712214b81e3a9eb15163cb7a7b0ee0329eb61a3 Mon Sep 17 00:00:00 2001 From: vagrant Date: Sun, 6 Jul 2014 19:10:04 +0000 Subject: [PATCH 21/52] Removing deprecated function islandor_get_comp_ds_mappings. --- includes/utilities.inc | 48 ------------------------------------------ 1 file changed, 48 deletions(-) diff --git a/includes/utilities.inc b/includes/utilities.inc index 050921cc..d0fffa94 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -649,54 +649,6 @@ function islandora_system_settings_form_default_value($name, $default_value, arr return isset($form_state['values'][$name]) ? $form_state['values'][$name] : variable_get($name, $default_value); } -/** - * Returns basic information about DS-COMPOSITE-MODEL. - * - * @deprecated - * The pre-existing--and more flexible-- - * islandora_get_datastreams_requirements_from_content_model() should be - * preferred, as it addresses the case where a stream can be allowed to have - * one of a set of mimetypes (this functions appears to only return the last - * declared mimetype for a given datastream). - * - * @param string $pid - * The PID of content model containing DS_COMP stream. - * - * @return array - * An associative array mapping datastream IDs to an associative array - * representing the parsed DS-COMPOSITE-MODEL of the form: - * - DSID: A string containing the datastream ID. - * - "mimetype": A string containing the last mimetype declared for the - * given datastream ID. - * - "optional": An optional boolean indicating that the given datastream - * is optional. - */ -function islandora_get_comp_ds_mappings($pid) { - $message = islandora_deprecated('7.x-1.2', t('Refactor to use the more flexible islandora_get_datastreams_requirements_from_content_model().')); - trigger_error(filter_xss($message), E_USER_DEPRECATED); - - $cm_object = islandora_object_load($pid); - if (!isset($cm_object) || !isset($cm_object['DS-COMPOSITE-MODEL'])) { - return FALSE; - } - $datastream = $cm_object['DS-COMPOSITE-MODEL']; - $ds_comp_stream = $datastream->content; - $sxml = new SimpleXMLElement($ds_comp_stream); - $mappings = array(); - foreach ($sxml->dsTypeModel as $ds) { - $dsid = (string) $ds['ID']; - $optional = (string) $ds['optional']; - foreach ($ds->form as $form) { - $mime = (string) $form['MIME']; - if ($optional) { - $mappings[$dsid]['optional'] = $optional; - } - $mappings[$dsid]['mimetype'] = $mime; - } - } - return $mappings; -} - /** * Checks that the given/current account has all the given permissions. * From 29978b7a1ef3cbed8e63a0479b8bd1e556a3edfe Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 8 Jul 2014 20:39:51 +0000 Subject: [PATCH 22/52] Resolve issue with recursing. Curse you, PHP! --- includes/tuque_wrapper.inc | 76 +++++++++++++++++++++++++++++-- tests/hooks.test | 4 ++ tests/islandora_hooks_test.module | 8 ++++ 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/includes/tuque_wrapper.inc b/includes/tuque_wrapper.inc index 33881193..348ac60a 100644 --- a/includes/tuque_wrapper.inc +++ b/includes/tuque_wrapper.inc @@ -144,6 +144,41 @@ class IslandoraFedoraObject extends FedoraObject { protected $fedoraDatastreamClass = 'IslandoraFedoraDatastream'; protected $fedoraRelsExtClass = 'IslandoraFedoraRelsExt'; + /** + * Magical magic, to allow recursive modifications. + * + * So... Magic functions in PHP are not re-entrant... Meaning that if you + * have something which tries to call __set on an object anywhere later in + * the callstack after it has already been called, it will not call the + * magic method again; instead, it will set the property on the object + * proper. Here, we detect the property being set on the object proper, and + * restore the magic functionality as long as it keeps getting set... + * + * Not necessary to try to account for this in Tuque proper, as Tuque itself + * does not have a mechanism to trigger modifications resulting from other + * modifications. + * + * @param string $name + * The name of the property being set. + * @param mixed $value + * The value to which the property should be set. + */ + public function __set($name, $value) { + parent::__set($name, $value); + + // XXX: Due to the structure of the code, we cannot use property_exists() + // (because many of the properties are declared in the class, and the magic + // triggers due them being NULLed), nor can we use isset() (because it is + // implemented as another magic function...). + $vars = get_object_vars($this); + while (isset($vars[$name])) { + $new_value = $this->$name; + unset($this->$name); + parent::__set($name, $new_value); + $vars = get_object_vars($this); + } + } + /** * Ingest the given datastream. * @@ -373,6 +408,41 @@ class IslandoraFedoraDatastream extends FedoraDatastream { protected $fedoraRelsIntClass = 'IslandoraFedoraRelsInt'; protected $fedoraDatastreamVersionClass = 'IslandoraFedoraDatastreamVersion'; + /** + * Magical magic, to allow recursive modifications. + * + * So... Magic functions in PHP are not re-entrant... Meaning that if you + * have something which tries to call __set on an object anywhere later in + * the callstack after it has already been called, it will not call the + * magic method again; instead, it will set the property on the object + * proper. Here, we detect the property being set on the object proper, and + * restore the magic functionality as long as it keeps getting set... + * + * Not necessary to try to account for this in Tuque proper, as Tuque itself + * does not have a mechanism to trigger modifications resulting from other + * modifications. + * + * @param string $name + * The name of the property being set. + * @param mixed $value + * The value to which the property should be set. + */ + public function __set($name, $value) { + parent::__set($name, $value); + + // XXX: Due to the structure of the code, we cannot use property_exists() + // (because many of the properties are declared in the class, and the magic + // triggers due them being NULLed), nor can we use isset() (because it is + // implemented as another magic function...). + $vars = get_object_vars($this); + while (isset($vars[$name])) { + $new_value = $this->$name; + unset($this->$name); + parent::__set($name, $new_value); + $vars = get_object_vars($this); + } + } + /** * Inherits. * @@ -383,10 +453,8 @@ class IslandoraFedoraDatastream extends FedoraDatastream { protected function modifyDatastream(array $args) { try { parent::modifyDatastream($args); - // XXX: Reload datastream from parent. - $datastream = $this->parent[$this->id]; - islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_MODIFIED_HOOK, $this->parent->models, $this->id, $this->parent, $datastream); - if ($datastream->state == 'D') { + islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_MODIFIED_HOOK, $this->parent->models, $this->id, $this->parent, $this); + if ($this->state == 'D') { islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_PURGED_HOOK, $this->parent->models, $this->id, $this->parent, $this->id); } } diff --git a/tests/hooks.test b/tests/hooks.test index d08c537b..b8846c52 100644 --- a/tests/hooks.test +++ b/tests/hooks.test @@ -109,9 +109,11 @@ class IslandoraHooksTestCase extends IslandoraWebTestCase { $this->repository->ingestObject($object); $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK] = FALSE; $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_MODIFIED_HOOK] = FALSE; + $_SESSION['islandora_hooks']['iteration'][ISLANDORA_OBJECT_MODIFIED_HOOK] = 0; $object->label = "New Label!"; $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_MODIFIED_HOOK], 'Called "hook_islandora_object_alter" when modifying via set magic functions.'); $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK], 'Called ISLANDORA_OBJECT_MODIFIED_HOOK when modifying via set magic functions.'); + $this->assertEqual('New Label! + 3', $object->label, 'Re-entered ISLANDORA_OBJECT_MODIFIED_HOOK when modifying via set magic functions.'); // Test blocking the modification. try { @@ -191,10 +193,12 @@ class IslandoraHooksTestCase extends IslandoraWebTestCase { $ds = $object->constructDatastream('TEST'); $object->ingestDatastream($ds); $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = FALSE; + $_SESSION['islandora_hooks']['iteration'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = 0; $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = FALSE; $ds->label = "New Label!"; $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_MODIFIED_HOOK], 'Called "hook_islandora_datastream_alter" when modifying via set magic functions.'); $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK], 'Called ISLANDORA_DATASTREAM_MODIFIED_HOOK when modifying via set magic functions.'); + $this->assertEqual('New Label! + 3', $ds->label, 'Re-entered ISLANDORA_DATASTREAM_MODIFIED_HOOK when modifying via set magic functions.'); // Test blocking modifying. try { diff --git a/tests/islandora_hooks_test.module b/tests/islandora_hooks_test.module index a6b8a5b6..cceb4dbc 100644 --- a/tests/islandora_hooks_test.module +++ b/tests/islandora_hooks_test.module @@ -112,6 +112,10 @@ function islandora_hooks_test_islandora_object_ingested(AbstractObject $object) function islandora_hooks_test_islandora_object_modified(AbstractObject $object) { if ($object->id == 'test:testModifiedObjectHook') { $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK] = TRUE; + if ($_SESSION['islandora_hooks']['iteration'][ISLANDORA_OBJECT_MODIFIED_HOOK]++ < 3) { + $new_label = 'New Label! + ' . $_SESSION['islandora_hooks']['iteration'][ISLANDORA_OBJECT_MODIFIED_HOOK]; + $object->label = $new_label; + } } } @@ -139,6 +143,10 @@ function islandora_hooks_test_islandora_datastream_ingested(AbstractObject $obje function islandora_hooks_test_islandora_datastream_modified(AbstractObject $object, AbstractDatastream $datastream) { if ($object->id == 'test:testModifiedDatastreamHook' && $datastream->id == "TEST") { $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = TRUE; + if ($_SESSION['islandora_hooks']['iteration'][ISLANDORA_DATASTREAM_MODIFIED_HOOK]++ < 3) { + $new_label = 'New Label! + ' . $_SESSION['islandora_hooks']['iteration'][ISLANDORA_DATASTREAM_MODIFIED_HOOK]; + $datastream->label = $new_label; + } } } From 6133b0973c082d7a4de1ca65a3b2e4d34cbf7cdb Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Wed, 9 Jul 2014 18:45:30 +0000 Subject: [PATCH 23/52] Magic to get around a core Drupal problem. --- includes/ingest.form.inc | 6 +++++- islandora.module | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/includes/ingest.form.inc b/includes/ingest.form.inc index f7979063..b5a4740d 100644 --- a/includes/ingest.form.inc +++ b/includes/ingest.form.inc @@ -706,7 +706,11 @@ function islandora_ingest_form_ingest_button(array &$form_state) { $validate_callback = $form_id . '_validate'; $validate = function_exists($validate_callback) ? array($validate_callback) : NULL; $submit_callback = $form_id . '_submit'; - $submit = function_exists($submit_callback) ? array($submit_callback, 'islandora_ingest_form_submit') : array('islandora_ingest_form_submit'); + $submit = function_exists($submit_callback) ? array( + $submit_callback, + 'islandora_ingest_form_pre_submit', + 'islandora_ingest_form_submit', + ) : array('islandora_ingest_form_pre_submit', 'islandora_ingest_form_submit'); return array( '#type' => 'submit', '#name' => 'ingest', diff --git a/islandora.module b/islandora.module index ff077212..2b678b78 100644 --- a/islandora.module +++ b/islandora.module @@ -1913,3 +1913,19 @@ function islandora_find_package($package_name) { } return $found && user_access('administer site configuration'); } + +/** + * Helper function for ingest steps and batches. + * + * When batches within batches are triggered within ingest steps + * the submit handler becomes out of scope. When it becomes time to execute the + * submit the function cannot be found and fails. This pre-submit is to + * get around this problem. + * + * @see https://www.drupal.org/node/2300367 + * + * @see https://www.drupal.org/node/1300928 + */ +function islandora_ingest_form_pre_submit($form, &$form_state) { + module_load_include('inc', 'islandora', 'includes/ingest.form'); +} From b7b4717e493240d4d4b2ec00318d6ba4ceaa9e14 Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Thu, 10 Jul 2014 17:24:14 +0000 Subject: [PATCH 24/52] Unused var. --- islandora.module | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/islandora.module b/islandora.module index a626e131..118f7f78 100644 --- a/islandora.module +++ b/islandora.module @@ -184,7 +184,6 @@ function islandora_menu() { ISLANDORA_INGEST, ), 2), ); - $islandora_path = drupal_get_path('module', 'islandora'); $items['islandora/object/%islandora_object/manage/overview'] = array( 'title' => 'Overview', 'type' => MENU_DEFAULT_LOCAL_TASK, @@ -1922,7 +1921,7 @@ function islandora_ingest_form_pre_submit($form, &$form_state) { module_load_include('inc', 'islandora', 'includes/ingest.form'); } -/* +/* * Implements hook_menu_local_tasks_alter(). */ function islandora_menu_local_tasks_alter(&$data, $router_item, $root_path) { From d964ea204275b197138af1494c8aabad3a56c3a4 Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Thu, 10 Jul 2014 18:06:59 +0000 Subject: [PATCH 25/52] Appease the Travis gods after a merge conflict fail. --- islandora.module | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/islandora.module b/islandora.module index 118f7f78..f0bf796b 100644 --- a/islandora.module +++ b/islandora.module @@ -1921,7 +1921,7 @@ function islandora_ingest_form_pre_submit($form, &$form_state) { module_load_include('inc', 'islandora', 'includes/ingest.form'); } -/* +/** * Implements hook_menu_local_tasks_alter(). */ function islandora_menu_local_tasks_alter(&$data, $router_item, $root_path) { @@ -1954,4 +1954,3 @@ function islandora_menu_local_tasks_alter(&$data, $router_item, $root_path) { } } } - From 29b32e2c073aa8ddd38ef449e7e50b5843c9e0f8 Mon Sep 17 00:00:00 2001 From: willtp87 Date: Mon, 14 Jul 2014 13:32:32 +0000 Subject: [PATCH 26/52] not lying about units --- includes/utilities.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/utilities.inc b/includes/utilities.inc index d0fffa94..26633df5 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -30,16 +30,16 @@ function islandora_convert_bytes_to_human_readable($bytes, $precision = 2) { return $bytes . ' B'; } elseif (($bytes >= $kilobyte) && ($bytes < $megabyte)) { - return round($bytes / $kilobyte, $precision) . ' KB'; + return round($bytes / $kilobyte, $precision) . ' KiB'; } elseif (($bytes >= $megabyte) && ($bytes < $gigabyte)) { - return round($bytes / $megabyte, $precision) . ' MB'; + return round($bytes / $megabyte, $precision) . ' MiB'; } elseif (($bytes >= $gigabyte) && ($bytes < $terabyte)) { - return round($bytes / $gigabyte, $precision) . ' GB'; + return round($bytes / $gigabyte, $precision) . ' GiB'; } elseif ($bytes >= $terabyte) { - return round($bytes / $terabyte, $precision) . ' TB'; + return round($bytes / $terabyte, $precision) . ' TiB'; } else { return $bytes . ' B'; From 6ca6dc4c068954f970f8dc86d75867c2b11b76cc Mon Sep 17 00:00:00 2001 From: Jordan Dukart Date: Fri, 18 Jul 2014 11:55:44 +0000 Subject: [PATCH 27/52] Make sure our attribute doesn't break markup. --- theme/islandora-dublin-core-display.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/islandora-dublin-core-display.tpl.php b/theme/islandora-dublin-core-display.tpl.php index 52c80607..4badc619 100644 --- a/theme/islandora-dublin-core-display.tpl.php +++ b/theme/islandora-dublin-core-display.tpl.php @@ -20,7 +20,7 @@