Open Journal Systems  3.3.0
MarkupHandler.inc.php
1 <?php
2 
16 import('classes.handler.Handler');
17 
18 class MarkupHandler extends Handler {
20  protected $_plugin;
21 
25  function __construct() {
26  parent::__construct();
27 
28  // set reference to markup plugin
29  $this->_plugin = PluginRegistry::getPlugin('generic', 'markupplugin');
30 
31  $this->addRoleAssignment(
32  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR),
33  array('convertToXml', 'generateGalleyFiles', 'profile',
34  'triggerConversion', 'fetchConversionJobStatus')
35  );
36 
37  $this->addRoleAssignment(array(ROLE_ID_MANAGER), array('batch'));
38  }
39 
43  function authorize($request, &$args, $roleAssignments) {
44  $op = $request->getRouter()->getRequestedOp($request);
45 
46  if(in_array($op, array('profile','batch'))) {
47  import('lib.pkp.classes.security.authorization.ContextAccessPolicy');
48  $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
49  }
50  else {
51  import('lib.pkp.classes.security.authorization.SubmissionFileAccessPolicy');
52  $this->addPolicy(new SubmissionFileAccessPolicy($request, $args, $roleAssignments, SUBMISSION_FILE_ACCESS_READ));
53  }
54 
55  return parent::authorize($request, $args, $roleAssignments);
56  }
57 
66  public function convertToXml($args, $request) {
67  $params = array (
68  'messageKey' => 'plugins.generic.markup.modal.xmlConversionText',
69  'target' => 'xml-conversion',
70  'stageId' => $request->getUserVar('stageId')
71  );
72  return $this->_conversion($args, $request, $params);
73  }
74 
83  public function generateGalleyFiles($args, $request) {
84  $params = array (
85  'messageKey' => 'plugins.generic.markup.modal.galleyProductionText',
86  'target' => 'galley-generate',
87  'stageId' => WORKFLOW_STAGE_ID_PRODUCTION
88  );
89  return $this->_conversion($args, $request, $params);
90  }
91 
99  protected function _conversion($args, $request, $params) {
100  $context = $request->getContext();
101  $dispatcher = $request->getDispatcher();
102  $authType = $this->_plugin->getSetting($context->getId(), 'authType');
103 
104  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
105  if (!$submissionFile) {
106  return new JSONMessage(false);
107  }
108 
109  $fileId = $submissionFile->getFileId();
110  $stageId = $params['stageId'];
111 
112  $pluginIsConfigured = false;
113  $this->_plugin->import('classes.MarkupConversionHelper');
116  $pluginIsConfigured = true;
117  }
118  else {
119  $pluginIsConfigured = is_null($authType) ? false : true;
120  }
121  $loginCredentialsConfigured = true;
122 
123  // Import host, user and password variables into the current symbol table from an array
124  extract($this->_plugin->getOTSLoginParametersForJournal($context->getId(), $request->getUser()));
125  if (is_null($user) || is_null($password)) {
126  $loginCredentialsConfigured = false;
127  }
128 
129  $conversionTriggerUrl = $dispatcher->url($request, ROUTE_PAGE, null, 'markup', 'triggerConversion', null, array('submissionId' => $submissionFile->getSubmissionId(), 'fileId' => $fileId, 'stageId' => $stageId, 'target' => $params['target']));
130  $editorTemplateFile = $this->_plugin->getTemplatePath() . 'convert.tpl';
131  PKPLocale::requireComponents(LOCALE_COMPONENT_APP_COMMON, LOCALE_COMPONENT_PKP_MANAGER);
132  $templateMgr = TemplateManager::getManager($request);
133  $templateMgr->assign('fileId', $fileId);
134  $templateMgr->assign('messageKey', $params['messageKey']);
135  $templateMgr->assign('pluginIsConfigured', $pluginIsConfigured);
136  $templateMgr->assign('loginCredentialsConfigured', $loginCredentialsConfigured);
137  $templateMgr->assign('conversionTriggerUrl', $conversionTriggerUrl);
138  $templateMgr->assign('pluginJavaScriptURL', $this->_plugin->getJsUrl($request));
139  $output = $templateMgr->fetch($editorTemplateFile);
140  return new JSONMessage(true, $output);
141  }
142 
151  public function triggerConversion($args, $request) {
152  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
153  if (!$submissionFile) {
154  return new JSONMessage(false);
155  }
156 
157  $fileId = $submissionFile->getFileId();
158  $stageId = $request->getUserVar('stageId');
159 
160  $target = $request->getUserVar('target');
161  $jobId = $this->_plugin->fetchGateway($fileId, $stageId, $target);
162 
163  $journal = $request->getJournal();
164  $url = $this->_plugin->getSetting($journal->getid(), 'markupHostURL');
165  $message = __('plugins.generic.markup.job.success', array('url' => $url));
166 
167  $router = $request->getRouter();
168  $dispatcher = $router->getDispatcher();
169  $conversionJobStatusCheckUrl = $dispatcher->url($request, ROUTE_PAGE, null, 'markup',
170  'fetchConversionJobStatus', null, array('submissionId' => $submissionFile->getSubmissionId(), 'fileId' => $submissionFile->getFileId(), 'stageId' => $stageId, 'job' => $jobId));
171  $templateFile = $this->_plugin->getTemplatePath() . 'convert-result.tpl';
172  PKPLocale::requireComponents(LOCALE_COMPONENT_APP_COMMON, LOCALE_COMPONENT_PKP_MANAGER);
173  $templateMgr = TemplateManager::getManager($request);
174  $templateMgr->assign('jobId', $jobId);
175  $templateMgr->assign('message', $message);
176  $templateMgr->assign('conversionJobStatusCheckUrl', $conversionJobStatusCheckUrl);
177  $output = $templateMgr->fetch($templateFile);
178  return new JSONMessage(true, $output);
179  }
180 
189  public function fetchConversionJobStatus($args, $request)
190  {
191  $journal = $request->getJournal();
192  $jobId = $request->getUserVar('job'); // TODO validate jobId here
193 
194  $markupJobInfoDao = DAORegistry::getDAO('MarkupJobInfoDAO');
195  $jobInfo = $markupJobInfoDao->getMarkupJobInfo($jobId);
196  $xmlJobId = $jobInfo->getXmlJobId();
197 
198  // Import host, user and password variables into the current symbol table from an array
199  extract($this->_plugin->getOTSLoginParametersForJournal($journal->getId(), $request->getUser()));
200 
201  $this->_plugin->import('classes.XMLPSWrapper');
202  $xmlpsWrapper = new XMLPSWrapper($host, $user, $password);
203  $code = (int) $xmlpsWrapper->getJobStatus($xmlJobId);
204  $status = $xmlpsWrapper->statusCodeToLabel($code);
205 
206  $isCompleted = in_array($code, array(XMLPSWrapper::JOB_STATUS_FAILED, XMLPSWrapper::JOB_STATUS_COMPLETED));
207  $json = new JSONMessage(true, array(
208  'status' => $status,
209  'isCompleted' => $isCompleted
210  )
211  );
212 
213  if ($isCompleted) {
214  $json->setEvent('dataChanged');
215  $json->setAdditionalAttributes(array('reloadContainer' => true));
216  }
217 
218  return $json;
219  }
220 
228  public function profile($args, $request) {
229  $context = $request->getContext();
230  PKPLocale::requireComponents(LOCALE_COMPONENT_APP_COMMON, LOCALE_COMPONENT_PKP_MANAGER);
231  $templateMgr = TemplateManager::getManager($request);
232 
233  $this->_plugin->import('MarkupProfileSettingsForm');
234  $form = new MarkupProfileSettingsForm($this->_plugin, $context->getId());
235  if ($request->getUserVar('save')) {
236  $form->readInputData();
237  if ($form->validate()) {
238  $form->execute();
239  $notificationManager = new NotificationManager();
240  $notificationManager->createTrivialNotification(
241  $request->getUser()->getId(),
242  NOTIFICATION_TYPE_SUCCESS,
243  array('contents' => __('plugins.generic.markup.settings.saved'))
244  );
245  return new JSONMessage(true);
246  }
247  } else {
248  $form->initData();
249  }
250  return new JSONMessage(true, $form->fetch($request));
251  }
252 
260  public function batch($args, $request) {
262  LOCALE_COMPONENT_APP_SUBMISSION,
263  LOCALE_COMPONENT_PKP_SUBMISSION,
264  LOCALE_COMPONENT_APP_EDITOR,
265  LOCALE_COMPONENT_PKP_EDITOR,
266  LOCALE_COMPONENT_PKP_COMMON,
267  LOCALE_COMPONENT_APP_COMMON
268  );
269 
270  $this->_plugin->import('classes.MarkupBatchConversionHelper');
271  $batchConversionHelper = new MarkupBatchConversionHelper();
272 
273  $context = $request->getContext();
274  $dispatcher = $request->getDispatcher();
275  $templateMgr = TemplateManager::getManager();
276  $submissionMetadata = $batchConversionHelper->buildSubmissionMetadataByContext($context->getId());
277  $batchConversionStatusUrl = $dispatcher->url($request, ROUTE_PAGE, null, 'batch', 'fetchConversionStatus', null);
278  $startConversionUrl = $dispatcher->url($request, ROUTE_PAGE, null, 'batch', 'startConversion', null);
279  $templateMgr->assign('batchConversionStatusUrl', $batchConversionStatusUrl);
280  $templateMgr->assign('startConversionUrl', $startConversionUrl);
281 
282  if ($batchConversionHelper->isRunning()) {
283  $data = $batchConversionHelper->readOutFile();
284  $cancelConversionUrl = $dispatcher->url($request, ROUTE_PAGE, null, 'batch', 'cancelConversion',
285  null, array('token' => $data['cancellationToken']));
286  $templateMgr->assign('cancelConversionUrl', $cancelConversionUrl);
287  }
288  $templateMgr->assign('submissions', $submissionMetadata);
289  $templateMgr->assign('batchConversionIsRunning', $batchConversionHelper->isRunning());
290  $templateFile = $this->_plugin->getTemplatePath() . 'batchConversion.tpl';
291  $output = $templateMgr->fetch($templateFile);
292  return new JSONMessage(true, $output);
293  }
294 
303  public function media($args, $request) {
304  $user = $request->getUser();
305  $context = $request->getContext();
306  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
307  if (!$submissionFile) {
308  fatalError('Invalid request');
309  }
310 
311  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
312  import('lib.pkp.classes.submission.SubmissionFile'); // Constants
313  $dependentFiles = $submissionFileDao->getLatestRevisionsByAssocId(
314  ASSOC_TYPE_SUBMISSION_FILE,
315  $submissionFile->getFileId(),
316  $submissionFile->getSubmissionId(),
317  SUBMISSION_FILE_DEPENDENT
318  );
319 
320  // make sure this is an xml document
321  if (!in_array($submissionFile->getFileType(), array('text/xml', 'application/xml'))) {
322  fatalError('Invalid request');
323  }
324 
325  $mediaSubmissionFile = null;
326  foreach ($dependentFiles as $dependentFile) {
327  if ($dependentFile->getOriginalFileName() == $request->getUserVar('fileName')) {
328  $mediaSubmissionFile = $dependentFile;
329  break;
330  }
331  }
332 
333  if (!$mediaSubmissionFile) {
334  $request->getDispatcher()->handle404();
335  }
336 
337  $filePath = $mediaSubmissionFile->getFilePath();
338  header('Content-Type:'.$mediaSubmissionFile->getFileType());
339  header('Content-Length: ' . $mediaSubmissionFile->getFileSize());
340  readfile($filePath);
341  }
342 }
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
MarkupProfileSettingsForm
Form for Document Markup XML service credential settings from user profile.
Definition: MarkupProfileSettingsForm.inc.php:18
$op
$op
Definition: lib/pkp/pages/help/index.php:18
ContextAccessPolicy
Class to control access to PKP applications' setup components.
Definition: ContextAccessPolicy.inc.php:17
MarkupHandler\fetchConversionJobStatus
fetchConversionJobStatus($args, $request)
Definition: MarkupHandler.inc.php:192
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
MarkupBatchConversionHelper
Definition: MarkupBatchConversionHelper.inc.php:17
MarkupHandler\$_plugin
$_plugin
Definition: MarkupHandler.inc.php:23
MarkupHandler\convertToXml
convertToXml($args, $request)
Definition: MarkupHandler.inc.php:69
MarkupHandler\profile
profile($args, $request)
Definition: MarkupHandler.inc.php:231
MarkupHandler\_conversion
_conversion($args, $request, $params)
Definition: MarkupHandler.inc.php:102
MarkupHandler\media
media($args, $request)
Definition: MarkupHandler.inc.php:306
MarkupHandler\triggerConversion
triggerConversion($args, $request)
Definition: MarkupHandler.inc.php:154
XMLPSWrapper
Wrapper class for XML Parsing Service.
Definition: XMLPSWrapper.inc.php:16
MarkupHandler\generateGalleyFiles
generateGalleyFiles($args, $request)
Definition: MarkupHandler.inc.php:86
MarkupConversionHelper\readCredentialsFromConfig
static readCredentialsFromConfig()
Definition: MarkupConversionHelper.inc.php:611
MarkupHandler
Handle requests for markup plugin.
Definition: MarkupHandler.inc.php:18
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
MarkupHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: MarkupHandler.inc.php:46
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
MarkupHandler\__construct
__construct()
Definition: MarkupHandler.inc.php:28
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
MarkupConversionHelper\canUseCredentialsFromConfig
static canUseCredentialsFromConfig($creds)
Definition: MarkupConversionHelper.inc.php:624
SubmissionFileAccessPolicy
Base class to control (write) access to submissions and (read) access to submission files.
Definition: SubmissionFileAccessPolicy.inc.php:23
PluginRegistry\getPlugin
static getPlugin($category, $name)
Definition: PluginRegistry.inc.php:85
XMLPSWrapper\JOB_STATUS_FAILED
const JOB_STATUS_FAILED
Definition: XMLPSWrapper.inc.php:22
NotificationManager
Definition: NotificationManager.inc.php:19
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
Handler
Base request handler application class.
Definition: Handler.inc.php:18
XMLPSWrapper\JOB_STATUS_COMPLETED
const JOB_STATUS_COMPLETED
Definition: XMLPSWrapper.inc.php:21
PKPLocale\requireComponents
static requireComponents()
Definition: PKPLocale.inc.php:374
MarkupHandler\batch
batch($args, $request)
Definition: MarkupHandler.inc.php:263