Open Journal Systems  3.3.0
DataObject.inc.php
1 <?php
2 
18 class DataObject {
20  var $_data = array();
21 
23  var $_hasLoadableAdapters = false;
24 
26  var $_metadataExtractionAdapters = array();
27 
30 
32  var $_metadataInjectionAdapters = array();
33 
36 
40  public function __construct() { }
41 
42 
43  //
44  // Getters and Setters
45  //
53  public function getLocalizedData($key, $preferredLocale = null) {
54  $localePrecedence = AppLocale::getLocalePrecedence();
55  foreach ($localePrecedence as $locale) {
56  $value =& $this->getData($key, $locale);
57  if (!empty($value)) return $value;
58  unset($value);
59  }
60 
61  // Fallback: Get the first available piece of data.
62  $data =& $this->getData($key, null);
63  if (!empty($data)) {
64  // WARNING: Collapsing the following into a single line causes PHP 5.0.5 to die.
65  $locales = array_keys($data);
66  $firstLocale = array_shift($locales);
67  return $data[$firstLocale];
68  }
69 
70  // No data available; return null.
71  unset($data);
72  $data = null;
73  return $data;
74  }
75 
82  public function &getData($key, $locale = null) {
83  if (is_null($locale)) {
84  if (array_key_exists($key, $this->_data)) {
85  return $this->_data[$key];
86  }
87  } else {
88  // see http://bugs.php.net/bug.php?id=29848
89  if (array_key_exists($key, $this->_data) && is_array($this->_data[$key]) && array_key_exists($locale, $this->_data[$key])) {
90  return $this->_data[$key][$locale];
91  }
92  }
93  $nullVar = null;
94  return $nullVar;
95  }
96 
114  public function setData($key, $value, $locale = null) {
115  if (is_null($locale)) {
116  // This is either a non-localized value or we're
117  // passing in all locales at once.
118  if (is_null($value)) {
119  if (array_key_exists($key, $this->_data)) unset($this->_data[$key]);
120  } else {
121  $this->_data[$key] = $value;
122  }
123  } else {
124  // (Un-)set a single localized value.
125  if (is_null($value)) {
126  // see http://bugs.php.net/bug.php?id=29848
127  if (array_key_exists($key, $this->_data)) {
128  if (is_array($this->_data[$key]) && array_key_exists($locale, $this->_data[$key])) unset($this->_data[$key][$locale]);
129  // Was this the last entry for the data variable?
130  if (empty($this->_data[$key])) unset($this->_data[$key]);
131  }
132  } else {
133  $this->_data[$key][$locale] = $value;
134  }
135  }
136  }
137 
145  public function unsetData($key, $locale = null) {
146  if (is_null($locale)) {
147  unset($this->_data[$key]);
148  } else {
149  unset($this->_data[$key][$locale]);
150  }
151  }
152 
159  public function hasData($key, $locale = null) {
160  if (is_null($locale)) {
161  return array_key_exists($key, $this->_data);
162  } else {
163  // see http://bugs.php.net/bug.php?id=29848
164  return array_key_exists($key, $this->_data) && is_array($this->_data[$key]) && array_key_exists($locale, $this->_data[$key]);
165  }
166  }
167 
172  public function &getAllData() {
173  return $this->_data;
174  }
175 
180  public function setAllData(&$data) {
181  $this->_data =& $data;
182  }
183 
188  public function getId() {
189  return $this->getData('id');
190  }
191 
196  public function setId($id) {
197  $this->setData('id', $id);
198  }
199 
200 
201  //
202  // Public helper methods
203  //
221  public function upcastTo($targetObject) {
222  // Copy data from the source to the target.
223  $targetObject->setAllData($this->getAllData());
224 
225  // Return the upcast object.
226  return $targetObject;
227  }
228 
229 
230  //
231  // MetadataProvider interface implementation
232  //
237  public function setHasLoadableAdapters($hasLoadableAdapters) {
238  $this->_hasLoadableAdapters = $hasLoadableAdapters;
239  }
240 
245  public function getHasLoadableAdapters() {
247  }
248 
255  public function addSupportedMetadataAdapter($metadataAdapter) {
256  $metadataSchemaName = $metadataAdapter->getMetadataSchemaName();
257  assert(!empty($metadataSchemaName));
258 
259  // NB: Some adapters are injectors and extractors at the same time,
260  // notably the meta-data description dummy adapter that converts
261  // from/to a meta-data description. That's why we have to check
262  // input and output type separately.
263 
264  // Is this a meta-data extractor?
265  $inputType = $metadataAdapter->getInputType();
266  if ($inputType->checkType($this)) {
267  if (!isset($this->_metadataExtractionAdapters[$metadataSchemaName])) {
268  $this->_metadataExtractionAdapters[$metadataSchemaName] = $metadataAdapter;
269  }
270  }
271 
272  // Is this a meta-data injector?
273  $outputType = $metadataAdapter->getOutputType();
274  if ($outputType->checkType($this)) {
275  if (!isset($this->_metadataInjectionAdapters[$metadataSchemaName])) {
276  $this->_metadataInjectionAdapters[$metadataSchemaName] = $metadataAdapter;
277  }
278  }
279  }
280 
288  public function removeSupportedMetadataAdapter($metadataSchemaName) {
289  $result = false;
290  if (isset($this->_metadataExtractionAdapters[$metadataSchemaName])) {
291  unset($this->_metadataExtractionAdapters[$metadataSchemaName]);
292  $result = true;
293  }
294  if (isset($this->_metadataInjectionAdapters[$metadataSchemaName])) {
295  unset($this->_metadataInjectionAdapters[$metadataSchemaName]);
296  $result = true;
297  }
298  return $result;
299  }
300 
307  public function getSupportedExtractionAdapters() {
308  // Load meta-data adapters from the database.
309  if ($this->getHasLoadableAdapters() && !$this->_extractionAdaptersLoaded) {
310  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
311  $loadedAdapters = $filterDao->getObjectsByTypeDescription('class::%', 'metadata::%', $this);
312  foreach($loadedAdapters as $loadedAdapter) {
313  $this->addSupportedMetadataAdapter($loadedAdapter);
314  }
315  $this->_extractionAdaptersLoaded = true;
316  }
317 
319  }
320 
327  public function getSupportedInjectionAdapters() {
328  // Load meta-data adapters from the database.
329  if ($this->getHasLoadableAdapters() && !$this->_injectionAdaptersLoaded) {
330  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
331  $loadedAdapters = $filterDao->getObjectsByTypeDescription('metadata::%', 'class::%', $this, false);
332  foreach($loadedAdapters as $loadedAdapter) {
333  $this->addSupportedMetadataAdapter($loadedAdapter);
334  }
335  $this->_injectionAdaptersLoaded = true;
336  }
337 
339  }
340 
346  public function getSupportedMetadataSchemas() {
347  $supportedMetadataSchemas = array();
348  $extractionAdapters = $this->getSupportedExtractionAdapters();
349  foreach($extractionAdapters as $metadataAdapter) {
350  $supportedMetadataSchemas[] = $metadataAdapter->getMetadataSchema();
351  }
352  return $supportedMetadataSchemas;
353  }
354 
361  public function getMetadataFieldNames($translated = true) {
362  // Create a list of all possible meta-data field names
363  $metadataFieldNames = array();
364  $extractionAdapters = $this->getSupportedExtractionAdapters();
365  foreach($extractionAdapters as $metadataAdapter) {
366  // Add the field names from the current adapter
367  $metadataFieldNames = array_merge(
368  $metadataFieldNames,
369  $metadataAdapter->getDataObjectMetadataFieldNames($translated)
370  );
371  }
372  return array_unique($metadataFieldNames);
373  }
374 
383  public function getSetMetadataFieldNames($translated = true) {
384  // Retrieve a list of all possible meta-data field names
385  $metadataFieldNameCandidates = $this->getMetadataFieldNames($translated);
386 
387  // Only retain those fields that have data
388  $metadataFieldNames = array();
389  foreach($metadataFieldNameCandidates as $metadataFieldNameCandidate) {
390  if($this->hasData($metadataFieldNameCandidate)) {
391  $metadataFieldNames[] = $metadataFieldNameCandidate;
392  }
393  }
394  return $metadataFieldNames;
395  }
396 
402  public function getLocaleMetadataFieldNames() {
403  return $this->getMetadataFieldNames(true);
404  }
405 
411  public function getAdditionalMetadataFieldNames() {
412  return $this->getMetadataFieldNames(false);
413  }
414 
422  public function injectMetadata($metadataDescription) {
423  $dataObject = null;
424  $metadataSchemaName = $metadataDescription->getMetadataSchemaName();
425  $injectionAdapters = $this->getSupportedInjectionAdapters();
426  if(isset($injectionAdapters[$metadataSchemaName])) {
427  // Get the meta-data adapter that supports the
428  // given meta-data description's schema.
429  $metadataAdapter = $injectionAdapters[$metadataSchemaName]; /* @var $metadataAdapter MetadataDataObjectAdapter */
430 
431  // Pass in a reference to the data object which
432  // the filter will use to update the current instance
433  // of the data object.
434  $metadataAdapter->setTargetDataObject($this);
435 
436  // Use adapter filter to convert from a meta-data
437  // description to a data object.
438  $dataObject = $metadataAdapter->execute($metadataDescription);
439  }
440  return $dataObject;
441  }
442 
449  public function extractMetadata($metadataSchema) {
450  $metadataDescription = null;
451  $metadataSchemaName = $metadataSchema->getClassName();
452  $extractionAdapters = $this->getSupportedExtractionAdapters();
453  if(isset($extractionAdapters[$metadataSchemaName])) {
454  // Get the meta-data adapter that supports the
455  // given meta-data description's schema.
456  $metadataAdapter = $extractionAdapters[$metadataSchemaName];
457 
458  // Use adapter filter to convert from a data object
459  // to a meta-data description.
460  $metadataDescription = $metadataAdapter->execute($this);
461  }
462  return $metadataDescription;
463  }
464 
469  public function getDAO() {
470  assert(false);
471  }
472 }
473 
DataObject\getMetadataFieldNames
getMetadataFieldNames($translated=true)
Definition: DataObject.inc.php:379
DataObject\getDAO
getDAO()
Definition: DataObject.inc.php:487
DataObject\getData
& getData($key, $locale=null)
Definition: DataObject.inc.php:100
DataObject\getSupportedMetadataSchemas
getSupportedMetadataSchemas()
Definition: DataObject.inc.php:364
DataObject\getLocalizedData
getLocalizedData($key, $preferredLocale=null)
Definition: DataObject.inc.php:71
DataObject\$_metadataExtractionAdapters
$_metadataExtractionAdapters
Definition: DataObject.inc.php:35
DataObject\getSupportedInjectionAdapters
getSupportedInjectionAdapters()
Definition: DataObject.inc.php:345
DataObject\getSupportedExtractionAdapters
getSupportedExtractionAdapters()
Definition: DataObject.inc.php:325
DataObject
Any class with an associated DAO should extend this class.
Definition: DataObject.inc.php:18
DataObject\setAllData
setAllData(&$data)
Definition: DataObject.inc.php:198
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
DataObject\addSupportedMetadataAdapter
addSupportedMetadataAdapter($metadataAdapter)
Definition: DataObject.inc.php:273
DataObject\$_data
$_data
Definition: DataObject.inc.php:23
DataObject\$_injectionAdaptersLoaded
$_injectionAdaptersLoaded
Definition: DataObject.inc.php:53
DataObject\$_metadataInjectionAdapters
$_metadataInjectionAdapters
Definition: DataObject.inc.php:47
DataObject\upcastTo
upcastTo($targetObject)
Definition: DataObject.inc.php:239
DataObject\hasData
hasData($key, $locale=null)
Definition: DataObject.inc.php:177
DataObject\$_extractionAdaptersLoaded
$_extractionAdaptersLoaded
Definition: DataObject.inc.php:41
DataObject\getLocaleMetadataFieldNames
getLocaleMetadataFieldNames()
Definition: DataObject.inc.php:420
DataObject\removeSupportedMetadataAdapter
removeSupportedMetadataAdapter($metadataSchemaName)
Definition: DataObject.inc.php:306
DataObject\__construct
__construct()
Definition: DataObject.inc.php:58
DataObject\getAdditionalMetadataFieldNames
getAdditionalMetadataFieldNames()
Definition: DataObject.inc.php:429
DataObject\unsetData
unsetData($key, $locale=null)
Definition: DataObject.inc.php:163
DataObject\getSetMetadataFieldNames
getSetMetadataFieldNames($translated=true)
Definition: DataObject.inc.php:401
DataObject\$_hasLoadableAdapters
$_hasLoadableAdapters
Definition: DataObject.inc.php:29
DataObject\setHasLoadableAdapters
setHasLoadableAdapters($hasLoadableAdapters)
Definition: DataObject.inc.php:255
DataObject\setId
setId($id)
Definition: DataObject.inc.php:214
DataObject\getId
getId()
Definition: DataObject.inc.php:206
DataObject\extractMetadata
extractMetadata($metadataSchema)
Definition: DataObject.inc.php:467
DataObject\injectMetadata
injectMetadata($metadataDescription)
Definition: DataObject.inc.php:440
DataObject\getHasLoadableAdapters
getHasLoadableAdapters()
Definition: DataObject.inc.php:263
DataObject\setData
setData($key, $value, $locale=null)
Definition: DataObject.inc.php:132
AppLocale\getLocalePrecedence
static getLocalePrecedence()
Definition: env1/MockAppLocale.inc.php:64
DataObject\getAllData
& getAllData()
Definition: DataObject.inc.php:190