public static function importXML(&$import, $options = array()) { if (!isset(self::$questionnaireTable)) { self::$questionnaireTable = QFrame_Db_Table::getTable('questionnaire'); } libxml_use_internal_errors(true); if (is_a($import, 'ZipArchiveModel')) { $zip =& $import; $xml = $import->getQuestionnaireDefinitionXMLDocument(); if ($xml === NULL) { $xml = $import->getInstanceFullResponsesXMLDocument(); } if ($xml === NULL) { throw new Exception('Questionnaire definition not found in zip archive'); } $dom = new DOMDocument(); $dom->loadXML($xml); } elseif (is_a($import, 'DOMDocument')) { $dom =& $import; $xml = $dom->saveXML(); } else { $xml =& $import; $dom = new DOMDocument(); $dom->loadXML($xml); } $errors = libxml_get_errors(); try { $logger = Zend_Registry::get('logger'); } catch (Zend_Exception $e) { } foreach ($errors as $error) { $message = rtrim("XML error on line {$error->line} of {$error->file}: {$error->message}"); if (isset($logger) && $logger) { $logger->log($message, Zend_Log::ERR); } error_log($message); } if (count($errors) > 0) { throw new Exception('XML Exception'); } self::validateQuestionnaireDefinitionXML($dom); $questionnaire = $dom->getElementsByTagName('questionnaire')->item(0); $questionnaireName = $questionnaire->getAttribute('questionnaireName'); $questionnaireVersion = $questionnaire->getAttribute('questionnaireVersion'); $revision = $questionnaire->getAttribute('revision'); $transactionNumber = self::startSerializableTransaction(); if (isset($options['SkipQuestionnaireExistCheck'])) { $signature = 'nosignature'; } else { $questionnaireID = self::$questionnaireTable->getQuestionnaireID($questionnaireName, $questionnaireVersion, $revision); $signature = self::generateSignature($dom); if (isset($questionnaireID)) { $prevQuestionnaire = new QuestionnaireModel(array('questionnaireID' => $questionnaireID, 'depth' => 'questionnaire')); if ($signature === $prevQuestionnaire->signature) { $message = "Skipping questionnaire import since {$questionnaireName} {$questionnaireVersion} {$revision} already exists and has the same signature"; if (isset($logger) && $logger) { $logger->log($message, Zend_Log::ERR); } self::dbCommit($transactionNumber); return $questionnaireID; } else { throw new Exception('A questionnaire with the same name, version, and revision already exists with different content'); } } } $questionnaireID = self::$questionnaireTable->insert(array('questionnaireName' => $questionnaireName, 'questionnaireVersion' => $questionnaireVersion, 'revision' => $revision, 'signature' => $signature)); $questionnaire = new QuestionnaireModel(array('questionnaireID' => $questionnaireID, 'depth' => 'questionnaire')); $questionnaire->validateQuestionnaireDefinitionXML($dom); // store files if (!isset($options['SkipFileAttachments'])) { $questionnaire->questionnaireDefinition2responseSchema($dom); $questionnaire->questionnaireDefinition2completedResponseSchema($dom); $files = new FileModel($questionnaire); $files->store($xml, array('filename' => 'questionnaire-definition.xml')); } self::dbCommit($transactionNumber); if (!isset($options['SkipQuestionnaireExistCheck']) && !$questionnaire->getDefaultInstance()) { InstanceModel::importXML($xml, '_default_', array('hidden' => 1)); } return $questionnaireID; }