/** * @see MetadataDataObjectAdapter::injectMetadataIntoDataObject() * @param $metadataDescription MetadataDescription * @param $targetDataObject Submission */ function &injectMetadataIntoDataObject(&$metadataDescription, &$targetDataObject) { assert(is_a($targetDataObject, 'Submission')); assert($metadataDescription->getMetadataSchemaName() == 'plugins.metadata.mods34.schema.Mods34Schema'); // Get the cataloging language. $catalogingLanguage = $metadataDescription->getStatement('recordInfo/languageOfCataloging/languageTerm[@authority="iso639-2b"]'); $catalogingLocale = AppLocale::getLocaleFrom3LetterIso($catalogingLanguage); assert(!is_null($catalogingLocale)); // Title $localizedTitles = $metadataDescription->getStatementTranslations('titleInfo/title'); if (is_array($localizedTitles)) { foreach ($localizedTitles as $locale => $title) { $targetDataObject->setTitle($title, $locale); } } // Names: authors and sponsor $foundSponsor = false; $nameDescriptions =& $metadataDescription->getStatement('name'); if (is_array($nameDescriptions)) { foreach ($nameDescriptions as $nameDescription) { /* @var $nameDescription MetadataDescription */ // Check that we find the expected name schema. assert($nameDescription->getMetadataSchemaName() == 'lib.pkp.plugins.metadata.mods34.schema.Mods34NameSchema'); // Retrieve the name type and role. $nameType = $nameDescription->getStatement('[@type]'); $nameRoles = $nameDescription->getStatement('role/roleTerm[@type="code" @authority="marcrelator"]'); // Transport the name into the submission depending // on name type and role. // FIXME: Move this to a dedicated adapter in the Author class. if (is_array($nameRoles)) { switch ($nameType) { // Authors case 'personal': // Only authors go into the submission. if (in_array('aut', $nameRoles)) { // Instantiate a new author object. $authorDao = DAORegistry::getDAO('AuthorDAO'); /* @var $authorDao AuthorDAO */ $author = $authorDao->newDataObject(); // Family Name $author->setLastName($nameDescription->getStatement('namePart[@type="family"]')); // Given Names $givenNames = $nameDescription->getStatement('namePart[@type="given"]'); if (!empty($givenNames)) { $givenNames = explode(' ', $givenNames, 2); if (isset($givenNames[0])) { $author->setFirstName($givenNames[0]); } if (isset($givenNames[1])) { $author->setMiddleName($givenNames[1]); } } // Affiliation // NB: Our MODS mapping currently doesn't support translation for names. // This can be added when required by data providers. We assume the cataloging // language for the record. $affiliation = $nameDescription->getStatement('affiliation'); if (!empty($affiliation)) { $author->setAffiliation($affiliation, $catalogingLocale); } // Terms of address (unmapped field) $termsOfAddress = $nameDescription->getStatement('namePart[@type="termsOfAddress"]'); if ($termsOfAddress) { $author->setData('nlm34:namePart[@type="termsOfAddress"]', $termsOfAddress); } // Date (unmapped field) $date = $nameDescription->getStatement('namePart[@type="date"]'); if ($date) { $author->setData('nlm34:namePart[@type="date"]', $date); } // Add the author to the submission. $authorDao->insertObject($author); unset($author); } break; // Sponsor // NB: Our MODS mapping currently doesn't support translation for names. // This can be added when required by data providers. We assume the cataloging // language for the record. // Sponsor // NB: Our MODS mapping currently doesn't support translation for names. // This can be added when required by data providers. We assume the cataloging // language for the record. case 'corporate': // Only the first sponsor goes into the submission. if (!$foundSponsor && in_array('spn', $nameRoles)) { $foundSponsor = true; $targetDataObject->setSponsor($nameDescription->getStatement('namePart'), $catalogingLocale); } break; } } unset($nameDescription); } } // Creation date $dateSubmitted = $metadataDescription->getStatement('originInfo/dateCreated[@encoding="w3cdtf"]'); if ($dateSubmitted) { $targetDataObject->setDateSubmitted($dateSubmitted); } // Submission language $submissionLanguage = $metadataDescription->getStatement('language/languageTerm[@type="code" @authority="iso639-2b"]'); $submissionLocale = AppLocale::get2LetterFrom3LetterIsoLanguage($submissionLanguage); if ($submissionLocale) { $targetDataObject->setLanguage($submissionLocale); } // Pages (extent) $pages = $metadataDescription->getStatement('physicalDescription/extent'); if ($pages) { $targetDataObject->setPages($pages); } // Abstract $localizedAbstracts = $metadataDescription->getStatementTranslations('abstract'); if (is_array($localizedAbstracts)) { foreach ($localizedAbstracts as $locale => $abstract) { $targetDataObject->setAbstract($abstract, $locale); } } // Discipline, subject class and subject // FIXME: We currently ignore discipline, subject class and subject because we cannot // distinguish them within a list of MODS topic elements. Can we use several subject // statements with different authorities instead? // FIXME: We do not include coverage information at the moment. // Record identifier // NB: We currently don't override the submission id with the record identifier in MODS // to make sure that MODS records can be transported between different installations. // Handle unmapped fields. $this->injectUnmappedDataObjectMetadataFields($metadataDescription, $targetDataObject); return $targetDataObject; }
/** * @covers PKPLocale */ public function testGet2LetterFrom3LetterIsoLanguage() { self::assertEquals('en', AppLocale::get2LetterFrom3LetterIsoLanguage('eng')); self::assertEquals('pt', AppLocale::get2LetterFrom3LetterIsoLanguage('por')); self::assertNull(AppLocale::get2LetterFrom3LetterIsoLanguage('xxx')); }