From c538904dfb61f064599d5c039a4b6190df2ce3a3 Mon Sep 17 00:00:00 2001
From: Daniel Berthereau <Daniel.github@Berthereau.net>
Date: Mon, 13 Aug 2018 00:00:00 +0200
Subject: [PATCH] Filtered values in the default formats.

---
 README.md                                       |  9 ++++++++-
 src/OaiPmh/Metadata/AbstractMetadata.php        | 17 +++++++----------
 src/OaiPmh/Metadata/CdwaLite.php                |  8 ++++++++
 src/OaiPmh/Metadata/Mets.php                    | 12 ++++++++----
 src/OaiPmh/Metadata/Mods.php                    | 14 ++++++++++++++
 src/OaiPmh/Metadata/OaiDc.php                   |  4 +++-
 src/Service/OaiPmh/Metadata/CdwaLiteFactory.php |  1 +
 src/Service/OaiPmh/Metadata/MetsFactory.php     |  1 +
 src/Service/OaiPmh/Metadata/ModsFactory.php     |  1 +
 src/Service/OaiPmh/Metadata/OaiDcFactory.php    |  1 +
 10 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/README.md b/README.md
index c06fac9..d3021ab 100644
--- a/README.md
+++ b/README.md
@@ -162,13 +162,20 @@ by harvesters or other tools and because the RRCHNM itself removed the [schema]
 from the last site.
 
 **NOTE**: Because of its limited support by harvesters, the format is not
-implemented.
+implemented in Omeka S.
 
 ### Other formats
 
 Other formats can be added or replace an existing one via a key in the config
 `['oaipmhrepository']['metadata_formats']`.
 
+### Customization
+
+The output can be customized via the filter `oaipmhrepository.values`, that is
+triggered for each term. So it is possible to remove, to update or to append
+some values, or to convert some properties from other vocabularies into the
+standard formats.
+
 
 Warning
 -------
diff --git a/src/OaiPmh/Metadata/AbstractMetadata.php b/src/OaiPmh/Metadata/AbstractMetadata.php
index fc1ccd0..d1428c5 100644
--- a/src/OaiPmh/Metadata/AbstractMetadata.php
+++ b/src/OaiPmh/Metadata/AbstractMetadata.php
@@ -16,7 +16,6 @@ use Omeka\Api\Representation\AbstractResourceEntityRepresentation;
 use Omeka\Api\Representation\ItemRepresentation;
 use Omeka\Api\Representation\ValueRepresentation;
 use Omeka\Settings\SettingsInterface;
-use Zend\EventManager\Event;
 use Zend\EventManager\EventManagerAwareInterface;
 use Zend\EventManager\EventManagerAwareTrait;
 
@@ -159,18 +158,16 @@ abstract class AbstractMetadata
         $term,
         $values
     ) {
-        /** @var \Zend\EventManager\EventManager $eventManager */
-        $eventManager = $this->getEventManager();
-        /** @var \ArrayObject $args */
-        $args = $eventManager->prepareArgs([]);
-        $args['repository'] = self::class;
-        $args['resource'] = $resource;
+        $args = [];
+        $args['prefix'] = $this->getMetadataPrefix();
         $args['term'] = $term;
+        $args['resource'] = $resource;
         $args['values'] = $values;
 
-        $event = new Event('oaipmhrepository.values', $this, $args);
-        $eventManager->triggerEvent($event);
-
+        /** @var \ArrayObject $args */
+        $eventManager = $this->getEventManager();
+        $args = $eventManager->prepareArgs($args);
+        $eventManager->trigger('oaipmhrepository.values', $this, $args);
         return $args['values'];
     }
 
diff --git a/src/OaiPmh/Metadata/CdwaLite.php b/src/OaiPmh/Metadata/CdwaLite.php
index 8b74c7c..035070a 100644
--- a/src/OaiPmh/Metadata/CdwaLite.php
+++ b/src/OaiPmh/Metadata/CdwaLite.php
@@ -61,6 +61,7 @@ class CdwaLite extends AbstractMetadata
          * Required.  Fill with 'Unknown' if omitted.
          */
         $types = $item->value('dcterms:type', ['all' => true, 'default' => []]);
+        $types = $this->filterValues($item, 'dcterms:type', $types);
         $objectWorkTypeWrap = $this->appendNewElement($descriptive, 'cdwalite:objectWorkTypeWrap');
         if (empty($types)) {
             $types[] = 'Unknown';
@@ -74,6 +75,7 @@ class CdwaLite extends AbstractMetadata
          * Required.  Fill with 'Unknown' if omitted.
          */
         $titles = $item->value('dcterms:title', ['all' => true, 'default' => []]);
+        $titles = $this->filterValues($item, 'dcterms:title', $titles);
         $titleWrap = $this->appendNewElement($descriptive, 'cdwalite:titleWrap');
 
         foreach ($titles as $title) {
@@ -86,6 +88,7 @@ class CdwaLite extends AbstractMetadata
          * Non-repeatable, implode for inclusion of many creators.
          */
         $creators = $item->value('dcterms:creator', ['all' => true, 'default' => []]);
+        $creators = $this->filterValues($item, 'dcterms:creator', $creators);
 
         $creatorTexts = [];
         foreach ($creators as $creator) {
@@ -121,6 +124,7 @@ class CdwaLite extends AbstractMetadata
          * Non-repeatable, include only first date.
          */
         $date = $item->value('dcterms:date');
+        $date = $this->filterValues($item, 'dcterms:date', $date);
         $dateText = $date ? (string) $date : 'Unknown';
         $this->appendNewElement($descriptive, 'cdwalite:displayCreationDate', $dateText);
 
@@ -130,6 +134,7 @@ class CdwaLite extends AbstractMetadata
          */
         $indexingDatesWrap = $this->appendNewElement($descriptive, 'cdwalite:indexingDatesWrap');
         $dates = $item->value('dcterms:date', ['all' => true, 'default' => []]);
+        $dates = $this->filterValues($item, 'dcterms:date', $dates);
         foreach ($dates as $date) {
             $indexingDatesSet = $this->appendNewElement($indexingDatesWrap, 'cdwalite:indexingDatesSet');
             $this->appendNewElement($indexingDatesSet, 'cdwalite:earliestDate', (string) $date);
@@ -147,6 +152,7 @@ class CdwaLite extends AbstractMetadata
          * Not required.
          */
         $subjects = $item->value('dcterms:subject', ['all' => true, 'default' => []]);
+        $subjects = $this->filterValues($item, 'dcterms:subject', $subjects);
         $classWrap = $this->appendNewElement($descriptive, 'cdwalite:classWrap');
         foreach ($subjects as $subject) {
             $this->appendNewElement($classWrap, 'cdwalite:classification', (string) $subject);
@@ -156,6 +162,7 @@ class CdwaLite extends AbstractMetadata
          * Not required.
          */
         $descriptions = $item->value('dcterms:description', ['all' => true, 'default' => []]);
+        $descriptions = $this->filterValues($item, 'dcterms:description', $descriptions);
         if (!empty($descriptions)) {
             $descriptiveNoteWrap = $this->appendNewElement($descriptive, 'cdwalite:descriptiveNoteWrap');
             foreach ($descriptions as $description) {
@@ -175,6 +182,7 @@ class CdwaLite extends AbstractMetadata
          * Not required.
          */
         $rights = $item->value('dcterms:rights', ['all' => true, 'default' => []]);
+        $rights = $this->filterValues($item, 'dcterms:rights', $rights);
         foreach ($rights as $right) {
             $this->appendNewElement($administrative, 'cdwalite:rightsWork', (string) $right);
         }
diff --git a/src/OaiPmh/Metadata/Mets.php b/src/OaiPmh/Metadata/Mets.php
index bb51cf5..8989bff 100755
--- a/src/OaiPmh/Metadata/Mets.php
+++ b/src/OaiPmh/Metadata/Mets.php
@@ -66,7 +66,9 @@ class Mets extends AbstractMetadata
         ];
 
         foreach ($dcElementNames as $elementName) {
-            $values = $item->value("dcterms:$elementName", ['all' => true, 'default' => []]);
+            $term = 'dcterms:' . $elementName;
+            $values = $item->value($term, ['all' => true, 'default' => []]);
+            $values = $this->filterValues($item, $term, $values);
             foreach ($values as $value) {
                 $this->appendNewElement($dcXml, "dc:$elementName", (string) $value);
             }
@@ -111,9 +113,11 @@ class Mets extends AbstractMetadata
                     $fileIds[] = $fileId;
 
                     foreach ($dcElementNames as $elementName) {
-                        $dcElements = $media->value("dcterms:$elementName", ['all' => true, 'default' => []]);
-                        foreach ($dcElements as $value) {
-                            $this->appendNewElement($fileDcXml, "dc:$elementName", (string) $value);
+                        $term = 'dcterms:' . $elementName;
+                        $values = $media->value($term, ['all' => true, 'default' => []]);
+                        $values = $this->filterValues($media, $term, $values);
+                        foreach ($values as $value) {
+                            $this->appendNewElement($fileDcXml, 'dc:' . $elementName, (string) $value);
                         }
                     }
                 }
diff --git a/src/OaiPmh/Metadata/Mods.php b/src/OaiPmh/Metadata/Mods.php
index 46bccae..f89e653 100644
--- a/src/OaiPmh/Metadata/Mods.php
+++ b/src/OaiPmh/Metadata/Mods.php
@@ -49,12 +49,14 @@ class Mods extends AbstractMetadata
             . ' ' . self::METADATA_SCHEMA);
 
         $titles = $item->value('dcterms:title', ['all' => true, 'default' => []]);
+        $titles = $this->filterValues($item, 'dcterms:title', $titles);
         foreach ($titles as $title) {
             $titleInfo = $this->appendNewElement($mods, 'titleInfo');
             $this->appendNewElement($titleInfo, 'title', (string) $title);
         }
 
         $creators = $item->value('dcterms:creator', ['all' => true, 'default' => []]);
+        $creators = $this->filterValues($item, 'dcterms:creator', $creators);
         foreach ($creators as $creator) {
             $name = $this->appendNewElement($mods, 'name');
             $this->appendNewElement($name, 'namePart', (string) $creator);
@@ -64,6 +66,7 @@ class Mods extends AbstractMetadata
         }
 
         $contributors = $item->value('dcterms:contributor', ['all' => true, 'default' => []]);
+        $contributors = $this->filterValues($item, 'dcterms:contributor', $contributors);
         foreach ($contributors as $contributor) {
             $name = $this->appendNewElement($mods, 'name');
             $this->appendNewElement($name, 'namePart', (string) $contributor);
@@ -73,23 +76,27 @@ class Mods extends AbstractMetadata
         }
 
         $subjects = $item->value('dcterms:subject', ['all' => true, 'default' => []]);
+        $subjects = $this->filterValues($item, 'dcterms:subject', $subjects);
         foreach ($subjects as $subject) {
             $subjectTag = $this->appendNewElement($mods, 'subject');
             $this->appendNewElement($subjectTag, 'topic', (string) $subject);
         }
 
         $descriptions = $item->value('dcterms:description', ['all' => true, 'default' => []]);
+        $descriptions = $this->filterValues($item, 'dcterms:description', $descriptions);
         foreach ($descriptions as $description) {
             $this->appendNewElement($mods, 'note', (string) $description);
         }
 
         $formats = $item->value('dcterms:format', ['all' => true, 'default' => []]);
+        $formats = $this->filterValues($item, 'dcterms:format', $formats);
         foreach ($formats as $format) {
             $physicalDescription = $this->appendNewElement($mods, 'physicalDescription');
             $this->appendNewElement($physicalDescription, 'form', (string) $format);
         }
 
         $languages = $item->value('dcterms:language', ['all' => true, 'default' => []]);
+        $languages = $this->filterValues($item, 'dcterms:language', $languages);
         foreach ($languages as $language) {
             $languageElement = $this->appendNewElement($mods, 'language');
             $languageTerm = $this->appendNewElement($languageElement, 'languageTerm', (string) $language);
@@ -97,16 +104,19 @@ class Mods extends AbstractMetadata
         }
 
         $rights = $item->value('dcterms:rights', ['all' => true, 'default' => []]);
+        $rights = $this->filterValues($item, 'dcterms:rights', $rights);
         foreach ($rights as $right) {
             $this->appendNewElement($mods, 'accessCondition', (string) $right);
         }
 
         $types = $item->value('dcterms:type', ['all' => true, 'default' => []]);
+        $types = $this->filterValues($item, 'dcterms:type', $types);
         foreach ($types as $type) {
             $this->appendNewElement($mods, 'genre', (string) $type);
         }
 
         $identifiers = $item->value('dcterms:identifier', ['all' => true, 'default' => []]);
+        $identifiers = $this->filterValues($item, 'dcterms:identifier', $identifiers);
         foreach ($identifiers as $identifier) {
             $text = (string) $identifier;
             $idElement = $this->appendNewElement($mods, 'identifier', $text);
@@ -118,11 +128,13 @@ class Mods extends AbstractMetadata
         }
 
         $sources = $item->value('dcterms:source', ['all' => true, 'default' => []]);
+        $sources = $this->filterValues($item, 'dcterms:source', $sources);
         foreach ($sources as $source) {
             $this->_addRelatedItem($mods, (string) $source, true);
         }
 
         $relations = $item->value('dcterms:relation', ['all' => true, 'default' => []]);
+        $relations = $this->filterValues($item, 'dcterms:relation', $relations);
         foreach ($relations as $relation) {
             $this->_addRelatedItem($mods, (string) $relation);
         }
@@ -146,7 +158,9 @@ class Mods extends AbstractMetadata
         $url->setAttribute('usage', 'primary display');
 
         $publishers = $item->value('dcterms:publisher', ['all' => true, 'default' => []]);
+        $publishers = $this->filterValues($item, 'dcterms:publishers', $publishers);
         $dates = $item->value('dcterms:date', ['all' => true, 'default' => []]);
+        $dates = $this->filterValues($item, 'dcterms:date', $dates);
 
         // Empty originInfo sections are illegal
         if (count($publishers) + count($dates) > 0) {
diff --git a/src/OaiPmh/Metadata/OaiDc.php b/src/OaiPmh/Metadata/OaiDc.php
index 1a82998..6ef1385 100644
--- a/src/OaiPmh/Metadata/OaiDc.php
+++ b/src/OaiPmh/Metadata/OaiDc.php
@@ -63,7 +63,9 @@ class OaiDc extends AbstractMetadata
          * compliant per-node declarations.
          */
         foreach ($dcElementNames as $elementName) {
-            $values = $item->value("dcterms:$elementName", ['all' => true, 'default' => []]);
+            $term = 'dcterms:' . $elementName;
+            $values = $item->value($term, ['all' => true, 'default' => []]);
+            $values = $this->filterValues($item, $term, $values);
             foreach ($values as $value) {
                 $this->appendNewElement($oai_dc, "dc:$elementName", (string) $value);
             }
diff --git a/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php b/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php
index c3e3f77..b5a553e 100644
--- a/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php
+++ b/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php
@@ -19,6 +19,7 @@ class CdwaLiteFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new CdwaLite();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
diff --git a/src/Service/OaiPmh/Metadata/MetsFactory.php b/src/Service/OaiPmh/Metadata/MetsFactory.php
index e041c48..1844aaf 100644
--- a/src/Service/OaiPmh/Metadata/MetsFactory.php
+++ b/src/Service/OaiPmh/Metadata/MetsFactory.php
@@ -19,6 +19,7 @@ class MetsFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new Mets();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
diff --git a/src/Service/OaiPmh/Metadata/ModsFactory.php b/src/Service/OaiPmh/Metadata/ModsFactory.php
index 9797ad6..a9882b5 100644
--- a/src/Service/OaiPmh/Metadata/ModsFactory.php
+++ b/src/Service/OaiPmh/Metadata/ModsFactory.php
@@ -19,6 +19,7 @@ class ModsFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new Mods();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
diff --git a/src/Service/OaiPmh/Metadata/OaiDcFactory.php b/src/Service/OaiPmh/Metadata/OaiDcFactory.php
index 12e9b6f..a0f719f 100644
--- a/src/Service/OaiPmh/Metadata/OaiDcFactory.php
+++ b/src/Service/OaiPmh/Metadata/OaiDcFactory.php
@@ -19,6 +19,7 @@ class OaiDcFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new OaiDc();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
-- 
GitLab