Open Journal Systems  3.3.0
PubMedExportPlugin.inc.php
1 <?php
2 
16 import('lib.pkp.classes.plugins.ImportExportPlugin');
17 
22  function register($category, $path, $mainContextId = null) {
23  $success = parent::register($category, $path, $mainContextId);
24  $this->addLocaleData();
25  return $success;
26  }
27 
33  function getName() {
34  return 'PubMedExportPlugin';
35  }
36 
41  function getDisplayName() {
42  return __('plugins.importexport.pubmed.displayName');
43  }
44 
49  function getDescription() {
50  return __('plugins.importexport.pubmed.description');
51  }
52 
58  function display($args, $request) {
59  parent::display($args, $request);
60  $templateMgr = TemplateManager::getManager($request);
61  $context = $request->getContext();
62  switch (array_shift($args)) {
63  case 'index':
64  case '':
65  $apiUrl = $request->getDispatcher()->url($request, ROUTE_API, $context->getPath(), 'submissions');
66  $submissionsListPanel = new \APP\components\listPanels\SubmissionsListPanel(
67  'submissions',
68  __('common.publications'),
69  [
70  'apiUrl' => $apiUrl,
71  'count' => 100,
72  'getParams' => new stdClass(),
73  'lazyLoad' => true,
74  ]
75  );
76  $submissionsConfig = $submissionsListPanel->getConfig();
77  $submissionsConfig['addUrl'] = '';
78  $submissionsConfig['filters'] = array_slice($submissionsConfig['filters'], 1);
79  $templateMgr->setState([
80  'components' => [
81  'submissions' => $submissionsConfig,
82  ],
83  ]);
84  $templateMgr->assign([
85  'pageComponent' => 'ImportExportPage',
86  ]);
87  $templateMgr->display($this->getTemplateResource('index.tpl'));
88  break;
89  case 'exportSubmissions':
90  $exportXml = $this->exportSubmissions(
91  (array) $request->getUserVar('selectedSubmissions'),
92  $request->getContext(),
93  $request->getUser()
94  );
95  import('lib.pkp.classes.file.FileManager');
96  $fileManager = new FileManager();
97  $exportFileName = $this->getExportFileName($this->getExportPath(), 'articles', $context, '.xml');
98  $fileManager->writeFile($exportFileName, $exportXml);
99  $fileManager->downloadByPath($exportFileName);
100  $fileManager->deleteByPath($exportFileName);
101  break;
102  case 'exportIssues':
103  $exportXml = $this->exportIssues(
104  (array) $request->getUserVar('selectedIssues'),
105  $request->getContext(),
106  $request->getUser()
107  );
108  import('lib.pkp.classes.file.FileManager');
109  $fileManager = new FileManager();
110  $exportFileName = $this->getExportFileName($this->getExportPath(), 'issues', $context, '.xml');
111  $fileManager->writeFile($exportFileName, $exportXml);
112  $fileManager->downloadByPath($exportFileName);
113  $fileManager->deleteByPath($exportFileName);
114  break;
115  default:
116  $dispatcher = $request->getDispatcher();
117  $dispatcher->handle404();
118  }
119  }
120 
125  return 'pubmed';
126  }
127 
128  function exportSubmissions($submissionIds, $context, $user) {
129  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
130  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
131  $pubmedExportFilters = $filterDao->getObjectsByGroup('article=>pubmed-xml');
132  assert(count($pubmedExportFilters) == 1); // Assert only a single serialization filter
133  $exportFilter = array_shift($pubmedExportFilters);
134  $submissions = array();
135  foreach ($submissionIds as $submissionId) {
136  $submission = $submissionDao->getById($submissionId);
137  if ($submission && $submission->getData('contextId') == $context->getId()) $submissions[] = $submission;
138  }
139  libxml_use_internal_errors(true);
140  $submissionXml = $exportFilter->execute($submissions, true);
141  $xml = $submissionXml->saveXml();
142  $errors = array_filter(libxml_get_errors(), function($a) {
143  return $a->level == LIBXML_ERR_ERROR || $a->level == LIBXML_ERR_FATAL;
144  });
145  if (!empty($errors)) {
146  $this->displayXMLValidationErrors($errors, $xml);
147  }
148  return $xml;
149  }
150 
158  function exportIssues($issueIds, $context, $user) {
159  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
160  $pubmedExportFilters = $filterDao->getObjectsByGroup('article=>pubmed-xml');
161  assert(count($pubmedExportFilters) == 1); // Assert only a single serialization filter
162  $exportFilter = array_shift($pubmedExportFilters);
163  $submissionsIterator = Services::get('submission')->getMany([
164  'contextId' => $context->getId(),
165  'issueIds' => $issueIds,
166  ]);
167  libxml_use_internal_errors(true);
168  $submissionXml = $exportFilter->execute(iterator_to_array($submissionsIterator), true);
169  $xml = $submissionXml->saveXml();
170  $errors = array_filter(libxml_get_errors(), function($a) {
171  return $a->level == LIBXML_ERR_ERROR || $a->level == LIBXML_ERR_FATAL;
172  });
173  if (!empty($errors)) {
174  $this->displayXMLValidationErrors($errors, $xml);
175  }
176  return $xml;
177  }
178 
183  function executeCLI($scriptName, &$args) {
184 // $command = array_shift($args);
185  $xmlFile = array_shift($args);
186  $journalPath = array_shift($args);
187 
188  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
189  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
190 
191  $journal = $journalDao->getByPath($journalPath);
192 
193  if (!$journal) {
194  if ($journalPath != '') {
195  echo __('plugins.importexport.pubmed.cliError') . "\n";
196  echo __('plugins.importexport.pubmed.error.unknownJournal', array('journalPath' => $journalPath)) . "\n\n";
197  }
198  $this->usage($scriptName);
199  return;
200  }
201 
202  if ($xmlFile != '') switch (array_shift($args)) {
203  case 'articles':
204  $articleSearch = new ArticleSearch();
205  $results = $articleSearch->formatResults($args);
206  if (!$this->exportArticles($results, $xmlFile)) {
207  echo __('plugins.importexport.pubmed.cliError') . "\n";
208  echo __('plugins.importexport.pubmed.export.error.couldNotWrite', array('fileName' => $xmlFile)) . "\n\n";
209  }
210  return;
211  case 'issue':
212  $issueId = array_shift($args);
213  $issue = $issueDao->getByBestId($issueId, $journal->getId());
214  if ($issue == null) {
215  echo __('plugins.importexport.pubmed.cliError') . "\n";
216  echo __('plugins.importexport.pubmed.export.error.issueNotFound', array('issueId' => $issueId)) . "\n\n";
217  return;
218  }
219  $issues = array($issue);
220  if (!$this->exportIssues($journal, $issues, $xmlFile)) {
221  echo __('plugins.importexport.pubmed.cliError') . "\n";
222  echo __('plugins.importexport.pubmed.export.error.couldNotWrite', array('fileName' => $xmlFile)) . "\n\n";
223  }
224  return;
225  }
226  $this->usage($scriptName);
227 
228  }
229 
233  function usage($scriptName) {
234  echo __('plugins.importexport.pubmed.cliUsage', array(
235  'scriptName' => $scriptName,
236  'pluginName' => $this->getName()
237  )) . "\n";
238  }
239 }
240 
241 
PubMedExportPlugin\getDescription
getDescription()
Definition: PubMedExportPlugin.inc.php:49
ImportExportPlugin\displayXMLValidationErrors
displayXMLValidationErrors($errors, $xml)
Definition: ImportExportPlugin.inc.php:161
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PubMedExportPlugin\getDisplayName
getDisplayName()
Definition: PubMedExportPlugin.inc.php:41
PubMedExportPlugin\exportIssues
exportIssues($issueIds, $context, $user)
Definition: PubMedExportPlugin.inc.php:158
PubMedExportPlugin
PubMed/MEDLINE XML metadata export plugin.
Definition: PubMedExportPlugin.inc.php:18
ImportExportPlugin
Abstract class for import/export plugins.
Definition: ImportExportPlugin.inc.php:18
PubMedExportPlugin\getName
getName()
Definition: PubMedExportPlugin.inc.php:33
PubMedExportPlugin\getPluginSettingsPrefix
getPluginSettingsPrefix()
Definition: PubMedExportPlugin.inc.php:124
ImportExportPlugin\getExportFileName
getExportFileName($basePath, $objectsFileNamePart, $context, $extension='.xml')
Definition: ImportExportPlugin.inc.php:152
ImportExportPlugin\getExportPath
getExportPath()
Definition: ImportExportPlugin.inc.php:140
PubMedExportPlugin\exportSubmissions
exportSubmissions($submissionIds, $context, $user)
Definition: PubMedExportPlugin.inc.php:128
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PubMedExportPlugin\usage
usage($scriptName)
Definition: PubMedExportPlugin.inc.php:233
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
Plugin\$request
$request
Definition: Plugin.inc.php:68
Plugin\addLocaleData
addLocaleData($locale=null)
Definition: Plugin.inc.php:454
PubMedExportPlugin\display
display($args, $request)
Definition: PubMedExportPlugin.inc.php:58
ArticleSearch
Class for retrieving article search results.
Definition: ArticleSearch.inc.php:20
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35
PubMedExportPlugin\executeCLI
executeCLI($scriptName, &$args)
Definition: PubMedExportPlugin.inc.php:183
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49