public function testSanitizeQtiXml()
 {
     $xmlStr = file_get_contents($this->getSamplePath('/authoring/sanitizeQtiXml.xml'));
     $xml = simplexml_load_string($xmlStr);
     $this->assertTrue(count($xml->xpath("//*[local-name() = 'itemBody']//*[@style]")) > 0);
     $sanitizedXmlStr = Authoring::sanitizeQtiXml($xmlStr);
     $sanitizedXml = simplexml_load_string($sanitizedXmlStr);
     $this->assertTrue(count($sanitizedXml->xpath("//*[local-name() = 'itemBody']//*[@style]")) === 0);
     return $sanitizedXmlStr;
 }
 public function testSanitizeQtiXmlMultipleIds()
 {
     $xmlStr = file_get_contents($this->getSamplePath('/authoring/sanitizeQtiXmlMultipleIds.xml'));
     $xml = simplexml_load_string($xmlStr);
     $duplicate = array();
     $ids = array();
     foreach ($xml->xpath("//*[@id]") as $idElement) {
         $id = (string) $idElement['id'];
         if (!in_array($id, $ids)) {
             $ids[] = $id;
         } else {
             if (array_key_exists($id, $duplicate)) {
                 $duplicate[$id]++;
             } else {
                 $duplicate[$id] = 2;
             }
         }
     }
     $this->assertCount(3, $duplicate);
     $this->assertEquals(2, $duplicate['p001']);
     $this->assertEquals(3, $duplicate['p002']);
     $this->assertEquals(4, $duplicate['p003']);
     $sanitizedXmlStr = Authoring::sanitizeQtiXml($xmlStr);
     $sanitizedXml = simplexml_load_string($sanitizedXmlStr);
     $duplicate = array();
     $ids = array();
     foreach ($sanitizedXml->xpath("//*[@id]") as $idElement) {
         $id = (string) $idElement['id'];
         if (!in_array($id, $ids)) {
             $ids[] = $id;
         } else {
             if (array_key_exists($id, $duplicate)) {
                 $duplicate[$id]++;
             } else {
                 $duplicate[$id] = 2;
             }
         }
     }
     $this->assertCount(0, $duplicate);
     return $sanitizedXmlStr;
 }
 public function saveItem()
 {
     $returnValue = array('success' => false);
     if ($this->hasRequestParameter('uri')) {
         $uri = urldecode($this->getRequestParameter('uri'));
         $xml = file_get_contents('php://input');
         $rdfItem = new core_kernel_classes_Resource($uri);
         $itemService = taoItems_models_classes_ItemsService::singleton();
         //check if the item is QTI item
         if ($itemService->hasItemModel($rdfItem, array(ItemModel::MODEL_URI))) {
             try {
                 $sanitized = Authoring::sanitizeQtiXml($xml);
                 Authoring::validateQtiXml($sanitized);
                 //get the QTI xml
                 $returnValue['success'] = $itemService->setItemContent($rdfItem, $sanitized);
             } catch (QtiModelException $e) {
                 throw new \RuntimeException($e->getUserMessage(), 0, $e);
             }
         }
     }
     $this->returnJson($returnValue);
 }
 protected function createQtiItemModel($qtiFile, $validate = true)
 {
     $qtiXml = Authoring::sanitizeQtiXml($qtiFile);
     //validate the file to import
     $qtiParser = new Parser($qtiXml);
     if ($validate) {
         $basePath = common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem')->getDir();
         $qtiParser->validate();
         if (!$qtiParser->isValid()) {
             $failedValidation = true;
             $eStrs = array();
             foreach ($qtiParser->getErrors() as $libXmlError) {
                 $eStrs[] = __('QTI-XML error at line %1$d "%2$s".', $libXmlError['line'], str_replace('[LibXMLError] ', '', trim($libXmlError['message'])));
             }
             // Make sure there are no duplicate...
             $eStrs = array_unique($eStrs);
             // Add sub-report.
             throw new ValidationException($qtiFile, $eStrs);
         }
     }
     $qtiItem = $qtiParser->load();
     return $qtiItem;
 }
 protected function createQtiItemModel($qtiFile, $validate = true)
 {
     $qtiXml = Authoring::sanitizeQtiXml($qtiFile);
     //validate the file to import
     $qtiParser = new Parser($qtiXml);
     if ($validate) {
         $qtiParser->validate();
         if (!$qtiParser->isValid()) {
             $eStrs = array();
             foreach ($qtiParser->getErrors() as $libXmlError) {
                 $eStrs[] = __('QTI-XML error at line %1$d "%2$s".', $libXmlError['line'], str_replace('[LibXMLError] ', '', trim($libXmlError['message'])));
             }
             // Make sure there are no duplicate...
             $eStrs = array_unique($eStrs);
             // Add sub-report.
             throw new ValidationException($qtiFile, $eStrs);
         }
     }
     $qtiItem = $qtiParser->load();
     if (!$qtiItem && count($qtiParser->getErrors())) {
         $errors = [];
         foreach ($qtiParser->getErrors() as $error) {
             $errors[] = $error['message'];
         }
         throw new ValidationException($qtiFile, $errors);
     }
     return $qtiItem;
 }
Example #6
0
 /**
  * @param $xml
  * @param core_kernel_classes_Resource $rdfItem
  * @return bool
  * @throws exception\QtiModelException
  */
 public function saveXmlItemToRdfItem($xml, core_kernel_classes_Resource $rdfItem)
 {
     $sanitized = Authoring::sanitizeQtiXml($xml);
     Authoring::validateQtiXml($sanitized);
     $qtiParser = new Parser($sanitized);
     $qtiItem = $qtiParser->load();
     return $this->saveDataItemToRdfItem($qtiItem, $rdfItem);
 }