. /** * Provides validation classes used by the imscc converters * * @package backup-convert * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ final class error_messages { /** * * @static error_messages */ private static $instance = null; private function __construct(){} private function __clone(){} /** * @return error_messages */ public static function instance() { if (empty(self::$instance)) { $c = __CLASS__; self::$instance = new $c(); } return self::$instance; } /** * @var array */ private $items = array(); /** * @param string $msg */ public function add($msg) { if (!empty($msg)) { $this->items[] = $msg; } } /** * @return array */ public function errors() { $this->items; } /** * Empties the error content */ public function reset() { $this->items = array(); } /** * @param boolean $web * @return string */ public function to_string($web = false) { $result = ''; if ($web) { $result .= '
    '.PHP_EOL; } foreach ($this->items as $error) { if ($web) { $result .= '
  1. '; } $result .= $error.PHP_EOL; if ($web) { $result .= '
  2. '.PHP_EOL; } } if ($web) { $result .= '
'.PHP_EOL; } return $result; } /** * Casting to string method * @return string */ public function __toString() { return $this->to_string(false); } } final class libxml_errors_mgr { /** * @var boolean */ private $previous = false; /** * @param boolean $reset */ public function __construct($reset=false){ if ($reset) { error_messages::instance()->reset(); } $this->previous = libxml_use_internal_errors(true); libxml_clear_errors(); } private function collect_errors ($filename=''){ $errors = libxml_get_errors(); static $error_types = array( LIBXML_ERR_ERROR => 'Error' ,LIBXML_ERR_FATAL => 'Fatal Error' ,LIBXML_ERR_WARNING => 'Warning' ); $result = array(); foreach($errors as $error){ $add = ''; if (!empty($filename)) { $add = " in {$filename}"; } elseif (!empty($error->file)) { $add = " in {$error->file}"; } $line = ''; if (!empty($error->line)) { $line = " at line {$error->line}"; } $err = "{$error_types[$error->level]}{$add}: {$error->message}{$line}"; error_messages::instance()->add($err); } libxml_clear_errors(); return $result; } public function __destruct(){ $this->collect_errors(); if (!$this->previous) { libxml_use_internal_errors($this->previous); } } public function collect() { $this->collect_errors(); } } function validate_xml($xml, $schema){ $result = false; $manifest_file = realpath($xml); $schema_file = realpath($schema); if (empty($manifest_file) || empty($schema_file)) { return false; } $xml_error = new libxml_errors_mgr(); $manifest = new DOMDocument(); $doc->validateOnParse = false; $result = $manifest->load($manifest_file, LIBXML_NONET) && $manifest->schemaValidate($schema_file); return $result; } class cc_validate_type { const manifest_validator1 = 'cclibxml2validator.xsd' ; const assesment_validator1 = '/domainProfile_4/ims_qtiasiv1p2_localised.xsd'; const discussion_validator1 = '/domainProfile_6/imsdt_v1p0_localised.xsd' ; const weblink_validator1 = '/domainProfile_5/imswl_v1p0_localised.xsd' ; const manifest_validator11 = 'cc11libxml2validator.xsd' ; const blti_validator11 = 'imslticc_v1p0p1.xsd' ; const assesment_validator11 = 'ccv1p1_qtiasiv1p2p1_v1p0.xsd'; const discussion_validator11 = 'ccv1p1_imsdt_v1p1.xsd' ; const weblink_validator11 = 'ccv1p1_imswl_v1p1.xsd' ; /** * @var string */ protected $type = null; /** * @var string */ protected $location = null; public function __construct($type, $location){ $this->type = $type; $this->location = $location; } /** * Validates the item * @param string $element - File path for the xml * @return boolean */ public function validate($element) { $this->last_error = null; $celement = realpath($element); $cvalidator = realpath($this->location.DIRECTORY_SEPARATOR.$this->type); $result = (empty($celement) || empty($cvalidator)); if (!$result) { $xml_error = new libxml_errors_mgr(); $doc = new DOMDocument(); $doc->validateOnParse = false; $result = $doc->load($celement, LIBXML_NONET) && $doc->schemaValidate($cvalidator); } return $result; } } class manifest_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::manifest_validator11, $location); } } class manifest10_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::manifest_validator1, $location); } } class blti_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::blti_validator11, $location); } } class assesment_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::assesment_validator11, $location); } } class discussion_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::discussion_validator11, $location); } } class weblink_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::weblink_validator11, $location); } }