1<?php 2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4include_once "./Modules/TestQuestionPool/classes/export/qti12/class.assQuestionExport.php"; 5 6/** 7* Class for java applet question exports 8* 9* assJavaAppletExport is a class for java applet question exports 10* 11* @author Helmut Schottmüller <helmut.schottmueller@mac.com> 12* @version $Id$ 13* @ingroup ModulesTestQuestionPool 14*/ 15class assJavaAppletExport extends assQuestionExport 16{ 17 /** 18 * Returns a QTI xml representation of the question 19 * 20 * Returns a QTI xml representation of the question and sets the internal 21 * domxml variable with the DOM XML representation of the QTI xml representation 22 * 23 * @return string The QTI xml representation of the question 24 * @access public 25 */ 26 public function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false) 27 { 28 global $DIC; 29 $ilias = $DIC['ilias']; 30 include_once("./Services/Xml/classes/class.ilXmlWriter.php"); 31 $a_xml_writer = new ilXmlWriter; 32 // set xml header 33 $a_xml_writer->xmlHeader(); 34 $a_xml_writer->xmlStartTag("questestinterop"); 35 $attrs = array( 36 "ident" => "il_" . IL_INST_ID . "_qst_" . $this->object->getId(), 37 "title" => $this->object->getTitle(), 38 "maxattempts" => $this->object->getNrOfTries() 39 ); 40 $a_xml_writer->xmlStartTag("item", $attrs); 41 // add question description 42 $a_xml_writer->xmlElement("qticomment", null, $this->object->getComment()); 43 // add estimated working time 44 $workingtime = $this->object->getEstimatedWorkingTime(); 45 $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]); 46 $a_xml_writer->xmlElement("duration", null, $duration); 47 // add ILIAS specific metadata 48 $a_xml_writer->xmlStartTag("itemmetadata"); 49 $a_xml_writer->xmlStartTag("qtimetadata"); 50 $a_xml_writer->xmlStartTag("qtimetadatafield"); 51 $a_xml_writer->xmlElement("fieldlabel", null, "ILIAS_VERSION"); 52 $a_xml_writer->xmlElement("fieldentry", null, $ilias->getSetting("ilias_version")); 53 $a_xml_writer->xmlEndTag("qtimetadatafield"); 54 $a_xml_writer->xmlStartTag("qtimetadatafield"); 55 $a_xml_writer->xmlElement("fieldlabel", null, "QUESTIONTYPE"); 56 $a_xml_writer->xmlElement("fieldentry", null, JAVAAPPLET_QUESTION_IDENTIFIER); 57 $a_xml_writer->xmlEndTag("qtimetadatafield"); 58 $a_xml_writer->xmlStartTag("qtimetadatafield"); 59 $a_xml_writer->xmlElement("fieldlabel", null, "AUTHOR"); 60 $a_xml_writer->xmlElement("fieldentry", null, $this->object->getAuthor()); 61 $a_xml_writer->xmlEndTag("qtimetadatafield"); 62 63 // additional content editing information 64 $this->addAdditionalContentEditingModeInformation($a_xml_writer); 65 $this->addGeneralMetadata($a_xml_writer); 66 67 $a_xml_writer->xmlEndTag("qtimetadata"); 68 $a_xml_writer->xmlEndTag("itemmetadata"); 69 70 // PART I: qti presentation 71 $attrs = array( 72 "label" => $this->object->getTitle() 73 ); 74 $a_xml_writer->xmlStartTag("presentation", $attrs); 75 // add flow to presentation 76 $a_xml_writer->xmlStartTag("flow"); 77 // add material with question text to presentation 78 $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion()); 79 $solution = $this->object->getSuggestedSolution(0); 80 if (count($solution)) { 81 if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches)) { 82 $a_xml_writer->xmlStartTag("material"); 83 $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3]; 84 if (strcmp($matches[1], "") != 0) { 85 $intlink = $solution["internal_link"]; 86 } 87 $attrs = array( 88 "label" => "suggested_solution" 89 ); 90 $a_xml_writer->xmlElement("mattext", $attrs, $intlink); 91 $a_xml_writer->xmlEndTag("material"); 92 } 93 } 94 95 $a_xml_writer->xmlStartTag("material"); 96 $attrs = array( 97 "label" => "applet data", 98 "uri" => $this->object->getJavaAppletFilename(), 99 "height" => $this->object->getJavaHeight(), 100 "width" => $this->object->getJavaWidth(), 101 "embedded" => "base64" 102 ); 103 $javapath = $this->object->getJavaPath() . $this->object->getJavaAppletFilename(); 104 $fh = @fopen($javapath, "rb"); 105 if ($fh == false) { 106 return; 107 } 108 $javafile = fread($fh, filesize($javapath)); 109 fclose($fh); 110 $base64 = base64_encode($javafile); 111 $a_xml_writer->xmlElement("matapplet", $attrs, $base64); 112 113 if ($this->object->buildParamsOnly()) { 114 if ($this->object->getJavaCode()) { 115 $attrs = array( 116 "label" => "java_code" 117 ); 118 $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getJavaCode()); 119 } 120 if ($this->object->getJavaCodebase()) { 121 $attrs = array( 122 "label" => "java_codebase" 123 ); 124 $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getJavaCodebase()); 125 } 126 if ($this->object->getJavaArchive()) { 127 $attrs = array( 128 "label" => "java_archive" 129 ); 130 $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getJavaArchive()); 131 } 132 for ($i = 0; $i < $this->object->getParameterCount(); $i++) { 133 $param = $this->object->getParameter($i); 134 $attrs = array( 135 "label" => $param["name"] 136 ); 137 $a_xml_writer->xmlElement("mattext", $attrs, $param["value"]); 138 } 139 } 140 $a_xml_writer->xmlEndTag("material"); 141 $a_xml_writer->xmlStartTag("material"); 142 $attrs = array( 143 "label" => "points" 144 ); 145 $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getPoints()); 146 $a_xml_writer->xmlEndTag("material"); 147 148 $a_xml_writer->xmlEndTag("flow"); 149 $a_xml_writer->xmlEndTag("presentation"); 150 151 // PART II: qti resprocessing 152 $feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation( 153 $this->object->getId(), 154 true 155 ); 156 $feedback_onenotcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation( 157 $this->object->getId(), 158 false 159 ); 160 if (strlen($feedback_allcorrect . $feedback_onenotcorrect)) { 161 $a_xml_writer->xmlStartTag("resprocessing"); 162 $a_xml_writer->xmlStartTag("outcomes"); 163 $a_xml_writer->xmlStartTag("decvar"); 164 $a_xml_writer->xmlEndTag("decvar"); 165 $a_xml_writer->xmlEndTag("outcomes"); 166 167 if (strlen($feedback_allcorrect)) { 168 $attrs = array( 169 "continue" => "Yes" 170 ); 171 $a_xml_writer->xmlStartTag("respcondition", $attrs); 172 // qti conditionvar 173 $a_xml_writer->xmlStartTag("conditionvar"); 174 $attrs = array( 175 "respident" => "points" 176 ); 177 $a_xml_writer->xmlElement("varequal", $attrs, $this->object->getPoints()); 178 $a_xml_writer->xmlEndTag("conditionvar"); 179 // qti displayfeedback 180 $attrs = array( 181 "feedbacktype" => "Response", 182 "linkrefid" => "response_allcorrect" 183 ); 184 $a_xml_writer->xmlElement("displayfeedback", $attrs); 185 $a_xml_writer->xmlEndTag("respcondition"); 186 } 187 188 if (strlen($feedback_onenotcorrect)) { 189 $attrs = array( 190 "continue" => "Yes" 191 ); 192 $a_xml_writer->xmlStartTag("respcondition", $attrs); 193 // qti conditionvar 194 $a_xml_writer->xmlStartTag("conditionvar"); 195 $a_xml_writer->xmlStartTag("not"); 196 $attrs = array( 197 "respident" => "points" 198 ); 199 $a_xml_writer->xmlElement("varequal", $attrs, $this->object->getPoints()); 200 $a_xml_writer->xmlEndTag("not"); 201 $a_xml_writer->xmlEndTag("conditionvar"); 202 // qti displayfeedback 203 $attrs = array( 204 "feedbacktype" => "Response", 205 "linkrefid" => "response_onenotcorrect" 206 ); 207 $a_xml_writer->xmlElement("displayfeedback", $attrs); 208 $a_xml_writer->xmlEndTag("respcondition"); 209 } 210 $a_xml_writer->xmlEndTag("resprocessing"); 211 } 212 213 if (strlen($feedback_allcorrect)) { 214 $attrs = array( 215 "ident" => "response_allcorrect", 216 "view" => "All" 217 ); 218 $a_xml_writer->xmlStartTag("itemfeedback", $attrs); 219 // qti flow_mat 220 $a_xml_writer->xmlStartTag("flow_mat"); 221 $this->object->addQTIMaterial($a_xml_writer, $feedback_allcorrect); 222 $a_xml_writer->xmlEndTag("flow_mat"); 223 $a_xml_writer->xmlEndTag("itemfeedback"); 224 } 225 if (strlen($feedback_onenotcorrect)) { 226 $attrs = array( 227 "ident" => "response_onenotcorrect", 228 "view" => "All" 229 ); 230 $a_xml_writer->xmlStartTag("itemfeedback", $attrs); 231 // qti flow_mat 232 $a_xml_writer->xmlStartTag("flow_mat"); 233 $this->object->addQTIMaterial($a_xml_writer, $feedback_onenotcorrect); 234 $a_xml_writer->xmlEndTag("flow_mat"); 235 $a_xml_writer->xmlEndTag("itemfeedback"); 236 } 237 238 $a_xml_writer->xmlEndTag("item"); 239 $a_xml_writer->xmlEndTag("questestinterop"); 240 $xml = $a_xml_writer->xmlDumpMem(false); 241 if (!$a_include_header) { 242 $pos = strpos($xml, "?>"); 243 $xml = substr($xml, $pos + 2); 244 } 245 return $xml; 246 } 247} 248