16 import(
'lib.pkp.classes.plugins.ImportExportPlugin');
19 define(
'EXPORT_STATUS_ANY',
'');
20 define(
'EXPORT_STATUS_NOT_DEPOSITED',
'notDeposited');
21 define(
'EXPORT_STATUS_MARKEDREGISTERED',
'markedRegistered');
22 define(
'EXPORT_STATUS_REGISTERED',
'registered');
25 define(
'EXPORT_ACTION_EXPORT',
'export');
26 define(
'EXPORT_ACTION_MARKREGISTERED',
'markRegistered');
27 define(
'EXPORT_ACTION_DEPOSIT',
'deposit');
30 define(
'EXPORT_CONFIG_ERROR_SETTINGS', 0x02);
42 if (!is_a($this->_cache,
'PubObjectCache')) {
44 import(
'classes.plugins.PubObjectCache');
53 function register($category, $path, $mainContextId =
null) {
54 if (!parent::register($category, $path, $mainContextId))
return false;
60 foreach ($this->
_getDAOs() as $dao) {
80 switch (
$request->getUserVar(
'verb')) {
82 $form->readInputData();
83 if ($form->validate()) {
85 $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS);
97 $templateMgr->assign(array(
98 'statusMessage' => htmlentities($statusMessage),
100 return new JSONMessage(
true, $templateMgr->fetch($this->getTemplateResource(
'statusMessage.tpl')));
103 return parent::manage($args,
$request);
113 switch (array_shift($args)) {
117 $configurationErrors = array();
120 foreach($form->getFormFields() as $fieldName => $fieldType) {
121 if ($form->isOptional($fieldName))
continue;
122 $pluginSetting = $this->
getSetting($context->getId(), $fieldName);
123 if (empty($pluginSetting)) {
124 $configurationErrors[] = EXPORT_CONFIG_ERROR_SETTINGS;
132 import(
'lib.pkp.classes.linkAction.request.NullAction');
133 $linkActions = array();
134 foreach ($actionNames as $action => $actionName) {
138 $templateMgr->assign(array(
140 'actionNames' => $actionNames,
141 'configurationErrors' => $configurationErrors,
144 case 'exportSubmissions':
146 case 'exportRepresentations':
147 $selectedSubmissions = (array)
$request->getUserVar(
'selectedSubmissions');
148 $selectedIssues = (array)
$request->getUserVar(
'selectedIssues');
149 $selectedRepresentations = (array)
$request->getUserVar(
'selectedRepresentations');
150 $tab = (string)
$request->getUserVar(
'tab');
151 $noValidation =
$request->getUserVar(
'validation') ? false :
true;
153 if (empty($selectedSubmissions) && empty($selectedIssues) && empty($selectedRepresentations)) {
154 fatalError(__(
'plugins.importexport.common.error.noObjectsSelected'));
156 if (!empty($selectedSubmissions)) {
159 $objectsFileNamePart =
'articles';
160 } elseif (!empty($selectedIssues)) {
163 $objectsFileNamePart =
'issues';
164 } elseif (!empty($selectedRepresentations)) {
167 $objectsFileNamePart =
'galleys';
186 $path = array(
'plugin', $this->
getName());
188 assert($filter !=
null);
190 $onlyValidateExport = (
$request->getUserVar(
'onlyValidateExport')) ?
true :
false;
191 if ($onlyValidateExport) {
192 $noValidation =
false;
196 $exportXml = $this->
exportXML($objects, $filter, $context, $noValidation);
198 if ($onlyValidateExport) {
199 if (isset($exportXml)) {
202 'plugins.importexport.common.validation.success',
203 NOTIFICATION_TYPE_SUCCESS
208 'plugins.importexport.common.validation.fail',
209 NOTIFICATION_TYPE_ERROR
213 $request->redirect(
null,
null,
null, $path,
null, $tab);
215 import(
'lib.pkp.classes.file.FileManager');
218 $fileManager->writeFile($exportFileName, $exportXml);
219 $fileManager->downloadByPath($exportFileName);
220 $fileManager->deleteByPath($exportFileName);
222 } elseif (
$request->getUserVar(EXPORT_ACTION_DEPOSIT)) {
223 assert($filter !=
null);
225 $exportXml = $this->
exportXML($objects, $filter, $context, $noValidation);
228 import(
'lib.pkp.classes.file.FileManager');
231 $fileManager->writeFile($exportFileName, $exportXml);
233 $result = $this->
depositXML($objects, $context, $exportFileName);
235 if ($result ===
true) {
238 $this->getDepositSuccessNotificationMessageKey(),
239 NOTIFICATION_TYPE_SUCCESS
242 if (is_array($result)) {
243 foreach($result as $error) {
244 assert(is_array($error) &&
count($error) >= 1);
248 NOTIFICATION_TYPE_ERROR,
249 (isset($error[1]) ? $error[1] :
null)
255 $fileManager->deleteByPath($exportFileName);
257 $request->redirect(
null,
null,
null, $path,
null, $tab);
258 } elseif (
$request->getUserVar(EXPORT_ACTION_MARKREGISTERED)) {
261 $request->redirect(
null,
null,
null, $path,
null, $tab);
263 $dispatcher =
$request->getDispatcher();
264 $dispatcher->handle404();
273 return 'plugins.importexport.common.register.success';
284 abstract function depositXML($objects, $context, $filename);
326 EXPORT_STATUS_ANY => __(
'plugins.importexport.common.status.any'),
327 EXPORT_STATUS_NOT_DEPOSITED => __(
'plugins.importexport.common.status.notDeposited'),
328 EXPORT_STATUS_MARKEDREGISTERED => __(
'plugins.importexport.common.status.markedRegistered'),
329 EXPORT_STATUS_REGISTERED => __(
'plugins.importexport.common.status.registered'),
349 $actions = array(EXPORT_ACTION_EXPORT, EXPORT_ACTION_MARKREGISTERED);
350 if ($this->
getSetting($context->getId(),
'username') && $this->getSetting($context->getId(),
'password')) {
351 array_unshift($actions, EXPORT_ACTION_DEPOSIT);
362 EXPORT_ACTION_DEPOSIT => __(
'plugins.importexport.common.action.register'),
363 EXPORT_ACTION_EXPORT => __(
'plugins.importexport.common.action.export'),
364 EXPORT_ACTION_MARKREGISTERED => __(
'plugins.importexport.common.action.markRegistered'),
382 function exportXML($objects, $filter, $context, $noValidation =
null) {
384 $exportFilters = $filterDao->getObjectsByGroup($filter);
385 assert(count($exportFilters) == 1);
386 $exportFilter = array_shift($exportFilters);
388 $exportFilter->setDeployment($exportDeployment);
389 if ($noValidation) $exportFilter->setNoValidation($noValidation);
390 libxml_use_internal_errors(
true);
391 $exportXml = $exportFilter->execute($objects,
true);
392 $xml = $exportXml->saveXml();
393 $errors = array_filter(libxml_get_errors(),
function($a) {
394 return $a->level == LIBXML_ERR_ERROR || $a->level == LIBXML_ERR_FATAL;
396 if (!empty($errors)) {
408 foreach ($objects as $object) {
424 $dao = $object->getDAO();
425 $dao->updateObject($object);
437 assert(count($args) == 2);
438 $additionalFields =& $args[1];
439 assert(is_array($additionalFields));
441 $additionalFields[] = $fieldName;
456 $schema =& $params[0];
458 $schema->properties->{$fieldName} = (object) [
460 'apiSummary' =>
true,
461 'validation' => [
'nullable'],
472 protected function _getObjectAdditionalSettings() {
473 return array($this->getDepositStatusSettingName());
479 function callbackParseCronTab($hookName, $args) {
480 $taskFilesPath =& $args[0];
481 $taskFilesPath[] = $this->getPluginPath() . DIRECTORY_SEPARATOR .
'scheduledTasks.xml';
490 function getUnregisteredArticles($context) {
493 $articles = $submissionDao->getExportable(
499 $this->getDepositStatusSettingName(),
500 EXPORT_STATUS_NOT_DEPOSITED,
503 return $articles->toArray();
510 function isTestMode($context) {
511 return ($this->getSetting($context->getId(),
'testMode') == 1);
518 function getDepositStatusSettingName() {
519 return $this->getPluginSettingsPrefix().
'::status';
527 function usage($scriptName) {
529 'plugins.importexport.' . $this->getPluginSettingsPrefix() .
'.cliUsage',
531 'scriptName' => $scriptName,
532 'pluginName' => $this->getName()
540 function executeCLI($scriptName, &$args) {
543 $command = array_shift($args);
544 if (!in_array($command, array(
'export',
'register'))) {
545 $this->usage($scriptName);
549 $outputFile = $command ==
'export' ? array_shift($args) : null;
550 $contextPath = array_shift($args);
551 $objectType = array_shift($args);
554 $context = $contextDao->getByPath($contextPath);
556 if ($contextPath !=
'') {
557 echo __(
'plugins.importexport.common.cliError') .
"\n";
558 echo __(
'plugins.importexport.common.error.unknownJournal', array(
'journalPath' => $contextPath)) .
"\n\n";
560 $this->usage($scriptName);
565 if ($this->isRelativePath($outputFile)) {
566 $outputFile = PWD .
'/' . $outputFile;
568 $outputDir = dirname($outputFile);
569 if (!is_writable($outputDir) || (file_exists($outputFile) && !is_writable($outputFile))) {
570 echo __(
'plugins.importexport.common.cliError') .
"\n";
571 echo __(
'plugins.importexport.common.export.error.outputFileNotWritable', array(
'param' => $outputFile)) .
"\n\n";
572 $this->usage($scriptName);
577 switch ($objectType) {
579 $objects = $this->getPublishedSubmissions($args, $context);
580 $filter = $this->getSubmissionFilter();
581 $objectsFileNamePart =
'articles';
584 $objects = $this->getPublishedIssues($args, $context);
585 $filter = $this->getIssueFilter();
586 $objectsFileNamePart =
'issues';
589 $objects = $this->getArticleGalleys($args);
590 $filter = $this->getRepresentationFilter();
591 $objectsFileNamePart =
'galleys';
594 $this->usage($scriptName);
598 if (empty($objects)) {
599 echo __(
'plugins.importexport.common.cliError') .
"\n";
600 echo __(
'plugins.importexport.common.error.unknownObjects') .
"\n\n";
601 $this->usage($scriptName);
605 $this->usage($scriptName);
609 $this->executeCLICommand($scriptName, $command, $context, $outputFile, $objects, $filter, $objectsFileNamePart);
623 function executeCLICommand($scriptName, $command, $context, $outputFile, $objects, $filter, $objectsFileNamePart) {
624 $exportXml = $this->exportXML($objects, $filter, $context);
625 if ($command ==
'export' && $outputFile) file_put_contents($outputFile, $exportXml);
627 if ($command ==
'register') {
628 import(
'lib.pkp.classes.file.FileManager');
630 $exportFileName = $this->getExportFileName($this->getExportPath(), $objectsFileNamePart, $context,
'.xml');
631 $fileManager->writeFile($exportFileName, $exportXml);
632 $result = $this->depositXML($objects, $context, $exportFileName);
633 if ($result ===
true) {
634 echo __(
'plugins.importexport.common.register.success') .
"\n";
636 echo __(
'plugins.importexport.common.cliError') .
"\n";
637 if (is_array($result)) {
638 foreach($result as $error) {
639 assert(is_array($error) && count($error) >= 1);
640 $errorMessage = __($error[0], array(
'param' => (isset($error[1]) ? $error[1] :
null)));
641 echo
"*** $errorMessage\n";
645 echo __(
'plugins.importexport.common.register.error.mdsError', array(
'param' =>
' - ')) .
"\n\n";
647 $this->usage($scriptName);
649 $fileManager->deleteByPath($exportFileName);
659 function getPublishedSubmissions($submissionIds, $context) {
660 $submissions = array_map(
function($submissionId) {
663 return array_filter($submissions,
function($submission) {
664 return $submission->getData(
'status') === STATUS_PUBLISHED;
674 function getPublishedIssues($issueIds, $context) {
675 $publishedIssues = array();
677 foreach ($issueIds as $issueId) {
678 $publishedIssue = $issueDao->getById($issueId, $context->getId());
679 if ($publishedIssue) $publishedIssues[] = $publishedIssue;
681 return $publishedIssues;
689 function getArticleGalleys($galleyIds) {
692 foreach ($galleyIds as $galleyId) {
693 $articleGalley = $articleGalleyDao->getById($galleyId);
694 if ($articleGalley) $galleys[] = $articleGalley;
706 function _sendNotification($user, $message, $notificationType, $param =
null) {
707 static $notificationManager =
null;
708 if (is_null($notificationManager)) {
709 import(
'classes.notification.NotificationManager');
712 if (!is_null($param)) {
713 $params = array(
'param' => $param);
717 $notificationManager->createTrivialNotification(
720 array(
'contents' => __($message, $params))
729 function _instantiateExportDeployment($context) {
730 $exportDeploymentClassName = $this->getExportDeploymentClassName();
731 $this->
import($exportDeploymentClassName);
732 $exportDeployment =
new $exportDeploymentClassName($context, $this);
733 return $exportDeployment;
741 function _instantiateSettingsForm($context) {
742 $settingsFormClassName = $this->getSettingsFormClassName();
743 $this->
import(
'classes.form.' . $settingsFormClassName);
744 $settingsForm =
new $settingsFormClassName($this, $context->getId());
745 return $settingsForm;
752 protected function _getDAOs() {