Browse Source

Add core image server settings

Fix update hook, change imageserver filename
pull/725/head
Jared Whiklo 6 years ago
parent
commit
434ce7f04c
  1. 260
      includes/imageserver.inc
  2. 70
      islandora.install
  3. 98
      islandora.module

260
includes/imageserver.inc

@ -0,0 +1,260 @@
<?php
/**
* @file
* Image server central configuration.
*/
function islandora_imageserver_admin_form(array $form, array &$form_state) {
form_load_include($form_state, 'inc', 'islandora', 'includes/utilities');
$settings = islandora_imageserver_get_settings();
$form = array(
'type' => array(
'#type' => 'select',
'#title' => t('Image Server'),
'#description' => t('Select the image server to configure, used by the Paged Content, OpenSeadragon, & Internet Archive Bookreader modules.'),
'#default_value' => $settings['type'],
'#options' => array(
'none' => t('No image server configured'),
'iiif' => t('IIIF image server'),
'djatoka' => t('Adore-Djatoka image server'),
),
),
'url' => array(
'#prefix' => '<div id="islandora-imageserver-path-wrapper">',
'#suffix' => '</div>',
'#type' => 'textfield',
'#title' => t('Image Server Base URL'),
'#title_display' => 'invisible',
'#default_value' => $settings['url'],
'#description' => t('The location of the image server. <br/> !confirmation_message', array(
'!confirmation_message' => islandora_imageserver_admin_form_access_message($form_state),
)),
'#ajax' => array(
'callback' => 'islandora_imageserver_admin_ajax_url',
'wrapper' => 'islandora-imageserver-path-wrapper',
),
),
'iiif' => array(
'#type' => 'fieldset',
'#title' => t('IIIF Image Server Settings'),
'#description' => t('Settings for IIIF Image Server'),
'#states' => array(
'visible' => array(
':input[name="type"]' => array('value' => 'iiif'),
),
),
'iiif_token_header' => array(
'#type' => 'checkbox',
'#title' => t('Add token as header'),
'#default_value' => $settings['iiif_token_header'],
'#description' => t('Instead of sending the token as a query parameter, it will be sent in the X-ISLANDORA-TOKEN header.'),
),
'iiif_identifier' => array(
'#type' => 'textfield',
'#title' => t('IIIF Identifier'),
'#default_value' => $settings['iiif_identifier'],
'#element_validate' => array('token_element_validate'),
'#token_types' => array('islandora'),
),
'islandora_imageserver_iiif_token_tree' => array(
'#type' => 'fieldset',
'#title' => t('Replacement patterns'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => theme('token_tree', array(
'token_types' => array('islandora'),
'global_types' => FALSE,
)),
),
),
'actions' => array(
'#type' => 'actions',
'save' => array(
'#type' => 'submit',
'#value' => t('Save configuration'),
'#weight' => 0,
),
'reset' => array(
'#type' => 'submit',
'#value' => t('Reset to defaults'),
'#weight' => 1,
'#submit' => array('islandora_imageserver_admin_submit_reset'),
),
),
);
return $form;
}
/**
* Delete configured settings, returning us to default settings.
*/
function islandora_imageserver_admin_submit_reset() {
variable_del('islandora_imageserver_settings');
drupal_set_message('Settings reset.', 'status');
}
/**
* Implements hook_form_submit().
*/
function islandora_imageserver_admin_form_submit(array $form, array &$form_state) {
$type = $form_state['values']['type'];
if ($type == 'none') {
variable_del('islandora_imageserver_settings');
}
else {
$settings = islandora_imageserver_get_settings();
$settings['type'] = $type;
$settings['url'] = rtrim($form_state['values']['url'], '/');
if ($type == 'iiif') {
$settings['iiif_token_header'] = (bool) $form_state['values']['iiif_token_header'];
$settings['iiif_identifier'] = $form_state['values']['iiif_identifier'];
}
else {
$settings['iiif_token_header'] = FALSE;
$settings['iiif_identifier'] = ISLANDORA_IMAGESERVER_DEFAULT_TOKEN;
}
variable_set('islandora_imageserver_settings', $settings);
}
drupal_set_message("Settings saved successfully.", 'status');
}
/**
* Callback to check URL.
*
* @param array $form
* Drupal form.
* @param array $form_state
* Drupal form state.
*
* @return mixed
* The form element.
*/
function islandora_imageserver_admin_ajax_url(array $form, array $form_state) {
return $form['url'];
}
/**
* Gets a message which describes if Adore-Djatoka is accessible.
*
* @param array $settings
* The image server settings.
*
* @see islandora_imageserver_get_settings().
*
* @return string
* A message describing the accessibility of the Adore-Djatoka image resolver.
*/
function islandora_imageserver_admin_form_access_message(array &$form_state) {
$confirmation_message = '';
$type = islandora_imageserver_get_default_value($form_state, 'type');
$url = islandora_imageserver_get_default_value($form_state, 'url');
if ($type == 'djatoka') {
$url = url("{$url}", array(
'absolute' => TRUE,
'query' => array(
'url_ver' => 'Z39.88-2004',
'rft_id' => 'http://memory.loc.gov/gmd/gmd433/g4330/g4330/np000066.jp2',
'svc_id' => 'info:lanl-repo/svc/getRegion',
'svc_val_fmt' => 'info:ofi/fmt:kev:mtx:jpeg2000',
'svc.format' => 'image/jpeg',
'svc.level' => '1',
),
));
}
elseif ($type == 'iiif') {
$url = url(rtrim($url, '/')
, array(
'absolute' => TRUE,
)
);
}
if (isset($url) && !empty($url)) {
$result = drupal_http_request($url);
if ($result->code == 200) {
$confirmation_message = theme_image(array(
'path' => 'misc/watchdog-ok.png',
'attributes' => array()
));
$confirmation_message .= t('Successfully connected to image server.');
}
else {
$confirmation_message = theme_image(array(
'path' => 'misc/watchdog-error.png',
'attributes' => array()
));
$confirmation_message .= t('Unable to connect to image server at !path', array(
'!path' => $url,
));
}
}
return $confirmation_message;
}
/**
* Get image server settings.
*
* @return array
* Configuration to access the image server.
*/
function islandora_imageserver_get_settings() {
$defaults = array(
'type' => 'none',
'url' => '',
'iiif_token_header' => FALSE,
'iiif_identifier' => ISLANDORA_IMAGESERVER_DEFAULT_TOKEN,
);
$settings = variable_get('islandora_imageserver_settings', array()) + $defaults;
return $settings;
}
/**
* Utility to check form_state or return the default.
*
* @param array $form_state
* Drupal form state.
* @param $name
* Name of the form element/settings key.
* @return mixed
* The Form value or currently saved value.
*/
function islandora_imageserver_get_default_value(array &$form_state, $name) {
$settings = islandora_imageserver_get_settings();
return isset($form_state['values'][$name]) ? $form_state['values'][$name] : $settings[$name];
}
/**
* Generate a replacement string using tokens.
*
* @param string $string_token
* The replacement token to generate.
* @param string $pid
* The pid of the object.
* @param string $dsid
* The dsid to return.
* @param string $authtoken
* The authentication token.
* @return mixed
* The token replaced string.
*/
function islandora_imageserver_get_identifier($string_token, $pid, $dsid, $authtoken) {
$settings = islandora_imageserver_get_settings();
if ($settings['type'] == 'djatoka') {
// We use the token_replace to generate the rft_id.
$string_token = '[islandora:url_token]';
}
$parts = array(
'islandora' => array(
'pid' => $pid,
'dsid' => $dsid,
'token' => $authtoken,
),
);
return token_replace($string_token, $parts);
}

70
islandora.install

@ -61,6 +61,7 @@ function islandora_uninstall() {
'islandora_breadcrumbs_backends', 'islandora_breadcrumbs_backends',
'islandora_render_context_ingeststep', 'islandora_render_context_ingeststep',
'islandora_deny_inactive_and_deleted', 'islandora_deny_inactive_and_deleted',
'islandora_imageserver_settings',
); );
array_walk($variables, 'variable_del'); array_walk($variables, 'variable_del');
} }
@ -144,3 +145,72 @@ function islandora_update_7002() {
// Removing as the deprecation has been removed. // Removing as the deprecation has been removed.
variable_del('islandora_deprecation_return_false_when_datastream_exists'); variable_del('islandora_deprecation_return_false_when_datastream_exists');
} }
/**
* Implements hook_update_N().
*
* Try to auto-configure the image server settings in core based on
* the Internet Archive Bookreader and/or Openseadragon settings.
*/
function islandora_update_7003() {
module_load_include('inc', 'islandora', 'includes/imageserver');
if (islandora_imageserver_get_settings()['type'] != 'none') {
return t('Settings have already been configured manually.');
}
if (module_exists('islandora_openseadragon')) {
$openseadragon_settings = array(
'type' => variable_get('islandora_openseadragon_tilesource', 'djatoka'),
);
if ($openseadragon_settings['type'] == 'djatoka') {
$openseadragon_settings['url'] = variable_get('islandora_openseadragon_djatoka_url', 'adore-djatoka/resolver');
}
else {
$openseadragon_settings['url'] = variable_get('islandora_openseadragon_iiif_url', 'iiif');
$openseadragon_settings['iiif_token_header'] = variable_get('islandora_openseadragon_iiif_token_header', FALSE);
$openseadragon_settings['iiif_identifier'] = explode(":", variable_get('islandora_openseadragon_iiif_identifier', '[islandora_openseadragon:url_token]'))[1];
}
}
if (module_exists('islandora_internet_archive_bookreader')) {
$iabv_settings = array(
'type' => variable_get('islandora_internet_archive_bookreader_pagesource', 'djatoka'),
);
if ($iabv_settings['type'] == 'djatoka') {
$iabv_settings['url'] = variable_get('islandora_paged_content_djatoka_url', 'http://localhost:8080/adore-djatoka');
}
else {
$iabv_settings['url'] = variable_get('islandora_internet_archive_bookreader_iiif_url', 'iiif');
$iabv_settings['iiif_token_header'] = variable_get('islandora_internet_archive_bookreader_iiif_token_header', FALSE);
$iabv_settings['iiif_identifier'] = explode(":", variable_get('islandora_internet_archive_bookreader_iiif_identifier', '[islandora_iareader:url_token]'))[1];
}
}
if (isset($openseadragon_settings) && isset($iabv_settings)) {
if (count(array_diff($openseadragon_settings, $iabv_settings)) == 0) {
// Settings are the same, use for core imageserver variables.
$new_settings = $openseadragon_settings;
}
else {
// We could not migrate your settings to the new place. This stops the other
// two modules from deleting your settings.
throw new DrupalUpdateException('Islandora image server settings could NOT be configured automatically, please set them manually at Admin -> Islandora -> Image Server configuration and then run updates again.');
}
}
elseif (isset($openseadragon_settings)) {
$new_settings = $openseadragon_settings;
}
elseif (isset($iabv_settings)) {
$new_settings = $iabv_settings;
}
if (isset($new_settings)) {
if (isset($new_settings['iiif_identifer']) && !empty($new_settings['iiif_identifer'])) {
// This will only have the back half of the token, prepend islandora to it.
$new_settings['iiif_identifer'] = "[islandora:" + $new_settings['iiif_identifer'];
}
if ($new_settings['type'] == 'djatoka' && !preg_match('~resolver$~', $new_settings['url'])) {
// IABV javascript added resolver to URL, Openseadragon did not.
$new_settings['url'] = rtrim($new_settings['url'], '/') . '/resolver';
}
// We have migrated your settings to the new place.
variable_set('islandora_imageserver_settings', $new_settings);
return t("Islandora image server settings configured automatically.");
}
}

98
islandora.module

@ -72,6 +72,8 @@ define('ISLANDORA_MIME_TYPES_AUTOCOMPLETE', 'islandora/autocomplete/mime-types')
const ISLANDORA_BREADCRUMB_LEGACY_BACKEND = 'islandora_breadcrumbs_legacy_sparql'; const ISLANDORA_BREADCRUMB_LEGACY_BACKEND = 'islandora_breadcrumbs_legacy_sparql';
const ISLANDORA_IMAGESERVER_DEFAULT_TOKEN = "[islandora:url_token]";
/** /**
* Implements hook_menu(). * Implements hook_menu().
* *
@ -417,6 +419,15 @@ function islandora_menu() {
'type' => MENU_SUGGESTED_ITEM, 'type' => MENU_SUGGESTED_ITEM,
'access arguments' => array(ISLANDORA_MANAGE_DELETED_OBJECTS), 'access arguments' => array(ISLANDORA_MANAGE_DELETED_OBJECTS),
); );
$items['admin/islandora/image_server'] = array(
'title' => 'Image server configuration',
'description' => 'Define the settings for your local image server',
'page callback' => 'drupal_get_form',
'page arguments' => array('islandora_imageserver_admin_form'),
'access arguments' => array('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
'file' => 'includes/imageserver.inc',
);
return $items; return $items;
} }
@ -2230,3 +2241,90 @@ function islandora_islandora_solution_pack_child_relationships($cmodels) {
// exist when the hook is called, even if no module responds. // exist when the hook is called, even if no module responds.
return array('predicate' => array(), 'prefix' => array()); return array('predicate' => array(), 'prefix' => array());
} }
/**
* Implements hook_token_info().
*/
function islandora_token_info() {
$info = array();
$info['types']['islandora'] = array(
'name' => t('Islandora'),
'description' => t('Tokens for building IIIF identifer in Islandora.'),
'needs-data' => 'islandora',
);
$info['tokens']['islandora']['pid'] = array(
'name' => t('PID'),
'description' => t('The objects PID.'),
);
$info['tokens']['islandora']['dsid'] = array(
'name' => t('DSID'),
'description' => t('The objects DSID.'),
);
$info['tokens']['islandora']['url'] = array(
'name' => t('URL'),
'description' => t('The URL to the object in Islandora.'),
);
$info['tokens']['islandora']['url_token'] = array(
'name' => t('URL with Token'),
'description' => t('The URL to the object in Islandora with token in the query string.'),
);
$info['tokens']['islandora']['token'] = array(
'name' => t('Token'),
'description' => t('The token that can be used to access the object in Islandora.'),
);
return $info;
}
/**
* Implements hook_tokens().
*/
function islandora_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
if ($type != 'islandora' || !isset($data['islandora'])) {
return $replacements;
}
$pid = $data['islandora']['pid'];
$dsid = $data['islandora']['dsid'];
$token = $data['islandora']['token'];
foreach ($tokens as $name => $original) {
if ($name == 'pid') {
$replacements[$original] = $pid;
}
elseif ($name == 'dsid') {
$replacements[$original] = $dsid;
}
elseif ($name == 'token') {
$replacements[$original] = $token;
}
elseif ($name == 'url' || $name == 'url_token') {
$options = array(
'absolute' => TRUE,
'language' => language_default(),
'https' => (function_exists('drupal_is_https') ?
drupal_is_https() :
(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on')
),
);
if ($name == 'url_token') {
$options['query'] = array(
'token' => $token,
);
}
$replacements[$original] = url("islandora/object/{$pid}/datastream/{$dsid}/view", $options);
}
}
return $replacements;
}

Loading…
Cancel
Save