diff --git a/BatchIngest.inc b/BatchIngest.inc
new file mode 100644
index 00000000..31daa608
--- /dev/null
+++ b/BatchIngest.inc
@@ -0,0 +1,273 @@
+pid != "islandora:collectionCModel") {
+ $cm_options[$content_model->pid] = $content_model->name;
+ $name_mappings[] = $content_model->pid . '^' . $content_model->pid_namespace;
+ }
+ }
+ $mappings = implode('~~~', $name_mappings);
+ $form['#attributes']['enctype'] = 'multipart/form-data';
+
+ $form['titlebox'] = array(
+ '#type' => 'item',
+ '#value' => t("Batch ingest into $collection_pid"),
+ );
+
+ $form['collection_pid'] = array(
+ '#type' => 'hidden',
+ '#value' => $collection_pid,
+ );
+ $form['namespace_mappings'] = array(
+ '#type' => 'hidden',
+ '#value' => $mappings,
+ );
+ $form['metadata_type'] = array(
+ '#title' => "Choose Metadata Type",
+ '#type' => 'radios',
+ '#options' => array('MODS' => 'MODS', "DC" => "DUBLIN CORE"),
+ '#required' => true,
+ '#description' => t("Select primary metadata schema"),
+ );
+ $form['content_model'] = array(
+ '#title' => "Choose content model to be associated with objects ingested",
+ '#type' => 'select',
+ '#options' => $cm_options,
+ '#required' => true,
+ '#description' => t("Content models describe the behaviours of objects with which they are associated."),
+ );
+ $form['indicator']['file-location'] = array(
+ '#type' => 'file',
+ '#title' => t('Upload zipped folder'),
+ '#size' => 48,
+ '#description' => t('The zipped folder should contain all files necessary to build objects.
+ Related files must have the same filename, but with differing extensions to indicate mimetypes.
+ ie. myFile.xml and myFile.jpg'),
+ );
+
+ $form['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Create Objects ')
+ );
+
+
+ return($form);
+}
+
+/**
+ * @param array $form
+ * @param array $form_state
+*/
+
+function batch_creation_form_validate($form, &$form_state) {
+
+ $fieldName = 'file-location';
+ if (isset($_FILES['files']) && is_uploaded_file($_FILES['files']['tmp_name'][$fieldName])) {
+ $file = file_save_upload($fieldName);
+ if ($file->filemime != 'application/zip') {
+ form_set_error($fieldName, 'Input file must be a .zip file');
+ return;
+ }
+ if (!$file) {
+ form_set_error($fieldName, 'Error uploading file.');
+ return;
+ }
+ $form_state['values']['file'] = $file;
+ }
+ else {
+ // set error
+ form_set_error($fieldName, 'Error uploading file.');
+ return;
+ }
+}
+
+function batch_creation_form_submit($form, &$form_state) {
+ module_load_include('inc', 'fedora_repository', 'ContentModel');
+ module_load_include('inc', 'fedora_repository', 'api/fedora_item');
+ global $user;
+ $namespace_mappings = array();
+ $content_model = $form_state['values']['content_model'];
+ $metadata = $form_state['values']['metadata_type'];
+ $collection_pid = $form_state['values']['collection_pid'];
+ $namespace_process = explode('~~~', $form_state['values']['namespace_mappings']);
+ foreach ($namespace_process as $line) {
+ $line_parts = explode('^', $line);
+ $namespace_mappings[$line_parts[0]] = $line_parts[1];
+ }
+ $namespace = $namespace_mappings[$content_model];
+ $namespace = preg_replace('/:.*/', '', $namespace);
+ $dirName = "temp" . $user->uid;
+ $tmpDir = file_directory_path() . '/' . $dirName . '/';
+ mkdir($tmpDir);
+ $file = $form_state['values']['file'];
+ $fileName = $file->filepath;
+ $file_list = array();
+ $cmdString = "unzip -q -o -d $tmpDir \"$fileName\"";
+ system($cmdString, $retVal);
+ $dirs = array();
+ $doNotAdd = array('.', '..', '__MACOSX');
+ array_push($dirs, $tmpDir);
+ $files = scandir($tmpDir);
+ foreach ($files as $file) {
+ if (is_dir("$tmpDir/$file") & !in_array($file, $doNotAdd)) {
+ array_push($dirs, $tmpDir . $file);
+ }
+ }
+ foreach ($dirs as $directory) {
+ if ($inputs = opendir($directory)) {
+ while (FALSE !== ($file_name = readdir($inputs))) {
+ if (!in_array($file_name, $doNotAdd) && is_dir($file_name) == FALSE) {
+ $ext = strrchr($file_name, '.');
+ $base = preg_replace("/$ext$/", '', $file_name);
+ $ext = substr($ext, 1);
+ if ($ext) {
+ $file_list[$base][$ext] = "$directory/" . $file_name;
+ }
+ }
+ }
+ closedir($inputs);
+ }
+ }
+
+ if (($cm = ContentModel::loadFromModel($content_model, 'ISLANDORACM')) === FALSE) {
+ drupal_set_message("$content_model not found", "error");
+ return;
+ }
+
+ $batch = array(
+ 'title' => 'Ingesting Objects',
+ 'operations' => array(),
+ 'file' => drupal_get_path('module', 'fedora_repository') . '/BatchIngest.inc',
+ );
+
+
+ foreach ($file_list as $label => $object_files) {
+ if ($object_files['xml']) {
+ $batch['operations'][] = array('create_batch_objects', array($label, $content_model, $object_files, $collection_pid, $namespace, $metadata));
+ }
+ }
+ $batch['operations'][] = array('recursive_directory_delete', array($tmpDir));
+ batch_set($batch);
+ batch_process();
+}
+
+/**
+ *
+ * @param $label
+ * @param $content_model
+ * @param $object_files
+ * @param $collection_pid
+ * @param $namespace
+ * @param $metadata
+ */
+
+
+function create_batch_objects($label, $content_model, $object_files, $collection_pid, $namespace, $metadata) {
+ module_load_include('inc', 'fedora_repository', 'ContentModel');
+ module_load_include('inc', 'fedora_repository', 'MimeClass');
+ $cm = ContentModel::loadFromModel($content_model, 'ISLANDORACM');
+ $allowedMimeTypes = $cm->getMimetypes();
+ $mime_helper = new MimeClass();
+ $pid = fedora_item::get_next_PID_in_namespace($namespace);
+ module_load_include('inc', 'fedora_reppository', 'api/fedora_item');
+ $item = Fedora_item::ingest_new_item($pid, 'A', $label, $owner);
+ $item->add_relationship('hasModel', $content_model, FEDORA_MODEL_URI);
+ $item->add_relationship('isMemberOfCollection', $collection_pid);
+ if ($metadata == 'DC') {
+ $dc_xml = file_get_contents($object_files['xml']);
+ $item->modify_datastream_by_value($dc_xml, 'DC', "Dublin Core", 'text/xml');
+ }
+ if ($metadata == 'MODS') {
+ $mods_xml = file_get_contents($object_files['xml']);
+ $item->add_datastream_from_string($mods_xml, 'MODS');
+ $dc_xml = batch_create_dc_from_mods($mods_xml);
+ }
+ unset($object_files['xml']);
+ $use_primary = TRUE;
+ foreach ($object_files as $ext => $filename) {
+ $file_mimetype = $mime_helper->get_mimetype($filename);
+ if (in_array($file_mimetype, $allowedMimeTypes)) {
+ $added = $cm->execIngestRules($filename, $file_mimetype);
+ }
+ else {
+ $item->purge("$pid $label not ingested. $file_mimetype not permitted in objects associated with $content_model");
+ continue;
+ }
+ $ds_label = $use_primary ? $cm->getDatastreamNameDSID():$ext;
+ $item->add_datastream_from_file($filename, $ds_label);
+ $use_primary = FALSE;
+
+ if (!empty($_SESSION['fedora_ingest_files'])) {
+ foreach ($_SESSION['fedora_ingest_files'] as $dsid => $datastream_file) {
+ $item->add_datastream_from_file($datastream_file, $dsid);
+ }
+ }
+ }
+}
+
+/**
+ * transforms mods to dc
+ * @param $mods_xml
+ * @return
+ */
+
+
+
+function batch_create_dc_from_mods($mods_xml) {
+ $path = drupal_get_path('module', 'fedora_repository');
+ module_load_include('inc', 'fedora_repository', 'ObjectHelper');
+ module_load_include('inc', 'fedora_repository', 'CollectionClass');
+
+ if ($xmlstr == NULL || strlen($xmlstr) < 5) {
+ return " ";
+ }
+
+ try {
+ $proc = new XsltProcessor();
+ } catch (Exception $e) {
+ drupal_set_message(t("!e", array('!e' => $e->getMessage())), 'error');
+ return " ";
+ }
+
+ $xsl = new DomDocument();
+ $xsl->load($path . '/xsl/mods_to_dc.xsl');
+ $input = new DomDocument();
+ $input->loadXML(trim($xmlstr));
+ $xsl = $proc->importStylesheet($xsl);
+ $newdom = $proc->transformToDoc($input);
+ $dc_xml = $newdom->saveXML();
+
+ return $dc_xml;
+}
+
+/**
+ *
+ * @param $dir
+ * @return
+ */
+function recursive_directory_delete($dir) {
+ if (!file_exists($dir))
+ return true;
+ if (!is_dir($dir))
+ return unlink($dir);
+ foreach (scandir($dir) as $item) {
+ if ($item == '.' || $item == '..')
+ continue;
+ if (!recursive_directory_delete($dir . DIRECTORY_SEPARATOR . $item))
+ return false;
+ }
+ return rmdir($dir);
+}
\ No newline at end of file
diff --git a/CollectionClass.inc b/CollectionClass.inc
index 7013e77d..4251eea4 100644
--- a/CollectionClass.inc
+++ b/CollectionClass.inc
@@ -498,6 +498,8 @@ class CollectionClass {
*/
function showFieldSets($page_number) {
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
+ module_load_include('inc', 'fedora_repository', 'CollectionManagement');
+ module_load_include('inc', 'fedora_repository', 'BatchIngest');
global $base_url;
$tabset = array();
global $user;
@@ -514,32 +516,56 @@ class CollectionClass {
// Check the form post to see if we are in the middle of an ingest operation.
$show_ingest_tab = (!empty($_POST['form_id']) && $_POST['form_id'] == 'fedora_repository_ingest_form');
$add_to_collection = $this->getIngestInterface();
+
+ $show_batch_tab = TRUE;
+ $policy = CollectionPolicy::loadFromCollection($this->pid, TRUE);
+ $content_models = $policy->getContentModels();
+ if (count($content_models) == 1 && $content_models[0]->pid == "islandora:collectionCModel") {
+ $show_batch_tab = FALSE;
+ }
+ if (!$show_ingest_tab) {
+ $view_selected = true;
+ }
+ if(!$collection_items){
+ $view_selected = false;
+ $add_selected = true;
+ }
$view_selected = !$show_ingest_tab;
- drupal_set_message();
$tabset['view_tab'] = array(
'#type' => 'tabpage',
'#title' => 'View',
'#selected' => $view_selected,
- '#content' => $collection_items
+ '#content' => $collection_items,
+
);
$tabset['add_tab'] = array(
- // #type and #title are the minimum requirements.
'#type' => 'tabpage',
'#title' => t('Add'),
- '#selected' => $show_ingest_tab,
+ '#selected' => $add_selected,
// This will be the content of the tab.
'#content' => $add_to_collection,
);
-
- $tabset['add_collection_tab'] = array(
- // #type and #title are the minimum requirements.
- '#type' => 'tabpage',
- '#title' => t('Add Child Collection'),
- // This will be the content of the tab.
- '#content' => drupal_get_form('collection_creation_form', $this->pid),
- );
+ if (user_access('manage collections')) {
+ $tabset['add_collection_tab'] = array(
+ // #type and #title are the minimum requirements.
+ '#type' => 'tabpage',
+ '#title' => t('Manage This Collection'),
+ // This will be the content of the tab.
+ '#content' => drupal_get_form('collection_management_form', $this->pid, $content_models),
+ '#selected' => false,
+ );
+ }
+ if ($show_batch_tab && user_access('create batch process')) {
+ $tabset['batch_ingest_tab'] = array(
+ // #type and #title are the minimum requirements.
+ '#type' => 'tabpage',
+ '#title' => t('Batch Ingest'),
+ // This will be the content of the tab.
+ '#content' => drupal_get_form('batch_creation_form', $this->pid, $content_models),
+ );
+ }
return $tabset;
}
@@ -649,146 +675,3 @@ class CollectionClass {
}
-/**
- * collection creation form ?
- * @param type $form_state
- * @param type $parent_collection_pid
- * @return type
- */
-function collection_creation_form(&$form_state, $parent_collection_pid) {
- module_load_include('inc', 'fedora_repository', 'api/fedora_utils');
- $restricted = FALSE;
- if (variable_get('fedora_namespace_restriction_enforced', true)) {
- $restricted = true;
- $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:');
- $namespaces = explode(':', $allowed_string);
- foreach ($namespaces as $namespace) {
- if ($namespace) {
- $allowed[trim($namespace)] = trim($namespace);
- }
- }
- }
-
- $content_models = get_content_models_as_option_array();
- $form['titlebox'] = array(
- '#type' => 'item',
- '#value' => t("Create New Child Collection within $parent_collection_pid"),
- );
-
- $form['collection_name'] = array(
- '#title' => "Collection Name",
- '#type' => 'textfield',
- '#description' => t("Human readable name for this collection"),
- );
- $form['collection_pid'] = array(
- '#title' => "Collection PID",
- '#type' => 'textfield',
- '#size' => 15,
- '#description' => t("Unique PID for this collection.
Pids take the general form of namespace:collection eg islandora:pamphlets"),
- );
- if (!$restricted) {
- $form['collection_namespace'] = array(
- '#title' => "Collection Namespace",
- '#type' => 'textfield',
- '#size' => 15,
- '#default_value' => 'default',
- '#description' => t("Namespace for objects in this collection."),
- );
- }
- else {
- $form['collection_namespace'] = array(
- '#title' => "Collection Namespace",
- '#type' => 'select',
- '#options' => $allowed,
- '#default_value' => 'default',
- '#description' => t("Namespace for objects in this collection."),
- );
- }
- $form['parent_collection'] = array(
- '#type' => 'hidden',
- '#value' => $parent_collection_pid,
- );
-
- $form['content_models'] = array(
- '#title' => "Choose allowable content models for this collection",
- '#type' => 'checkboxes',
- '#options' => $content_models,
- '#required' => true,
- '#description' => t("Content models describe the behaviours of objects with which they are associated."),
- );
-
-
- $form['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Submit')
- );
-
-
- return($form);
-}
-
-/**
- * collection creation form validate ?
- * @param type $form
- * @param type $form_state
- * @return type
- */
-function collection_creation_form_validate($form, &$form_state) {
- module_load_include('inc', 'fedora_repository', 'api/fedora_item');
- module_load_include('inc', 'fedora_repository', 'api/fedora_utils');
- $pid = $form_state['values']['collection_pid'];
- $item = new fedora_item($pid);
- if ($item->exists()) {
- form_set_error('', t("$pid already exists within your repository. the PID must be unique"));
- return;
- }
- if (!valid_pid($pid)){
- form_set_error('', t("$pid is not a valid identifier"));
- return;
- }
-}
-
-/**
- * collection creation form submit
- * @global type $user
- * @param type $form
- * @param type $form_state
- */
-function collection_creation_form_submit($form, &$form_state) {
- global $user;
- module_load_include('inc', 'fedora_repository', 'api/fedora_item');
- module_load_include('inc', 'fedora_repository', 'api/dublin_core');
- $module_path = drupal_get_path('module', 'fedora_repository');
- $thumbnail = drupal_get_path('module', 'Fedora_Repository') . '/images/Crystal_Clear_filesystem_folder_grey.png';
- $collection_pid = $form_state['values']['collection_pid'];
- $new_collection_label = $form_state['values']['collection_name'];
- $parent_collection = $form_state['values']['parent_collection'];
- $pid_namespace = $form_state['values']['collection_namespace'];
- $all_cModels = get_content_models_as_option_array();
- $collection_policy = '
-
-
-
-
-
-
- isMemberOfCollection
-';
- $content_models = $form_state['values']['content_models'];
- $collection_policy_xml = simplexml_load_string($collection_policy);
- foreach ($content_models as $content_model) {
- if ($content_model) {
- $node = $collection_policy_xml->content_models->addChild('content_model');
- $node->addAttribute('dsid', 'ISLANDORACM');
- $node->addAttribute('name', $all_cModels[$content_model]);
- $node->addAttribute('namespace', $pid_namespace . ':1');
- $node->addAttribute('pid', $content_model);
- }
- }
- $item = fedora_item::ingest_new_item($collection_pid, 'A', $new_collection_label, $user->name);
- $item->add_relationship('isMemberOfCollection', $parent_collection, RELS_EXT_URI);
- $item->add_relationship('hasModel', 'islandora:collectionCModel', FEDORA_MODEL_URI);
- $item->add_datastream_from_string($collection_policy_xml->saveXML(), 'COLLECTION_POLICY');
- $item->add_datastream_from_file($thumbnail, 'TN');
- drupal_goto("/fedora/repository/$collection_pid");
-}
diff --git a/CollectionManagement.inc b/CollectionManagement.inc
new file mode 100644
index 00000000..148fab84
--- /dev/null
+++ b/CollectionManagement.inc
@@ -0,0 +1,304 @@
+objectProfile->objLabel;
+ $new_content_models = get_content_models_as_option_array();
+ $cm_options = array();
+ $name_mappings = array();
+ foreach ($content_models as $content_model) {
+ if ($content_model->pid != "islandora:collectionCModel") {
+ $item = new fedora_item($content_model->pid);
+ $cm_name = $item->objectProfile->objLabel;
+ $cm_options[$content_model->pid] = $cm_name;
+ }
+ }
+
+ $content_models = get_content_models_as_option_array();
+ $form['child_creation'] = array(
+ '#title' => "Create Child Collection",
+ '#type' => 'fieldset',
+ '#collapsible' => TRUE,
+ '#collapsed' => TRUE,
+ );
+
+ $form['child_creation']['titlebox'] = array(
+ '#type' => 'item',
+ '#value' => t("Create New Child Collection within $this_collection_pid"),
+ );
+
+ $form['child_creation']['collection_name'] = array(
+ '#title' => "Collection Name",
+ '#type' => 'textfield',
+ '#description' => t("Human readable name for this collection"),
+ );
+ $form['child_creation']['new_collection_pid'] = array(
+ '#title' => "Collection PID",
+ '#type' => 'textfield',
+ '#size' => 15,
+ '#description' => t("Unique PID for this collection.
Pids take the general form of namespace:collection eg islandora:pamphlets"),
+ );
+ if (!$restricted) {
+ $form['child_creation']['collection_namespace'] = array(
+ '#title' => "Collection Namespace",
+ '#type' => 'textfield',
+ '#size' => 15,
+ '#default_value' => 'default',
+ '#description' => t("Namespace for objects in this collection."),
+ );
+ }
+ else {
+ $form['child_creation']['collection_namespace'] = array(
+ '#title' => "Collection Namespace",
+ '#type' => 'select',
+ '#options' => $allowed,
+ '#default_value' => 'default',
+ '#description' => t("Namespace for objects in this collection."),
+ );
+ }
+ $form['parent_collection'] = array(
+ '#type' => 'hidden',
+ '#value' => $this_collection_pid,
+ );
+ $form['collection_pid'] = array(
+ '#type' => 'hidden',
+ '#value' => $this_collection_pid,
+ );
+ $form['child_creation']['content_models'] = array(
+ '#title' => "Choose allowable content models for this collection",
+ '#type' => 'checkboxes',
+ '#options' => $content_models,
+ '#description' => t("Content models describe the behaviours of objects with which they are associated."),
+ );
+
+
+ $form['child_creation']['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Create Collection'),
+ '#id' => 'create_class'
+ );
+ $form['change_cmodel'] = array(
+ '#title' => "Change Content Models",
+ '#type' => 'fieldset',
+ '#collapsible' => TRUE,
+ '#collapsed' => TRUE,
+ );
+ $form['change_cmodel']['titlebox'] = array(
+ '#type' => 'item',
+ '#value' => t("Change Content Models within $this_collection_pid"),
+ );
+
+ $form['change_cmodel']['current_content_model'] = array(
+ '#title' => "Choose content model to be changed",
+ '#type' => 'select',
+ '#options' => $cm_options,
+ '#description' => t("All objects in this collection with the selected content model will be changed."),
+ );
+ $form['change_cmodel']['new_content_model'] = array(
+ '#title' => "Choose new content model",
+ '#type' => 'select',
+ '#options' => $new_content_models,
+ '#description' => t("The new content model to be assigned to selected objects."),
+ );
+ $form['change_cmodel']['collection_pid'] = array(
+ '#type' => 'hidden',
+ '#value' => $this_collection_pid,
+ );
+ $form['change_cmodel']['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Change Content Model Associations'),
+ '#id' => 'change_model',
+ );
+ if (user_access('delete entire collections')) {
+ $form['delete_collection'] = array(
+ '#title' => "Permanently Delete $collection_name",
+ '#type' => 'fieldset',
+ '#description' => t("Clicking this button will delete all objects within $collection_name.
This action cannot be undone."),
+ '#collapsible' => TRUE,
+ '#collapsed' => TRUE,
+ );
+ $form['delete_collection']['confirm'] = array(
+ '#title' => "Are you sure?",
+ '#type' => 'fieldset',
+ '#description' => t('Clicking the delete button will permanantly remove all objects from this collection.
This action cannot be undone. '),
+ '#collapsible' => TRUE,
+ '#collapsed' => TRUE,
+ );
+
+ $form['delete_collection']['confirm']['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Delete this collection'),
+ '#id' => 'delete_collection',
+ );
+ }
+ return($form);
+}
+
+/**
+ * collection creation form validate
+ * @param array $form
+ * @param array $form_state
+ */
+function collection_management_form_validate($form, &$form_state) {
+ if ($form_state['clicked_button']['#id'] == 'create_class') {
+ module_load_include('inc', 'fedora_repository', 'api/fedora_item');
+ module_load_include('inc', 'fedora_repository', 'api/fedora_utils');
+ $pid = $form_state['values']['new_collection_pid'];
+ $item = new fedora_item($pid);
+ if ($item->exists()) {
+ form_set_error('', t("$pid already exists within your repository. the PID must be unique"));
+ return;
+ }
+ if (!valid_pid($pid)) {
+ form_set_error('', t("$pid is not a valid identifier"));
+ return;
+ }
+ }
+}
+
+/**
+ * collection creation form submit
+ * @global type $user
+ * @param type $form
+ * @param type $form_state
+ */
+function collection_management_form_submit($form, &$form_state) {
+ module_load_include('inc', 'fedora_repository', 'api/fedora_collection');
+ module_load_include('inc', 'fedora_repository', 'api/fedora_item');
+ module_load_include('inc', 'fedora_repository', 'api/dublin_core');
+ global $user;
+ $collection_pid = $form_state['values']['parent_collection'];
+ if ($form_state['clicked_button']['#id'] == 'create_class') {
+ $module_path = drupal_get_path('module', 'fedora_repository');
+ $thumbnail = drupal_get_path('module', 'Fedora_Repository') . '/images/Crystal_Clear_filesystem_folder_grey.png';
+ $new_collection_pid = $form_state['values']['new_collection_pid'];
+ $new_collection_label = $form_state['values']['collection_name'];
+ $pid_namespace = $form_state['values']['collection_namespace'];
+ $all_cModels = get_content_models_as_option_array();
+ $collection_policy = '
+
+
+
+
+
+
+ isMemberOfCollection
+';
+ $content_models = $form_state['values']['content_models'];
+ $collection_policy_xml = simplexml_load_string($collection_policy);
+ foreach ($content_models as $content_model) {
+ if ($content_model) {
+ $node = $collection_policy_xml->content_models->addChild('content_model');
+ $node->addAttribute('dsid', 'ISLANDORACM');
+ $node->addAttribute('name', $all_cModels[$content_model]);
+ $node->addAttribute('namespace', $pid_namespace . ':1');
+ $node->addAttribute('pid', $content_model);
+ }
+ }
+ $item = fedora_item::ingest_new_item($new_collection_pid, 'A', $new_collection_label, $user->name);
+ $item->add_relationship('isMemberOfCollection', $collection_pid, RELS_EXT_URI);
+ $item->add_relationship('hasModel', 'islandora:collectionCModel', FEDORA_MODEL_URI);
+ $item->add_datastream_from_string($collection_policy_xml->saveXML(), 'COLLECTION_POLICY');
+ $item->add_datastream_from_file($thumbnail, 'TN');
+ drupal_goto("/fedora/repository/$new_collection_pid");
+ }
+
+ if ($form_state['clicked_button']['#id'] == 'change_model') {
+ $current_content_model = $form_state['values']['current_content_model'];
+ $new_content_model = $form_state['values']['new_content_model'];
+ $policy = CollectionPolicy::loadFromCollection($collection_pid, TRUE);
+ $add_to_policy = TRUE;
+ $policy_cms = $policy->getContentModels();
+ foreach ($policy_cms as $policy_cm) {
+ if ($policy_cm->pid == $current_content_model) {
+ $namespace = $policy_cm->pid_namespace;
+ }
+ if ($policy_cm->pid == $new_content_model) {
+ $add_to_policy = FALSE;
+ }
+ }
+ if ($add_to_policy) {
+ $policy->addModel(ContentModel::loadFromModel($new_content_model), $namespace);
+ $policy->saveToFedora();
+ }
+ $query = "select \$object from <#ri>
+ where (\$object
+ and \$object
+ and \$object )";
+ $query = htmlentities(urlencode($query));
+ $content = '';
+
+ $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch');
+ $url .= "?type=tuples&flush=TRUE&format=csv&limit=$limit&offset=$offset&lang=itql&stream=on&query=" . $query;
+ $content .= do_curl($url);
+ $results = explode("\n", $content);
+ $object_pids = preg_replace('/^info:fedora\/|"object"/', '', $results);
+ $count = 0;
+ foreach ($object_pids as $object_pid) {
+ if (!$object_pid) {
+ continue;
+ }
+ $item = new fedora_item($object_pid);
+ $item->purge_relationship('hasModel', $current_content_model);
+ $item->add_relationship('hasModel', $new_content_model, FEDORA_MODEL_URI);
+ $count++;
+ }
+ drupal_set_message("$current_content_model changed to $new_content_model on $count objects");
+ }
+
+ if ($form_state['clicked_button']['#id'] == 'delete_collection') {
+ $collection_name = $form_state['values']['collection_name'];
+ $pids = get_related_items_as_array($collection_pid, 'isMemberOfCollection');
+
+ $batch = array(
+ 'title' => "Deleting Objects from $name",
+ 'operations' => array(),
+ 'file' => drupal_get_path('module', 'fedora_repository') . '/CollectionManagement.inc',
+ );
+
+
+ foreach ($pids as $pid) {
+
+ $batch['operations'][] = array('delete_objects_as_batch', array($pid));
+ }
+
+ batch_set($batch);
+ batch_process('/fedora/repository');
+ }
+}
+/**
+ * deletes PID if pid is not collection
+ * @param $pid
+ */
+function delete_objects_as_batch($pid) {
+ module_load_include('inc', 'fedora_repository', 'api/fedora_item');
+ $name = $user->name;
+ $item_to_delete = new Fedora_Item($pid);
+ $models = $item_to_delete->get_models();
+ foreach ($models as $model) {
+ if ($model['object'] != 'islandora:collectionCModel') {
+ $item_to_delete->purge("$object purged by $name");
+ }
+ }
+}
\ No newline at end of file
diff --git a/ContentModel.inc b/ContentModel.inc
index 64b71980..b1f28074 100644
--- a/ContentModel.inc
+++ b/ContentModel.inc
@@ -4,7 +4,6 @@
* @file
*
*/
-
/**
* @file
* Content Model Class
@@ -204,6 +203,9 @@ class ContentModel extends XMLDatastream {
try {
if (self::valid_pid($pid)) {
$fedoraItem = new Fedora_Item($pid);
+ if (!$name) {
+ $name = $fedoraItem->objectProfile->objLabel;
+ }
$dsid = ($dsid != NULL && self::valid_dsid($dsid)) ? $dsid : ContentModel::getDefaultDSID();
$ds = $fedoraItem->get_datastream_dissemination($dsid);
if (!empty($ds)) {
@@ -396,12 +398,12 @@ class ContentModel extends XMLDatastream {
$rootEl->appendChild($ingest_formEl);
if (isset($sXml->edit_metadata) &&
- trim($sXml->edit_metadata->build_form_method->module) != '' &&
- trim($sXml->edit_metadata->build_form_method->file) != '' &&
- trim($sXml->edit_metadata->build_form_method->class_name) != '' &&
- trim($sXml->edit_metadata->build_form_method->method_name) != '' &&
- trim($sXml->edit_metadata->submit_form_method->method_name) != '' &&
- trim($sXml->edit_metadata->build_form_method['dsid']) != ''
+ trim($sXml->edit_metadata->build_form_method->module) != '' &&
+ trim($sXml->edit_metadata->build_form_method->file) != '' &&
+ trim($sXml->edit_metadata->build_form_method->class_name) != '' &&
+ trim($sXml->edit_metadata->build_form_method->method_name) != '' &&
+ trim($sXml->edit_metadata->submit_form_method->method_name) != '' &&
+ trim($sXml->edit_metadata->build_form_method['dsid']) != ''
) {
$edit_metadata_methodEl = $newDom->createElement('edit_metadata_method');
$edit_metadata_methodEl->setAttribute('module', $sXml->edit_metadata->build_form_method->module);
@@ -491,6 +493,22 @@ class ContentModel extends XMLDatastream {
return $ret;
}
+ /**
+ * Gets the DSID of the default datastream
+ * from the element of the schema.
+ * Returns FALSE on failure.
+ *
+ * @return String
+ */
+ public function getDatastreamNameDSID() {
+ $datastreams = $this->xml->getElementsByTagName('datastreams');
+ $datastream = $datastreams->item(0);
+ if ($datastreams->length > 0) {
+ $datastream = $datastreams->item(0)->getElementsByTagName('datastream');
+ return $datastream->item(0)->getAttribute('dsid');
+ }
+ }
+
/**
* Gets an array of form elements to use in the ingest form. The results of this array are passed
* to the specified ingest form builder. The form builder can optionally not use the elements as defined
@@ -1677,9 +1695,9 @@ class ContentModel extends XMLDatastream {
$dispMethods = $ds->getElementsByTagName('display_method');
for ($i = 0; !$found && $i < $dispMethods->length; $i++) {
if ($module == ($dispMethods->item($i)->getAttribute('module') == '' ? 'fedora_repository' : $dispMethods->item($i)->getAttribute('module')) &&
- $file == $dispMethods->item($i)->getAttribute('file') &&
- $class == $dispMethods->item($i)->getAttribute('class') &&
- $method == $dispMethods->item($i)->getAttribute('method')) {
+ $file == $dispMethods->item($i)->getAttribute('file') &&
+ $class == $dispMethods->item($i)->getAttribute('class') &&
+ $method == $dispMethods->item($i)->getAttribute('method')) {
$found = $dispMethods->item($i);
}
}
@@ -1715,9 +1733,9 @@ class ContentModel extends XMLDatastream {
$dispMethods = $ds->getElementsByTagName('display_method');
for ($i = 0; !$found && $i < $dispMethods->length; $i++) {
if ($module == ($dispMethods->item($i)->getAttribute('module') == '' ? 'fedora_repository' : $dispMethods->item($i)->getAttribute('module') == '') &&
- $file == $dispMethods->item($i)->getAttribute('file') &&
- $class == $dispMethods->item($i)->getAttribute('class') &&
- $method == $dispMethods->item($i)->getAttribute('method')) {
+ $file == $dispMethods->item($i)->getAttribute('file') &&
+ $class == $dispMethods->item($i)->getAttribute('class') &&
+ $method == $dispMethods->item($i)->getAttribute('method')) {
$found = $dispMethods->item($i);
}
}
@@ -1919,9 +1937,9 @@ class ContentModel extends XMLDatastream {
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $methods->length; $i++) {
if (($methods->item($i)->getAttribute('module') == '' ? 'fedora_repository' : $methods->item($i)->getAttribute('module')) == $module &&
- $methods->item($i)->getAttribute('file') == $file &&
- $methods->item($i)->getAttribute('class') == $class &&
- $methods->item($i)->getAttribute('method') == $method) {
+ $methods->item($i)->getAttribute('file') == $file &&
+ $methods->item($i)->getAttribute('class') == $class &&
+ $methods->item($i)->getAttribute('method') == $method) {
$found = $methods->item($i);
}
}
diff --git a/ObjectHelper.inc b/ObjectHelper.inc
index 1baf5be5..9e9995b7 100644
--- a/ObjectHelper.inc
+++ b/ObjectHelper.inc
@@ -19,6 +19,9 @@ class ObjectHelper {
public static $INGEST_FEDORA_OBJECTS = 'ingest new fedora objects';
public static $EDIT_TAGS_DATASTREAM = 'edit tags datastream';
public static $VIEW_DETAILED_CONTENT_LIST = 'view detailed list of content';
+ public static $MANAGE_COLLECTIONS = 'manage collections';
+ public static $DELETE_ENTIRE_COLLECTIONS = 'delete entire collections';
+ public static $CREATE_BATCH_PROCESS = 'create batch process';
public static $DISPLAY_ALWAYS = 0;
public static $DISPLAY_NEVER = 1;
public static $DISPLAY_NO_MODEL_OUTPUT = 2;
@@ -160,7 +163,7 @@ class ObjectHelper {
if ($asAttachment) {
$suggestedFileName = "$label";
$pos = strpos($suggestedFileName, '.');
-
+
/*
* Here we used to take an object of, say, type application/pdf with label, say, "My Document"
* and we assemble the output filename extension based on the post-slash portion of the mimetype.
@@ -300,8 +303,8 @@ class ObjectHelper {
}
if ($allow) {
$purgeImage = '
';
+ $pid . '/' . $dataStreamValue->ID . '/' . $dataStreamValue->label . '">
';
}
}
else {
@@ -329,7 +332,7 @@ class ObjectHelper {
$mimeType = $dataStreamValue->MIMEType;
$view = '' . t('View') . '';
+ '" target="_blank" >' . t('View') . '';
$action = "$base_url/fedora/repository/object_download/" . drupal_urlencode($pid) . '/' . $id . '/' . drupal_urlencode(preg_replace('/\//i', '${1}_', $label)); // Necessary to handle the case of Datastream labels that contain slashes. Ugh.
$downloadVersion = '';
if (user_access(ObjectHelper :: $EDIT_FEDORA_METADATA)) {
@@ -416,7 +419,7 @@ class ObjectHelper {
if ($allow) {
$output .= '
';
+ $dsid . '">
';
}
}
return $output;
@@ -673,8 +676,8 @@ class ObjectHelper {
if ($allow) {
// $ingestObject = ' $collectionName, '!collection_pid' => $collection_pid)) . '" href="' . base_path() .
- 'fedora/ingestObject/' . $collection_pid . '/' . $collectionName . '">
' . t('Add to this Collection');
+ 'fedora/ingestObject/' . $collection_pid . '/' . $collectionName . '">
' . t('Add to this Collection');
}
}
}
@@ -855,10 +858,10 @@ class ObjectHelper {
// Get pid, title and description for children of object $pid
$query_string = 'select $o $title from <#ri> ' .
// $query_string = 'select $o $title $desc from <#ri> '.
- 'where $s $o ' .
- 'and $o $title ' .
+ 'where $s $o ' .
+ 'and $o $title ' .
// 'and $o $desc '.
- 'and ( ';
+ 'and ( ';
foreach ($pids as $pid) {
$query_string .= '$s or ';
diff --git a/api/fedora_item.inc b/api/fedora_item.inc
index dfd39523..4dacca8c 100644
--- a/api/fedora_item.inc
+++ b/api/fedora_item.inc
@@ -76,10 +76,9 @@ class Fedora_Item {
*/
function add_datastream_from_file($datastream_file, $datastream_id, $datastream_label = NULL, $datastream_mimetype = '', $controlGroup = 'M', $logMessage = NULL) {
module_load_include('inc', 'fedora_repository', 'MimeClass');
- if (!is_file($datastream_file)){
+ if (!is_file($datastream_file)) {
drupal_set_message("$datastream_file not found
", 'warning');
return;
-
}
if (empty($datastream_mimetype)) {
// Get mime type from the file extension.
@@ -233,6 +232,11 @@ class Fedora_Item {
$relationship = "isPartOf";
$namespaceURI = 'info:fedora/fedora-system:def/relations-external#';
break;
+ case "rel:hasModel":
+ case "hasModel":
+ $relationship = "hasModel";
+ $namespaceURI = FEDORA_MODEL_URI;
+ break;
}
if (substr($object, 0, 12) != 'info:fedora/') {
@@ -558,7 +562,6 @@ class Fedora_Item {
$relsextxml->loadXML($relsext);
$relsextxml->normalizeDocument();
$rels = $relsextxml->getElementsByTagNameNS('info:fedora/fedora-system:def/relations-external#', '*');
-
foreach ($rels as $child) {
if (empty($relationship) || preg_match("/$relationship/", $child->tagName)) {
$relationships[] = array(
@@ -568,12 +571,36 @@ class Fedora_Item {
);
}
}
+
+ return $relationships;
+ }
+
+
+ function get_models() {
+ $relationships = array();
+ try {
+ $relsext = $this->get_datastream_dissemination('RELS-EXT');
+ } catch (exception $e) {
+ drupal_set_message(t("Error retrieving RELS-EXT of object $pid"), 'error');
+ return $relationships;
+ }
+
+ // Parse the RELS-EXT into an associative array.
+ $relsextxml = new DOMDocument();
+ $relsextxml->loadXML($relsext);
+ $relsextxml->normalizeDocument();
+ $mods = $relsextxml->getElementsByTagNameNS(FEDORA_MODEL_URI, '*');
+ foreach ($mods as $child) {
+ if (empty($relationship) || preg_match("/$relationship/", $child->tagName)) {
+ $relationships[] = array(
+ 'subject' => $this->pid,
+ 'predicate' => $child->tagName,
+ 'object' => substr($child->getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'resource'), 12),
+ );
+ }
+ }
+
return $relationships;
- //$children = $relsextxml->RDF->description;
- //$children = $relsextxml->RDF->description;
- //$params = array( 'pid' => $this->pid,
- // 'relationship' => 'NULL' );
- //return $this->soap_call( 'getRelationships', $params );
}
/**
diff --git a/api/fedora_utils.inc b/api/fedora_utils.inc
index c430d37d..c8ce7d0e 100644
--- a/api/fedora_utils.inc
+++ b/api/fedora_utils.inc
@@ -299,7 +299,7 @@ function get_content_models_as_option_array() {
$nameparts = explode(':', $parts[0]);
if (!$restricted || in_array($nameparts[0], $allowed))
if ($item->get_datastream_dissemination('ISLANDORACM')) {
- $options[$parts[0]] = $parts[1];
+ $options[$parts[0]] = $parts[1]. ' ~ ' . $parts[0] ;
}
}
}
diff --git a/fedora_repository.module b/fedora_repository.module
index 99eba2f1..ea1c15c5 100644
--- a/fedora_repository.module
+++ b/fedora_repository.module
@@ -830,6 +830,9 @@ function fedora_repository_perm() {
OBJECTHELPER::$INGEST_FEDORA_OBJECTS,
OBJECTHELPER::$EDIT_TAGS_DATASTREAM,
OBJECTHELPER::$VIEW_DETAILED_CONTENT_LIST,
+ OBJECTHELPER::$MANAGE_COLLECTIONS,
+ OBJECTHELPER::$DELETE_ENTIRE_COLLECTIONS,
+ OBJECTHELPER::$CREATE_BATCH_PROCESS,
);
}
@@ -987,7 +990,17 @@ function fedora_repository_get_items($pid = NULL, $dsId = NULL, $collection = NU
// Add a 'manage object' tab for all objects, where detailed list of content is shown.
$obj = new FedoraObjectDetailedContent($pid);
$object_details = $obj->showFieldSets();
+ if ($object_details['fedora_object_details']['#selected'] == true){
+ foreach($cmodels_tabs as $cmodel_tab){
+ if (is_array($cmodel_tab)){
+ $cmodel_tab['#selected'] = FALSE;
+ }
+
+ }
+ }
$cmodels_tabs = array_merge($cmodels_tabs, $object_details);
+
+
return tabs_render($cmodels_tabs);
}
diff --git a/xsl/mods_to_dc.xsl b/xsl/mods_to_dc.xsl
new file mode 100644
index 00000000..4c007469
--- /dev/null
+++ b/xsl/mods_to_dc.xsl
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+ .
+
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --
+
+
+
+
+ --
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ --
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Collection
+
+
+ DataSet
+
+
+ Service
+
+
+
+ Software
+
+
+ Image
+
+
+
+ InteractiveResource
+
+
+ MovingImage
+
+
+ PhysicalObject
+
+
+
+ Sound
+
+
+ StillImage
+
+
+
+ Text
+
+
+ Text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --
+
+
+
+
+
+
+
+
+
+
+
+
+ --
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+ ,
+
+
+
+
+ (
+
+
+ )
+
+
+ (
+
+ )
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+