Open Monograph Press  3.3.0
XMLTypeDescription.inc.php
1 <?php
2 
26 import('lib.pkp.classes.filter.TypeDescription');
27 import('lib.pkp.classes.filter.TypeDescriptionFactory');
28 
29 define('XML_TYPE_DESCRIPTION_VALIDATE_NONE', '*');
30 define('XML_TYPE_DESCRIPTION_VALIDATE_SCHEMA', 'schema');
31 define('XML_TYPE_DESCRIPTION_VALIDATE_DTD', 'dtd');
32 define('XML_TYPE_DESCRIPTION_VALIDATE_RELAX_NG', 'relax-ng');
33 
36  var $_validationStrategy = XML_TYPE_DESCRIPTION_VALIDATE_SCHEMA;
37 
40 
41 
48  function __construct($typeName) {
49  parent::__construct($typeName);
50  }
51 
52 
53  //
54  // Setters and Getters
55  //
59  function getNamespace() {
60  return TYPE_DESCRIPTION_NAMESPACE_XML;
61  }
62 
67  function setValidationStrategy($validationStrategy) {
68  $this->_validationStrategy = $validationStrategy;
69  }
70 
71  //
72  // Implement abstract template methods from TypeDescription
73  //
77  function parseTypeName($typeName) {
78  // We expect a validation strategy and an optional validation argument
79  $typeNameParts = explode('(', $typeName);
80  switch (count($typeNameParts)) {
81  case 1:
82  // No argument present (only dtd or no validation)
83  $validationStrategy = $typeName;
84  if ($validationStrategy != XML_TYPE_DESCRIPTION_VALIDATE_NONE
85  && $validationStrategy != XML_TYPE_DESCRIPTION_VALIDATE_DTD) return false;
86  $validationSource = null;
87  break;
88 
89  case 2:
90  // We have an argument (only available for schema and relax-ng)
91  $validationStrategy = $typeNameParts[0];
92  if ($validationStrategy != XML_TYPE_DESCRIPTION_VALIDATE_SCHEMA
93  && $validationStrategy != XML_TYPE_DESCRIPTION_VALIDATE_RELAX_NG) return false;
94  $validationSource = trim($typeNameParts[1], ')');
95  break;
96 
97  default:
98  return false;
99  }
100 
101  $this->_validationStrategy = $validationStrategy;
102  $this->_validationSource = $validationSource;
103 
104  return true;
105  }
106 
110  function checkType(&$object) {
111  // We only accept DOMDocument objects and source strings.
112  if (!is_a($object, 'DOMDocument') && !is_string($object)) return false;
113 
114  // No validation...
115  if ($this->_validationStrategy == XML_TYPE_DESCRIPTION_VALIDATE_NONE) return true;
116 
117  // Validation - requires DOMDocument
118  if (is_string($object)) {
119  $xmlDom = new DOMDocument();
120  $xmlDom->loadXML($object);
121  } else {
122  $xmlDom =& $object;
123  }
124 
125  switch($this->_validationStrategy) {
126  // We have to suppress validation errors, otherwise the script
127  // will stop when validation errors occur.
128  case XML_TYPE_DESCRIPTION_VALIDATE_DTD:
129  if (!$xmlDom->validate()) return false;
130  break;
131 
132  case XML_TYPE_DESCRIPTION_VALIDATE_SCHEMA:
133  libxml_use_internal_errors(true);
134  if (!$xmlDom->schemaValidate($this->_validationSource)) {
135  $errors = libxml_get_errors();
136  return false;
137  }
138 
139  break;
140 
141  case XML_TYPE_DESCRIPTION_VALIDATE_RELAX_NG:
142  if (!$xmlDom->relaxNGValidate($this->_validationSource)) return false;
143  break;
144 
145  default:
146  assert(false);
147  }
148 
149  return true;
150  }
151 }
152 
XMLTypeDescription\$_validationSource
$_validationSource
Definition: XMLTypeDescription.inc.php:45
XMLTypeDescription\getNamespace
getNamespace()
Definition: XMLTypeDescription.inc.php:65
XMLTypeDescription\setValidationStrategy
setValidationStrategy($validationStrategy)
Definition: XMLTypeDescription.inc.php:73
XMLTypeDescription\__construct
__construct($typeName)
Definition: XMLTypeDescription.inc.php:54
TypeDescription
Abstract base class for filter input/output type descriptions.
Definition: TypeDescription.inc.php:49
XMLTypeDescription\checkType
checkType(&$object)
Definition: XMLTypeDescription.inc.php:116
XMLTypeDescription\$_validationStrategy
$_validationStrategy
Definition: XMLTypeDescription.inc.php:39
XMLTypeDescription
Class that describes an XML input/output type.
Definition: XMLTypeDescription.inc.php:34
XMLTypeDescription\parseTypeName
parseTypeName($typeName)
Definition: XMLTypeDescription.inc.php:83