Open Journal Systems  3.3.0
NativeXmlPKPPublicationFilter.inc.php
1 <?php
2 
16 import('lib.pkp.plugins.importexport.native.filter.NativeImportFilter');
17 
23  function __construct($filterGroup) {
24  $this->setDisplayName('Native XML publication import');
25  parent::__construct($filterGroup);
26  }
27 
28 
29  //
30  // Implement template methods from PersistableFilter
31  //
35  function getClassName() {
36  return 'lib.pkp.plugins.importexport.native.filter.NativeXmlPKPPublicationFilter';
37  }
38 
39 
40  //
41  // Implement template methods from NativeImportFilter
42  //
47  function getPluralElementName() {
48  return 'publications';
49  }
50 
56  return 'publication';
57  }
58 
63  function handleElement($node) {
64  $deployment = $this->getDeployment();
65  $context = $deployment->getContext();
66 
67  $submission = $deployment->getSubmission();
68 
70  $publicationDao = DAORegistry::getDAO('PublicationDAO');
71  $publication = $publicationDao->newDataObject();
73  $publication->setData('submissionId', $submission->getId());
74 
75  $publication->stampModified();
76  $publication = $this->populateObject($publication, $node);
77 
78  $publicationLocale = $node->getAttribute('locale');
79  if (empty($publicationLocale))
80  $publicationLocale = $context->getPrimaryLocale();
81 
82  $publication->setData('locale', $publicationLocale);
83  $publication->setData('version', $node->getAttribute('version'));
84  $publication->setData('seq', $node->getAttribute('seq'));
85  $publication->setData('accessStatus', $node->getAttribute('access_status'));
86  $publication->setData('status', $node->getAttribute('status'));
87  $publication->setData('primaryContactId', $node->getAttribute('primary_contact_id'));
88  $publication->setData('urlPath', $node->getAttribute('url_path'));
89 
90  $publication = Services::get('publication')->add($publication, Application::get()->getRequest());
91  $deployment->setPublication($publication);
92 
93  for ($n = $node->firstChild; $n !== null; $n=$n->nextSibling) {
94  if (is_a($n, 'DOMElement')) {
95  $this->handleChildElement($n, $publication);
96  }
97  }
98 
99  $publication = Services::get('publication')->edit($publication, array(), Application::get()->getRequest());
100 
101  return $publication;
102  }
103 
110  function populateObject($publication, $node) {
111 
112  if ($datePublished = $node->getAttribute('date_published')) {
113  $publication->setData('datePublished', $datePublished);
114  }
115 
116  return $publication;
117  }
118 
124  function handleChildElement($n, $publication) {
125  $setterMappings = $this->_getLocalizedPublicationFields();
126  $controlledVocabulariesMappings = $this->_getControlledVocabulariesMappings();
127 
128  list($locale, $value) = $this->parseLocalizedContent($n);
129  if (empty($locale)) $locale = $publication->getData('locale');
130 
131  if (in_array($n->tagName, $setterMappings)) {
132  $publication->setData($n->tagName, $value, $locale);
133  } elseif (isset($controlledVocabulariesMappings[$n->tagName])) {
134  $controlledVocabulariesDao = $submissionKeywordDao = DAORegistry::getDAO($controlledVocabulariesMappings[$n->tagName][0]);
135  $insertFunction = $controlledVocabulariesMappings[$n->tagName][1];
136 
137  $controlledVocabulary = array();
138  for ($nc = $n->firstChild; $nc !== null; $nc=$nc->nextSibling) {
139  if (is_a($nc, 'DOMElement')) {
140  $controlledVocabulary[] = $nc->textContent;
141  }
142  }
143 
144  $controlledVocabulariesValues = array();
145  $controlledVocabulariesValues[$locale] = $controlledVocabulary;
146 
147  $controlledVocabulariesDao->$insertFunction($controlledVocabulariesValues, $publication->getId(), false);
148 
149  $publicationNew = Services::get('publication')->get($publication->getId());
150  $publication->setData($n->tagName, $publicationNew->getData($n->tagName));
151  } else switch ($n->tagName) {
152  // Otherwise, delegate to specific parsing code
153  case 'id':
154  $this->parseIdentifier($n, $publication);
155  break;
156  case 'authors':
157  $this->parseAuthors($n, $publication);
158  break;
159  case 'citations':
160  $this->parseCitations($n, $publication);
161  break;
162  case 'copyrightYear':
163  $publication->setData('copyrightYear', $n->textContent);
164  break;
165  case 'licenseUrl':
166  $publication->setData('licenseUrl', $n->textContent);
167  break;
168  default:
169  $deployment = $this->getDeployment();
170  $deployment->addWarning(ASSOC_TYPE_PUBLICATION, $publication->getId(), __('plugins.importexport.common.error.unknownElement', array('param' => $n->tagName)));
171  }
172  }
173 
174  //
175  // Element parsing
176  //
182  function parseIdentifier($element, $publication) {
183  $deployment = $this->getDeployment();
184  $submission = $deployment->getSubmission();
185 
186  $advice = $element->getAttribute('advice');
187  switch ($element->getAttribute('type')) {
188  case 'internal':
189  // "update" advice not supported yet.
190  assert(!$advice || $advice == 'ignore');
191 
192  if ($element->textContent == $submission->getData('currentPublicationId')) {
193  $submission->setData('currentPublicationId', $publication->getId());
194  }
195 
196  break;
197  case 'public':
198  if ($advice == 'update') {
199  $publication->setData('pub-id::publisher-id', $element->textContent);
200  }
201  break;
202  default:
203  if ($advice == 'update') {
204  $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true, $deployment->getContext()->getId());
205  $publication->setData('pub-id::'.$element->getAttribute('type'), $element->textContent);
206  }
207  }
208  }
209 
215  function parseAuthors($node, $publication) {
216  for ($n = $node->firstChild; $n !== null; $n=$n->nextSibling) {
217  if (is_a($n, 'DOMElement')) {
218  assert($n->tagName == 'author');
219  $this->parseAuthor($n, $publication);
220  }
221  }
222  }
223 
229  function parseAuthor($n, $publication) {
230  $filterDao = DAORegistry::getDAO('FilterDAO');
231  $importFilters = $filterDao->getObjectsByGroup('native-xml=>author');
232  assert(count($importFilters)==1); // Assert only a single unserialization filter
233  $importFilter = array_shift($importFilters);
234  $importFilter->setDeployment($this->getDeployment());
235  $authorDoc = new DOMDocument();
236  $authorDoc->appendChild($authorDoc->importNode($n, true));
237  return $importFilter->execute($authorDoc);
238  }
239 
245  function parseCitations($n, $publication) {
246  $publicationId = $publication->getId();
247  $citationsString = $n->textContent;
248  $citationDao = DAORegistry::getDAO('CitationDAO');
249  $citationDao->importCitations($publicationId, $citationsString);
250  }
251 
252  //
253  // Helper functions
254  //
260  return array(
261  'title',
262  'prefix',
263  'subtitle',
264  'abstract',
265  'coverage',
266  'type',
267  'source',
268  'rights',
269  'copyrightHolder',
270  );
271  }
272 
278  return array(
279  'keywords' => array('SubmissionKeywordDAO', 'insertKeywords'),
280  'agencies' => array('SubmissionAgencyDAO', 'insertAgencies'),
281  'disciplines' => array('SubmissionDisciplineDAO', 'insertDisciplines'),
282  'subjects' => array('SubmissionSubjectDAO', 'insertSubjects'),
283  );
284  }
285 
291  assert(false); // Subclasses must override
292  }
293 
299  function getImportFilter($elementName) {
300  assert(false); // Subclasses should override
301  }
302 }
303 
304 
NativeXmlPKPPublicationFilter\_getControlledVocabulariesMappings
_getControlledVocabulariesMappings()
Definition: NativeXmlPKPPublicationFilter.inc.php:277
NativeXmlPKPPublicationFilter\getRepresentationExportFilterGroupName
getRepresentationExportFilterGroupName()
Definition: NativeXmlPKPPublicationFilter.inc.php:290
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
NativeXmlPKPPublicationFilter\populateObject
populateObject($publication, $node)
Definition: NativeXmlPKPPublicationFilter.inc.php:110
NativeXmlPKPPublicationFilter\_getLocalizedPublicationFields
_getLocalizedPublicationFields()
Definition: NativeXmlPKPPublicationFilter.inc.php:259
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
NativeXmlPKPPublicationFilter\getImportFilter
getImportFilter($elementName)
Definition: NativeXmlPKPPublicationFilter.inc.php:299
NativeXmlPKPPublicationFilter\handleElement
handleElement($node)
Definition: NativeXmlPKPPublicationFilter.inc.php:63
NativeImportFilter\parseLocalizedContent
parseLocalizedContent($element)
Definition: NativeImportFilter.inc.php:98
NativeXmlPKPPublicationFilter\handleChildElement
handleChildElement($n, $publication)
Definition: NativeXmlPKPPublicationFilter.inc.php:124
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
NativeXmlPKPPublicationFilter
Base class that converts a Native XML document to a set of publications.
Definition: NativeXmlPKPPublicationFilter.inc.php:18
NativeImportFilter
Base class that converts a Native XML document to a DataObject.
Definition: NativeImportFilter.inc.php:18
NativeXmlPKPPublicationFilter\parseAuthor
parseAuthor($n, $publication)
Definition: NativeXmlPKPPublicationFilter.inc.php:229
NativeXmlPKPPublicationFilter\getClassName
getClassName()
Definition: NativeXmlPKPPublicationFilter.inc.php:35
NativeXmlPKPPublicationFilter\parseCitations
parseCitations($n, $publication)
Definition: NativeXmlPKPPublicationFilter.inc.php:245
NativeXmlPKPPublicationFilter\parseIdentifier
parseIdentifier($element, $publication)
Definition: NativeXmlPKPPublicationFilter.inc.php:182
NativeXmlPKPPublicationFilter\getPluralElementName
getPluralElementName()
Definition: NativeXmlPKPPublicationFilter.inc.php:47
NativeXmlPKPPublicationFilter\parseAuthors
parseAuthors($node, $publication)
Definition: NativeXmlPKPPublicationFilter.inc.php:215
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
NativeXmlPKPPublicationFilter\getSingularElementName
getSingularElementName()
Definition: NativeXmlPKPPublicationFilter.inc.php:55
NativeXmlPKPPublicationFilter\__construct
__construct($filterGroup)
Definition: NativeXmlPKPPublicationFilter.inc.php:23
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49