<?php
/**
* @file plugins/generic/driver/DRIVERPlugin.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 DRIVERPlugin
*
* @brief DRIVER plugin class
*/
namespace APP\plugins\generic\driver;
use APP\core\Application;
use APP\facades\Repo;
use APP\journal\JournalDAO;
use PKP\db\DAORegistry;
use PKP\plugins\GenericPlugin;
use PKP\plugins\Hook;
use PKP\tombstone\DataObjectTombstoneSettingsDAO;
define('DRIVER_ACCESS_OPEN', 0);
define('DRIVER_ACCESS_CLOSED', 1);
define('DRIVER_ACCESS_EMBARGOED', 2);
define('DRIVER_ACCESS_DELAYED', 3);
define('DRIVER_ACCESS_RESTRICTED', 4);
class DRIVERPlugin extends GenericPlugin
{
/**
* @copydoc Plugin::register()
*
* @param null|mixed $mainContextId
*/
public function register($category, $path, $mainContextId = null)
{
$success = parent::register($category, $path, $mainContextId);
if ($success && $this->getEnabled($mainContextId)) {
$driverDao = new DRIVERDAO();
DAORegistry::registerDAO('DRIVERDAO', $driverDao);
// Add DRIVER set to OAI results
Hook::add('OAIDAO::getJournalSets', [$this, 'sets']);
Hook::add('JournalOAI::records', [$this, 'recordsOrIdentifiers']);
Hook::add('JournalOAI::identifiers', [$this, 'recordsOrIdentifiers']);
Hook::add('OAIDAO::_returnRecordFromRow', [$this, 'addSet']);
Hook::add('OAIDAO::_returnIdentifierFromRow', [$this, 'addSet']);
// consider DRIVER article in article tombstones
Hook::add('ArticleTombstoneManager::insertArticleTombstone', [$this, 'insertDRIVERArticleTombstone']);
}
return $success;
}
public function getDisplayName()
{
return __('plugins.generic.driver.displayName');
}
public function getDescription()
{
return __('plugins.generic.driver.description');
}
/*
* OAI interface
*/
/**
* Add DRIVER set
*/
public function sets($hookName, $params)
{
$sets = & $params[5];
array_push($sets, new \PKP\oai\OAISet('driver', 'Open Access DRIVERset', ''));
return false;
}
/**
* Get DRIVER records or identifiers
*/
public function recordsOrIdentifiers($hookName, $params)
{
$journalOAI = & $params[0];
$from = $params[1];
$until = $params[2];
$set = $params[3];
$offset = $params[4];
$limit = $params[5];
$total = & $params[6];
$records = & $params[7];
$records = [];
if (isset($set) && $set == 'driver') {
$driverDao = DAORegistry::getDAO('DRIVERDAO'); /** @var DRIVERDAO $driverDao */
$driverDao->setOAI($journalOAI);
if ($hookName == 'JournalOAI::records') {
$funcName = '_returnRecordFromRow';
} elseif ($hookName == 'JournalOAI::identifiers') {
$funcName = '_returnIdentifierFromRow';
}
$journalId = $journalOAI->journalId;
$records = $driverDao->getDRIVERRecordsOrIdentifiers([$journalId, null], $from, $until, $offset, $limit, $total, $funcName);
return true;
}
return false;
}
/**
* Change OAI record or identifier to consider the DRIVER set
*/
public function addSet($hookName, $params)
{
$record = & $params[0];
$row = $params[1];
if ($this->isDRIVERRecord($row)) {
$record->sets[] = 'driver';
}
return false;
}
/**
* Consider the DRIVER article in the article tombstone
*/
public function insertDRIVERArticleTombstone($hookName, $params)
{
$articleTombstone = & $params[0];
if ($this->isDRIVERArticle($articleTombstone->getOAISetObjectId(Application::ASSOC_TYPE_JOURNAL), $articleTombstone->getDataObjectId())) {
$dataObjectTombstoneSettingsDao = DAORegistry::getDAO('DataObjectTombstoneSettingsDAO'); /** @var DataObjectTombstoneSettingsDAO $dataObjectTombstoneSettingsDao */
$dataObjectTombstoneSettingsDao->updateSetting($articleTombstone->getId(), 'driver', true, 'bool');
}
return false;
}
/**
* Check if it's a DRIVER record.
*
* @param array $row Database fields
*
* @return bool
*/
public function isDRIVERRecord($row)
{
// if the article is alive
if (!isset($row['tombstone_id'])) {
$journalDao = DAORegistry::getDAO('JournalDAO'); /** @var JournalDAO $journalDao */
$journal = $journalDao->getById($row['journal_id']);
$submission = Repo::submission()->get($row['submission_id']);
$publication = $submission->getCurrentPublication();
$issue = Repo::issue()->get($publication->getData('issueId'));
// is open access
$status = '';
if ($journal->getData('publishingMode') == \APP\journal\Journal::PUBLISHING_MODE_OPEN) {
$status = DRIVER_ACCESS_OPEN;
} elseif ($journal->getData('publishingMode') == \APP\journal\Journal::PUBLISHING_MODE_SUBSCRIPTION) {
if ($issue->getAccessStatus() == 0 || $issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_OPEN) {
$status = DRIVER_ACCESS_OPEN;
} elseif ($issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION) {
if ($publication->getData('accessStatus') == \APP\submission\Submission::ARTICLE_ACCESS_OPEN) {
$status = DRIVER_ACCESS_OPEN;
} elseif ($issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION && $issue->getOpenAccessDate() != null) {
$status = DRIVER_ACCESS_EMBARGOED;
} elseif ($issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION && $issue->getOpenAccessDate() == null) {
$status = DRIVER_ACCESS_CLOSED;
}
}
}
if ($journal->getData('restrictSiteAccess') == 1 || $journal->getData('restrictArticleAccess') == 1) {
$status = DRIVER_ACCESS_RESTRICTED;
}
if ($status == DRIVER_ACCESS_EMBARGOED && date('Y-m-d') >= date('Y-m-d', strtotime($issue->getOpenAccessDate()))) {
$status = DRIVER_ACCESS_DELAYED;
}
// is there a full text
$galleys = $submission->getGalleys();
if (!empty($galleys)) {
return $status == DRIVER_ACCESS_OPEN;
}
return false;
} else {
$dataObjectTombstoneSettingsDao = DAORegistry::getDAO('DataObjectTombstoneSettingsDAO'); /** @var DataObjectTombstoneSettingsDAO $dataObjectTombstoneSettingsDao */
return $dataObjectTombstoneSettingsDao->getSetting($row['tombstone_id'], 'driver');
}
}
/**
* Check if it's a DRIVER article.
*
* @return bool
*/
public function isDRIVERArticle($journalId, $articleId)
{
$journalDao = DAORegistry::getDAO('JournalDAO'); /** @var JournalDAO $journalDao */
$journal = $journalDao->getById($journalId);
$submission = Repo::submission()->get($articleId);
$publication = $submission->getCurrentPublication();
$issue = Repo::issue()->get($publication->getData('issueId'));
// is open access
$status = '';
if ($journal->getData('publishingMode') == \APP\journal\Journal::PUBLISHING_MODE_OPEN) {
$status = DRIVER_ACCESS_OPEN;
} elseif ($journal->getData('publishingMode') == \APP\journal\Journal::PUBLISHING_MODE_SUBSCRIPTION) {
if ($issue->getAccessStatus() == 0 || $issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_OPEN) {
$status = DRIVER_ACCESS_OPEN;
} elseif ($issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION) {
if ($publication->getData('accessStatus') == \APP\submission\Submission::ARTICLE_ACCESS_OPEN) {
$status = DRIVER_ACCESS_OPEN;
} elseif ($issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION && $issue->getOpenAccessDate() != null) {
$status = DRIVER_ACCESS_EMBARGOED;
} elseif ($issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION && $issue->getOpenAccessDate() == null) {
$status = DRIVER_ACCESS_CLOSED;
}
}
}
if ($journal->getData('restrictSiteAccess') == 1 || $journal->getData('restrictArticleAccess') == 1) {
$status = DRIVER_ACCESS_RESTRICTED;
}
if ($status == DRIVER_ACCESS_EMBARGOED && date('Y-m-d') >= date('Y-m-d', strtotime($issue->getOpenAccessDate()))) {
$status = DRIVER_ACCESS_DELAYED;
}
// is there a full text
$galleys = $submission->getGalleys();
if (!empty($galleys)) {
return $status == DRIVER_ACCESS_OPEN;
}
return false;
}
}
if (!PKP_STRICT_MODE) {
class_alias('\APP\plugins\generic\driver\DRIVERPlugin', '\DRIVERPlugin');
}
|