Open Journal Systems  3.3.0
MetadataDataObjectAdapter.inc.php
1 <?php
2 
23 import('lib.pkp.classes.filter.PersistableFilter');
24 import('lib.pkp.classes.metadata.MetadataDescription');
25 
26 define('METADATA_DOA_INJECTION_MODE', 0x01);
27 define('METADATA_DOA_EXTRACTION_MODE', 0x02);
28 
31  var $_mode;
32 
35 
38 
41 
44 
47 
49  var $_dataObjectName;
50 
55  function __construct($filterGroup, $mode = null) {
56  // Initialize the adapter.
57  parent::__construct($filterGroup);
58 
59  // Extract information from the input/output types.
60 
61  // Find out whether this filter is injecting or
62  // extracting meta-data.
63  $metadataTypeDescription = null; /* @var $metadataTypeDescription MetadataTypeDescription */
64  $dataObjectTypeDescription = null; /* @var $dataObjectTypeDescription ClassTypeDescription */
65  $inputType =& $this->getInputType();
66  $outputType =& $this->getOutputType();
67  if (is_null($mode)) {
68  if (is_a($inputType, 'MetadataTypeDescription')) {
69  $mode = METADATA_DOA_INJECTION_MODE;
70  } else {
71  $mode = METADATA_DOA_EXTRACTION_MODE;
72  }
73  }
74  $this->_mode = $mode;
75 
76  if ($mode == METADATA_DOA_INJECTION_MODE) {
77  // We are in meta-data injection mode (or both input and output are meta-data descriptions).
78  $metadataTypeDescription =& $inputType; /* @var $metadataTypeDescription MetadataTypeDescription */
79  assert(is_a($outputType, 'ClassTypeDescription'));
80  $dataObjectTypeDescription =& $outputType; /* @var $dataObjectTypeDescription ClassTypeDescription */
81  } else {
82  // We are in meta-data extraction mode.
83  assert(is_a($outputType, 'MetadataTypeDescription'));
84  $metadataTypeDescription =& $outputType;
85  assert(is_a($inputType, 'ClassTypeDescription'));
86  $dataObjectTypeDescription =& $inputType;
87  }
88 
89  // Extract information from the input/output types.
90  $this->_metadataSchemaName = $metadataTypeDescription->getMetadataSchemaClass();
91  $this->_assocType = $metadataTypeDescription->getAssocType();
92  $this->_dataObjectName = $dataObjectTypeDescription->getTypeName();
93 
94  // Set the display name.
95  if ($mode == METADATA_DOA_INJECTION_MODE) {
96  $this->setDisplayName('Inject metadata into a(n) '.$this->getDataObjectClass());
97  } else {
98  $this->setDisplayName('Extract metadata from a(n) '.$this->getDataObjectClass());
99  }
100  }
101 
102  //
103  // Getters and setters
104  //
109  function getMode() {
110  return $this->_mode;
111  }
112 
118  function getMetadataSchemaName() {
120  }
121 
126  function &getMetadataSchema() {
127  // Lazy-load the meta-data schema if this has
128  // not been done before.
129  if (is_null($this->_metadataSchema)) {
130  $metadataSchemaName = $this->getMetadataSchemaName();
131  assert(!is_null($metadataSchemaName));
132  $this->_metadataSchema =& instantiate($metadataSchemaName, 'MetadataSchema');
133  assert(is_object($this->_metadataSchema));
134  }
135  return $this->_metadataSchema;
136  }
137 
143  function getMetadataNamespace() {
144  $metadataSchema =& $this->getMetadataSchema();
145  return $metadataSchema->getNamespace();
146  }
147 
152  function getDataObjectName() {
153  return $this->_dataObjectName;
154  }
155 
162  function getDataObjectClass() {
163  if (is_null($this->_dataObjectClass)) {
164  $dataObjectName = $this->getDataObjectName();
165  assert(!is_null($dataObjectName));
166  $dataObjectNameParts = explode('.', $dataObjectName);
167  $this->_dataObjectClass = array_pop($dataObjectNameParts);
168  }
170  }
171 
177  function getAssocType() {
178  return $this->_assocType;
179  }
180 
185  function setTargetDataObject(&$targetDataObject) {
186  $this->_targetDataObject =& $targetDataObject;
187  }
188 
193  function &getTargetDataObject() {
194  return $this->_targetDataObject;
195  }
196 
197 
198  //
199  // Abstract template methods
200  //
207  function &injectMetadataIntoDataObject(&$metadataDescription, &$targetDataObject) {
208  // Must be implemented by sub-classes
209  assert(false);
210  }
211 
217  function extractMetadataFromDataObject(&$sourceDataObject) {
218  // Must be implemented by sub-classes
219  assert(false);
220  }
221 
233  function getDataObjectMetadataFieldNames($translated = true) {
234  // By default return all field names
235  return $this->getMetadataFieldNames($translated);
236  }
237 
238 
239  //
240  // Implement template methods from Filter
241  //
249  function &process(&$input) {
250  // Do we inject or extract metadata?
251  switch ($this->getMode()) {
252  case METADATA_DOA_INJECTION_MODE:
253  $targetDataObject =& $this->getTargetDataObject();
254 
255  // Instantiate a new data object if none was given.
256  if (is_null($targetDataObject)) {
257  $targetDataObject =& $this->instantiateDataObject();
258  assert(is_a($targetDataObject, $this->getDataObjectName()));
259  }
260 
261  // Inject meta-data into the data object.
262  $output =& $this->injectMetadataIntoDataObject($input, $targetDataObject);
263  break;
264 
265  case METADATA_DOA_EXTRACTION_MODE:
266  $output = $this->extractMetadataFromDataObject($input);
267  break;
268 
269  default:
270  // Input should be validated by now.
271  assert(false);
272  }
273 
274  return $output;
275  }
276 
277 
278  //
279  // Protected helper methods
280  //
291  function &instantiateDataObject() {
292  $dataObjectName = $this->getDataObjectName();
293  assert(!is_null($dataObjectName));
294  $dataObject =& instantiate($dataObjectName, $this->getDataObjectClass());
295  return $dataObject;
296  }
297 
303  function &instantiateMetadataDescription() {
304  $metadataDescription = new MetadataDescription($this->getMetadataSchemaName(), $this->getAssocType());
305  return $metadataDescription;
306  }
307 
315  function getMetadataFieldNames($translated = true) {
316  // Do we need to build the field name cache first?
317  if (is_null($this->_metadataFieldNames)) {
318  // Initialize the cache array
319  $this->_metadataFieldNames = array();
320 
321  // Retrieve all properties and add
322  // their names to the cache
323  $metadataSchema =& $this->getMetadataSchema();
324  $metadataSchemaNamespace = $metadataSchema->getNamespace();
325  $properties =& $metadataSchema->getProperties();
326  foreach($properties as $property) {
327  $propertyAssocTypes = $property->getAssocTypes();
328  if (in_array($this->_assocType, $propertyAssocTypes)) {
329  // Separate translated and non-translated property names
330  // and add the name space so that field names are unique
331  // across various meta-data schemas.
332  $this->_metadataFieldNames[$property->getTranslated()][] = $metadataSchemaNamespace.':'.$property->getName();
333  }
334  }
335  }
336 
337  // Return the field names
338  return $this->_metadataFieldNames[$translated];
339  }
340 
347  function addLocalizedStatements(&$metadataDescription, $propertyName, $localizedValues) {
348  if (is_array($localizedValues)) {
349  foreach ($localizedValues as $locale => $values) {
350  // Handle cardinality "many" and "one" in the same way.
351  if (is_scalar($values)) $values = array($values);
352  foreach($values as $value) {
353  $metadataDescription->addStatement($propertyName, $value, $locale);
354  unset($value);
355  }
356  }
357  }
358  }
359 
367  function injectUnmappedDataObjectMetadataFields(&$metadataDescription, &$dataObject) {
368  // Handle translated and non-translated statements separately.
369  foreach(array(true, false) as $translated) {
370  // Retrieve the unmapped fields.
371  foreach($this->getDataObjectMetadataFieldNames($translated) as $unmappedProperty) {
372  // Identify the corresponding property name.
373  list($namespace, $propertyName) = explode(':', $unmappedProperty);
374 
375  // Find out whether we have a statement for this unmapped property.
376  if ($metadataDescription->hasStatement($propertyName)) {
377  // Add the unmapped statement directly to the
378  // data object.
379  if ($translated) {
380  $dataObject->setData($unmappedProperty, $metadataDescription->getStatementTranslations($propertyName));
381  } else {
382  $dataObject->setData($unmappedProperty, $metadataDescription->getStatement($propertyName));
383  }
384  }
385  }
386  }
387  }
388 
395  function extractUnmappedDataObjectMetadataFields(&$dataObject, &$metadataDescription) {
396  $metadataSchema =& $this->getMetadataSchema();
397  $handledNamespace = $metadataSchema->getNamespace();
398 
399  // Handle translated and non-translated statements separately.
400  foreach(array(true, false) as $translated) {
401  // Retrieve the unmapped fields.
402  foreach($this->getDataObjectMetadataFieldNames($translated) as $unmappedProperty) {
403  // Find out whether we have a statement for this unmapped property.
404  if ($dataObject->hasData($unmappedProperty)) {
405  // Identify the corresponding property name and namespace.
406  list($namespace, $propertyName) = explode(':', $unmappedProperty);
407 
408  // Only extract data if the namespace of the property
409  // is the same as the one handled by this adapter and the
410  // property is within the current description.
411  if ($namespace == $handledNamespace && $metadataSchema->hasProperty($propertyName)) {
412  // Add the unmapped statement to the metadata description.
413  if ($translated) {
414  $this->addLocalizedStatements($metadataDescription, $propertyName, $dataObject->getData($unmappedProperty));
415  } else {
416  $metadataDescription->addStatement($propertyName, $dataObject->getData($unmappedProperty));
417  }
418  }
419  }
420  }
421  }
422  }
423 }
424 
MetadataDataObjectAdapter\getAssocType
getAssocType()
Definition: MetadataDataObjectAdapter.inc.php:198
MetadataDataObjectAdapter\$_dataObjectName
$_dataObjectName
Definition: MetadataDataObjectAdapter.inc.php:70
instantiate
& instantiate($fullyQualifiedClassName, $expectedTypes=null, $expectedPackages=null, $expectedMethods=null, $constructorArg=null)
Definition: functions.inc.php:165
MetadataDataObjectAdapter\getMetadataFieldNames
getMetadataFieldNames($translated=true)
Definition: MetadataDataObjectAdapter.inc.php:336
MetadataDataObjectAdapter\getDataObjectMetadataFieldNames
getDataObjectMetadataFieldNames($translated=true)
Definition: MetadataDataObjectAdapter.inc.php:254
MetadataDataObjectAdapter\addLocalizedStatements
addLocalizedStatements(&$metadataDescription, $propertyName, $localizedValues)
Definition: MetadataDataObjectAdapter.inc.php:368
Filter\getOutputType
& getOutputType()
Definition: Filter.inc.php:217
MetadataDataObjectAdapter\injectMetadataIntoDataObject
& injectMetadataIntoDataObject(&$metadataDescription, &$targetDataObject)
Definition: MetadataDataObjectAdapter.inc.php:228
Filter\getInputType
& getInputType()
Definition: Filter.inc.php:209
MetadataDataObjectAdapter\getMode
getMode()
Definition: MetadataDataObjectAdapter.inc.php:130
MetadataDataObjectAdapter\$_metadataSchemaName
$_metadataSchemaName
Definition: MetadataDataObjectAdapter.inc.php:58
MetadataDataObjectAdapter
Class that injects/extracts a meta-data description into/from an application entity object (DataObjec...
Definition: MetadataDataObjectAdapter.inc.php:29
MetadataDataObjectAdapter\instantiateMetadataDescription
& instantiateMetadataDescription()
Definition: MetadataDataObjectAdapter.inc.php:324
MetadataDataObjectAdapter\injectUnmappedDataObjectMetadataFields
injectUnmappedDataObjectMetadataFields(&$metadataDescription, &$dataObject)
Definition: MetadataDataObjectAdapter.inc.php:388
MetadataDataObjectAdapter\extractMetadataFromDataObject
extractMetadataFromDataObject(&$sourceDataObject)
Definition: MetadataDataObjectAdapter.inc.php:238
MetadataDataObjectAdapter\$_metadataFieldNames
$_metadataFieldNames
Definition: MetadataDataObjectAdapter.inc.php:52
MetadataDataObjectAdapter\setTargetDataObject
setTargetDataObject(&$targetDataObject)
Definition: MetadataDataObjectAdapter.inc.php:206
DataObject\__construct
__construct()
Definition: DataObject.inc.php:58
MetadataDataObjectAdapter\$_mode
$_mode
Definition: MetadataDataObjectAdapter.inc.php:34
MetadataDataObjectAdapter\$_dataObjectClass
$_dataObjectClass
Definition: MetadataDataObjectAdapter.inc.php:46
MetadataDataObjectAdapter\getDataObjectClass
getDataObjectClass()
Definition: MetadataDataObjectAdapter.inc.php:183
MetadataDataObjectAdapter\getMetadataSchema
& getMetadataSchema()
Definition: MetadataDataObjectAdapter.inc.php:147
MetadataDataObjectAdapter\getMetadataNamespace
getMetadataNamespace()
Definition: MetadataDataObjectAdapter.inc.php:164
MetadataDataObjectAdapter\instantiateDataObject
& instantiateDataObject()
Definition: MetadataDataObjectAdapter.inc.php:312
MetadataDescription
Class modeling a description (DCMI abstract model) or subject- predicate-object graph (RDF)....
Definition: MetadataDescription.inc.php:109
MetadataDataObjectAdapter\__construct
__construct($filterGroup, $mode=null)
Definition: MetadataDataObjectAdapter.inc.php:76
MetadataDataObjectAdapter\getTargetDataObject
& getTargetDataObject()
Definition: MetadataDataObjectAdapter.inc.php:214
MetadataDataObjectAdapter\$_assocType
$_assocType
Definition: MetadataDataObjectAdapter.inc.php:64
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
MetadataDataObjectAdapter\getMetadataSchemaName
getMetadataSchemaName()
Definition: MetadataDataObjectAdapter.inc.php:139
MetadataDataObjectAdapter\process
& process(&$input)
Definition: MetadataDataObjectAdapter.inc.php:270
MetadataDataObjectAdapter\$_metadataSchema
$_metadataSchema
Definition: MetadataDataObjectAdapter.inc.php:40
MetadataDataObjectAdapter\extractUnmappedDataObjectMetadataFields
extractUnmappedDataObjectMetadataFields(&$dataObject, &$metadataDescription)
Definition: MetadataDataObjectAdapter.inc.php:416
MetadataDataObjectAdapter\getDataObjectName
getDataObjectName()
Definition: MetadataDataObjectAdapter.inc.php:173
PersistableFilter
A filter that can be persisted to the database.
Definition: PersistableFilter.inc.php:44