diff --git a/.gitignore b/.gitignore
index c432e384..9b07bbb0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,6 @@ tests/islandora_web_test_case.inc~
theme/islandora-object.tpl.php~
theme/islandora.theme.inc~
+
+tests/test_config.ini
+
diff --git a/includes/IslandoraTuqueWrapper.inc b/includes/IslandoraTuqueWrapper.inc
deleted file mode 100644
index 2692c24c..00000000
--- a/includes/IslandoraTuqueWrapper.inc
+++ /dev/null
@@ -1,78 +0,0 @@
-connection = new IslandoraRepositoryConnection($url, $user_string, $pass_string);
$this->connection->reuseConnection = TRUE;
$this->api = new IslandoraFedoraApi($this->connection);
diff --git a/includes/islandora_tuque_wrapper.inc b/includes/islandora_tuque_wrapper.inc
new file mode 100644
index 00000000..8bd3c3e6
--- /dev/null
+++ b/includes/islandora_tuque_wrapper.inc
@@ -0,0 +1,360 @@
+models as $model) {
+ $types[] = "{$model}_islandora_object";
+ }
+ drupal_alter($types, $object, $context);
+}
+
+/**
+ * Allow modules to alter a datastream before a mutable event occurs.
+ */
+function islandora_alter_datastream(AbstractFedoraObject $object, AbstractDatastream $datastream, array &$context) {
+ $types = array('islandora_datastream');
+ foreach ($object->models as $model) {
+ $types[] = "{$model}_{$datastream->id}_islandora_datastream";
+ }
+ drupal_alter($types, $object, $datastream, $context);
+}
+
+/**
+ * Constructs a list of hooks from the given paramenters and invokes them.
+ */
+function islandora_invoke_object_hooks($hook, array $models) {
+ module_load_include('inc', 'islandora', 'includes/utilities');
+ return islandora_invoke_hook_list($hook, $models, array_slice(func_get_args(), 2));
+}
+
+/**
+ * Constructs a list of hooks from the given paramenters and invokes them.
+ */
+function islandora_invoke_datastream_hooks($hook, array $models, $dsid) {
+ module_load_include('inc', 'islandora', 'includes/utilities');
+ $refinements = array();
+ foreach ($models as $model) {
+ $refinements[] = "{$model}_{$dsid}";
+ }
+ return islandora_invoke_hook_list($hook, $refinements, array_slice(func_get_args(), 3));
+}
+
+class IslandoraFedoraRepository extends FedoraRepository {
+ protected $queryClass = 'IslandoraRepositoryQuery';
+ protected $newObjectClass = 'IslandoraNewFedoraObject';
+ protected $objectClass = 'IslandoraFedoraObject';
+
+ /**
+ * Ingest the given object.
+ *
+ * @see FedoraRepository::ingestObject()
+ */
+ public function ingestObject(NewFedoraObject &$object) {
+ $context = array(
+ 'action' => 'ingest',
+ 'block' => FALSE,
+ );
+ islandora_alter_object($object, $context);
+ try {
+ if ($context['block']) {
+ throw new Exception('Ingest Object was blocked.');
+ }
+ $ret = parent::ingestObject($object);
+ islandora_invoke_object_hooks(ISLANDORA_OBJECT_INGESTED_HOOK, $object->models, $object);
+ // Call the ingested datastream hooks for NewFedoraObject's after the
+ // object had been ingested.
+ foreach ($object as $dsid => $datastream) {
+ islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_INGESTED_HOOK, $object->models, $dsid, $object, $datastream);
+ }
+ return $ret;
+ }
+ catch (Exception $e) {
+ watchdog('islandora', 'Failed to ingest object: @pidcode: @code
message: @msg', array(
+ '@pid' => $object->id,
+ '@code' => $e->getCode(),
+ '@msg' => $e->getMessage()), WATCHDOG_ERROR);
+ throw $e;
+ }
+ }
+}
+
+class IslandoraRepositoryQuery extends RepositoryQuery {}
+
+class IslandoraNewFedoraObject extends NewFedoraObject {
+ protected $newFedoraDatastreamClass = 'IslandoraNewFedoraDatastream';
+ protected $fedoraDatastreamClass = 'IslandoraFedoraDatastream';
+ protected $fedoraRelsExtClass = 'IslandoraFedoraRelsExt';
+}
+
+class IslandoraFedoraObject extends FedoraObject {
+ protected $newFedoraDatastreamClass = 'IslandoraNewFedoraDatastream';
+ protected $fedoraDatastreamClass = 'IslandoraFedoraDatastream';
+ protected $fedoraRelsExtClass = 'IslandoraFedoraRelsExt';
+
+ /**
+ * Ingest the given datastream.
+ *
+ * @see FedoraObject::ingestDatastream()
+ */
+ public function ingestDatastream(&$datastream) {
+ $object = $datastream->parent;
+ $context = array(
+ 'action' => 'ingest',
+ 'block' => FALSE,
+ );
+ islandora_alter_datastream($object, $datastream, $context);
+ try {
+ if ($context['block']) {
+ throw new Exception('Ingest Datastream was blocked.');
+ }
+ $ret = parent::ingestDatastream($datastream);
+ islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_INGESTED_HOOK, $object->models, $datastream->id, $object, $datastream);
+ return $ret;
+ }
+ catch (Exception $e) {
+ watchdog('islandora', 'Failed to ingest object: @pidcode: @code
message: @msg', array(
+ '@pid' => $object->id,
+ '@dsid' => $datastream->id,
+ '@code' => $e->getCode(),
+ '@msg' => $e->getMessage()), WATCHDOG_ERROR);
+ throw $e;
+ }
+ }
+}
+
+class IslandoraRepositoryConnection extends RepositoryConnection {}
+
+class IslandoraFedoraApi extends FedoraApi {
+
+ /**
+ * Instantiate a IslandoraFedoraApi object.
+ *
+ * @see FedoraApi::__construct()
+ */
+ public function __construct(IslandoraRepositoryConnection $connection, FedoraApiSerializer $serializer = NULL) {
+ if (!$serializer) {
+ $serializer = new FedoraApiSerializer();
+ }
+ $this->a = new FedoraApiA($connection, $serializer);
+ $this->m = new IslandoraFedoraApiM($connection, $serializer);
+ $this->connection = $connection;
+ }
+}
+
+class IslandoraFedoraApiM extends FedoraApiM {
+
+ /**
+ * Update a datastream.
+ *
+ * Either changing its metadata, updaing the datastream contents or both.
+ *
+ * @throws Exception
+ * If the modify datastream request was block by some module.
+ *
+ * @see FedoraApiM::modifyDatastream
+ */
+ public function modifyDatastream($pid, $dsid, $params = array()) {
+ $object = islandora_object_load($pid);
+ $datastream = $object[$dsid];
+ $context = array(
+ 'action' => 'modify',
+ 'block' => FALSE,
+ 'params' => $params,
+ );
+ islandora_alter_datastream($object, $datastream, $context);
+ 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 @pidcode: @code
message: @msg', array(
+ '@pid' => $pid,
+ '@dsid' => $dsid,
+ '@code' => $e->getCode(),
+ '@msg' => $e->getMessage()), WATCHDOG_ERROR);
+ throw $e;
+ }
+ }
+
+ /**
+ * Update Fedora Object parameters.
+ *
+ * @see FedoraApiM::modifyObject
+ */
+ public function modifyObject($pid, $params = NULL) {
+ $object = islandora_object_load($pid);
+ $context = array(
+ 'action' => 'modify',
+ 'block' => FALSE,
+ 'params' => $params,
+ );
+ islandora_alter_object($object, $context);
+ 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: @pidcode: @code
message: @msg', array(
+ '@pid' => $pid,
+ '@code' => $e->getCode(),
+ '@msg' => $e->getMessage()), WATCHDOG_ERROR);
+ throw $e;
+ }
+ }
+
+ /**
+ * Purge a datastream from from Fedora.
+ *
+ * @see FedoraApiM::purgeDatastream
+ */
+ public function purgeDatastream($pid, $dsid, $params = array()) {
+ $object = islandora_object_load($pid);
+ $context = array(
+ 'action' => 'purge',
+ 'purge' => TRUE,
+ 'delete' => FALSE,
+ 'block' => FALSE,
+ );
+ islandora_alter_datastream($object, $object[$dsid], $context);
+ try {
+ $action = $context['block'] ? 'block' : FALSE;
+ $action = (!$action && $context['delete']) ? 'delete' : $action;
+ $action = !$action ? 'purge' : $action;
+ switch ($action) {
+ case 'block':
+ throw new Exception('Purge Datastream was blocked.');
+ break;
+
+ case 'delete':
+ $object[$dsid]->state = 'D';
+ return array();
+
+ default:
+ $ret = parent::purgeDatastream($pid, $dsid, $params);
+ islandora_invoke_datastream_hooks(ISLANDORA_DATASTREAM_PURGED_HOOK, $object->models, $dsid, $object, $dsid);
+ return $ret;
+ }
+ }
+ catch(Exception $e) {
+ watchdog('islandora', 'Failed to purge datastream @dsid from @pidcode: @code
message: @msg', array(
+ '@pid' => $pid,
+ '@dsid' => $dsid,
+ '@code' => $e->getCode(),
+ '@msg' => $e->getMessage()), WATCHDOG_ERROR);
+ throw $e;
+ }
+ }
+
+ /**
+ * Purge an object.
+ *
+ * @see FedoraApiM::purgeObject
+ */
+ public function purgeObject($pid, $log_message = NULL) {
+ $object = islandora_object_load($pid);
+ $context = array(
+ 'action' => 'purge',
+ 'purge' => TRUE,
+ 'delete' => FALSE,
+ 'block' => FALSE,
+ );
+ islandora_alter_object($object, $context);
+ try {
+ $action = $context['block'] ? 'block' : FALSE;
+ $action = (!$action && $context['delete']) ? 'delete' : $action;
+ $action = !$action ? 'purge' : $action;
+ $models = $object->models;
+ switch ($action) {
+ case 'block':
+ throw new Exception('Purge object was blocked.');
+ break;
+
+ case 'delete':
+ $object->state = 'D';
+ return '';
+
+ default:
+ $ret = parent::purgeObject($pid, $log_message);
+ islandora_invoke_object_hooks(ISLANDORA_OBJECT_PURGED_HOOK, $models, $pid);
+ return $ret;
+ }
+ }
+ catch(Exception $e) {
+ watchdog('islandora', 'Failed to purge object @pidcode: @code
message: @msg', array(
+ '@pid' => $pid,
+ '@code' => $e->getCode(),
+ '@msg' => $e->getMessage()), WATCHDOG_ERROR);
+ throw $e;
+ }
+ }
+
+}
+
+class IslandoraSimpleCache extends SimpleCache {}
+
+class IslandoraNewFedoraDatastream extends NewFedoraDatastream {
+ protected $fedoraRelsIntClass = 'IslandoraFedoraRelsInt';
+ protected $fedoraDatastreamVersionClass = 'IslandoraFedoraDatastreamVersion';
+}
+
+class IslandoraFedoraDatastream extends FedoraDatastream {
+ protected $fedoraRelsIntClass = 'IslandoraFedoraRelsInt';
+ protected $fedoraDatastreamVersionClass = 'IslandoraFedoraDatastreamVersion';
+}
+
+class IslandoraFedoraDatastreamVersion extends FedoraDatastreamVersion {
+ protected $fedoraRelsIntClass = 'IslandoraFedoraRelsInt';
+ protected $fedoraDatastreamVersionClass = 'IslandoraFedoraDatastreamVersion';
+}
+
+class IslandoraFedoraRelsExt extends FedoraRelsExt {}
+
+class IslandoraFedoraRelsInt extends FedoraRelsInt {}
diff --git a/includes/MimeDetect.inc b/includes/mime_detect.inc
similarity index 100%
rename from includes/MimeDetect.inc
rename to includes/mime_detect.inc
diff --git a/includes/solution_packs.inc b/includes/solution_packs.inc
index bf50a1f5..f3e0f0e8 100644
--- a/includes/solution_packs.inc
+++ b/includes/solution_packs.inc
@@ -622,11 +622,14 @@ function theme_islandora_viewers_table($variables) {
* Array or string with data the module needs in order to render a full viewer
* @param string $variable_id
* The id of the Drupal variable the viewer settings are saved in
+ * @param FedoraObject $fedora_object
+ * The tuque object representing the fedora object being displayed
* @return
* The callback to the viewer module. Returns a rendered viewer. Returns FALSE
* if no viewer is set.
*/
-function islandora_get_viewer($params = NULL, $variable_id = NULL) {
+
+function islandora_get_viewer($params = NULL, $variable_id = NULL, $fedora_object = NULL) {
// get viewer from settings
$settings = variable_get($variable_id, array());
// make sure a viewer is set
@@ -636,10 +639,10 @@ function islandora_get_viewer($params = NULL, $variable_id = NULL) {
if ($viewer_id AND $params !== NULL) {
$callback = islandora_get_viewer_callback($viewer_id);
// call callback function
- return $callback($params);
+ return $callback($params, $fedora_object);
}
}
- return NULL;
+ return FALSE;
}
/**
diff --git a/includes/utilities.inc b/includes/utilities.inc
index fe1cf1d0..b210d35c 100644
--- a/includes/utilities.inc
+++ b/includes/utilities.inc
@@ -112,29 +112,65 @@ function islandora_describe_repository($url = NULL) {
}
/**
- * Build a list of all the hooks to call.
+ * Build and invoke a list of hooks by combining the given hook and refinements.
+ *
+ * The given hook will be called as MODULE_HOOK, and for each hook refinement
+ * as MODULE_REFINEMENT_HOOK. Any additional arguments passed to this function
+ * will be passed as arguments to module_invoke_all().
*
- * Concatenates the each pid (escaped) to the hook name, for calling in
- * module_invoke_all().
+ * @see islandora_build_hook_list()
+ * To see how the hook list is generated.
*
* @param string $hook
* A hook to call.
- * @param array $pids
- * An array of PIDs (probably content models).
+ * @param array $refinements
+ * An array of strings, that will be escaped and concatinated with the given
+ * hook. This will most likely be PIDs/DSIDs/Labels etc. We often refine our
+ * hooks using an objects model.
+ * @param array $args
+ * Any arguments to pass onto module_invoke_all().
*
* @return array
- * An array with each PID escaped and concatenated with the base hook name,
- * in addition to the base hook name at the end.
+ * The merged results from all the hooks.
*/
-function islandora_build_hook_list($hook, $pids = array()) {
- $hooks = array();
-
- $pids = array_unique($pids);
- foreach ($pids as $pid) {
- $hooks[] = islandora_escape_pid_for_function($pid) . '_' . $hook;
+function islandora_invoke_hook_list($hook, array $refinements, array $args) {
+ $return = array();
+ foreach (islandora_build_hook_list($hook, $refinements) as $hook) {
+ array_unshift($args, $hook);
+ $result = call_user_func_array('module_invoke_all', $args);
+ $return = array_merge_recursive($return, $result);
+ array_shift($args);
}
- $hooks[] = $hook;
+ return $return;
+}
+/**
+ * Build a list of all the hooks to call.
+ *
+ * Concatenates each hook $refinement (escaped) to the hook name, for calling
+ * with module_invoke_all().
+ *
+ * Any non-valid PHP function characters in the given refinements are
+ * converted to "_" characters.
+ *
+ * @param string $hook
+ * The base hook to concatenate.
+ * @param array $refinements
+ * An array of strings, that will be escaped and concatinated with the given
+ * hook. This will most likely be PIDs/DSIDs/Labels etc. We often refine our
+ * hooks using an objects model.
+ *
+ * @return array
+ * An array with each refinement escaped and concatenated with the base hook
+ * name, in addition to the base hook name.
+ */
+function islandora_build_hook_list($hook, $refinements = array()) {
+ $refinements = array_unique($refinements);
+ $hooks = array($hook);
+ foreach ($refinements as $refinement) {
+ $refinement = preg_replace('/[^a-zA-Z0-9_]/', '_', $refinement);
+ $hooks[] = "{$refinement}_{$hook}";
+ }
return $hooks;
}
@@ -397,7 +433,7 @@ function islandora_prepare_new_object($namespace = NULL, $label = NULL, $datastr
$mimetype = isset($ds['mimetype']) ? $ds['mimetype'] : 'text/xml';
// Default 'Managed'
$control_group = (isset($ds['control_group']) && in_array($ds['control_group'], array('X', 'M', 'R', 'E'))) ? $ds['control_group'] : 'M';
-
+
$ds_uri = FALSE;
if (file_valid_uri($ds['datastream_file'])) {
$datastream_file = $ds['datastream_file'];
@@ -405,7 +441,7 @@ function islandora_prepare_new_object($namespace = NULL, $label = NULL, $datastr
}
else {
$datastream_file = url($ds['datastream_file'], array('absolute' => TRUE));
- }
+ }
$datastream = $object->constructDatastream($dsid, $control_group);
$datastream->label = $label;
$datastream->mimetype = $mimetype;
@@ -440,3 +476,64 @@ function islandora_display_repository_inaccessible_message() {
array('!link' => $link));
drupal_set_message($message, 'error', FALSE);
}
+
+/**
+ * Create a message stating if the given executable is available.
+ *
+ * If the both the version and required version are given then only if the
+ * version is equal to or greater than the required version the executable
+ * will be considered correct.
+ *
+ * @param string $path
+ * The absolute path to an executable to check for availability.
+ * @param string $version
+ * The version of exectuable.
+ * @param string $required_version
+ * The required version of exectuable.
+ *
+ * @return string
+ * A message in html detailing if the given executable is accessible.
+ */
+function islandora_executable_available_message($path, $version = NULL, $required_version = NULL) {
+ $available = is_executable($path);
+ if ($available) {
+ $image = theme_image(array('path' => 'misc/watchdog-ok.png', 'attributes' => array()));
+ $message = t('Executable found at @path', array('@path' => $path));
+ if ($version) {
+ $message .= t('
Version: @version', array('@version' => $version));
+ }
+ if ($required_version) {
+ $message .= t('
Required Version: @version', array('@version' => $required_version));
+ if (version_compare($version, $required_version) < 0) {
+ $image = theme_image(array('path' => 'misc/watchdog-error.png', 'attributes' => array()));
+ }
+ }
+ }
+ else {
+ $image = theme_image(array('path' => 'misc/watchdog-error.png', 'attributes' => array()));
+ $message = t('Unable to locate executable at @path', array('@path' => $path));
+ }
+ return $image . $message;
+}
+
+/**
+ * Create a message stating if the given directory exists.
+ *
+ * @param string $path
+ * The absolute path to an executable to check for availability.
+ *
+ * @return string
+ * A message in HTML detailing if the given directory is exists.
+ */
+function islandora_directory_exists_message($path) {
+ $available = is_dir($path);
+ if ($available) {
+ $image = theme_image(array('path' => 'misc/watchdog-ok.png', 'attributes' => array()));
+ $message = t('Directory found at @path', array('@path' => $path));
+ }
+ else {
+ $image = theme_image(array('path' => 'misc/watchdog-error.png', 'attributes' => array()));
+ $message = t('Unable to locate directory at @path', array('@path' => $path));
+ }
+ return $image . $message;
+}
diff --git a/islandora.api.php b/islandora.api.php
index f017f937..5e976194 100644
--- a/islandora.api.php
+++ b/islandora.api.php
@@ -2,24 +2,26 @@
/**
* @file
- * This file lists and documents all available hook functions to manipulate data.
+ * This file documents all available hook functions to manipulate data.
*/
/**
* Generate a repository objects view.
*
- * @param FedoraObject $fedora_object
- * A Tuque FedoraObject being operated on.
+ * @param FedoraObject $object
+ * The object to display
* @param object $user
* The user accessing the object.
* @param string $page_number
* The page in the content.
- * @param string $page_size: The size of the page.
+ * @param string $page_size
+ * The size of the page.
*
* @return array
* An array whose values are markup.
*/
-function hook_islandora_view_object($fedora_object, $user, $page_number, $page_size) {}
+function hook_islandora_view_object($object, $user, $page_number, $page_size) {
+}
/**
* Generate an object's display for the given content model.
@@ -27,35 +29,38 @@ function hook_islandora_view_object($fedora_object, $user, $page_number, $page_s
* Content models PIDs have colons and hyphens changed to underscores, to
* create the hook name.
*
- * @param type $fedora_object
+ * @param FedoraObject $object
* A Tuque FedoraObject
*
* @return array
* An array whose values are markup.
*/
-function hook_CMODEL_PID_islandora_view_object($fedora_object) {}
+function hook_CMODEL_PID_islandora_view_object($object) {
+}
/**
* Alter display output after it has been generated.
*
- * @param FedoraObject $fedora_object
+ * @param FedoraObject $object
* A Tuque FedoraObject being operated on.
- * @param array $arr
+ * @param array $rendered
* An arr of rendered views.
*/
-function hook_islandora_view_object_alter(&$fedora_object, &$arr) {}
+function hook_islandora_view_object_alter(&$object, &$rendered) {
+}
/**
* Generate an object's management display.
*
- * @param type $fedora_object
+ * @param FedoraObject $object
* A Tuque FedoraObject
*
* @return array
* An array whose values are markup.
*/
-function hook_islandora_edit_object($fedora_object) {}
+function hook_islandora_edit_object($object) {
+}
/**
* Generate an object's management display for the given content model.
@@ -63,148 +68,282 @@ function hook_islandora_edit_object($fedora_object) {}
* Content models PIDs have colons and hyphens changed to underscores, to
* create the hook name.
*
- * @param type $fedora_object
+ * @param FedoraObject $object
* A Tuque FedoraObject
*
* @return array
* An array whose values are markup.
*/
-function hook_CMODEL_PID_islandora_edit_object($fedora_object) {}
+function hook_CMODEL_PID_islandora_edit_object($object) {
+}
/**
* Allow management display output to be altered.
*
- * @param type $fedora_object
+ * @param FedoraObject $object
* A Tuque FedoraObject
- * @param type $arr
+ * @param array $rendered
* an arr of rendered views
*/
-function hook_islandora_edit_object_alter(&$fedora_object, &$arr) {}
+function hook_islandora_edit_object_alter(&$object, &$rendered) {
+}
+
+/**
+ * Allows modules to alter the object or block/modify the given action.
+ *
+ * This alter hook will be called before any object is ingested, modified or
+ * purged.
+ *
+ * Changing object properties such as "label", or "state", are considered
+ * modifications, where as manipulating an object's datstreams are not.
+ *
+ * @param AbstractFedoraObject $object
+ * The object to alter.
+ * @param array $context
+ * An associative array containing:
+ * - action: A string either 'ingest', 'purge', 'modify'.
+ * - block: Either TRUE or FALSE, if TRUE the action won't take place.
+ * Defaults to FALSE.
+ * - purge: Either TRUE or FALSE, only present when the action is 'purge'.
+ * If 'delete' or 'block' is set to TRUE, they will take precedence.
+ * Defaults to TRUE.
+ * - delete: Either TRUE or FALSE, only present when the action is 'purge'.
+ * If TRUE it will cause the object's state to be set to 'D' instead.
+ * If 'block' is set to TRUE, it will take precedence.
+ * Defaults to FALSE,
+ * - params: An associative array, only present when the action is 'modify'.
+ * The key value pairs repersent what values will be changed. The params
+ * will match the same params as passed to FedoraApiM::modifyObject().
+ *
+ * @see FedoraApiM::modifyObject()
+ */
+function hook_islandora_object_alter(AbstractFedoraObject $object, array &$context) {
+}
/**
- * Allows modules to add to an objects ingest process.
+ * Allows modules to alter the object or block/modify the given action.
*
- * @param FedoraObject $fedora_object
- * A Tuque FedoraObject.
+ * @see hook_islandora_object_alter()
+ */
+function hook_CMODEL_PID_islandora_object_alter(AbstractFedoraObject $object, array &$context) {
+}
+
+/**
+ * Allows modules to alter the datastream or block/modify the given action.
+ *
+ * This alter hook will be called before any datastream is ingested, modified or
+ * purged.
+ *
+ * Adding datastreams to NewFedoraObject's will not trigger this alter hook
+ * immediately, instead it will be triggered for all datastreams at the time
+ * of the NewFedoraObject's ingest.
+ *
+ * Purging datastreams from a NewFedoraObject will not trigger this alter hook
+ * at all.
+ *
+ * Changing datastream's properties such as "label", or "state", are considered
+ * modifications, as well as changing the datastreams content.
+ *
+ * @param AbstractFedoraObject $object
+ * The object to the datastream belong to.
+ * @param AbstractFedoraDatastream $datastream
+ * The datastream to alter.
+ * @param array $context
+ * An associative array containing:
+ * - action: A string either 'ingest', 'purge', 'modify'.
+ * - block: Either TRUE or FALSE, if TRUE the action won't take place.
+ * Defaults to FALSE.
+ * - purge: Either TRUE or FALSE, only present when the action is 'purge'.
+ * If 'delete' or 'block' is set to TRUE, they will take precedence.
+ * Defaults to TRUE.
+ * - delete: Either TRUE or FALSE, only present when the action is 'purge'.
+ * If TRUE it will cause the object's state to be set to 'D' instead.
+ * If 'block' is set to TRUE, it will take precedence.
+ * Defaults to FALSE,
+ * - params: An associative array, only present when the action is 'modify'.
+ * The key value pairs repersent what values will be changed. The params
+ * will match the same params as passed to FedoraApiM::modifyDatastream().
+ *
+ * @see FedoraApiM::modifyDatastream()
*/
-function hook_islandora_ingest_post_ingest($fedora_object) {}
+function hook_islandora_datastream_alter(AbstractFedoraObject $object, AbstractFedoraDatastream $datastream, array &$context) {
+}
/**
- * Allow modules to add to the ingest process of a specific content model.
+ * Allows modules to alter the datastream or block/modify the given action.
+ *
+ * @see hook_islandora_datastream_alter()
*/
-function hook_CMODEL_PID_islandora_ingest_post_ingest($fedora_object) {}
+function hook_CMODEL_PID_DSID_islandora_datastream_alter(AbstractFedoraObject $object, AbstractFedoraDatastream $datastream, array &$context) {
+}
/**
- * Allows modules to add to a repository objects view/edit(/misc) process.
+ * Notify modules that the given object was ingested.
*
- * If you implement this hook you must also register your module with
- * hook_islandora_hook_info().
+ * This hook is called after an object has been successfully ingested via a
+ * FedoraRepository object.
*
- * @param FedoraObject $fedora_object
- * A Tuque FedoraObject.
+ * @note
+ * If ingested directly via the FedoraApiM object this will not be called as we
+ * don't have access to the ingested object at that time.
*
- * @return array|null
- * An associative array with 'deleted' mapped to TRUE--indicating that the
- * object should just be marked as deleted, instead of actually being
- * purged--or NULL/no return if we just need to do something before the
- * is purged.
+ * @param FedoraObject $object
+ * The object that was ingested.
*/
-function hook_islandora_pre_purge_object($fedora_object) {}
+function hook_islandora_object_ingested(FedoraObject $object) {
+}
/**
- * Allow modules to react to the purge process of a specific content model.
+ * Notify modules that the given object was ingested.
*
- * @see hook_islandora_pre_purge_object()
+ * @see hook_islandora_object_ingested()
*/
-function hook_CMODEL_PID_islandora_pre_purge_object($fedora_object) {}
+function hook_CMODEL_PID_islandora_object_ingested(FedoraObject $object) {
+}
/**
- * Register potential ingest routes.
+ * Notify modules that the given object was modified.
*
- * Implementations should return an array containing possible routes.
+ * This hook is called after an object has been successfully modified.
+ *
+ * Changing object properties such as "label", or "state", are considered
+ * modifications, where as manipulating an object's datstreams are not.
+ *
+ * @param FedoraObject $object
+ * The object that was ingested.
+ *
+ * @todo We should also include what changes were made in a additional
+ * parameter.
*/
-function hook_islandora_ingest_registry($collection_object) {
- $reg = array(
- array(
- 'name' => t('Ingest route name'),
- 'url' => 'ingest_route/url',
- 'weight' => 0,
- ),
- );
- return $reg;
+function hook_islandora_object_modified(FedoraObject $object) {
}
/**
- * Register a datastream edit route/form.
+ * Notify modules that the given object was ingested.
*
- * @param $islandora_object
- * @param $ds_id
+ * @see hook_islandora_object_modified()
*/
-function hook_islandora_edit_datastream_registry($islandora_object, $ds_id) {}
+function hook_CMODEL_PID_islandora_object_modified(FedoraObject $object) {
+}
/**
- * Alter an object before it gets used further down the stack.
+ * Notify modules that the given object was purged/deleted.
*
- * @param type $object
- * A Tuque FedoraObject
+ * This hook is called after an object has been successfully purged, or
+ * when its state has been changed to "Deleted".
+ *
+ * @param string $pid
+ * The ID of the object that was purged/deleted.
*/
-function hook_islandora_object_alter($fedora_object) {}
+function hook_islandora_object_purged($pid) {
+}
/**
- * Allow modification of an object before ingesting.
+ * Notify modules that the given object was purged/deleted.
*
- * @param type $islandora_object
- * A Tuque FedoraObject
+ * @see hook_islandora_object_purged()
+ */
+function hook_CMODEL_PID_islandora_object_purged($pid) {
+}
+
+/**
+ * Notify modules that the given datastream was ingested.
+ *
+ * This hook is called after the datastream has been successfully ingested.
+ *
+ * @note
+ * If ingested directly via the FedoraApiM object this will not be called as we
+ * don't have access to the ingested datastream at that time.
+ *
+ * @param FedoraObject $object
+ * The object the datastream belongs to.
+ * @param FedoraDatastream $datastream
+ * The ingested datastream.
+ */
+function hook_islandora_datastream_ingested(FedoraObject $object, FedoraDatastream $datastream) {
+}
+
+/**
+ * Notify modules that the given datastream was ingested.
+ *
+ * @see hook_islandora_object_ingested()
*/
-function hook_islandora_ingest_pre_ingest($islandora_object) {}
+function hook_CMODEL_PID_DSID_islandora_datastream_ingested(FedoraObject $object, FedoraDatastream $datastream) {
+}
/**
- * Allow modification of objects of a certain content model before ingesting.
+ * Notify modules that the given datastream was modified.
*
- * @see hook_islandora_ingest_pre_ingest()
+ * This hook is called after an datastream has been successfully modified.
+ *
+ * Changing datastream properties such as "label", or "state", are considered
+ * modifications, as well as the datastreams content.
+ *
+ * @param FedoraObject $object
+ * The object the datastream belongs to.
+ * @param FedoraDatastream $datastream
+ * The datastream that was ingested.
+ *
+ * @todo We should also include what changes were made in a additional
+ * parameter.
*/
-function hook_CMODEL_PID_islandora_ingest_pre_ingest($islandora_object) {}
+function hook_islandora_datastream_modified(FedoraObject $object, FedoraDatastream $datastream) {
+}
/**
- * Allow modules to setup for the purge of a datastream.
+ * Notify modules that the given datastream was ingested.
*
- * @param object $datastream
- * A Tuque FedoraDatastream object.
+ * @see hook_islandora_datastream_modified()
*/
-function hook_islandora_pre_purge_datastream($datastream) {}
+function hook_CMODEL_PID_islandora_datastream_modified(FedoraObject $object, FedoraDatastream $datastream) {
+}
/**
- * Allow modules to react after a datastream is purged.
+ * Notify modules that the given datastream was purged/deleted.
+ *
+ * This hook is called after an datastream has been successfully purged, or
+ * when its state has been changed to "Deleted".
*
- * @param object $object
- * A Tuque FedoraObject.
+ * @param FedoraObject $object
+ * The object the datastream belonged to.
* @param string $dsid
- * A id of the former datastream.
+ * The ID of the datastream that was purged/deleted.
+ */
+function hook_islandora_datastream_purged(FedoraObject $object, $dsid) {
+}
+
+/**
+ * Notify modules that the given datastream was purged/deleted.
+ *
+ * @see hook_islandora_datastream_purged()
*/
-function hook_islandora_post_purge_datastream($object, $dsid) {}
+function hook_CMODEL_PID_islandora_datastream_purged(FedoraObject $object, $dsid) {
+}
/**
- * Allow modules to react post-purge.
+ * Register a datastream edit route/form.
*
- * @param string $object_id
- * The former object's PID.
- * @param array $content_models
- * An array containing the models to which the former object.
+ * @param FedoraObject $object
+ * The object to check.
+ * @param string $dsid
+ * todo
*/
-function hook_islandora_post_purge_object($object_id, $content_models) {}
+function hook_islandora_edit_datastream_registry($object, $dsid) {
+}
/**
* Registry hook for required objects.
*
* Solution packs can include data to create certain objects that describe or
- * help the objects it would create. This includes collection objects and content
- * models.
+ * help the objects it would create. This includes collection objects and
+ * content models.
*
* @see islandora_solution_packs_admin()
* @see islandora_install_solution_pack()
* @example islandora_islandora_required_objects()
*/
-function hook_islandora_required_objects() {}
+function hook_islandora_required_objects() {
+}
/**
* Registry hook for viewers that can be implemented by solution packs.
@@ -215,20 +354,21 @@ function hook_islandora_required_objects() {}
* @see islandora_get_viewers()
* @see islandora_get_viewer_callback()
*/
-function hook_islandora_viewer_info() {}
-
+function hook_islandora_viewer_info() {
+}
/**
* Returns a list of datastreams that are determined to be undeletable.
*/
-function hook_islandora_undeletable_datastreams(array $models) {}
+function hook_islandora_undeletable_datastreams(array $models) {
+}
/**
* Define steps used in the islandora_ingest_form() ingest process.
*
* @param array $form_state
* An array containing the form_state, on which infomation from step storage
- * might be extracted. Note that the
+ * might be extracted. Note that the
*
* @return array
* An associative array of associative arrays which define each step in the
@@ -265,4 +405,5 @@ function hook_islandora_ingest_steps(array $form_state) {
*
* @see hook_islandora_ingest_steps()
*/
-function hook_CMODEL_PID_islandora_ingest_steps(array $form_state) {}
+function hook_CMODEL_PID_islandora_ingest_steps(array $form_state) {
+}
diff --git a/islandora.info b/islandora.info
index 419f633b..538c3b74 100644
--- a/islandora.info
+++ b/islandora.info
@@ -6,11 +6,13 @@ core = 7.x
configure = admin/islandora/configure
stylesheets[all][] = css/islandora.base.css
stylesheets[all][] = css/islandora.theme.css
-files[] = includes/MimeDetect.inc
-files[] = includes/DublinCore.inc
-files[] = includes/IslandoraTuque.inc
-files[] = includes/IslandoraTuqueWrapper.inc
+files[] = includes/mime_detect.inc
+files[] = includes/dublin_core.inc
+files[] = includes/islandora_tuque.inc
+files[] = includes/islandora_tuque_wrapper.inc
+files[] = includes/islandora_object.entity_controller.inc
files[] = tests/islandora_web_test_case.inc
files[] = tests/islandora_authtokens.test
files[] = tests/islandora_manage_permissions.test
+files[] = tests/islandora_hooks.test
php = 5.3
diff --git a/islandora.module b/islandora.module
index 421994ae..df2748f2 100644
--- a/islandora.module
+++ b/islandora.module
@@ -41,10 +41,15 @@ define('ISLANDORA_PRE_INGEST_HOOK', 'islandora_ingest_pre_ingest');
define('ISLANDORA_POST_INGEST_HOOK', 'islandora_ingest_post_ingest');
define('ISLANDORA_PRE_PURGE_OBJECT_HOOK', 'islandora_pre_purge_object');
define('ISLANDORA_POST_PURGE_OBJECT_HOOK', 'islandora_post_purge_object');
+
+// @todo Add Documentation.
+define('ISLANDORA_OBJECT_INGESTED_HOOK', 'islandora_object_ingested');
+define('ISLANDORA_OBJECT_MODIFIED_HOOK', 'islandora_object_modified');
+define('ISLANDORA_OBJECT_PURGED_HOOK', 'islandora_object_purged');
+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_PRE_PURGE_DATASTREAM_HOOK', 'islandora_pre_purge_datastream');
-define('ISLANDORA_POST_PURGE_DATASTREAM_HOOK', 'islandora_post_purge_datastream');
-define('ISLANDORA_EDIT_DATASTREAM_HOOK', 'islandora_edit_datastream');
/**
* Implements hook_menu().
@@ -485,7 +490,10 @@ function islandora_default_islandora_manage_overview_object(FedoraObject $object
* The HTML repersentation of the manage object page.
*/
function islandora_edit_object(FedoraObject $object) {
+ module_load_include('inc', 'islandora', 'includes/breadcrumb');
module_load_include('inc', 'islandora', 'includes/utilities');
+ drupal_set_title($object->label);
+ drupal_set_breadcrumb(islandora_get_breadcrumbs($object));
$output = array();
foreach (islandora_build_hook_list(ISLANDORA_EDIT_HOOK, $object->models) as $hook) {
$temp = module_invoke_all($hook, $object);
@@ -546,6 +554,7 @@ function islandora_view_default_object() {
function islandora_view_object(FedoraObject $object) {
module_load_include('inc', 'islandora', 'includes/breadcrumb');
module_load_include('inc', 'islandora', 'includes/utilities');
+ drupal_set_title($object->label);
drupal_set_breadcrumb(islandora_get_breadcrumbs($object));
// Optional pager parameters
$page_number = (empty($_GET['page'])) ? '1' : $_GET['page'];
@@ -596,7 +605,6 @@ function islandora_default_islandora_view_object($object) {
* A IslandoraTuque instance
*/
function islandora_get_tuque_connection($user = NULL, $url = NULL) {
- module_load_include('inc', 'islandora', 'includes/IslandoraTuque');
$tuque = &drupal_static(__FUNCTION__);
if (!$tuque) {
if (IslandoraTuque::exists()) {
@@ -633,9 +641,7 @@ function islandora_object_load($object_id) {
$tuque = islandora_get_tuque_connection();
if ($tuque) {
try {
- $object = $tuque->repository->getObject(urldecode($object_id));
- drupal_alter('islandora_object', $object);
- return $object;
+ return $tuque->repository->getObject(urldecode($object_id));
} catch (Exception $e) {
if ($e->getCode() == '404') {
return FALSE;
@@ -799,124 +805,33 @@ function islandora_islandora_undeletable_datastreams(array $models) {
}
/**
- * Ingest the given object into Fedora calling its pre/post hooks as well.
- *
- * @todo will be cleaned up in the future
+ * Ingest the given object.
*
* @param NewFedoraObject $object
* An ingestable FedoraObject.
*
* @return FedoraObject
- * The ingested FedoraObject, after running the pre/post ingest hooks.
- * Returns FALSE if the ingest failed.
+ * The ingested FedoraObject.
*/
function islandora_add_object(NewFedoraObject &$object) {
- islandora_pre_add_object($object);
- try {
- $object->repository->ingestObject($object);
- islandora_post_add_object($object);
- return $object;
- } catch (Exception $e) {
- watchdog('islandora', 'Failed to ingest object: @pidcode: @code
message: @msg', array(
- '@pid' => $object->id,
- '@code' => $e->getCode(),
- '@msg' => $e->getMessage()), WATCHDOG_ERROR);
- }
- return FALSE;
-}
-
-/**
- * Calls the ISLANDORA_PRE_INGEST_HOOK hooks.
- *
- * @param NewFedoraObject $object
- * An ingestable FedoraObject.
- */
-function islandora_pre_add_object(NewFedoraObject $object) {
- module_load_include('inc', 'islandora', 'includes/utilities');
- foreach (islandora_build_hook_list(ISLANDORA_PRE_INGEST_HOOK, $object->models) as $hook) {
- module_invoke_all($hook, $object);
- }
+ return $object->repository->ingestObject($object);
}
-
/**
- * Calls the ISLANDORA_POST_INGEST_HOOK hooks.
- *
- * @param FedoraObject $object
- * A recently ingestable FedoraObject.
- */
-function islandora_post_add_object(FedoraObject $object) {
- foreach (islandora_build_hook_list(ISLANDORA_POST_INGEST_HOOK, $object->models) as $hook) {
- module_invoke_all($hook, $object);
- }
-}
-
-/**
- * Deletes the given object into Fedora calling its pre/post hooks as well.
+ * Delete's or purges the given object.
*
* @param FedoraObject $object
* An object to delete.
*
- * @return FedoraObject
+ * @return bool
* The ingested FedoraObject, after running the pre/post ingest hooks.
*/
function islandora_delete_object(FedoraObject &$object) {
- $object_id = $object->id;
- $models = $object->models;
- $action = islandora_pre_delete_object($object);
- switch ($action) {
- case 'blocked':
- // Do nothing.
- return FALSE;
- case 'delete':
- // Change the state to deleted.
- $object->delete();
- islandora_post_delete_object($object_id, $models);
- return TRUE;
- default:
- // Purge
- $object->repository->purgeObject($object_id);
- islandora_post_delete_object($object_id, $models);
- $object = NULL;
- return TRUE;
- }
-}
-
-/**
- * Calls the ISLANDORA_PRE_PURGE_OBJECT_HOOK hooks.
- *
- * @param FedoraObject $object
- * The object that is about to be deleted.
- */
-function islandora_pre_delete_object(FedoraObject $object) {
- module_load_include('inc', 'islandora', 'includes/utilities');
- $results = array();
- foreach (islandora_build_hook_list(ISLANDORA_PRE_PURGE_OBJECT_HOOK, $object->models) as $hook) {
- $results = array_merge_recursive($results, module_invoke_all($hook, $object));
- }
- $action = (isset($results['block']) && $results['block']) ? 'block' : FALSE;
- $action = (!$action && isset($results['delete']) && $results['delete']) ? 'delete' : $action;
- $action = !$action ? 'purge' : $action;
- return $action;
-}
-
-/**
- * Calls the ISLANDORA_POST_PURGE_OBJECT_HOOK hooks.
- *
- * @param string $object_id
- * The object id of an the recently deleted object.
- * @param array $models
- * The list of content models the delete object subsribed to.
- */
-function islandora_post_delete_object($object_id, array $models) {
- module_load_include('inc', 'islandora', 'includes/utilities');
- foreach (islandora_build_hook_list(ISLANDORA_POST_PURGE_OBJECT_HOOK, $models) as $hook) {
- module_invoke_all($hook, $object_id, $models);
- }
+ return $object->repository->purgeObject($object->id);
}
/**
- * Delete's/Purges the given datastream.
+ * Delete's or purges the given datastream.
*
* @throws Exception
* Which types are undefined, but more than likely because of the hooks
@@ -925,87 +840,81 @@ function islandora_post_delete_object($object_id, array $models) {
* @param FedoraDatastream $datastream
* The datastream to delete.
*
- * @return boolean
- * TRUE is returned if the datastream was Deleted/Purged, FALSE if it was
- * blocked.
+ * @return bool
+ * TRUE if successful, FALSE otherwise.
*/
function islandora_delete_datastream(FedoraDatastream &$datastream) {
- $datastream_id = $datastream->id;
$object = $datastream->parent;
- $action = islandora_pre_delete_datastream($datastream);
- switch ($action) {
- case 'blocked':
- // Do nothing.
- return FALSE;
- case 'delete':
- // Change the state to deleted.
- $object[$datastream_id]->state = 'D';
- // @todo Differentiate between delete/purge in the hooks.
- islandora_post_delete_datastream($object, $datastream_id);
- return TRUE;
- default:
- // Purge
- $object->purgeDatastream($datastream_id);
- islandora_post_delete_datastream($object, $datastream_id);
- $datastream = NULL;
- return TRUE;
- }
+ return $object->purgeDatastream($datastream->id);
}
/**
- * The default behaviour is to 'purge' the datastream but this can be overridden
- * by modules that implement the 'islandora_pre_purge_datastream' hook.
- *
- * @todo make this an alter.
- *
- * The returned array can include a 'block' => TRUE
- * pair which will prevent the datastream from being deleted if it particularly
- * needed for a certain function. Returning 'delete' => TRUE will cause the
- * datastream to be put into a deleted state.
- *
- * @param FedoraDatastream $datastream
- * The datastream to delete.
+ * Implements hook_cron()
*
- * @return string
- * The action to take when deleting the given datastream, either 'purge',
- * 'delete', or 'block'.
+ * Removes expired authentication tokens.
*/
-function islandora_pre_delete_datastream(FedoraDatastream $datastream) {
- module_load_include('inc', 'islandora', 'includes/utilities');
- $results = array();
- foreach (islandora_build_hook_list(ISLANDORA_PRE_PURGE_DATASTREAM_HOOK, $datastream->parent->models) as $hook) {
- // Not sure this will work the greatest, probably an alter would be better..
- $results = array_merge_recursive($results, module_invoke_all($hook, $datastream));
- }
- $action = (isset($results['block']) && $results['block']) ? 'block' : FALSE;
- $action = (!$action && isset($results['delete']) && $results['delete']) ? 'delete' : $action;
- $action = !$action ? 'purge' : $action;
- return $action;
+function islandora_cron() {
+ module_load_include('inc', 'islandora', 'includes/islandora_authtokens');
+ islandora_remove_expired_tokens();
}
/**
- * Calls the post purge datastream hooks.
- *
- * @todo Should differentiate between purging/deleting.
+ * Implements hook_entity_info().
*
- * @param FedoraObject $object
- * The parent object of the deleted datastream.
- * @param string $datastream_id
- * The datastream id of the deleted datastream.
+ * Some boiler-plate for Tokens (the module, not our authentication work-
+ * around).
*/
-function islandora_post_delete_datastream(FedoraObject $object, $datastream_id) {
- module_load_include('inc', 'islandora', 'includes/utilities');
- foreach (islandora_build_hook_list(ISLANDORA_POST_PURGE_DATASTREAM_HOOK, $object->models) as $hook) {
- module_invoke_all($hook, $object, $datastream_id);
- }
+function islandora_entity_info() {
+ $entities = array();
+
+ $entities['islandora_object'] = array(
+ 'label' => t('Islandora Object'),
+ 'controller class' => 'IslandoraObjectEntityController',
+ 'fieldable' => FALSE,
+ 'entity keys' => array(
+ 'id' => 'id',
+ 'label' => 'label',
+ ),
+ );
+
+ return $entities;
}
/**
- * Implements hook_cron()
+ * Implements hook_entity_property_info().
*
- * Removes expired authentication tokens.
+ * Details the tokens which will be available on the given object.
*/
-function islandora_cron() {
- module_load_include('inc', 'islandora', 'includes/islandora_authtokens');
- islandora_remove_expired_tokens();
+function islandora_entity_property_info() {
+ $info = array();
+
+ $p = &$info['islandora_object']['properties'];
+
+ $p['id'] = array(
+ 'type' => 'text',
+ 'label' => t('ID'),
+ 'description' => t('The identifier of the object.'),
+ );
+ $p['label'] = array(
+ 'type' => 'text',
+ 'label' => t('Object Label'),
+ 'description' => t('The label of the object.'),
+ );
+ $p['owner'] = array(
+ 'type' => 'text',
+ 'label' => t('Object Owner'),
+ 'description' => t('The name of the owner of the object.'),
+ );
+ $p['state'] = array(
+ 'type' => 'text',
+ 'label' => t('Object State'),
+ 'description' => t('An initial representing the state of the object.'),
+ );
+ $p['models'] = array(
+ 'type' => 'list',
+ 'label' => t('Content Models'),
+ 'description' => t('The list of content models which the object has.'),
+ );
+
+ return $info;
}
diff --git a/islandora.rules.inc b/islandora.rules.inc
new file mode 100644
index 00000000..bda999b3
--- /dev/null
+++ b/islandora.rules.inc
@@ -0,0 +1,115 @@
+ array(
+ 'type' => 'islandora_object',
+ 'label' => t('Subject'),
+ 'description' => t('An object of which we should check the ' .
+ 'relationships (The "subject" of the relationship).'),
+ ),
+ 'pred_uri' => array(
+ 'type' => 'text',
+ 'label' => t('Predicate URI'),
+ 'description' => t('The URI namespace to which the predicate belongs.'),
+ ),
+ 'pred' => array(
+ 'type' => 'text',
+ 'label' => t('Predicate'),
+ 'description' => t('The predicate of the relationship.'),
+ ),
+ 'object' => array(
+ 'type' => 'text',
+ 'label' => t('Object'),
+ 'description' => t('The object of the relationship.'),
+ 'allow null' => TRUE,
+ 'default value' => NULL,
+ ),
+ 'type' => array(
+ 'type' => 'integer',
+ 'label' => t('Object type in the relationship'),
+ 'description' => t('0=URI, 1=plain literal'),
+ 'default value' => 0,
+ ),
+ );
+
+ return $to_return;
+}
+
+/**
+ * Implements hook_rules_condition_info().
+ */
+function islandora_rules_condition_info() {
+ $cond = array();
+
+ $cond['islandora_object_has_relationship'] = array(
+ 'label' => t('Check object for a relationship'),
+ 'group' => t('Islandora'),
+ 'parameter' => islandora_rules_relationship_parameter_array(),
+ );
+
+ return $cond;
+}
+
+/**
+ * Implements hook_rules_action_info().
+ */
+function islandora_rules_action_info() {
+ $cond = array();
+
+ $cond['islandora_object_remove_relationship'] = array(
+ 'label' => t('Remove a relationship from an object'),
+ 'group' => t('Islandora'),
+ 'parameter' => islandora_rules_relationship_parameter_array(),
+ );
+
+ $cond['islandora_object_add_relationship'] = array(
+ 'label' => t('Add a relationship to an object'),
+ 'group' => t('Islandora'),
+ 'parameter' => islandora_rules_relationship_parameter_array(),
+ );
+ return $cond;
+}
+/**
+ * Checks that there is a relationship match on the given object.
+ *
+ * Takes a subject (either a FedoraObject or a FedoraDatastream), as well as
+ * the parameters for FedoraRelsExt::get() or FedoraRelsInt::get(), to try to
+ * find a match.
+ *
+ * @see FedoraRelsExt::get()
+ */
+function islandora_object_has_relationship($sub, $pred_uri, $pred, $object, $type) {
+ $relationships = $sub->relationships->get($pred_uri, $pred, $object, $type);
+ return !empty($relationships);
+}
+
+/**
+ * Remove a relationship from the given object.
+ *
+ * Takes a subject (either a FedoraObject or a FedoraDatastream), as well as
+ * the parameters for FedoraRelsExt::remove() or FedoraRelsInt::remove(), to
+ * try to find a match.
+ *
+ * @see FedoraRelsExt::get()
+ */
+function islandora_object_remove_relationship($sub, $pred_uri, $pred, $object, $type) {
+ $sub->relationships->remove($pred_uri, $pred, $object, $type);
+}
+
+/**
+ * Add a relationship to the given object.
+ *
+ * Takes a subject (either a FedoraObject or a FedoraDatastream), as well as
+ * the parameters for FedoraRelsExt::add() or FedoraRelsInt::add(), and adds
+ * the represented relationship.
+ *
+ * @see FedoraRelsExt::get()
+ */
+function islandora_object_add_relationship($sub, $pred_uri, $pred, $object, $type) {
+ $sub->relationships->add($pred_uri, $pred, $object, $type);
+}
+
diff --git a/policies/permit-getDatastream-unrestricted.xml b/policies/permit-getDatastream-unrestricted.xml
new file mode 100644
index 00000000..7483cbb3
--- /dev/null
+++ b/policies/permit-getDatastream-unrestricted.xml
@@ -0,0 +1,25 @@
+
+
+ Note that other policies may provide exceptions to this broad policy. This policy assumes api-m users have to be authenticated
+
+
+
+
+
+
+
+
+
+
+ urn:fedora:names:fedora:2.1:action:id-getDatastream
+
+
+
+
+
+
+
diff --git a/policies/permit-getDatastreamHistory-unrestricted.xml b/policies/permit-getDatastreamHistory-unrestricted.xml
new file mode 100644
index 00000000..f7662eb0
--- /dev/null
+++ b/policies/permit-getDatastreamHistory-unrestricted.xml
@@ -0,0 +1,25 @@
+
+
+ Note that other policies may provide exceptions to this broad policy. This policy assumes api-m users have to be authenticated
+
+
+
+
+
+
+
+
+
+
+ urn:fedora:names:fedora:2.1:action:id-getDatastreamHistory
+
+
+
+
+
+
+
diff --git a/tests/README b/tests/README
new file mode 100644
index 00000000..797d788b
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,3 @@
+You can define your own configurations specific to your enviroment by copying
+default.test_config.ini to test_config.ini, making your changes in the copied
+file.
\ No newline at end of file
diff --git a/tests/default.test_config.ini b/tests/default.test_config.ini
new file mode 100644
index 00000000..f07fb4c3
--- /dev/null
+++ b/tests/default.test_config.ini
@@ -0,0 +1,6 @@
+[fedora]
+fedora_url = "http://localhost:8080/fedora"
+use_drupal_filter = TRUE
+drupal_filter_file = "/usr/local/fedora/server/config/filter-drupal.xml"
+admin_user = "fedoraAdmin"
+admin_pass = "fedoraAdmin"
diff --git a/tests/islandora_authtokens.test b/tests/islandora_authtokens.test
index 953964c4..326225f2 100644
--- a/tests/islandora_authtokens.test
+++ b/tests/islandora_authtokens.test
@@ -1,7 +1,15 @@
'Islandora Authorization Tokens',
@@ -10,45 +18,50 @@ class IslandoraAuthtokensTestCase extends IslandoraWebTestCase {
);
}
+ /**
+ * Set up data for the tests.
+ */
public function setUp() {
- parent::setUp(array('islandora'));
+ parent::setUp();
}
+ /**
+ * Test redeeming invalid tokens.
+ */
public function testRedeemInvalidToken() {
module_load_include('inc', 'islandora', 'includes/islandora_authtokens');
-
- // get a token
$token = islandora_get_object_token('test:pid', 'woot', 1);
$this->assertTrue($token, 'Token was generated correctly.', 'Unit Tests');
-
- // redeem a token that doesn't exist with real pid and dsid
+ // Redeem a token that doesn't exist with real pid and dsid.
$account = islandora_validate_object_token('test:pid', 'woot', 'foo');
$this->assertFalse($account, 'Redeeming an token that doesn\'t exist returns FALSE', 'Unit Tests');
}
+ /**
+ * Test redeeming valid tokens.
+ */
public function testRedeemValidToken() {
module_load_include('inc', 'islandora', 'includes/islandora_authtokens');
-
- // change the current user
+ // Change the current user.
global $user;
$user_backup = $user;
$test_account = $this->drupalCreateUser();
$user = $test_account;
-
$token = islandora_get_object_token('test:pid', 'woot', 1);
- // logout again
+ // Logout again.
$user = $user_backup;
-
$token_account = islandora_validate_object_token('test:pid', 'woot', $token);
-
$this->assertEqual($token_account->uid, $test_account->uid, 'UID from token is correct', 'Unit Tests');
$this->assertEqual($token_account->pass, $test_account->pass, 'Pass from token is correct', 'Unit Tests');
$this->assertEqual($token_account->name, $test_account->name, 'Name from token is correct', 'Unit Tests');
}
+ /**
+ * Test tokened datastream view without XACML.
+ */
public function testTokenedViewDatastreamWithoutXacml() {
- // ingest the fixture
+ // Ingest the fixture.
$fixture_path = drupal_get_path('module', 'islandora') . '/tests/fixtures/bug.jp2';
$tuque = islandora_get_tuque_connection();
$newpid = "{$this->randomName()}:{$this->randomName()}";
@@ -67,8 +80,8 @@ class IslandoraAuthtokensTestCase extends IslandoraWebTestCase {
$this->drupalGet("islandora/object/{$newpid}/datastream/JP2/view");
$this->assertResponse(200, 'Page loaded as the authorized user');
- // do some voodoo to get a token as the user we are connecting as
- // to do this we need to change the user we are logged in as
+ // Do some voodoo to get a token as the user we are connecting as
+ // to do this we need to change the user we are logged in as.
module_load_include('inc', 'islandora', 'includes/islandora_authtokens');
global $user;
$backup = $user;
@@ -84,11 +97,14 @@ class IslandoraAuthtokensTestCase extends IslandoraWebTestCase {
$this->drupalGet("islandora/object/{$newpid}/datastream/JP2/view", array('query' => array('token' => $token)));
$this->assertResponse(403, 'Token is unable to be reused');
- // delete fixture object
+ // Delete fixture object.
$tuque->repository->purgeObject($newpid);
}
+ /**
+ * This will test something someday.
+ */
public function testTokenedViewDatastreamWithXacml() {
- // we need to add this test.
+ // We need to add this test.
}
-}
\ No newline at end of file
+}
diff --git a/tests/islandora_hooks.test b/tests/islandora_hooks.test
new file mode 100644
index 00000000..0a667fee
--- /dev/null
+++ b/tests/islandora_hooks.test
@@ -0,0 +1,213 @@
+ 'Islandora Hooks',
+ 'description' => 'Ensure that the hooks for ingestion/purge/modification are called at the appropriate times.',
+ 'group' => 'Islandora',
+ );
+ }
+
+ /**
+ * Creates an admin user and a connection to a fedora repository.
+ *
+ * @see IslandoraWebTestCase::setUp()
+ */
+ public function setUp() {
+ parent::setUp('islandora_hooks_test', 'devel');
+ $this->repository = $this->admin->repository;
+ $this->purgeTestObjects();
+ }
+
+ /**
+ * Free any objects/resources created for this test.
+ *
+ * @see IslandoraWebTestCase::tearDown()
+ */
+ public function tearDown() {
+ $this->purgeTestObjects();
+ unset($this->repository);
+ parent::tearDown();
+ }
+
+ /**
+ * Purge any objects created by the test's in this class.
+ */
+ public function purgeTestObjects() {
+ $objects = array(
+ 'test:testIngestedObjectHook',
+ 'test:testBlockedIngestedObjectHook',
+ 'test:testModifiedObjectHook',
+ 'test:testPurgedObjectHook',
+ 'test:testIngestedDatastreamHook',
+ 'test:testModifiedDatastreamHook',
+ 'test:testPurgedDatastreamHook',
+ );
+ foreach ($objects as $object) {
+ try {
+ $object = $this->repository->getObject($object);
+ $object->label = "Don't Block";
+ $this->repository->purgeObject($object->id);
+ }
+ catch(Exception $e) {
+ // Meh... Either it didn't exist or the purge failed.
+ }
+ }
+ }
+
+ /**
+ * Test ALL THE HOOKS!.
+ */
+ public function testHooks() {
+ // Test ingesting with FedoraRepository::ingestObject().
+ $object = $this->repository->constructObject('test:testIngestedObjectHook');
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_INGESTED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_INGESTED_HOOK] = FALSE;
+ $this->repository->ingestObject($object);
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_INGESTED_HOOK], 'Called "hook_islandora_object_alter" when ingesting via FedoraRepository::ingestObject.');
+ $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_INGESTED_HOOK], 'Called ISLANDORA_OBJECT_INGESTED_HOOK when ingesting via FedoraRepository::ingestObject.');
+ $this->repository->purgeObject($object->id);
+ // Test blocking the ingest.
+ $object = $this->repository->constructObject('test:testIngestedObjectHook');
+ $object->label = 'block';
+ try {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_INGESTED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_INGESTED_HOOK] = FALSE;
+ $this->repository->ingestObject($object);
+ $this->fail('Blocked ingest should throw an Exception.');
+ $this->repository->purgeObject($object->id);
+ }
+ catch(Exception $e) {
+ $this->pass('Ingest blocked and exception thrown.');
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_INGESTED_HOOK], 'Called "hook_islandora_object_alter" when blocking ingesting via FedoraRepository::ingestObject.');
+ $this->assertFalse($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_INGESTED_HOOK], 'Did not called ISLANDORA_OBJECT_INGESTED_HOOK when blocking ingesting via FedoraRepository::ingestObject.');
+ }
+ // Test modifying via set magic functions.
+ $object = $this->repository->constructObject('test:testModifiedObjectHook');
+ $this->repository->ingestObject($object);
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_MODIFIED_HOOK] = FALSE;
+ $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.');
+ // Test blocking the modification.
+ try {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_MODIFIED_HOOK] = FALSE;
+ $object->label = 'block';
+ $this->fail('Blocked modify should throw an Exception.');
+ }
+ catch(Exception $e) {
+ $this->pass('Modify blocked and exception thrown.');
+ $this->assertNotEqual($object->label, 'block', 'Modification did not stick.');
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_MODIFIED_HOOK], 'Called "hook_islandora_object_alter" when blocking modifying via set magic functions.');
+ $this->assertFALSE($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK], 'Called ISLANDORA_OBJECT_MODIFIED_HOOK when blocking modifying via set magic functions.');
+ }
+ $this->repository->purgeObject($object->id);
+ // Test purging with FedoraRepository::purgeObject().
+ $object = $this->repository->constructObject('test:testPurgedObjectHook');
+ $this->repository->ingestObject($object);
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $this->repository->purgeObject($object->id);
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called "hook_islandora_object_alter" when purging via FedoraRepository::purgeObject.');
+ $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called ISLANDORA_OBJECT_PURGED_HOOK when purging via FedoraRepository::purgeObject.');
+ // Test deleting.
+ $object = $this->repository->constructObject('test:testPurgedObjectHook');
+ $this->repository->ingestObject($object);
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $object->delete();
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called "hook_islandora_object_alter" when deleting via FedoraObject::delete.');
+ $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called ISLANDORA_OBJECT_PURGED_HOOK when purging via FedoraObject::delete.');
+ $this->repository->purgeObject($object->id);
+ // Test alter blocking.
+ $object = $this->repository->constructObject('test:testPurgedObjectHook');
+ $this->repository->ingestObject($object);
+ try {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $object->label = 'block';
+ $this->repository->purgeObject($object->id);
+ $this->fail('Blocked modify should throw an Exception.');
+ }
+ catch(Exception $e) {
+ $this->pass('Modify blocked and exception thrown.');
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called "hook_islandora_object_alter" when blocking purge via FedoraRepository::purgeObject.');
+ $this->assertFalse($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called ISLANDORA_OBJECT_PURGED_HOOK when blocking purge via FedoraRepository::purgeObject.');
+ }
+ // Test alter delete.
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK] = FALSE;
+ $object->label = 'delete';
+ $this->repository->purgeObject($object->id);
+ $this->assertEqual($object->state, 'D', '"hook_islandora_object_alter" prevented purge and deleted the object.');
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called "hook_islandora_object_alter" when preventing purge and deleting.');
+ $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK], 'Called ISLANDORA_OBJECT_PURGED_HOOK when preventing purge and deleting.');
+ $object->label = 'Something other than delete';
+ $this->repository->purgeObject($object->id);
+ // Test ingesting with FedoraRepository::ingestObject().
+ $object = $this->repository->constructObject('test:testIngestedDatastreamHook');
+ $this->repository->ingestObject($object);
+ $ds = $object->constructDatastream('TEST');
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_INGESTED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_INGESTED_HOOK] = FALSE;
+ $object->ingestDatastream($ds);
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_INGESTED_HOOK], 'Called "hook_islandora_datastream_alter" when ingesting via FedoraObject::ingestDatastream.');
+ $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_INGESTED_HOOK], 'Called ISLANDORA_DATASTREAM_INGESTED_HOOK when ingesting via FedoraObject::ingestDatastream.');
+ $this->repository->purgeObject($object->id);
+ // Test modifying a datastream.
+ $object = $this->repository->constructObject('test:testModifiedDatastreamHook');
+ $this->repository->ingestObject($object);
+ $ds = $object->constructDatastream('TEST');
+ $object->ingestDatastream($ds);
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = FALSE;
+ $_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.');
+ // Test blocking modifying.
+ try {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = FALSE;
+ $ds->label = 'block';
+ $this->fail('Blocked modify should throw an Exception.');
+ }
+ catch(Exception $e) {
+ $this->pass('Modify blocked and exception thrown.');
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_MODIFIED_HOOK], 'Called "hook_islandora_datastream_alter" when blocking modifying via set magic functions.');
+ $this->assertFALSE($_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK], 'Called ISLANDORA_DATASTREAM_MODIFIED_HOOK when blocking modifying via set magic functions.');
+ }
+ $this->repository->purgeObject($object->id);
+ // Test purging with FedoraRepository::purgeObject().
+ $object = $this->repository->constructObject('test:testPurgedDatastreamHook');
+ $this->repository->ingestObject($object);
+ $ds = $object->constructDatastream('TEST');
+ $object->ingestDatastream($ds);
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_PURGED_HOOK] = FALSE;
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_PURGED_HOOK] = FALSE;
+ $object->purgeDatastream($ds->id);
+ $this->assert($_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_PURGED_HOOK], 'Called "hook_islandora_datastream_alter" when purging via FedoraObject::purgeDatastream.');
+ $this->assert($_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_PURGED_HOOK], 'Called ISLANDORA_DATASTREAM_PURGED_HOOK when purging via FedoraObject::purgeDatastream.');
+ $this->repository->purgeObject($object->id);
+ }
+
+}
diff --git a/tests/islandora_hooks_test.info b/tests/islandora_hooks_test.info
new file mode 100644
index 00000000..9d211978
--- /dev/null
+++ b/tests/islandora_hooks_test.info
@@ -0,0 +1,7 @@
+name = Islandora Hook testing
+description = Tests Hooks. Do not enable.
+core = 7.x
+package = Testing
+hidden = TRUE
+dependencies[] = islandora
+files[] = islandora_hooks_test.module
diff --git a/tests/islandora_hooks_test.module b/tests/islandora_hooks_test.module
new file mode 100644
index 00000000..315b88ee
--- /dev/null
+++ b/tests/islandora_hooks_test.module
@@ -0,0 +1,152 @@
+id == 'test:testIngestedObjectHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_INGESTED_HOOK] = TRUE;
+ if ($object->label == 'block') {
+ $context['block'] = TRUE;
+ }
+ }
+ break;
+
+ case 'modify':
+ if ($object->id == 'test:testModifiedObjectHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_MODIFIED_HOOK] = TRUE;
+ if (isset($context['params']['label']) && $context['params']['label'] == 'block') {
+ $context['block'] = TRUE;
+ }
+ }
+ elseif ($object->id == 'test:testPurgedObjectHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK] = TRUE;
+ if (isset($context['params']['label']) && $context['params']['label'] == 'block') {
+ $context['block'] = TRUE;
+ }
+ elseif (isset($context['params']['label']) && $context['params']['label'] == 'delete') {
+ $context['delete'] = TRUE;
+ }
+ }
+ break;
+
+ case 'purge':
+ if ($object->id == 'test:testPurgedObjectHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_OBJECT_PURGED_HOOK] = TRUE;
+ if ($object->label == 'block') {
+ $context['block'] = TRUE;
+ }
+ elseif ($object->label == 'delete') {
+ $context['delete'] = TRUE;
+ }
+ }
+ break;
+ }
+}
+
+/**
+ * Implements hook_islandora_object_alter().
+ */
+function islandora_hooks_test_islandora_datastream_alter(AbstractFedoraObject $object, AbstractFedoraDatastream $datastream, array &$context) {
+ switch ($context['action']) {
+ case 'ingest':
+ if ($object->id == 'test:testIngestedDatastreamHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_INGESTED_HOOK] = TRUE;
+ if ($datastream->label == 'block') {
+ $context['block'] = TRUE;
+ }
+ }
+ break;
+
+ case 'modify':
+ if ($object->id == 'test:testModifiedDatastreamHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = TRUE;
+ if (isset($context['params']['dsLabel']) && $context['params']['dsLabel'] == 'block') {
+ $context['block'] = TRUE;
+ }
+ }
+ elseif ($object->id == 'test:testPurgedDatastreamHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_PURGED_HOOK] = TRUE;
+ if (isset($context['params']['dsLabel']) && $context['params']['dsLabel'] == 'block') {
+ $context['block'] = TRUE;
+ }
+ elseif (isset($context['params']['dsLabel']) && $context['params']['dsLabel'] == 'delete') {
+ $context['delete'] = TRUE;
+ }
+ }
+ break;
+
+ case 'purge':
+ if ($object->id == 'test:testPurgedDatastreamHook') {
+ $_SESSION['islandora_hooks']['alter'][ISLANDORA_DATASTREAM_PURGED_HOOK] = TRUE;
+ if ($datastream->label == 'block') {
+ $context['block'] = TRUE;
+ }
+ elseif ($datastream->label == 'delete') {
+ $context['delete'] = TRUE;
+ }
+ }
+ break;
+ }
+}
+
+/**
+ * Implements hook_islandora_object_ingested().
+ */
+function islandora_hooks_test_islandora_object_ingested(FedoraObject $object) {
+ if ($object->id == 'test:testIngestedObjectHook') {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_INGESTED_HOOK] = TRUE;
+ }
+}
+
+/**
+ * Implements hook_islandora_object_modified().
+ */
+function islandora_hooks_test_islandora_object_modified(FedoraObject $object) {
+ if ($object->id == 'test:testModifiedObjectHook') {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_MODIFIED_HOOK] = TRUE;
+ }
+}
+
+/**
+ * Implements hook_islandora_object_purged().
+ */
+function islandora_hooks_test_islandora_object_purged($pid) {
+ if ($pid == 'test:testPurgedObjectHook') {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_OBJECT_PURGED_HOOK] = TRUE;
+ }
+}
+
+/**
+ * Implements hook_islandora_datastream_ingested().
+ */
+function islandora_hooks_test_islandora_datastream_ingested(FedoraObject $object, FedoraDatastream $datastream) {
+ if ($object->id == 'test:testIngestedDatastreamHook' && $datastream->id == "TEST") {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_INGESTED_HOOK] = TRUE;
+ }
+}
+
+/**
+ * Implements hook_islandora_datastream_modified().
+ */
+function islandora_hooks_test_islandora_datastream_modified(FedoraObject $object, FedoraDatastream $datastream) {
+ if ($object->id == 'test:testModifiedDatastreamHook' && $datastream->id == "TEST") {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_MODIFIED_HOOK] = TRUE;
+ }
+}
+
+/**
+ * Implements hook_islandora_datastream_purged().
+ */
+function islandora_hooks_test_islandora_datastream_purged(FedoraObject $object, $dsid) {
+ if ($object->id == 'test:testPurgedDatastreamHook' && $dsid == "TEST") {
+ $_SESSION['islandora_hooks']['hook'][ISLANDORA_DATASTREAM_PURGED_HOOK] = TRUE;
+ }
+}
diff --git a/tests/islandora_web_test_case.inc b/tests/islandora_web_test_case.inc
index d47dc214..cc5b8c67 100644
--- a/tests/islandora_web_test_case.inc
+++ b/tests/islandora_web_test_case.inc
@@ -1,36 +1,124 @@
configuration = $this->getTestConfiguration();
+ if ($this->configuration['use_drupal_filter']) {
+ $this->backUpDrupalFilter();
+ $this->setUpDrupalFilter();
+ }
+ $this->createAdminUser();
+ }
- $islandora_path = drupal_get_path('module', 'islandora');
- $this->config_info = parse_ini_file("$islandora_path/tests/test_config.ini");
- $connection_info = Database::getConnectionInfo('default');
+ /**
+ * Parses and returns the settings from the test configuration file.
+ *
+ * If no install specific test_config.ini file is found, it will use the
+ * assumed default configs found in default.test_config.ini.
+ *
+ * @return array
+ * The test configuration.
+ *
+ * @see parse_ini_file()
+ */
+ protected function getTestConfiguration() {
+ $path = drupal_get_path('module', 'islandora');
+ if (file_exists("$path/tests/test_config.ini")) {
+ $this->pass('Using custom test configuration.');
+ return parse_ini_file("$path/tests/test_config.ini");
+ }
+ elseif (file_exists("$path/tests/default.test_config.ini")) {
+ $this->pass('Using default test configuration.');
+ return parse_ini_file("$path/tests/default.test_config.ini");
+ }
+ throw new Exception('Required default.test_config.ini/test_config.ini file not found');
+ }
- $this->original_drupal_fiter = file_get_contents($this->config_info['filter_drupal_file']);
+ /**
+ * Stores the content of the Drupal Filter for later restoration.
+ */
+ protected function backUpDrupalFilter() {
+ if (file_exists($this->configuration['filter_drupal_file'])) {
+ $this->originalDrupalFilterContent = file_get_contents($this->configuration['filter_drupal_file']);
+ }
+ else {
+ throw new Exception('Failed to find the required Drupal Filter configuration file.');
+ }
+ }
+ /**
+ * Sets up a drupal filter that can read for the tests users table.
+ */
+ protected function setUpDrupalFilter() {
+ $connection_info = Database::getConnectionInfo('default');
$drupal_filter_dom = new DomDocument();
- $drupal_filter_dom->loadXML($this->original_drupal_fiter);
+ $drupal_filter_dom->loadXML($this->originalDrupalFilterContent);
$drupal_filter_xpath = new DOMXPath($drupal_filter_dom);
-
$server = $connection_info['default']['host'];
$dbname = $connection_info['default']['database'];
$user = $connection_info['default']['username'];
$password = $connection_info['default']['password'];
$port = $connection_info['default']['port'] ? $connection_info['default']['port'] : '3306';
$prefix = $connection_info['default']['prefix']['default'];
-
$results = $drupal_filter_xpath->query("/FilterDrupal_Connection/connection[@server='$server' and @dbname='$dbname' and @user='$user' and @password='$password' and @port='$port']/sql");
$results->item(0)->nodeValue = "SELECT DISTINCT u.uid AS userid, u.name AS Name, u.pass AS Pass, r.name AS Role FROM ({$prefix}users u LEFT JOIN {$prefix}users_roles ON u.uid={$prefix}users_roles.uid) LEFT JOIN {$prefix}role r ON r.rid={$prefix}users_roles.rid WHERE u.name=? AND u.pass=?;";
+ file_put_contents($this->configuration['drupal_filter_file'], $drupal_filter_dom->saveXML());
+ }
- file_put_contents($this->config_info['filter_drupal_file'], $drupal_filter_dom->saveXML());
+ /**
+ * Creates the a full fedora admin user with a repository connection.
+ */
+ protected function createAdminUser() {
+ $this->admin = new stdClass();
+ $this->admin->uid = 1;
+ $this->admin->name = $this->configuration['admin_user'];
+ $this->admin->pass = $this->configuration['admin_pass'];
+ $url = variable_get('islandora_base_url', $this->configuration['fedora_url']);
+ $connection = islandora_get_tuque_connection($this->admin, $url);
+ $this->admin->repository = $connection->repository;
+ return $this->admin;
+ }
+ /**
+ * Stores the content of the Drupal Filter for later restoration.
+ */
+ protected function restoreDrupalFilter() {
+ $file = $this->configuration['filter_drupal_file'];
+ if (isset($this->originalDrupalFilterContent)) {
+ file_put_contents($file, $this->originalDrupalFilterContent);
+ }
+ elseif (file_exists($file)) {
+ // Remove if there was never an original.
+ drupal_unlink($file);
+ }
}
+ /**
+ * Restores the original Drupal filter, frees any allocated resources.
+ *
+ * @see DrupalWebTestCase::tearDown()
+ */
public function tearDown() {
- file_put_contents($this->config_info['filter_drupal_file'], $this->original_drupal_fiter);
+ if ($this->configuration['use_drupal_filter']) {
+ $this->restoreDrupalFilter();
+ }
+ unset($this->admin);
+ unset($this->configuration);
parent::tearDown();
}
-}
\ No newline at end of file
+}
diff --git a/tests/test_config.ini b/tests/test_config.ini
deleted file mode 100644
index 1d6eb7d6..00000000
--- a/tests/test_config.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[fedora]
-filter_drupal_file = "/usr/local/fedora/server/config/filter-drupal.xml"
-admin_user = "fedoraAdmin"
-admin_pass = "fedoraAdmin"
diff --git a/theme/islandora-object-edit.tpl.php b/theme/islandora-object-edit.tpl.php
index 0772a899..266a1259 100644
--- a/theme/islandora-object-edit.tpl.php
+++ b/theme/islandora-object-edit.tpl.php
@@ -20,7 +20,4 @@
*
*/
?>
-
-label); ?>
-
diff --git a/theme/islandora-object.tpl.php b/theme/islandora-object.tpl.php
index 9062098c..753232c5 100644
--- a/theme/islandora-object.tpl.php
+++ b/theme/islandora-object.tpl.php
@@ -58,10 +58,6 @@
*
*/
?>
-
-
-
-