diff --git a/Module.php b/Module.php index 48f58179fefbe39689715d9fe29246b1e09e0c00..be8d4a9ce948c07eec2a902abf61b66488b39fd5 100644 --- a/Module.php +++ b/Module.php @@ -300,18 +300,37 @@ SQL; return; } + $resource = $event->getParam('resource'); + + // Manage exception for mets and dcterms. $prefix = $event->getParam('prefix'); if ($prefix === 'oai_dcterms') { return; } + if ($prefix === 'mets') { + $services = $this->getServiceLocator(); + $settings = $services->get('Omeka\Settings'); + switch (get_class($resource)) { + case \Omeka\Api\Representation\ItemRepresentation::class: + default: + $dataFormat = $settings->get('oaipmhrepository_mets_data_item'); + break; + case \Omeka\Api\Representation\MediaRepresentation::class: + $dataFormat = $settings->get('oaipmhrepository_mets_data_media'); + break; + } + if ($dataFormat === 'dcterms') { + return; + } + } + $map = include __DIR__ . '/data/mappings/dc_generic.php'; $term = $event->getParam('term'); if (empty($map[$term])) { return; } - $resource = $event->getParam('resource'); $values = $event->getParam('values'); $single = !is_array($values); diff --git a/config/module.config.php b/config/module.config.php index 761df10999a5ae4520fbadb3ff3edaac2b705424..ca47db9cb4ee8e27f2d06ac0a51426a351ea6cb5 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -111,6 +111,8 @@ return [ 'oaipmhrepository_append_identifier_site' => 'absolute_site_url', 'oaipmhrepository_oai_set_format' => 'basic', 'oaipmhrepository_generic_dcterms' => true, + 'oaipmhrepository_mets_data_item' => 'dcterms', + 'oaipmhrepository_mets_data_media' => 'dcterms', 'oaipmhrepository_human_interface' => true, 'oaipmhrepository_redirect_route' => '', 'oaipmhrepository_list_limit' => 50, diff --git a/src/Form/ConfigForm.php b/src/Form/ConfigForm.php index 5a6bb314cf387bb7348e0a13e14cb0b2e71d0a60..6340c984f81f138f6e330aa42a4ed7722b956e5b 100644 --- a/src/Form/ConfigForm.php +++ b/src/Form/ConfigForm.php @@ -175,6 +175,36 @@ class ConfigForm extends Form implements TranslatorAwareInterface ], ]); + $this->add([ + 'name' => 'oaipmhrepository_mets_data_item', + 'type' => Element\Select::class, + 'options' => [ + 'label' => 'Mets: data format for item', // @translate + 'info' => 'The format of the metadata of item.', // @translate + 'value_options' => [ + 'dc' => 'Dublin Core', + 'dcterms' => 'Dublin Core terms', + // TODO Use mods inside mets. + // 'mods' => 'Mods', + ], + ], + ]); + + $this->add([ + 'name' => 'oaipmhrepository_mets_data_media', + 'type' => Element\Select::class, + 'options' => [ + 'label' => 'Mets: data format for media', // @translate + 'info' => 'The format of the metadata of media.', // @translate + 'value_options' => [ + 'dc' => 'Dublin Core', + 'dcterms' => 'Dublin Core terms', + // TODO Use mods inside mets. + // 'mods' => 'Mods', + ], + ], + ]); + $this->add([ 'name' => 'oaipmhrepository_human_interface', 'type' => Element\Checkbox::class, diff --git a/src/OaiPmh/Metadata/Mets.php b/src/OaiPmh/Metadata/Mets.php index a11e238d5e88e7fc9404e0a6a57c6c9c843b79e0..85aa14b9567e15e2c34a728059b5737881f5b1e4 100755 --- a/src/OaiPmh/Metadata/Mets.php +++ b/src/OaiPmh/Metadata/Mets.php @@ -30,6 +30,9 @@ class Mets extends AbstractMetadata /** XML namespace for unqualified Dublin Core */ const DC_NAMESPACE_URI = 'http://purl.org/dc/elements/1.1/'; + /** XML namespace for Dublin Core */ + const DCTERMS_NAMESPACE_URI = 'http://purl.org/dc/terms/'; + /** * Appends METS metadata. * @@ -53,43 +56,27 @@ class Mets extends AbstractMetadata $metadataSection = $this->appendNewElement($mets, 'dmdSec'); $itemDmdId = 'dmd-' . $item->id(); $metadataSection->setAttribute('ID', $itemDmdId); - $dcWrap = $this->appendNewElement($metadataSection, 'mdWrap'); - $dcWrap->setAttribute('MDTYPE', 'DC'); - - $dcXml = $this->appendNewElement($dcWrap, 'xmlData'); - $dcXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI); + $dataWrap = $this->appendNewElement($metadataSection, 'mdWrap'); - $localNames = [ - 'title', - 'creator', - 'subject', - 'description', - 'publisher', - 'contributor', - 'date', - 'type', - 'format', - 'identifier', - 'source', - 'language', - 'relation', - 'coverage', - 'rights', - ]; - - foreach ($localNames as $localName) { - $term = 'dcterms:' . $localName; - $values = $item->value($term, ['all' => true, 'default' => []]); - $values = $this->filterValues($item, $term, $values); - foreach ($values as $value) { - $this->appendNewElement($dcXml, 'dc:' . $localName, (string) $value); - } + $itemDataFormat = $this->settings->get('oaipmhrepository_mets_data_item'); + switch ($itemDataFormat) { + case 'dc': + default: + $this->mdtypeDc($dataWrap, $item); + break; + case 'dcterms': + $this->mdtypeDcterms($dataWrap, $item); + break; + // case 'mods': + // break; } $fileIds = []; if ($this->settings->get('oaipmhrepository_expose_media', false)) { $mediaList = $item->media(); if (count($mediaList)) { + $mediaDataFormat = $this->settings->get('oaipmhrepository_mets_data_media'); + $fileSection = $this->appendNewElement($mets, 'fileSec'); $fileGroup = $this->appendNewElement($fileSection, 'fileGrp'); $fileGroup->setAttribute('USE', 'ORIGINAL'); @@ -97,6 +84,7 @@ class Mets extends AbstractMetadata foreach ($mediaList as $media) { $fileDmdId = 'dmd-file-' . $media->id(); $fileId = 'file-' . $media->id(); + $fileIds[] = $fileId; $fileElement = $this->appendNewElement($fileGroup, 'file'); $fileElement->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI); @@ -116,21 +104,17 @@ class Mets extends AbstractMetadata $fileContentMetadata = $this->appendNewElement($mets, 'dmdSec'); $fileContentMetadata->setAttribute('ID', $fileDmdId); - $fileDcWrap = $this->appendNewElement($fileContentMetadata, 'mdWrap'); - $fileDcWrap->setAttribute('MDTYPE', 'DC'); - - $fileDcXml = $this->appendNewElement($fileDcWrap, 'xmlData'); - $fileDcXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI); - - $fileIds[] = $fileId; - - foreach ($localNames as $localName) { - $term = 'dcterms:' . $localName; - $values = $media->value($term, ['all' => true, 'default' => []]); - $values = $this->filterValues($media, $term, $values); - foreach ($values as $value) { - $this->appendNewElement($fileDcXml, 'dc:' . $localName, (string) $value); - } + $fileDataWrap = $this->appendNewElement($fileContentMetadata, 'mdWrap'); + switch ($mediaDataFormat) { + case 'dc': + default: + $this->mdtypeDc($fileDataWrap, $media); + break; + case 'dcterms': + $this->mdtypeDcterms($fileDataWrap, $media); + break; + // case 'mods': + // break; } } } @@ -159,4 +143,116 @@ class Mets extends AbstractMetadata { return self::METADATA_NAMESPACE; } + + protected function mdtypeDc($dataWrap, $resource) + { + $dataWrap->setAttribute('MDTYPE', 'DC'); + $dataXml = $this->appendNewElement($dataWrap, 'xmlData'); + $dataXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI); + + $localNames = [ + 'title', + 'creator', + 'subject', + 'description', + 'publisher', + 'contributor', + 'date', + 'type', + 'format', + 'identifier', + 'source', + 'language', + 'relation', + 'coverage', + 'rights', + ]; + + foreach ($localNames as $localName) { + $term = 'dcterms:' . $localName; + $values = $resource->value($term, ['all' => true, 'default' => []]); + $values = $this->filterValues($resource, $term, $values); + foreach ($values as $value) { + $this->appendNewElement($dataXml, 'dc:' . $localName, (string) $value); + } + } + } + + protected function mdtypeDcterms($dataWrap, $resource) + { + $dataWrap->setAttribute('MDTYPE', 'DC'); + $dataWrap->setAttribute('MDTYPEVERSION', 'DCMI Metadata Terms'); + $dataXml = $this->appendNewElement($dataWrap, 'xmlData'); + $dataXml->setAttribute('xmlns:dcterms', self::DCTERMS_NAMESPACE_URI); + + // Each of the 55 Dublin Core terms, in the Omeka order. + $localNames = [ + // Dublin Core Elements. + 'title', + 'creator', + 'subject', + 'description', + 'publisher', + 'contributor', + 'date', + 'type', + 'format', + 'identifier', + 'source', + 'language', + 'relation', + 'coverage', + 'rights', + // Dublin Core terms. + 'audience', + 'alternative', + 'tableOfContents', + 'abstract', + 'created', + 'valid', + 'available', + 'issued', + 'modified', + 'extent', + 'medium', + 'isVersionOf', + 'hasVersion', + 'isReplacedBy', + 'replaces', + 'isRequiredBy', + 'requires', + 'isPartOf', + 'hasPart', + 'isReferencedBy', + 'references', + 'isFormatOf', + 'hasFormat', + 'conformsTo', + 'spatial', + 'temporal', + 'mediator', + 'dateAccepted', + 'dateCopyrighted', + 'dateSubmitted', + 'educationLevel', + 'accessRights', + 'bibliographicCitation', + 'license', + 'rightsHolder', + 'provenance', + 'instructionalMethod', + 'accrualMethod', + 'accrualPeriodicity', + 'accrualPolicy', + ]; + + foreach ($localNames as $localName) { + $term = 'dcterms:' . $localName; + $values = $resource->value($term, ['all' => true, 'default' => []]); + $values = $this->filterValues($resource, $term, $values); + foreach ($values as $value) { + $this->appendNewElement($dataXml, $term, (string) $value); + } + } + } }