257 lines
7.1 KiB
PHP
257 lines
7.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/oai/ojs/JournalOAI.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2003-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class JournalOAI
|
|
*
|
|
* @ingroup oai
|
|
*
|
|
* @see OAIDAO
|
|
*
|
|
* @brief OJS-specific OAI interface.
|
|
* Designed to support both a site-wide and journal-specific OAI interface
|
|
* (based on where the request is directed).
|
|
*/
|
|
|
|
namespace APP\oai\ojs;
|
|
|
|
use APP\core\Application;
|
|
use APP\journal\Journal;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\oai\OAI;
|
|
use PKP\oai\OAIRepository;
|
|
use PKP\oai\OAIResumptionToken;
|
|
use PKP\plugins\Hook;
|
|
use PKP\site\Site;
|
|
use PKP\site\VersionDAO;
|
|
|
|
class JournalOAI extends OAI
|
|
{
|
|
/** @var Site associated site object */
|
|
public $site;
|
|
|
|
/** @var Journal associated journal object */
|
|
public $journal;
|
|
|
|
/** @var int|null Journal ID; null if no journal */
|
|
public $journalId;
|
|
|
|
/** @var OAIDAO DAO for retrieving OAI records/tokens from database */
|
|
public $dao;
|
|
|
|
|
|
/**
|
|
* @copydoc OAI::OAI()
|
|
*/
|
|
public function __construct($config)
|
|
{
|
|
parent::__construct($config);
|
|
|
|
$request = Application::get()->getRequest();
|
|
$this->site = $request->getSite();
|
|
$this->journal = $request->getJournal();
|
|
$this->journalId = isset($this->journal) ? $this->journal->getId() : null;
|
|
/** @var OAIDAO */
|
|
$this->dao = DAORegistry::getDAO('OAIDAO');
|
|
$this->dao->setOAI($this);
|
|
}
|
|
|
|
/**
|
|
* Convert article ID to OAI identifier.
|
|
*
|
|
* @param int $articleId
|
|
*
|
|
* @return string
|
|
*/
|
|
public function articleIdToIdentifier($articleId)
|
|
{
|
|
return 'oai:' . $this->config->repositoryId . ':' . 'article/' . $articleId;
|
|
}
|
|
|
|
/**
|
|
* Convert OAI identifier to article ID.
|
|
*
|
|
* @param string $identifier
|
|
*
|
|
* @return int|false
|
|
*/
|
|
public function identifierToArticleId($identifier)
|
|
{
|
|
$prefix = 'oai:' . $this->config->repositoryId . ':' . 'article/';
|
|
if (strstr($identifier, $prefix)) {
|
|
return (int) str_replace($prefix, '', $identifier);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the journal ID and section ID corresponding to a set specifier.
|
|
*
|
|
* @param null|mixed $journalId
|
|
*
|
|
* @return array
|
|
*/
|
|
public function setSpecToSectionId($setSpec, $journalId = null)
|
|
{
|
|
$tmpArray = preg_split('/:/', $setSpec);
|
|
if (count($tmpArray) == 1) {
|
|
[$journalSpec] = $tmpArray;
|
|
$sectionSpec = null;
|
|
} elseif (count($tmpArray) == 2) {
|
|
[$journalSpec, $sectionSpec] = $tmpArray;
|
|
} else {
|
|
return [0, 0];
|
|
}
|
|
return $this->dao->getSetJournalSectionId($journalSpec, $sectionSpec, $this->journalId);
|
|
}
|
|
|
|
|
|
//
|
|
// OAI interface functions
|
|
//
|
|
|
|
/**
|
|
* @copydoc OAI::repositoryInfo()
|
|
*/
|
|
public function repositoryInfo()
|
|
{
|
|
$info = new OAIRepository();
|
|
|
|
if (isset($this->journal)) {
|
|
$info->repositoryName = $this->journal->getLocalizedName();
|
|
$info->adminEmail = $this->journal->getData('contactEmail');
|
|
} else {
|
|
$info->repositoryName = $this->site->getLocalizedTitle();
|
|
$info->adminEmail = $this->site->getLocalizedContactEmail();
|
|
}
|
|
|
|
$info->sampleIdentifier = $this->articleIdToIdentifier(1);
|
|
$info->earliestDatestamp = $this->dao->getEarliestDatestamp([$this->journalId]);
|
|
|
|
$info->toolkitTitle = 'Open Journal Systems';
|
|
$versionDao = DAORegistry::getDAO('VersionDAO'); /** @var VersionDAO $versionDao */
|
|
$currentVersion = $versionDao->getCurrentVersion();
|
|
$info->toolkitVersion = $currentVersion->getVersionString();
|
|
$info->toolkitURL = 'https://pkp.sfu.ca/ojs/';
|
|
|
|
return $info;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::validIdentifier()
|
|
*/
|
|
public function validIdentifier($identifier)
|
|
{
|
|
return $this->identifierToArticleId($identifier) !== false;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::identifierExists()
|
|
*/
|
|
public function identifierExists($identifier)
|
|
{
|
|
$recordExists = false;
|
|
$articleId = $this->identifierToArticleId($identifier);
|
|
if ($articleId) {
|
|
$recordExists = $this->dao->recordExists($articleId, [$this->journalId]);
|
|
}
|
|
return $recordExists;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::record()
|
|
*/
|
|
public function record($identifier)
|
|
{
|
|
$articleId = $this->identifierToArticleId($identifier);
|
|
if ($articleId) {
|
|
$record = $this->dao->getRecord($articleId, [$this->journalId]);
|
|
}
|
|
if (!isset($record)) {
|
|
$record = false;
|
|
}
|
|
return $record;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::records()
|
|
*/
|
|
public function records($metadataPrefix, $from, $until, $set, $offset, $limit, &$total)
|
|
{
|
|
$records = null;
|
|
if (!Hook::call('JournalOAI::records', [$this, $from, $until, $set, $offset, $limit, &$total, &$records])) {
|
|
$sectionId = null;
|
|
if (isset($set)) {
|
|
[$journalId, $sectionId] = $this->setSpecToSectionId($set);
|
|
} else {
|
|
$journalId = $this->journalId;
|
|
}
|
|
$records = $this->dao->getRecords([$journalId, $sectionId], $from, $until, $set, $offset, $limit, $total);
|
|
}
|
|
return $records;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::identifiers()
|
|
*/
|
|
public function identifiers($metadataPrefix, $from, $until, $set, $offset, $limit, &$total)
|
|
{
|
|
$records = null;
|
|
if (!Hook::call('JournalOAI::identifiers', [$this, $from, $until, $set, $offset, $limit, &$total, &$records])) {
|
|
$sectionId = null;
|
|
if (isset($set)) {
|
|
[$journalId, $sectionId] = $this->setSpecToSectionId($set);
|
|
} else {
|
|
$journalId = $this->journalId;
|
|
}
|
|
$records = $this->dao->getIdentifiers([$journalId, $sectionId], $from, $until, $set, $offset, $limit, $total);
|
|
}
|
|
return $records;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::sets()
|
|
*/
|
|
public function sets($offset, $limit, &$total)
|
|
{
|
|
$sets = null;
|
|
if (!Hook::call('JournalOAI::sets', [$this, $offset, $limit, &$total, &$sets])) {
|
|
$sets = $this->dao->getJournalSets($this->journalId, $offset, $limit, $total);
|
|
}
|
|
return $sets;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::resumptionToken()
|
|
*/
|
|
public function resumptionToken($tokenId)
|
|
{
|
|
$this->dao->clearTokens();
|
|
$token = $this->dao->getToken($tokenId);
|
|
if (!isset($token)) {
|
|
$token = false;
|
|
}
|
|
return $token;
|
|
}
|
|
|
|
/**
|
|
* @copydoc OAI::saveResumptionToken()
|
|
*/
|
|
public function saveResumptionToken($offset, $params)
|
|
{
|
|
$token = new OAIResumptionToken(null, $offset, $params, time() + $this->config->tokenLifetime);
|
|
$this->dao->insertToken($token);
|
|
return $token;
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\APP\oai\ojs\JournalOAI', '\JournalOAI');
|
|
}
|