16 import(
'classes.plugins.DOIPubIdExportPlugin');
20 define(
'CROSSREF_STATUS_FAILED',
'failed');
22 define(
'CROSSREF_API_DEPOSIT_OK', 200);
24 define(
'CROSSREF_API_URL',
'https://api.crossref.org/v2/deposits');
26 define(
'CROSSREF_API_URL_DEV',
'https://test.crossref.org/v2/deposits');
28 define(
'CROSSREF_API_STAUTS_URL',
'https://api.crossref.org/servlet/submissionDownload');
30 define(
'CROSSREF_API_STAUTS_URL_DEV',
'https://test.crossref.org/servlet/submissionDownload');
33 define(
'CROSSREF_DEPOSIT_STATUS',
'depositStatus');
42 return 'CrossRefExportPlugin';
49 return __(
'plugins.importexport.crossref.displayName');
56 return __(
'plugins.importexport.crossref.description');
63 return 'preprint=>crossref-xml';
70 return array_merge(parent::getStatusNames(), array(
71 EXPORT_STATUS_REGISTERED => __(
'plugins.importexport.crossref.status.registered'),
72 CROSSREF_STATUS_FAILED => __(
'plugins.importexport.crossref.status.failed'),
73 EXPORT_STATUS_MARKEDREGISTERED => __(
'plugins.importexport.crossref.status.markedRegistered'),
82 $dispatcher =
$request->getDispatcher();
83 import(
'lib.pkp.classes.linkAction.request.AjaxModal');
85 CROSSREF_STATUS_FAILED =>
91 'grid.settings.plugins.settingsPluginGridHandler',
92 'manage',
null, array(
'plugin' =>
'CrossRefExportPlugin',
'category' =>
'importexport',
'verb' =>
'statusMessage',
93 'batchId' => $pubObject->getData($this->getDepositBatchIdSettingName()),
'submissionId' => $pubObject->getId())
95 __(
'plugins.importexport.crossref.status.failed'),
98 __(
'plugins.importexport.crossref.status.failed')
109 $submissionId =
$request->getUserVar(
'submissionId');
111 $article = $submissionDao->getById($submissionId);
113 if (!empty($failedMsg)) {
119 import(
'lib.pkp.classes.helpers.PKPCurlHelper');
122 curl_setopt($curlCh, CURLOPT_RETURNTRANSFER,
true);
123 curl_setopt($curlCh, CURLOPT_POST,
true);
124 curl_setopt($curlCh, CURLOPT_HEADER, 0);
127 $endpoint = ($this->
isTestMode($context) ? CROSSREF_API_STAUTS_URL_DEV : CROSSREF_API_STAUTS_URL);
128 curl_setopt($curlCh, CURLOPT_URL, $endpoint);
130 $username = $this->
getSetting($context->getId(),
'username');
131 $password = $this->
getSetting($context->getId(),
'password');
132 $batchId =
$request->getUserVar(
'batchId');
133 $data = array(
'doi_batch_id' => $batchId,
'type' =>
'result',
'usr' => $username,
'pwd' => $password);
134 curl_setopt($curlCh, CURLOPT_POSTFIELDS, $data);
135 $response = curl_exec($curlCh);
137 if ($response ===
false) {
138 $result = __(
'plugins.importexport.common.register.error.mdsError', array(
'param' =>
'No response from server.'));
151 EXPORT_ACTION_DEPOSIT => __(
'plugins.importexport.crossref.action.register'),
152 EXPORT_ACTION_EXPORT => __(
'plugins.importexport.crossref.action.export'),
153 EXPORT_ACTION_MARKREGISTERED => __(
'plugins.importexport.crossref.action.markRegistered'),
162 return array_merge(parent::_getObjectAdditionalSettings(), array(
179 return 'CrossRefSettingsForm';
186 return 'CrossrefExportDeployment';
194 $path = array(
'plugin', $this->
getName());
196 import(
'lib.pkp.classes.file.FileManager');
198 $resultErrors = array();
200 if (
$request->getUserVar(EXPORT_ACTION_DEPOSIT)) {
201 assert($filter !=
null);
207 $errorsOccured =
false;
213 foreach ($objects as $object) {
215 $exportXml = $this->
exportXML(array($object), $filter, $context, $noValidation);
218 $objectsFileNamePart = $objectsFileNamePart .
'-' . $object->getId();
220 $fileManager->writeFile($exportFileName, $exportXml);
222 $result = $this->
depositXML($object, $context, $exportFileName);
224 $errorsOccured =
true;
226 if (is_array($result)) {
227 $resultErrors[] = $result;
230 $fileManager->deleteByPath($exportFileName);
233 if (empty($resultErrors)) {
234 if ($errorsOccured) {
237 'plugins.importexport.crossref.register.error.mdsError',
238 NOTIFICATION_TYPE_ERROR
243 $this->getDepositSuccessNotificationMessageKey(),
244 NOTIFICATION_TYPE_SUCCESS
248 foreach($resultErrors as $errors) {
249 foreach ($errors as $error) {
250 assert(is_array($error) && count($error) >= 1);
254 NOTIFICATION_TYPE_ERROR,
255 (isset($error[1]) ? $error[1] :
null)
261 $request->redirect(
null,
null,
null, $path,
null, $tab);
263 parent::executeExportAction(
$request, $objects, $filter, $tab, $objectsFileNamePart, $noValidation);
277 error_log(
"depositOnPublish");
278 $newPublication = $args[0];
279 $objects[] =
Services::get(
'submission')->get($newPublication->getData(
'submissionId'));
283 $objectsFileNamePart =
'preprints';
284 $noValidation =
null;
286 import(
'lib.pkp.classes.file.FileManager');
288 $resultErrors = array();
289 $errorsOccured =
false;
291 foreach ($objects as $object) {
292 $exportXml = $this->
exportXML(array($object), $filter, $context, $noValidation);
293 $objectsFileNamePart = $objectsFileNamePart .
'-' . $object->getId();
295 $fileManager->writeFile($exportFileName, $exportXml);
296 $result = $this->
depositXML($object, $context, $exportFileName);
298 $errorsOccured =
true;
300 if (is_array($result)) {
301 $resultErrors[] = $result;
303 $fileManager->deleteByPath($exportFileName);
306 if (empty($resultErrors)) {
307 if ($errorsOccured) {
310 'plugins.importexport.crossref.register.error.mdsError',
311 NOTIFICATION_TYPE_ERROR
316 $this->getDepositSuccessNotificationMessageKey(),
317 NOTIFICATION_TYPE_SUCCESS
321 foreach($resultErrors as $errors) {
322 foreach ($errors as $error) {
323 assert(is_array($error) && count($error) >= 1);
327 NOTIFICATION_TYPE_ERROR,
328 (isset($error[1]) ? $error[1] :
null)
345 import(
'lib.pkp.classes.helpers.PKPCurlHelper');
348 curl_setopt($curlCh, CURLOPT_RETURNTRANSFER,
true);
349 curl_setopt($curlCh, CURLOPT_POST,
true);
350 curl_setopt($curlCh, CURLOPT_HEADER, 0);
353 $endpoint = ($this->
isTestMode($context) ? CROSSREF_API_URL_DEV : CROSSREF_API_URL);
354 curl_setopt($curlCh, CURLOPT_URL, $endpoint);
356 $username = $this->
getSetting($context->getId(),
'username');
357 $password = $this->
getSetting($context->getId(),
'password');
358 assert(is_readable($filename));
359 if (function_exists(
'curl_file_create')) {
360 curl_setopt($curlCh, CURLOPT_SAFE_UPLOAD,
true);
361 $cfile =
new CURLFile($filename);
363 $cfile =
"@$filename";
365 $data = array(
'operation' =>
'doMDUpload',
'usr' => $username,
'pwd' => $password,
'mdFile' => $cfile);
366 curl_setopt($curlCh, CURLOPT_POSTFIELDS, $data);
367 $response = curl_exec($curlCh);
370 if ($response ===
false) {
371 $result = array(array(
'plugins.importexport.common.register.error.mdsError',
'No response from server.'));
372 } elseif (curl_getinfo($curlCh, CURLINFO_HTTP_CODE) != CROSSREF_API_DEPOSIT_OK) {
375 $xmlDoc =
new DOMDocument();
376 $xmlDoc->loadXML($response);
378 $batchIdNode = $xmlDoc->getElementsByTagName(
'batch_id')->item(0);
381 $status = CROSSREF_STATUS_FAILED;
385 $xmlDoc =
new DOMDocument();
386 $xmlDoc->loadXML($response);
387 $batchIdNode = $xmlDoc->getElementsByTagName(
'batch_id')->item(0);
391 $failureCountNode = $xmlDoc->getElementsByTagName(
'failure_count')->item(0);
392 $failureCount = (int) $failureCountNode->nodeValue;
393 if ($failureCount > 0) {
394 $status = CROSSREF_STATUS_FAILED;
398 $status = EXPORT_STATUS_REGISTERED;
402 $warningCountNode = $xmlDoc->getElementsByTagName(
'warning_count')->item(0);
403 $warningCount = (int) $warningCountNode->nodeValue;
404 if ($warningCount > 0) {
405 $result = array(array(
'plugins.importexport.crossref.register.success.warning', htmlspecialchars($response)));
408 HookRegistry::call(
'crossrefexportplugin::deposited', array($this, $response, $objects));
430 assert(is_a($object,
'Submission'));
438 if ($status == EXPORT_STATUS_REGISTERED) {
448 foreach ($objects as $object) {
476 return 'plugins.importexport.common.register.success';
482 function executeCLICommand($scriptName, $command, $context, $outputFile, $objects, $filter, $objectsFileNamePart) {
486 $exportXml = $this->
exportXML($objects, $filter, $context);
487 if ($outputFile) file_put_contents($outputFile, $exportXml);
491 import(
'lib.pkp.classes.file.FileManager');
493 $resultErrors = array();
499 $errorsOccured =
false;
505 foreach ($objects as $object) {
507 $exportXml = $this->
exportXML(array($object), $filter, $context);
510 $objectsFileNamePartId = $objectsFileNamePart .
'-' . $object->getId();
512 $fileManager->writeFile($exportFileName, $exportXml);
514 $result = $this->
depositXML($object, $context, $exportFileName);
516 $errorsOccured =
true;
518 if (is_array($result)) {
519 $resultErrors[] = $result;
522 $fileManager->deleteByPath($exportFileName);
525 if (empty($resultErrors)) {
526 if ($errorsOccured) {
527 echo __(
'plugins.importexport.crossref.register.error.mdsError') .
"\n";
529 echo __(
'plugins.importexport.common.register.success') .
"\n";
532 echo __(
'plugins.importexport.common.cliError') .
"\n";
533 foreach($resultErrors as $errors) {
534 foreach ($errors as $error) {
535 assert(is_array($error) && count($error) >= 1);
536 $errorMessage = __($error[0], array(
'param' => (isset($error[1]) ? $error[1] :
null)));
537 echo
"*** $errorMessage\n";
541 $this->
usage($scriptName);