From 2a041f9ef01fb44c14ac9890072cbca138e2e8b0 Mon Sep 17 00:00:00 2001 From: jonathangreen Date: Tue, 22 May 2012 15:45:07 -0300 Subject: [PATCH 1/6] Addding add stuff --- RestConnection.inc | 23 +++++++++++++++++++++++ includes/add-menu.inc | 32 ++++++++++++++++++++++++++++++++ islandora.module | 7 +++++-- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 includes/add-menu.inc diff --git a/RestConnection.inc b/RestConnection.inc index 3d74d85b..24e65f83 100644 --- a/RestConnection.inc +++ b/RestConnection.inc @@ -13,9 +13,32 @@ require_once 'sites/all/libraries/tuque/FedoraRelationships.php'; class RestConnection { + /** + * Connection to the repository + * + * @var RepositoryConnection + */ public $connection = NULL; + + /** + * The Fedora API we are using + * + * @var FedoraAPI + */ public $api = NULL; + + /** + * The cache we use to connect. + * + * @var SimpleCache + */ public $cache = NULL; + + /** + * The repository object. + * + * @var FedoraRepository + */ public $repository = NULL; function RestConnection($user) { diff --git a/includes/add-menu.inc b/includes/add-menu.inc new file mode 100644 index 00000000..d1fb988d --- /dev/null +++ b/includes/add-menu.inc @@ -0,0 +1,32 @@ +repository->getObject($pid); + + dsm($object->id); + + /** + + $ingest_registry = module_invoke_all('islandora_ingest_registry', $collection_pid); + + $registry_count = count($ingest_registry); + + if ($registry_count == 0) { + // No ingest implementations. + drupal_set_message(t('There are no ingest methods specified for this collection.')); + drupal_goto('islandora/object/' . $collection_pid); + } + elseif ($registry_count == 1) { + // One registry implementation, go there + drupal_goto($ingest_registry[0]['url']); + } + else { + // Multiple ingest routes registered + return islandora_ingest_registry_render($ingest_registry); + } + * + */ +} \ No newline at end of file diff --git a/islandora.module b/islandora.module index 2a6fbae9..5de421e3 100644 --- a/islandora.module +++ b/islandora.module @@ -96,9 +96,12 @@ function islandora_menu() { 'access arguments' => array(FEDORA_VIEW), ); + $items['islandora/object/%/add'] = array( - 'title' => 'Add stream', - 'page callback' => 'islandora_add_stream', + 'title' => 'Add to an object', + 'file' => 'includes/add-menu.inc', + 'page callback' => 'islandora_add_callback', + 'page arguments' => array(2), 'type' => MENU_NORMAL_ITEM, 'access arguments' => array(FEDORA_ADD_DS) ); From 6413c436918f8566800bf09167fadb6e8aaa3963 Mon Sep 17 00:00:00 2001 From: jonathangreen Date: Tue, 22 May 2012 16:39:12 -0300 Subject: [PATCH 2/6] Added some more menu stuff --- includes/add-menu.inc | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/includes/add-menu.inc b/includes/add-menu.inc index d1fb988d..6bc0fd75 100644 --- a/includes/add-menu.inc +++ b/includes/add-menu.inc @@ -2,31 +2,30 @@ function islandora_add_callback($pid) { module_load_include('inc', 'islandora', 'RestConnection'); - global $user; + $user = new stdClass(); + $user->name = 'fedoraAdmin'; + $user->pass = 'password'; $connection = new RestConnection($user); $object = $connection->repository->getObject($pid); + $models = $object->models; - dsm($object->id); + return drupal_get_form('islandora_add_form', $models, $object); +} - /** +function islandora_add_form($object) { + $form = array (); + return $form; +} - $ingest_registry = module_invoke_all('islandora_ingest_registry', $collection_pid); - - $registry_count = count($ingest_registry); - - if ($registry_count == 0) { - // No ingest implementations. - drupal_set_message(t('There are no ingest methods specified for this collection.')); - drupal_goto('islandora/object/' . $collection_pid); - } - elseif ($registry_count == 1) { - // One registry implementation, go there - drupal_goto($ingest_registry[0]['url']); - } - else { - // Multiple ingest routes registered - return islandora_ingest_registry_render($ingest_registry); +function islandora_form_alter(&$form, &$form_state, $form_id) { + if($form_id == 'islandora_add_form') { + $form['islandora_repository_pid'] = array( + '#type' => 'textfield', + '#title' => t('Root Collection PID'), + '#default_value' => variable_get('islandora_repository_pid', 'islandora:root'), + '#description' => t('The PID of the Root Collection Object'), + '#required' => TRUE, + '#weight' => -18 + ); } - * - */ } \ No newline at end of file From 775116d9a2f5c54fed8bc88d313ee986907bfae9 Mon Sep 17 00:00:00 2001 From: jonathangreen Date: Wed, 23 May 2012 11:10:04 -0300 Subject: [PATCH 3/6] Added mimeclass --- utils/MimeClass.inc | 359 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 utils/MimeClass.inc diff --git a/utils/MimeClass.inc b/utils/MimeClass.inc new file mode 100644 index 00000000..a827c476 --- /dev/null +++ b/utils/MimeClass.inc @@ -0,0 +1,359 @@ +mime). + * While I don't have a specific use case for a mime->extension lookup, I think + * it's good to have in here. + * + * Drupal 7 will have better mime handlers. See: + * http://api.drupal.org/api/function/file_default_mimetype_mapping/7 + * + */ + +class MimeClass { + + protected $protectedMimeTypes = array( + /* + * This is a shortlist of mimetypes which should catch most + * mimetype<-->extension lookups in the context of Islandora collections. + * + * It has been cut from a much longer list. + * + * Two types of mimetypes should be put in this list: + * 1) Special emerging formats which may not yet be expressed in the system + * mime.types file. + * 2) Heavily used mimetypes of particular importance to the Islandora + * project, as lookups against this list will be quicker and less + * resource intensive than other methods. + * + * Lookups are first checked against this short list. If no results are + * found, then the lookup function may move on to check other sources, + * namely the system's mime.types file. + * + * In most cases though, this short list should suffice. + * + * If modifying this list, please note that for promiscuous mimetypes + * (those which map to multiple extensions, such as text/plain) + * The function get_extension will always return the *LAST* extension in + * this list, so you should put your preferred extension *LAST*. + * + * e.g... + * "jpeg" => "image/jpeg", + * "jpe" => "image/jpeg", + * "jpg" => "image/jpeg", + * + * $this->get_extension('image/jpeg') will always return 'jpg'. + * + */ + // Openoffice: + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + // Staroffice: + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + // K-office: + 'kil' => 'application/x-killustrator', + 'kpt' => 'application/x-kpresenter', + 'kpr' => 'application/x-kpresenter', + 'ksp' => 'application/x-kspread', + 'kwt' => 'application/x-kword', + 'kwd' => 'application/x-kword', + // Ms office 97: + 'doc' => 'application/msword', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + // Office2007: + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'docm' => 'application/vnd.ms-word.document.macroEnabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12', + // Wordperfect (who cares?): + 'wpd' => 'application/wordperfect', + // Common and generic containers: + 'pdf' => 'application/pdf', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'rtf' => 'text/rtf', + 'rtx' => 'text/richtext', + 'latex' => 'application/x-latex', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + // *ml: + 'css' => 'text/css', + 'htm' => 'text/html', + 'html' => 'text/html', + 'wbxml' => 'application/vnd.wap.wbxml', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xsl' => 'text/xml', + 'xml' => 'text/xml', + 'csv' => 'text/csv', + 'tsv' => 'text/tab-separated-values', + 'txt' => 'text/plain', + // images: + "bmp" => "image/bmp", + "gif" => "image/gif", + "ief" => "image/ief", + "jpeg" => "image/jpeg", + "jpe" => "image/jpeg", + "jpg" => "image/jpeg", + "jp2" => "image/jp2", + "png" => "image/png", + "tiff" => "image/tiff", + "tif" => "image/tif", + "djvu" => "image/vnd.djvu", + "djv" => "image/vnd.djvu", + "wbmp" => "image/vnd.wap.wbmp", + "ras" => "image/x-cmu-raster", + "pnm" => "image/x-portable-anymap", + "pbm" => "image/x-portable-bitmap", + "pgm" => "image/x-portable-graymap", + "ppm" => "image/x-portable-pixmap", + "rgb" => "image/x-rgb", + "xbm" => "image/x-xbitmap", + "xpm" => "image/x-xpixmap", + "xwd" => "image/x-windowdump", + // videos: + "mpeg" => "video/mpeg", + "mpe" => "video/mpeg", + "mpg" => "video/mpeg", + "m4v" => "video/mp4", + "mp4" => "video/mp4", + "ogv" => "video/ogg", + "qt" => "video/quicktime", + "mov" => "video/quicktime", + "mxu" => "video/vnd.mpegurl", + "avi" => "video/x-msvideo", + "movie" => "video/x-sgi-movie", + "flv" => "video/x-flv", + "swf" => "application/x-shockwave-flash", + // Audio: + "mp3" => "audio/mpeg", + "mp4a" => "audio/mp4", + "m4a" => "audio/mp4", + "oga" => "audio/ogg", + "ogg" => "audio/ogg", + "flac" => "audio/x-flac", + "wav" => "audio/vnd.wave", + // Compressed formats: + // (note: http://svn.cleancode.org/svn/email/trunk/mime.types) + "tgz" => "application/x-gzip", + "gz" => "application/x-gzip", + "tar" => "application/x-tar", + "gtar" => "application/x-gtar", + "zip" => "application/x-zip", + // others: + 'bin' => 'application/octet-stream', + ); + protected $protectedFileExtensions; + protected $systemTypes; + protected $systemExts; + protected $etcMimeTypes = '/etc/mime.types'; + + /** + * Construtor + */ + public function __construct() { + + // Populate the reverse shortlist: + $this->protectedFileExtensions = array_flip($this->protectedMimeTypes); + + // Pick up a local mime.types file if it is available. + if (is_readable('mime.types')) { + $this->etcMimeTypes = 'mime.types'; + } + } + + /** + * description: returns a mimetype associated with the file extension of + * $filename + * + * @param string $filename + * The filename + * @param boolean $debug + * Returns a debug array. + * + * @return mixed + * string or an array + */ + public function getMimetype($filename, $debug = FALSE) { + + $file_name_and_extension = explode('.', $filename); + $ext = strtolower(array_pop($file_name_and_extension)); + + if (!empty($this->protectedMimeTypes[$ext])) { + if (TRUE === $debug) { + return array('mime_type' => $this->protectedMimeTypes[$ext], 'method' => 'from_array'); + } + return $this->protectedMimeTypes[$ext]; + } + + if (function_exists('file_get_mimetype')) { + $drupal_mimetype = file_get_mimetype($filename); + if ('application/octet-stream' != $drupal_mimetype) { + if (TRUE == $debug) { + return array('mime_type' => $drupal_mimetype, 'method' => 'file_get_mimetype'); + } + return $drupal_mimetype; + } + } + + if (!isset($this->systemTypes)) { + $this->systemTypes = $this->systemExtensionMimetypes(); + } + if (isset($this->systemTypes[$ext])) { + if (TRUE == $debug) { + return array('mime_type' => $this->systemTypes[$ext], 'method' => 'mime.types'); + } + return $this->systemTypes[$ext]; + } + + if (TRUE === $debug) { + return array('mime_type' => 'application/octet-stream', 'method' => 'last_resort'); + } + return 'application/octet-stream'; + } + + /** + * function: get_extension + * description: returns *one* valid file extension for a given $mime_type + * + * @param type $mime_type + * @param type $debug + * @return type + */ + public function getExtension($mime_type, $debug = FALSE) { + + if (!empty($this->protectedFileExtensions[$mime_type])) { + if (TRUE == $debug) { + return array('extension' => $this->protectedFileExtensions[$mime_type], 'method' => 'from_array'); + } + return $this->protectedFileExtensions[$mime_type]; + } + + if (!isset($this->systemExts)) { + $this->systemExts = $this->systemMimetypeExtensions(); + } + if (isset($this->systemExts[$mime_type])) { + if (TRUE == $debug) { + return array('extension' => $this->systemExts[$mime_type], 'method' => 'mime.types'); + } + return $this->systemExts[$mime_type]; + } + + if (TRUE == $debug) { + return array('extension' => 'bin', 'method' => 'last_resort'); + } + return 'bin'; + } + + /** + * function: systemMimetypeExtensions + * description: populates an internal array of mimetype/extension associations + * from the system mime.types file, or a local mime.types if one is found (see + * __constuctor). + * return: array of mimetype => extension + */ + protected function systemMimetypeExtensions() { + $out = array(); + if (file_exists($this->etcMimeTypes)) { + $file = fopen($this->etcMimeTypes, 'r'); + while (($line = fgets($file)) !== FALSE) { + $line = trim(preg_replace('/#.*/', '', $line)); + if (!$line) { + continue; + } + $parts = preg_split('/\s+/', $line); + if (count($parts) == 1) { + continue; + } + // A single part means a mimetype without extensions, which we ignore. + $type = array_shift($parts); + if (!isset($out[$type])) { + $out[$type] = array_shift($parts); + } + // We take the first ext from the line if many are present. + } + fclose($file); + } + return $out; + } + + /** + * function: systemMimetypeExtensions + * description: populates an internal array of mimetype/extension associations + * from the system mime.types file, or a local mime.types if one is found (see + * __constuctor). + * return: array of extension => mimetype + */ + protected function systemExtensionMimetypes() { + $out = array(); + if (file_exists($this->etcMimeTypes)) { + $file = fopen($this->etcMimeTypes, 'r'); + while (($line = fgets($file)) !== FALSE) { + $line = trim(preg_replace('/#.*/', '', $line)); + if (!$line) + continue; + $parts = preg_split('/\s+/', $line); + if (count($parts) == 1) + continue; + // A single part means a mimetype without extensions, which we ignore. + $type = array_shift($parts); + foreach ($parts as $part) + $out[$part] = $type; + } + fclose($file); + } + return $out; + } + +} + From 6a65cdfe06e857e4489f70725714b4560ec008b8 Mon Sep 17 00:00:00 2001 From: jonathangreen Date: Wed, 23 May 2012 15:02:54 -0300 Subject: [PATCH 4/6] Added some initial ingest function. --- includes/add-menu.inc | 31 ------------------- includes/ingest-menu.inc | 4 +-- islandora.module | 17 ++++++++++ .../islandora_basic_collection.module | 21 +++++++++++++ 4 files changed, 40 insertions(+), 33 deletions(-) delete mode 100644 includes/add-menu.inc diff --git a/includes/add-menu.inc b/includes/add-menu.inc deleted file mode 100644 index 6bc0fd75..00000000 --- a/includes/add-menu.inc +++ /dev/null @@ -1,31 +0,0 @@ -name = 'fedoraAdmin'; - $user->pass = 'password'; - $connection = new RestConnection($user); - $object = $connection->repository->getObject($pid); - $models = $object->models; - - return drupal_get_form('islandora_add_form', $models, $object); -} - -function islandora_add_form($object) { - $form = array (); - return $form; -} - -function islandora_form_alter(&$form, &$form_state, $form_id) { - if($form_id == 'islandora_add_form') { - $form['islandora_repository_pid'] = array( - '#type' => 'textfield', - '#title' => t('Root Collection PID'), - '#default_value' => variable_get('islandora_repository_pid', 'islandora:root'), - '#description' => t('The PID of the Root Collection Object'), - '#required' => TRUE, - '#weight' => -18 - ); - } -} \ No newline at end of file diff --git a/includes/ingest-menu.inc b/includes/ingest-menu.inc index b2e795a2..a27892b0 100644 --- a/includes/ingest-menu.inc +++ b/includes/ingest-menu.inc @@ -22,7 +22,7 @@ function islandora_ingest_callback($collection_pid) { } elseif ($registry_count == 1) { // One registry implementation, go there - drupal_goto($ingest_registry[0]['url']); + drupal_goto($ingest_registry[0]['url'] . "/$collection_pid"); } else { // Multiple ingest routes registered @@ -37,7 +37,7 @@ function islandora_ingest_registry_render($ingest_registry) { '#markup' => '', ); foreach ($ingest_registry AS $ingest_route) { - $output['#markup'] .= l($ingest_route['name'], $ingest_route['url']) . '
'; + $output['#markup'] .= l($ingest_route['name'], $ingest_route['url']. "/$collection_pid") . '
'; } return $output; } \ No newline at end of file diff --git a/islandora.module b/islandora.module index b2c3773a..8dfffc80 100644 --- a/islandora.module +++ b/islandora.module @@ -172,6 +172,14 @@ function islandora_menu() { 'access arguments' => array(FEDORA_PURGE), ); + $items['islandora/test/%'] = array( + 'title' => 'Purge data stream', + 'page callback' => 'islandora_test_test', + 'page arguments' => array(2), + 'type' => MENU_CALLBACK, + 'access arguments' => array(FEDORA_PURGE), + ); + return $items; } @@ -394,3 +402,12 @@ function islandora_preprocess_islandora_default(&$variables) { $variables['islandora_thumbnail_url'] = $base_url . '/islandora/object/' . $islandora_object->id . '/datastream/TN/view'; } } + + +function islandora_islandora_ingest_registry() { + return array(array('url' => 'islandora/test', 'name' => 'basic collection ingest')); +} + +function islandora_test_test($pid) { + return 'jessus'; +} \ No newline at end of file diff --git a/islandora_basic_collection/islandora_basic_collection.module b/islandora_basic_collection/islandora_basic_collection.module index e09765a8..8214a5d7 100644 --- a/islandora_basic_collection/islandora_basic_collection.module +++ b/islandora_basic_collection/islandora_basic_collection.module @@ -132,3 +132,24 @@ function islandora_basic_collection_get_objects($object){ return $results; } +function islandora_basic_collection_islandora_ingest_get_information($models, $object) { + if(in_array('islandora:collectionCModel', $models) && isset($object['COLLECTION_POLICY'])) { + try { + $return = array(); + $xml = new SimpleXMLElement($object['COLLECTION_POLICY']); + $cms = $xml->getElementsByTagName('content_models')->item(0)->getElementsByTagName('content_model'); + $return['contentsmodels'] = array(); + foreach($cms as $cm) { + $contentmodel = array(); + $contentmodel['name'] = (string) $cm['name']; + $contentmodel['namespace'] = (string) $cm['namespace']; + $contentmodel['pid'] = (string) $cm['pid']; + $return['contentsmodels'] = (string) $contentmodel; + } + $return['relationship'] = trim($xml->getElementsByTagName('relationship')->item(0)->nodeValue); + + return $return; + } + catch (Exception $e) { } + } +} From 0396eea6235c4cc6d784ec4eb9feb2993ae09155 Mon Sep 17 00:00:00 2001 From: jonathangreen Date: Wed, 23 May 2012 15:03:13 -0300 Subject: [PATCH 5/6] Added some more ingest stuff --- includes/islandora.ingest.inc | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 includes/islandora.ingest.inc diff --git a/includes/islandora.ingest.inc b/includes/islandora.ingest.inc new file mode 100644 index 00000000..2d61e41e --- /dev/null +++ b/includes/islandora.ingest.inc @@ -0,0 +1,27 @@ +models; + $collection_info = module_invoke_all('islandora_ingest_get_information', $models, $collection_object); + + return $collection_info; +} + +function islandora_ingest_get_object($content_models, $collection_pid, $relationship, $namespace) { + module_load_include('inc', 'islandora', 'RestConnection'); + global $user; + $connection = new RestConnection($user); + $object = $connection->repository->constructObject($namespace); + foreach($content_models as $contentmodel) { + $object->relationships->add(FEDORA_MODEL_URI, 'hasModel', $content_model); + } + $object->relationships->add($relationship['uri'], $relationship['value'], $collection_pid); + module_invoke_all('islandora_ingest_pre_ingest', $object, $content_models, $collection_pid); + return $object; +} + +function islandora_ingest_add_object(&$object) { + $object->repository->ingestObject($object); + module_invoke_all('islandora_ingest_post_ingest', $object); + return $object; +} \ No newline at end of file From 2448c11326b3125959226c85115e5e16d80a8603 Mon Sep 17 00:00:00 2001 From: jonathangreen Date: Wed, 23 May 2012 15:21:16 -0300 Subject: [PATCH 6/6] test --- islandora.module | 8 -------- 1 file changed, 8 deletions(-) diff --git a/islandora.module b/islandora.module index 4ceaef27..6f939550 100644 --- a/islandora.module +++ b/islandora.module @@ -175,14 +175,6 @@ function islandora_menu() { 'access arguments' => array(FEDORA_PURGE), ); - $items['islandora/test/%'] = array( - 'title' => 'Purge data stream', - 'page callback' => 'islandora_test_test', - 'page arguments' => array(2), - 'type' => MENU_CALLBACK, - 'access arguments' => array(FEDORA_PURGE), - ); - return $items; }