You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
7.0 KiB
265 lines
7.0 KiB
2 years ago
|
<?php
|
||
|
// This file is part of Moodle - http://moodle.org/
|
||
|
//
|
||
|
// Moodle is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License as published by
|
||
|
// the Free Software Foundation, either version 3 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
//
|
||
|
// Moodle is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU General Public License
|
||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||
|
/**
|
||
|
* Provides validation classes used by the imscc converters
|
||
|
*
|
||
|
* @package backup-convert
|
||
|
* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
|
||
|
* @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 .= '<ol>'.PHP_EOL;
|
||
|
}
|
||
|
foreach ($this->items as $error) {
|
||
|
if ($web) {
|
||
|
$result .= '<li>';
|
||
|
}
|
||
|
|
||
|
$result .= $error.PHP_EOL;
|
||
|
|
||
|
if ($web) {
|
||
|
$result .= '</li>'.PHP_EOL;
|
||
|
}
|
||
|
}
|
||
|
if ($web) {
|
||
|
$result .= '</ol>'.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);
|
||
|
}
|
||
|
}
|
||
|
|