Open Journal Systems  3.3.0
NativeXmlPublicationFilter.inc.php
1 <?php
2 
16 import('lib.pkp.plugins.importexport.native.filter.NativeXmlPKPPublicationFilter');
17 
19  //
20  // Implement template methods from PersistableFilter
21  //
25  function getClassName() {
26  return 'plugins.importexport.native.filter.NativeXmlPublicationFilter';
27  }
28 
34  function handleElement($node) {
35  $deployment = $this->getDeployment();
36  $context = $deployment->getContext();
37  $sectionAbbrev = $node->getAttribute('section_ref');
38  if ($sectionAbbrev !== '') {
39  $sectionDao = DAORegistry::getDAO('SectionDAO'); /* @var $sectionDao SectionDAO */
40  $section = $sectionDao->getByAbbrev($sectionAbbrev, $context->getId());
41  if (!$section) {
42  $deployment->addError(ASSOC_TYPE_SUBMISSION, NULL, __('plugins.importexport.native.error.unknownSection', array('param' => $sectionAbbrev)));
43  } else {
44  return parent::handleElement($node);
45  }
46  }
47  }
48 
55  function populateObject($publication, $node) {
56  $deployment = $this->getDeployment();
57  $context = $deployment->getContext();
58 
59  $sectionAbbrev = $node->getAttribute('section_ref');
60  if ($sectionAbbrev !== '') {
61  $sectionDao = DAORegistry::getDAO('SectionDAO'); /* @var $sectionDao SectionDAO */
62  $section = $sectionDao->getByAbbrev($sectionAbbrev, $context->getId());
63  if (!$section) {
64  $deployment->addError(ASSOC_TYPE_PUBLICATION, $publication->getId(), __('plugins.importexport.native.error.unknownSection', array('param' => $sectionAbbrev)));
65  } else {
66  $publication->setData('sectionId', $section->getId());
67  }
68  }
69  // check if publication is related to an issue, but has no published date
70  $datePublished = $node->getAttribute('date_published');
71  $issue = $deployment->getIssue();
72  $issue_identification = $node->getElementsByTagName('issue_identification');
73  if (!$datePublished && ($issue || $issue_identification->length)) {
74  $titleNodes = $node->getElementsByTagName('title');
75  $deployment->addError(ASSOC_TYPE_PUBLICATION, $publication->getId(), __('plugins.importexport.native.import.error.publishedDateMissing', array('publicationTitle' => $titleNodes->item(0)->textContent)));
76  }
77 
78  $this->populatePublishedPublication($publication, $node);
79 
80  return parent::populateObject($publication, $node);
81  }
82 
88  function handleChildElement($n, $publication) {
89  switch ($n->tagName) {
90  case 'article_galley':
91  $this->parseArticleGalley($n, $publication);
92  break;
93  case 'issue_identification':
94  // do nothing, because this is done in populatePublishedSubmission
95  break;
96  case 'pages':
97  $publication->setData('pages', $n->textContent);
98  break;
99  case 'covers':
100  import('plugins.importexport.native.filter.NativeFilterHelper');
101  $nativeFilterHelper = new NativeFilterHelper();
102  $nativeFilterHelper->parsePublicationCovers($this, $n, $publication);
103  break;
104  default:
105  parent::handleChildElement($n, $publication);
106  }
107  }
108 
114  function getImportFilter($elementName) {
115  $deployment = $this->getDeployment();
116  $submission = $deployment->getSubmission();
117  switch ($elementName) {
118  case 'article_galley':
119  $importClass='ArticleGalley';
120  break;
121  default:
122  $importClass=null; // Suppress scrutinizer warn
123  $deployment->addWarning(ASSOC_TYPE_SUBMISSION, $submission->getId(), __('plugins.importexport.common.error.unknownElement', array('param' => $elementName)));
124  }
125  // Caps on class name for consistency with imports, whose filter
126  // group names are generated implicitly.
127  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
128  $importFilters = $filterDao->getObjectsByGroup('native-xml=>' . $importClass);
129  $importFilter = array_shift($importFilters);
130  return $importFilter;
131  }
132 
138  function parseArticleGalley($n, $publication) {
139  $importFilter = $this->getImportFilter($n->tagName);
140  assert(isset($importFilter)); // There should be a filter
141 
142  $importFilter->setDeployment($this->getDeployment());
143  $articleGalleyDoc = new DOMDocument();
144  $articleGalleyDoc->appendChild($articleGalleyDoc->importNode($n, true));
145  return $importFilter->execute($articleGalleyDoc);
146  }
147 
154  function populatePublishedPublication($publication, $node) {
155  $deployment = $this->getDeployment();
156 
157  $context = $deployment->getContext();
158  $issue = $deployment->getIssue();
159 
160  if (empty($issue)) {
161  $issueIdentificationNodes = $node->getElementsByTagName('issue_identification');
162 
163  if ($issueIdentificationNodes->length != 1) {
164  $titleNodes = $node->getElementsByTagName('title');
165  $deployment->addError(ASSOC_TYPE_PUBLICATION, $publication->getId(), __('plugins.importexport.native.import.error.issueIdentificationMissing', array('articleTitle' => $titleNodes->item(0)->textContent)));
166  } else {
167  $issueIdentificationNode = $issueIdentificationNodes->item(0);
168  $issue = $this->parseIssueIdentification($publication, $issueIdentificationNode);
169  }
170  }
171 
172  if ($issue) {
173  $publication->setData('issueId', $issue->getId());
174  }
175 
176  return $publication;
177  }
178 
184  function parseIssueIdentification($publication, $node) {
185  $deployment = $this->getDeployment();
186  $context = $deployment->getContext();
187 
188  $vol = $num = $year = null;
189  $titles = array();
190  for ($n = $node->firstChild; $n !== null; $n=$n->nextSibling) {
191  if (is_a($n, 'DOMElement')) {
192  switch ($n->tagName) {
193  case 'volume':
194  $vol = $n->textContent;
195  break;
196  case 'number':
197  $num = $n->textContent;
198  break;
199  case 'year':
200  $year = $n->textContent;
201  break;
202  case 'title':
203  list($locale, $value) = $this->parseLocalizedContent($n);
204  if (empty($locale)) $locale = $context->getPrimaryLocale();
205  $titles[$locale] = $value;
206  break;
207  default:
208  $deployment->addWarning(ASSOC_TYPE_PUBLICATION, $publication->getId(), __('plugins.importexport.common.error.unknownElement', array('param' => $n->tagName)));
209  }
210  }
211  }
212  $issueDao = DAORegistry::getDAO('IssueDAO');
213  $issue = null;
214  $issuesByIdentification = $issueDao->getIssuesByIdentification($context->getId(), $vol, $num, $year, $titles);
215  if ($issuesByIdentification->getCount() != 1) {
216  $deployment->addError(ASSOC_TYPE_PUBLICATION, $publication->getId(), __('plugins.importexport.native.import.error.issueIdentificationMatch', array('issueIdentification' => $node->ownerDocument->saveXML($node))));
217  } else {
218  $issue = $issuesByIdentification->next();
219  }
220 
221  if (!isset($issue)) {
222  $issue = $issueDao->newDataObject();
223 
224  $issue->setVolume($vol);
225  $issue->setNumber($num);
226  $issue->setYear($year);
227  $issue->setShowVolume(1);
228  $issue->setShowNumber(1);
229  $issue->setShowYear(1);
230  $issue->setShowTitle(0);
231  $issue->setCurrent(0);
232  $issue->setPublished(0);
233  $issue->setAccessStatus(0);
234  $issue->setJournalId($context->getId());
235  $issue->setTitle($titles, null);
236 
237  $issueId = $issueDao->insertObject($issue);
238 
239  $issue->setId($issueId);
240  }
241 
242  return $issue;
243  }
244 }
NativeXmlPublicationFilter\populateObject
populateObject($publication, $node)
Definition: NativeXmlPublicationFilter.inc.php:55
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
NativeXmlPublicationFilter\getImportFilter
getImportFilter($elementName)
Definition: NativeXmlPublicationFilter.inc.php:114
NativeXmlPublicationFilter\parseArticleGalley
parseArticleGalley($n, $publication)
Definition: NativeXmlPublicationFilter.inc.php:138
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
NativeImportFilter\parseLocalizedContent
parseLocalizedContent($element)
Definition: NativeImportFilter.inc.php:98
NativeXmlPublicationFilter\getClassName
getClassName()
Definition: NativeXmlPublicationFilter.inc.php:25
NativeXmlPKPPublicationFilter
Base class that converts a Native XML document to a set of publications.
Definition: NativeXmlPKPPublicationFilter.inc.php:18
NativeXmlPublicationFilter\handleChildElement
handleChildElement($n, $publication)
Definition: NativeXmlPublicationFilter.inc.php:88
NativeXmlPublicationFilter
Class that converts a Native XML document to a set of articles.
Definition: NativeXmlPublicationFilter.inc.php:18
NativeXmlPublicationFilter\parseIssueIdentification
parseIssueIdentification($publication, $node)
Definition: NativeXmlPublicationFilter.inc.php:184
NativeXmlPublicationFilter\populatePublishedPublication
populatePublishedPublication($publication, $node)
Definition: NativeXmlPublicationFilter.inc.php:154
NativeXmlPublicationFilter\handleElement
handleElement($node)
Definition: NativeXmlPublicationFilter.inc.php:34
NativeFilterHelper
Class that provides native import/export filter-related helper methods.
Definition: NativeFilterHelper.inc.php:15