Open Monograph Press  3.3.0
Filter.inc.php
1 <?php
75 import('lib.pkp.classes.core.DataObject');
76 import('lib.pkp.classes.filter.TypeDescriptionFactory');
77 
78 class Filter extends DataObject {
80  var $_inputType;
81 
84 
86  var $_input;
87 
89  var $_output;
90 
92  var $_errors = array();
93 
98  var $_runtimeEnvironment = false;
99 
109  function __construct($inputType, $outputType) {
110  // Initialize the filter.
111  parent::__construct();
112  $this->setTransformationType($inputType, $outputType);
113  }
114 
115  //
116  // Setters and Getters
117  //
122  function setDisplayName($displayName) {
123  $this->setData('displayName', $displayName);
124  }
125 
137  function getDisplayName() {
138  if (!$this->hasData('displayName')) {
139  $this->setData('displayName', get_class($this));
140  }
141 
142  return $this->getData('displayName');
143  }
144 
149  function setSequence($seq) {
150  $this->setData('seq', $seq);
151  }
152 
157  function getSequence() {
158  return $this->getData('seq');
159  }
160 
169  function setTransformationType(&$inputType, &$outputType) {
170  $typeDescriptionFactory = TypeDescriptionFactory::getInstance();
171 
172  // Instantiate the type descriptions if we got string input.
173  if (!is_a($inputType, 'TypeDescription')) {
174  assert(is_string($inputType));
175  $inputType = $typeDescriptionFactory->instantiateTypeDescription($inputType);
176  }
177  if (!is_a($outputType, 'TypeDescription')) {
178  assert(is_string($outputType));
179  $outputType = $typeDescriptionFactory->instantiateTypeDescription($outputType);
180  }
181 
182  $this->_inputType = $inputType;
183  $this->_outputType = $outputType;
184  }
185 
186 
191  function &getInputType() {
192  return $this->_inputType;
193  }
194 
199  function &getOutputType() {
200  return $this->_outputType;
201  }
202 
219  function &getLastOutput() {
220  return $this->_output;
221  }
222 
239  function &getLastInput() {
240  return $this->_input;
241  }
242 
247  function addError($message) {
248  $this->_errors[] = $message;
249  }
250 
255  function getErrors() {
256  return $this->_errors;
257  }
258 
263  function hasErrors() {
264  return (!empty($this->_errors));
265  }
266 
270  function clearErrors() {
271  $this->_errors = array();
272  }
273 
278  function setRuntimeEnvironment(&$runtimeEnvironment) {
279  assert(is_a($runtimeEnvironment, 'RuntimeEnvironment'));
280  $this->_runtimeEnvironment =& $runtimeEnvironment;
281 
282  // Inject the runtime settings into the data object
283  // for persistence.
284  $runtimeSettings = $this->supportedRuntimeEnvironmentSettings();
285  foreach($runtimeSettings as $runtimeSetting => $defaultValue) {
286  $methodName = 'get'.PKPString::ucfirst($runtimeSetting);
287  $this->setData($runtimeSetting, $runtimeEnvironment->$methodName());
288  }
289  }
290 
295  function &getRuntimeEnvironment() {
297  }
298 
299 
300  //
301  // Abstract template methods to be implemented by subclasses
302  //
310  function &process(&$input) {
311  assert(false);
312  }
313 
314  //
315  // Public methods
316  //
340  function supports(&$input, &$output) {
341  // Validate input
342  $inputType =& $this->getInputType();
343  $validInput = $inputType->isCompatible($input);
344 
345  // If output is null then we're done
346  if (is_null($output)) return $validInput;
347 
348  // Validate output
349  $outputType =& $this->getOutputType();
350  $validOutput = $outputType->isCompatible($output);
351 
352  return $validInput && $validOutput;
353  }
354 
365  function supportsAsInput(&$input) {
366  $nullVar = null;
367  return($this->supports($input, $nullVar));
368  }
369 
376  if ($this->_runtimeEnvironment === false) {
377  // The runtime environment has never been
378  // queried before.
379  $runtimeSettings = $this->supportedRuntimeEnvironmentSettings();
380 
381  // Find out whether we have any runtime restrictions set.
382  $hasRuntimeSettings = false;
383  foreach($runtimeSettings as $runtimeSetting => $defaultValue) {
384  if ($this->hasData($runtimeSetting)) {
385  $$runtimeSetting = $this->getData($runtimeSetting);
386  $hasRuntimeSettings = true;
387  } else {
388  $$runtimeSetting = $defaultValue;
389  }
390  }
391 
392  // If we found any runtime restrictions then construct a
393  // runtime environment from the settings.
394  if ($hasRuntimeSettings) {
395  import('lib.pkp.classes.core.RuntimeEnvironment');
396  $this->_runtimeEnvironment = new RuntimeEnvironment($phpVersionMin, $phpVersionMax, $phpExtensions, $externalPrograms);
397  } else {
398  // Set null so that we don't try to construct
399  // a runtime environment object again.
400  $this->_runtimeEnvironment = null;
401  }
402  }
403 
404  if (is_null($this->_runtimeEnvironment) || $this->_runtimeEnvironment->isCompatible()) return true;
405 
406  return false;
407  }
408 
426  function &execute(&$input, $returnErrors = false) {
427  // Make sure that we don't destroy referenced
428  // data somewhere out there.
429  unset($this->_input, $this->_output);
430 
431  // Check the runtime environment
432  if (!$this->isCompatibleWithRuntimeEnvironment()) {
433  // Missing installation requirements.
434  fatalError('Trying to run a transformation that is not supported in your installation environment.');
435  }
436 
437  // Validate the filter input
438  if (!$this->supportsAsInput($input)) {
439  // We have no valid input so return
440  // an empty output (see unset statement
441  // above).
442  return $this->_output;
443  }
444 
445  // Save a reference to the last valid input
446  $this->_input =& $input;
447 
448  // Process the filter
449  $preliminaryOutput =& $this->process($input);
450 
451  HookRegistry::call(strtolower_codesafe(get_class($this) . '::execute'), array(&$preliminaryOutput));
452 
453  // Validate the filter output
454  if ((!is_null($preliminaryOutput) && $this->supports($input, $preliminaryOutput)) || $returnErrors) {
455  $this->_output =& $preliminaryOutput;
456  }
457 
458  // Return processed data
459  return $this->_output;
460  }
461 
462  //
463  // Public helper methods
464  //
471  static function supportedRuntimeEnvironmentSettings() {
472  static $runtimeEnvironmentSettings = array(
473  'phpVersionMin' => PHP_REQUIRED_VERSION,
474  'phpVersionMax' => null,
475  'phpExtensions' => array(),
476  'externalPrograms' => array()
477  );
478 
479  return $runtimeEnvironmentSettings;
480  }
481 }
482 
483 
Filter\setRuntimeEnvironment
setRuntimeEnvironment(&$runtimeEnvironment)
Definition: Filter.inc.php:296
Filter\__construct
__construct($inputType, $outputType)
Definition: Filter.inc.php:127
Filter\supportsAsInput
supportsAsInput(&$input)
Definition: Filter.inc.php:383
DataObject\getData
& getData($key, $locale=null)
Definition: DataObject.inc.php:100
DataObject
Any class with an associated DAO should extend this class.
Definition: DataObject.inc.php:18
Filter\setSequence
setSequence($seq)
Definition: Filter.inc.php:167
Filter\getOutputType
& getOutputType()
Definition: Filter.inc.php:217
Filter\getLastInput
& getLastInput()
Definition: Filter.inc.php:257
Filter\$_output
$_output
Definition: Filter.inc.php:101
Filter\execute
& execute(&$input, $returnErrors=false)
Definition: Filter.inc.php:444
Filter\addError
addError($message)
Definition: Filter.inc.php:265
Filter\getInputType
& getInputType()
Definition: Filter.inc.php:209
Clue\StreamFilter
Definition: CallbackFilter.php:3
Filter\getDisplayName
getDisplayName()
Definition: Filter.inc.php:155
DataObject\hasData
hasData($key, $locale=null)
Definition: DataObject.inc.php:177
Filter\getSequence
getSequence()
Definition: Filter.inc.php:175
DataObject\__construct
__construct()
Definition: DataObject.inc.php:58
Filter\isCompatibleWithRuntimeEnvironment
isCompatibleWithRuntimeEnvironment()
Definition: Filter.inc.php:393
Filter\hasErrors
hasErrors()
Definition: Filter.inc.php:281
Filter\$_input
$_input
Definition: Filter.inc.php:95
Filter\getErrors
getErrors()
Definition: Filter.inc.php:273
Filter\$_outputType
$_outputType
Definition: Filter.inc.php:89
TypeDescriptionFactory\getInstance
static getInstance()
Definition: TypeDescriptionFactory.inc.php:41
Filter\setTransformationType
setTransformationType(&$inputType, &$outputType)
Definition: Filter.inc.php:187
Filter\supports
supports(&$input, &$output)
Definition: Filter.inc.php:358
Filter\$_errors
$_errors
Definition: Filter.inc.php:107
strtolower_codesafe
strtolower_codesafe($str)
Definition: functions.inc.php:280
Filter\getRuntimeEnvironment
& getRuntimeEnvironment()
Definition: Filter.inc.php:313
Filter\supportedRuntimeEnvironmentSettings
static supportedRuntimeEnvironmentSettings()
Definition: Filter.inc.php:489
Filter\getLastOutput
& getLastOutput()
Definition: Filter.inc.php:237
Filter\$_runtimeEnvironment
$_runtimeEnvironment
Definition: Filter.inc.php:116
RuntimeEnvironment
Class that describes a runtime environment.
Definition: RuntimeEnvironment.inc.php:16
Filter\$_inputType
$_inputType
Definition: Filter.inc.php:83
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
Filter\process
& process(&$input)
Definition: Filter.inc.php:328
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
Filter\clearErrors
clearErrors()
Definition: Filter.inc.php:288
DataObject\setData
setData($key, $value, $locale=null)
Definition: DataObject.inc.php:132