Skip to content
Snippets Groups Projects
Commit 372ca62f authored by Daniel Berthereau's avatar Daniel Berthereau
Browse files

Added an option to set the format of data for mets.

parent df0545a6
No related branches found
No related tags found
No related merge requests found
...@@ -300,18 +300,37 @@ SQL; ...@@ -300,18 +300,37 @@ SQL;
return; return;
} }
$resource = $event->getParam('resource');
// Manage exception for mets and dcterms.
$prefix = $event->getParam('prefix'); $prefix = $event->getParam('prefix');
if ($prefix === 'oai_dcterms') { if ($prefix === 'oai_dcterms') {
return; 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'; $map = include __DIR__ . '/data/mappings/dc_generic.php';
$term = $event->getParam('term'); $term = $event->getParam('term');
if (empty($map[$term])) { if (empty($map[$term])) {
return; return;
} }
$resource = $event->getParam('resource');
$values = $event->getParam('values'); $values = $event->getParam('values');
$single = !is_array($values); $single = !is_array($values);
......
...@@ -111,6 +111,8 @@ return [ ...@@ -111,6 +111,8 @@ return [
'oaipmhrepository_append_identifier_site' => 'absolute_site_url', 'oaipmhrepository_append_identifier_site' => 'absolute_site_url',
'oaipmhrepository_oai_set_format' => 'basic', 'oaipmhrepository_oai_set_format' => 'basic',
'oaipmhrepository_generic_dcterms' => true, 'oaipmhrepository_generic_dcterms' => true,
'oaipmhrepository_mets_data_item' => 'dcterms',
'oaipmhrepository_mets_data_media' => 'dcterms',
'oaipmhrepository_human_interface' => true, 'oaipmhrepository_human_interface' => true,
'oaipmhrepository_redirect_route' => '', 'oaipmhrepository_redirect_route' => '',
'oaipmhrepository_list_limit' => 50, 'oaipmhrepository_list_limit' => 50,
......
...@@ -175,6 +175,36 @@ class ConfigForm extends Form implements TranslatorAwareInterface ...@@ -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([ $this->add([
'name' => 'oaipmhrepository_human_interface', 'name' => 'oaipmhrepository_human_interface',
'type' => Element\Checkbox::class, 'type' => Element\Checkbox::class,
......
...@@ -30,6 +30,9 @@ class Mets extends AbstractMetadata ...@@ -30,6 +30,9 @@ class Mets extends AbstractMetadata
/** XML namespace for unqualified Dublin Core */ /** XML namespace for unqualified Dublin Core */
const DC_NAMESPACE_URI = 'http://purl.org/dc/elements/1.1/'; 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. * Appends METS metadata.
* *
...@@ -53,43 +56,27 @@ class Mets extends AbstractMetadata ...@@ -53,43 +56,27 @@ class Mets extends AbstractMetadata
$metadataSection = $this->appendNewElement($mets, 'dmdSec'); $metadataSection = $this->appendNewElement($mets, 'dmdSec');
$itemDmdId = 'dmd-' . $item->id(); $itemDmdId = 'dmd-' . $item->id();
$metadataSection->setAttribute('ID', $itemDmdId); $metadataSection->setAttribute('ID', $itemDmdId);
$dcWrap = $this->appendNewElement($metadataSection, 'mdWrap'); $dataWrap = $this->appendNewElement($metadataSection, 'mdWrap');
$dcWrap->setAttribute('MDTYPE', 'DC');
$dcXml = $this->appendNewElement($dcWrap, 'xmlData');
$dcXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI);
$localNames = [ $itemDataFormat = $this->settings->get('oaipmhrepository_mets_data_item');
'title', switch ($itemDataFormat) {
'creator', case 'dc':
'subject', default:
'description', $this->mdtypeDc($dataWrap, $item);
'publisher', break;
'contributor', case 'dcterms':
'date', $this->mdtypeDcterms($dataWrap, $item);
'type', break;
'format', // case 'mods':
'identifier', // break;
'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);
}
} }
$fileIds = []; $fileIds = [];
if ($this->settings->get('oaipmhrepository_expose_media', false)) { if ($this->settings->get('oaipmhrepository_expose_media', false)) {
$mediaList = $item->media(); $mediaList = $item->media();
if (count($mediaList)) { if (count($mediaList)) {
$mediaDataFormat = $this->settings->get('oaipmhrepository_mets_data_media');
$fileSection = $this->appendNewElement($mets, 'fileSec'); $fileSection = $this->appendNewElement($mets, 'fileSec');
$fileGroup = $this->appendNewElement($fileSection, 'fileGrp'); $fileGroup = $this->appendNewElement($fileSection, 'fileGrp');
$fileGroup->setAttribute('USE', 'ORIGINAL'); $fileGroup->setAttribute('USE', 'ORIGINAL');
...@@ -97,6 +84,7 @@ class Mets extends AbstractMetadata ...@@ -97,6 +84,7 @@ class Mets extends AbstractMetadata
foreach ($mediaList as $media) { foreach ($mediaList as $media) {
$fileDmdId = 'dmd-file-' . $media->id(); $fileDmdId = 'dmd-file-' . $media->id();
$fileId = 'file-' . $media->id(); $fileId = 'file-' . $media->id();
$fileIds[] = $fileId;
$fileElement = $this->appendNewElement($fileGroup, 'file'); $fileElement = $this->appendNewElement($fileGroup, 'file');
$fileElement->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI); $fileElement->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI);
...@@ -116,21 +104,17 @@ class Mets extends AbstractMetadata ...@@ -116,21 +104,17 @@ class Mets extends AbstractMetadata
$fileContentMetadata = $this->appendNewElement($mets, 'dmdSec'); $fileContentMetadata = $this->appendNewElement($mets, 'dmdSec');
$fileContentMetadata->setAttribute('ID', $fileDmdId); $fileContentMetadata->setAttribute('ID', $fileDmdId);
$fileDcWrap = $this->appendNewElement($fileContentMetadata, 'mdWrap'); $fileDataWrap = $this->appendNewElement($fileContentMetadata, 'mdWrap');
$fileDcWrap->setAttribute('MDTYPE', 'DC'); switch ($mediaDataFormat) {
case 'dc':
$fileDcXml = $this->appendNewElement($fileDcWrap, 'xmlData'); default:
$fileDcXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI); $this->mdtypeDc($fileDataWrap, $media);
break;
$fileIds[] = $fileId; case 'dcterms':
$this->mdtypeDcterms($fileDataWrap, $media);
foreach ($localNames as $localName) { break;
$term = 'dcterms:' . $localName; // case 'mods':
$values = $media->value($term, ['all' => true, 'default' => []]); // break;
$values = $this->filterValues($media, $term, $values);
foreach ($values as $value) {
$this->appendNewElement($fileDcXml, 'dc:' . $localName, (string) $value);
}
} }
} }
} }
...@@ -159,4 +143,116 @@ class Mets extends AbstractMetadata ...@@ -159,4 +143,116 @@ class Mets extends AbstractMetadata
{ {
return self::METADATA_NAMESPACE; 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);
}
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment