diff --git a/moodle.php b/moodle.php new file mode 100644 index 0000000..84f801e --- /dev/null +++ b/moodle.php @@ -0,0 +1,147 @@ +fullname;; +$identifyResponse["baseURL"] = $CFG->wwwroot.'/local/oai_pmh/moodle.php'; +$identifyResponse["protocolVersion"] = '2.0'; +$identifyResponse['adminEmail'] = $adminEmail->email; +$identifyResponse["earliestDatestamp"] = '2013-01-01T12:00:00Z'; +$identifyResponse["deletedRecord"] = 'no'; // How your repository handles deletions + // no: The repository does not maintain status about deletions. + // It MUST NOT reveal a deleted status. + // persistent: The repository persistently keeps track about deletions + // with no time limit. It MUST consistently reveal the status + // of a deleted record over time. + // transient: The repository does not guarantee that a list of deletions is + // maintained. It MAY reveal a deleted status for records. +$identifyResponse["granularity"] = 'YYYY-MM-DDThh:mm:ssZ'; + +if (!isset($uri)) { + $uri = 'test.oai_pmh'; +} +$uri = parse_url($CFG->wwwroot); +$oai2 = new OAI2Server($uri['host'], $_GET, $identifyResponse, + array( + 'ListMetadataFormats' => + function($identifier = '') { + return array('oai_dc' => array('metadataPrefix'=>'oai_dc', + 'schema'=>'http://www.openarchives.org/OAI/2.0/oai_dc.xsd', + 'metadataNamespace'=>'http://www.openarchives.org/OAI/2.0/oai_dc/', + 'record_prefix'=>'dc', + 'record_namespace' => 'http://purl.org/dc/elements/1.1/')); + }, + + 'ListSets' => + function($resumptionToken = '') { + return array (array('setSpec' => 'all', 'setName' => 'All files')); + }, + + 'ListRecords' => + function($metadataPrefix, $from = '', $until = '', $set = '', $count = false, $deliveredRecords = 0, $maxItems = 0) { + global $DB; + + if ($metadataPrefix != 'oai_dc') { + throw new OAI2Exception('noRecordsMatch'); + } + + $files = array(); + $fs = get_file_storage(); + $hashes = $DB->get_records_sql("SELECT DISTINCT pathnamehash as hash FROM files"); + foreach ($hashes as $h) { + if ($file = $fs->get_file_by_hash($h->hash)) { + $files[] = $file; + } + } + if ($count) { + return sizeof($files); + } + if (empty($files)) { + throw new OAI2Exception('noRecordsMatch'); + } + $records = array(); + $now = date('Y-m-d-H:s'); + foreach ($files as $f) { + $filename = $f->get_filename(); + if (!empty($filename) && ($filename != ' ') && $filename != '.') { + $records[] = array('identifier' => $f->get_contenthash(), + 'datestamp' => $now, + 'set' => 'all', + 'metadata' => array( + 'container_name' => 'oai_dc:dc', + 'container_attributes' => array( + 'xmlns:oai_dc' => "http://www.openarchives.org/OAI/2.0/oai_dc/", + 'xmlns:dc' => "http://purl.org/dc/elements/1.1/", + 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", + 'xsi:schemaLocation' => + 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd' + ), + 'fields' => array( + 'dc:title' => $f->get_filename(), + 'dc:author' => $f->get_author(), + ) + )); + } + } + return $records; + }, + + 'GetRecord' => + function($identifier, $metadataPrefix) { + global $DB; + + if ($metadataPrefix != 'oai_dc') { + throw new OAI2Exception('noRecordsMatch'); + } + + $fs = get_file_storage(); + $record = $DB->get_record_sql("SELECT id, pathnamehash FROM files WHERE contenthash = '{$identifier}' ORDER BY id LIMIT 1"); + if (!$file = $fs->get_file_by_hash($record->pathnamehash)) { + throw new OAI2Exception('idDoesNotExist'); + } + $now = date('Y-m-d-H:s'); + return array('identifier' => $file->get_contenthash(), + 'datestamp' => $now, + 'set' => 'all', + 'metadata' => array( + 'container_name' => 'oai_dc:dc', + 'container_attributes' => array( + 'xmlns:oai_dc' => "http://www.openarchives.org/OAI/2.0/oai_dc/", + 'xmlns:dc' => "http://purl.org/dc/elements/1.1/", + 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", + 'xsi:schemaLocation' => + 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd' + ), + 'fields' => array( + 'dc:title' => $file->get_filename(), + 'dc:author' => $file->get_author(), + ) + )); + }, + ) +); + +$response = $oai2->response(); +$response->formatOutput = true; +$response->preserveWhiteSpace = false; +header('Content-Type: text/xml'); +echo $response->saveXML(); diff --git a/oai2server.php b/oai2server.php index c1b13a7..830c432 100644 --- a/oai2server.php +++ b/oai2server.php @@ -188,7 +188,7 @@ class OAI2Server { } public function ListIdentifiers() { - return $this->ListRecords(); + $this->ListRecords(); } public function ListRecords() {