Open Journal Systems  3.3.0
MarkupBatchConversionHandler.inc.php
1 <?php
2 
16 import('classes.handler.Handler');
17 
20  protected $_plugin = null;
21 
25  public 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),
33  array('filesToConvert', 'startConversion', 'fetchConversionStatus', 'cancelConversion')
34  );
35  }
36 
40  function authorize($request, &$args, $roleAssignments) {
41  $op = $request->getRouter()->getRequestedOp($request);
42 
43  if($op == 'filesToConvert') {
44  import('lib.pkp.classes.security.authorization.SubmissionAccessPolicy');
45  $this->addPolicy(new SubmissionAccessPolicy($request, $args, $roleAssignments));
46  }
47 
48  return parent::authorize($request, $args, $roleAssignments);
49  }
50 
58  public function filesToConvert($args, $request) {
59  $context = $request->getContext();
60  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
61  $genreDao = DAORegistry::getDAO('GenreDAO');
62  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
63  $filesToConvert = array();
64  $validFileExtensions = array('pdf','doc','docx');
65  $submissionFiles = $submissionFileDao->getLatestRevisions($submission->getId());
66  foreach ($submissionFiles as $submissionFile) {
67  $genre = $genreDao->getById($submissionFile->getGenreId());
68  if (intval($genre->getCategory()) != GENRE_CATEGORY_DOCUMENT)
69  continue;
70  if (intval($genre->getDependent()) != 0)
71  continue;
72  if (!in_array(strtolower($submissionFile->getExtension()), $validFileExtensions))
73  continue;
74  $filesToConvert[] = array(
75  'fileId' => $submissionFile->getFileId(),
76  'stage' => $submission->getStageId(),
77  'filename' => $submissionFile->getName(AppLocale::getLocale()),
78  );
79  }
80  return new JSONMessage(true, $filesToConvert);
81  }
82 
90  public function startConversion($args, $request) {
91  $user = $request->getUser();
92  $dispatcher = $request->getDispatcher();
93 
94  $pattern = '/submission_(\d+)/';
95  $submissions = array();
96  foreach ($_POST as $field => $value) {
97  if (preg_match($pattern, $field, $matches) && (intval($value) !== -1) ) {
98  $submissionId = $matches[1];
99  $submissions[$submissionId] = $value;
100  }
101  }
102  if (count($submissions)) {
103  // Create an access key
104  $this->_plugin->import('classes.MarkupConversionHelper');
105  $accessKey = MarkupConversionHelper::makeAccessToken($user);
106 
107  // trigger conversion
108  $url = $request->url(null, 'gateway', 'plugin', array('MarkupBatchGatewayPlugin',
109  'userId', $user->getId(), 'accessKey', $accessKey));
110 
111  $ch = curl_init();
112  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // Avoid HTTP 417 errors
113  curl_setopt($ch, CURLOPT_URL, $url);
114  curl_setopt($ch, CURLOPT_POSTFIELDS, $submissions);
115  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
116  curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000);
117  curl_exec($ch);
118  curl_close($ch);
119 
120  // notification
121  $notificationManager = new NotificationManager();
122  $notificationManager->createTrivialNotification(
123  $user->getId(),
124  NOTIFICATION_TYPE_SUCCESS,
125  array(
126  'contents' => __('plugins.generic.markup.trigger-conversion'),
127  )
128  );
129  }
130 
131  // redirect to batch conversion page
132  $url = $dispatcher->url($request, ROUTE_PAGE,null, 'management', 'settings', 'website',
133  array(), 'markupBatchConversion');
134  $request->redirectUrl($url);
135  }
136 
144  public function fetchConversionStatus($args, $request) {
145  $this->_plugin->import('classes.MarkupBatchConversionHelper');
146  $batchConversionHelper = new MarkupBatchConversionHelper();
147  $data = $batchConversionHelper->readOutFile();
148  $responseData = null;
149  if (is_array($data)) {
150  $responseData = <<<OED
151 
152  <h3>Batch conversion job infos</h3>
153  <p><em>Running {$data['processedCount']} out of {$data['submissionCount']}.</em></p>
154  <dl>
155  <dt>Submission Id</dt><dd>{$data['submissionId']}</dd>
156  <dt>OJS Job ID</dt><dd>{$data['jobInfoId']}</dd>
157  <dt>OTS Job ID</dt><dd>{$data['otsJobId']}</dd>
158  <dt>Job Status</dt><dd>{$data['conversionStatus']}</dd>
159  </dl>
160 
161 OED;
162  }
163  else {
164  $responseData = array(
165  'errorMessage' => __('plugins.generic.markup.conversion-running'),
166  );
167  }
168 
169  return new JSONMessage(true, $responseData);
170  }
171 
179  public function cancelConversion($args, $request) {
180  $user = $request->getUser();
181  $dispatcher = $request->getDispatcher();
182  $conversionPageUrl = $dispatcher->url($request, ROUTE_PAGE,null, 'management', 'settings', 'website',
183  array(), 'markupBatchConversion');
184  $this->_plugin->import('classes.MarkupBatchConversionHelper');
185  $batchConversionHelper = new MarkupBatchConversionHelper();
186  if (!$batchConversionHelper->isRunning()) {
187  $request->redirectUrl($conversionPageUrl);
188  exit;
189  }
190 
191  // verify cancellation token
192  $data = $batchConversionHelper->readOutFile();
193  $token = $request->getUserVar('token');
194  if ($token != $data['cancellationToken']) {
195  $request->redirectUrl($conversionPageUrl);
196  exit;
197  }
198 
199  $pid = intval($data['pid']);
200  $notificationManager = new NotificationManager();
201  if (posix_kill($pid, 9)) { // 9 = SIGKILL
202  $notificationManager->createTrivialNotification(
203  $user->getId(),
204  NOTIFICATION_TYPE_SUCCESS,
205  array(
206  'contents' => __('plugins.generic.markup.cancel-success'),
207  )
208  );
209  }
210  else {
211  $notificationManager->createTrivialNotification(
212  $user->getId(),
213  NOTIFICATION_TYPE_ERROR,
214  array(
215  'contents' => __('plugins.generic.markup.cancel-failure'),
216  )
217  );
218  }
219  $batchConversionHelper->deleteOutFile();
220  $request->redirectUrl($conversionPageUrl);
221  }
222 }
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
MarkupBatchConversionHandler\filesToConvert
filesToConvert($args, $request)
Definition: MarkupBatchConversionHandler.inc.php:61
MarkupBatchConversionHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: MarkupBatchConversionHandler.inc.php:43
$op
$op
Definition: lib/pkp/pages/help/index.php:18
MarkupBatchConversionHandler\fetchConversionStatus
fetchConversionStatus($args, $request)
Definition: MarkupBatchConversionHandler.inc.php:147
Submission
Article class.
Definition: Submission.inc.php:34
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
MarkupBatchConversionHelper
Definition: MarkupBatchConversionHelper.inc.php:17
MarkupBatchConversionHandler\__construct
__construct()
Definition: MarkupBatchConversionHandler.inc.php:28
MarkupBatchConversionHandler\startConversion
startConversion($args, $request)
Definition: MarkupBatchConversionHandler.inc.php:93
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
Symfony\Polyfill\Php72
Definition: Php72.php:12
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
PluginRegistry\getPlugin
static getPlugin($category, $name)
Definition: PluginRegistry.inc.php:85
MarkupBatchConversionHandler\$_plugin
$_plugin
Definition: MarkupBatchConversionHandler.inc.php:23
NotificationManager
Definition: NotificationManager.inc.php:19
MarkupBatchConversionHandler
Handles request for articles batch conversion.
Definition: MarkupBatchConversionHandler.inc.php:18
SubmissionAccessPolicy
Base class to control (write) access to submissions and (read) access to submission details in OMP.
Definition: SubmissionAccessPolicy.inc.php:19
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
Handler
Base request handler application class.
Definition: Handler.inc.php:18
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
MarkupConversionHelper\makeAccessToken
static makeAccessToken($user)
Definition: MarkupConversionHelper.inc.php:642
MarkupBatchConversionHandler\cancelConversion
cancelConversion($args, $request)
Definition: MarkupBatchConversionHandler.inc.php:182