Skip to content

Commit

Permalink
Expose production ready files via JATS
Browse files Browse the repository at this point in the history
  • Loading branch information
asmecher committed Apr 1, 2022
1 parent 0238be3 commit 2b80216
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 7 deletions.
94 changes: 94 additions & 0 deletions JatsTemplateDownloadHandler.inc.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

/**
* @file JatsTemplateDownloadHandler.inc.php
*
* Copyright (c) 2014-2020 Simon Fraser University
* Copyright (c) 2003-2020 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @package plugins.generic.jatsTemplate
* @class JatsTemplateDownloadHandler
*/

import('classes.handler.Handler');

use \Firebase\JWT\JWT;

class JatsTemplateDownloadHandler extends Handler {
/** @var JatsTemplatePlugin The JATS Template plugin */
static $plugin;

/**
* Provide the JATS template plugin to the handler.
* @param $plugin JATSTemplatePlugin
*/
static function setPlugin($plugin) {
self::$plugin = $plugin;
}

/**
* @copydoc PKPHandler::authorize()
*/
function authorize($request, &$args, $roleAssignments) {
// Permit the use of the Authorization header and an API key for access to unpublished/subscription content
if ($header = array_search('Authorization', array_flip(getallheaders()))) {
list($bearer, $jwt) = explode(' ', $header);
if (strcasecmp($bearer, 'Bearer') == 0) {
$apiToken = JWT::decode($jwt, Config::getVar('security', 'api_key_secret', ''), array('HS256'));
$this->setApiToken($apiToken);
}
}

import('lib.pkp.classes.security.authorization.ContextRequiredPolicy');
$this->addPolicy(new ContextRequiredPolicy($request));

import('classes.security.authorization.OjsJournalMustPublishPolicy');
$this->addPolicy(new OjsJournalMustPublishPolicy($request));

return parent::authorize($request, $args, $roleAssignments);
}

protected function _isUserAllowedAccess($request) {
$user = $request->getUser();
$context = $request->getContext();
if (!$user || !$context) return false;
$roleDao = DAORegistry::getDAO('RoleDAO'); /** @var $roleDao RoleDAO */
$roles = $roleDao->getByUserId($user->getId(), $context->getId());
$allowedAccess = false;
foreach ($roles as $role) {
if (in_array($role->getRoleId(), [ROLE_ID_MANAGER, ROLE_ID_SUBSCRIPTION_MANAGER])) return true;
}
return false;
}

/**
* Handle a download request
* @param $args array Arguments array.
* @param $request PKPRequest Request object.
*/
function download($args, $request) {
if (!$this->_isUserAllowedAccess($request)) $request->getDispatcher()->handle404();

// Check the stage (this is only for consistency with other download URLs in the system
// in case the built-in download handler can be used in place of this in the future)
$submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
if ($request->getUserVar('stageId') != WORKFLOW_STAGE_ID_PRODUCTION) $request->getDispatcher()->handle404();

$submissionId = $request->getUserVar('submissionId');
$layoutFiles = $submissionFileDao->getLatestRevisions($submissionId, SUBMISSION_FILE_PRODUCTION_READY);
foreach ($layoutFiles as $layoutFile) {
if ($layoutFile->getFileId() != $request->getUserVar('fileId') || $layoutFile->getRevision() != $request->getUserVar('revision')) continue;

import('lib.pkp.classes.file.SubmissionFileManager');
$fileManager = new SubmissionFileManager($request->getContext()->getId(), $submissionId);
if (!$fileManager->downloadById($layoutFile->getFileId(), $layoutFile->getRevision(), false, $layoutFile->getClientFileName())) {
error_log('FileApiHandler: File ' . $layoutFile->getFilePath() . ' does not exist or is not readable!');
header('HTTP/1.0 500 Internal Server Error');
fatalError('500 Internal Server Error');
} else return;
}
$request->getDispatcher()->handle404();
}
}

55 changes: 48 additions & 7 deletions JatsTemplatePlugin.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public function register($category, $path, $mainContextId = null) {
$this->addLocaleData();

if ($success && $this->getEnabled()) {
HookRegistry::register('OAIMetadataFormat_JATS::findJats', array($this, 'callback'));
HookRegistry::register('OAIMetadataFormat_JATS::findJats', [$this, 'callbackFindJats']);
HookRegistry::register('LoadHandler', [$this, 'callbackHandleContent']);
}
return $success;
}
Expand All @@ -41,11 +42,11 @@ public function getDescription() {
}

/**
* Send submission files to iThenticate.
* Prepare JATS template document
* @param $hookName string
* @param $args array
*/
public function callback($hookName, $args) {
public function callbackFindJats($hookName, $args) {
$plugin =& $args[0];
$record =& $args[1];
$candidateFiles =& $args[2];
Expand Down Expand Up @@ -212,10 +213,28 @@ function toXml(&$record, $format = null) {
$response .= "\t\t\t</kwd-group>\n";
}

$response .=
(isset($pageCount)?"\t\t\t<counts><page-count count=\"" . (int) $pageCount. "\" /></counts>\n":'') .
"\t\t</article-meta>\n" .
"\t</front>\n";
$response .= (isset($pageCount)?"\t\t\t<counts><page-count count=\"" . (int) $pageCount. "\" /></counts>\n":'');

$candidateFound = false;
$layoutResponse = "\t\t\t\t<custom-meta-group>";
$submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
$layoutFiles = $submissionFileDao->getLatestRevisions($article->getId(), SUBMISSION_FILE_PRODUCTION_READY);
foreach ($layoutFiles as $layoutFile) {
$candidateFound = true;
$sourceFileUrl = $request->url(null, 'jatsTemplate', 'download', null,
[
'fileId' => $layoutFile->getFileId(),
'revision' => $layoutFile->getRevision(),
'submissionId' => $layoutFile->getSubmissionId(),
'stageId' => WORKFLOW_STAGE_ID_PRODUCTION,
]
);
$layoutResponse .= "\t\t\t\t\t<custom-meta>\t\t\t\t\t\t<meta-name>production-ready-file-url</meta-name>\n\t\t\t\t\t\t<meta-value><ext-link ext-link-type=\"uri\" xlink:href=\"" . htmlspecialchars($sourceFileUrl) . "\"/></meta-value>\n\t\t\t\t\t</custom-meta>\n";
}
$layoutResponse .= "\t\t\t\t</custom-meta-group>";
if ($candidateFound) $response .= $layoutResponse;

$response .= "\t\t</article-meta>\n\t</front>\n";

// Include body text (for search indexing only)
import('classes.search.ArticleSearchIndex');
Expand Down Expand Up @@ -275,4 +294,26 @@ function toXml(&$record, $format = null) {
$response .= "</article>";
return $response;
}

/**
* Declare the handler function to process the actual page PATH
* @param $hookName string The name of the invoked hook
* @param $args array Hook parameters
* @return boolean Hook handling status
*/
function callbackHandleContent($hookName, $args) {
$request = Application::get()->getRequest();
$templateMgr = TemplateManager::getManager($request);

$page =& $args[0];
$op =& $args[1];

if ($page == 'jatsTemplate' && $op == 'download') {
define('HANDLER_CLASS', 'JatsTemplateDownloadHandler');
$this->import('JatsTemplateDownloadHandler');
JatsTemplateDownloadHandler::setPlugin($this);
return true;
}
return false;
}
}

0 comments on commit 2b80216

Please sign in to comment.