/** * Processes a process * * Called when this component receives an HTTP POST request to * /process(/). */ public function postProcess() { $this->app->response->setStatus(201); $header = $this->app->request->headers->all(); $body = $this->app->request->getBody(); $process = Process::decodeProcess($body); // always been an array $arr = true; if (!is_array($process)) { $process = array($process); $arr = false; } // this array contains the indices of the inserted objects $res = array(); foreach ($process as $pro) { $eid = $pro->getExercise()->getId(); // loads the form from database $result = Request::routeRequest('GET', '/form/exercise/' . $eid, $this->app->request->headers->all(), '', $this->_formDb, 'form'); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { // only one form as result $forms = Form::decodeForm($result['content']); $forms = $forms[0]; $formdata = $pro->getRawSubmission()->getFile(); $timestamp = $formdata->getTimeStamp(); if ($timestamp === null) { $timestamp = time(); } if ($formdata !== null && $forms !== null) { $formdata = Form::decodeForm($formdata->getBody(true)); if (is_array($formdata)) { $formdata = $formdata[0]; } if ($formdata !== null) { // evaluate the formdata $points = 0; $answers = $formdata->getChoices(); $correctAnswers = $forms->getChoices(); $allcorrect = true; if ($forms->getType() == 0) { $parameter = explode(' ', strtolower($pro->getParameter())); if ($parameter === null || count($parameter) === 0 || $parameter[0] === '') { if (DefaultNormalizer::normalizeText($correctAnswers[0]->getText()) != DefaultNormalizer::normalizeText($answers[0]->getText())) { $allcorrect = false; } } elseif (strtolower($parameter[0]) === 'distance1') { $similarity = 0; similar_text(DefaultNormalizer::normalizeText($answers[0]->getText()), DefaultNormalizer::normalizeText($correctAnswers[0]->getText()), $similarity); if (isset($parameter[1])) { if ($similarity < $parameter[1]) { $allcorrect = false; } } else { if ($similarity < 100) { $allcorrect = false; } } } elseif (strtolower($parameter[0]) === 'regularexpression') { $i = 1; $test = $parameter[$i]; while ($i < count($parameter)) { if (@preg_match($test, DefaultNormalizer::normalizeText($answers[0]->getText())) !== false) { break; } $test .= ' ' . $parameter[$i]; $i++; } $match = @preg_match($test, DefaultNormalizer::normalizeText(DefaultNormalizer::normalizeText($answers[0]->getText()))); if ($match === false || $match == false || $test == '') { $allcorrect = false; } } } elseif ($forms->getType() == 1) { foreach ($correctAnswers as $mask) { $foundInStudentsAnswer = false; foreach ($answers as $answer) { if ($answer->getText() === $mask->getChoiceId()) { $foundInStudentsAnswer = true; break; } } if ($mask->getCorrect() === '1' && !$foundInStudentsAnswer) { $allcorrect = false; break; } elseif ($mask->getCorrect() === '0' && $foundInStudentsAnswer) { $allcorrect = false; break; } } } elseif ($forms->getType() == 2) { foreach ($correctAnswers as $mask) { $foundInStudentsAnswer = false; foreach ($answers as $answer) { if ($answer->getText() === $mask->getChoiceId()) { $foundInStudentsAnswer = true; break; } } if ($mask->getCorrect() === '1' && !$foundInStudentsAnswer) { $allcorrect = false; break; } elseif ($mask->getCorrect() === '0' && $foundInStudentsAnswer) { $allcorrect = false; break; } } } if ($allcorrect) { $points = $pro->getExercise()->getMaxPoints(); } // save the marking #region Form to PDF if ($pro->getMarking() === null) { $raw = $pro->getRawSubmission(); $exerciseName = ''; if ($raw !== null) { $exerciseName = $raw->getExerciseName(); } $answer = ""; if ($forms->getType() == 0) { $answer = $formdata->getChoices()[0]->getText(); } if ($forms->getType() == 1) { $answer = $this->ChoiceIdToText($formdata->getChoices()[0]->getText(), $forms->getChoices()); } if ($forms->getType() == 2) { foreach ($formdata->getChoices() as $chosen) { $answer .= $this->ChoiceIdToText($chosen->getText(), $forms->getChoices()) . '<br>'; } } $answer2 = ""; foreach ($forms->getChoices() as $chosen) { if ($chosen->getCorrect() === '1') { $answer2 .= $chosen->getText() . '<br>'; } } $Text = "<h1>AUFGABE {$exerciseName}</h1>" . "<hr>"; if ($forms->getTask() !== null && trim($forms->getTask()) != '') { $Text .= "<p>" . "<h2>Aufgabenstellung:</h2>" . $forms->getTask() . "</p>"; } $Text .= "<p>" . "<h2>Antwort:</h2>" . "<span style=\"color: " . ($points === 0 ? 'red' : 'black') . "\">" . $answer . "</span></p>"; if ($points === 0) { $Text .= "<p>" . "<h2>Lösung:</h2><span style=\"color: green\">" . $answer2 . "</span></p>"; } if ($forms->getSolution() !== null && trim($forms->getSolution()) != '') { $Text .= "<p>" . "<h2>Lösungsbegründung:</h2>" . $forms->getSolution() . "</p>"; } $Text .= "<p style=\"text-align: center;\">" . "<h2><span style=\"color: red\">{$points}P</span></h2>" . "</p>"; $pdf = Pdf::createPdf($Text); //echo Pdf::encodePdf($pdf);return; $result = Request::routeRequest('POST', '/pdf', array(), Pdf::encodePdf($pdf), $this->_pdf, 'pdf'); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { $pdf = File::decodeFile($result['content']); $pdf->setDisplayName($exerciseName . '.pdf'); $pdf->setTimeStamp($timestamp); $pdf->setBody(null); $submission = $pro->getSubmission(); if ($submission === null) { $submission = $pro->getRawSubmission(); } $studentId = $pro->getRawSubmission() !== null ? $pro->getRawSubmission()->getStudentId() : null; if ($studentId === null) { $studentId = $pro->getSubmission() !== null ? $pro->getSubmission()->getStudentId() : null; } $marking = Marking::createMarking(null, $studentId, null, null, null, null, 3, $points, $submission->getDate() !== null ? $submission->getDate() : time()); if (is_object($submission)) { $marking->setSubmission(clone $submission); } $marking->setFile($pdf); $pro->setMarking($marking); } else { $res[] = null; $this->app->response->setStatus(409); continue; } } #endregion $rawSubmission = $pro->getRawSubmission(); $rawFile = $rawSubmission->getFile(); $rawFile->setBody(Form::encodeForm($formdata), true); $rawSubmission->setFile($rawFile); $rawSubmission->setExerciseId($eid); $pro->setRawSubmission($rawSubmission); $res[] = $pro; continue; } } } $this->app->response->setStatus(409); $res[] = null; } if (!$arr && count($res) == 1) { $this->app->response->setBody(Process::encodeProcess($res[0])); } else { $this->app->response->setBody(Process::encodeProcess($res)); } }
/** * Adds a form. * * Called when this component receives an HTTP POST request to * /form(/). */ public function addForm() { Logger::Log('starts POST AddForm', LogLevel::DEBUG); $header = $this->app->request->headers->all(); $body = $this->app->request->getBody(); $this->app->response->setStatus(201); $forms = Form::decodeForm($body); // always been an array $arr = true; if (!is_array($forms)) { $forms = array($forms); $arr = false; } // this array contains the indices of the inserted objects $res = array(); $choices = array(); foreach ($forms as $key => $form) { $choices[] = $form->getChoices(); $forms[$key]->setChoices(null); } $resForms = array(); foreach ($forms as $form) { $method = 'POST'; $URL = '/form'; if ($form->getFormId() !== null) { $method = 'PUT'; $URL = '/form/' . $form->getFormId(); } $result = Request::routeRequest($method, $URL, array(), Form::encodeForm($form), $this->_form, 'form'); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299 && isset($result['content'])) { $newform = Form::decodeForm($result['content']); if ($form->getFormId() === null) { $form->setFormId($newform->getFormId()); } $resForms[] = $form; } else { $f = new Form(); $f->setStatus(409); $resForms[] = $f; } } $forms = $resForms; $i = 0; foreach ($choices as &$choicelist) { foreach ($choicelist as $key2 => $choice) { if ($forms[$i]->getFormId() !== null) { $formId = $forms[$i]->getFormId(); $choicelist[$key2]->setFormId($formId); $method = 'POST'; $URL = '/choice'; if ($choicelist[$key2]->getChoiceId() !== null) { $method = 'PUT'; $URL = '/choice/' . $choice->getChoiceId(); } $result = Request::routeRequest($method, $URL, array(), Choice::encodeChoice($choicelist[$key2]), $this->_choice, 'choice'); if ($result['status'] >= 200 && $result['status'] <= 299) { $newchoice = Choice::decodeChoice($result['content']); if ($choicelist[$key2]->getChoiceId() === null) { $choicelist[$key2]->setChoiceId($newchoice->getChoiceId()); } $choicelist[$key2]->setStatus(201); } else { $choicelist[$key2]->setStatus(409); } } } $forms[$i]->setChoices($choicelist); $i++; } // checks the correctness of the query /*if ( $result['status'] >= 200 && $result['status'] <= 299 && isset($result['content'])){ $newforms = Form::decodeForm($result['content']); if ( !is_array( $newforms ) ) $newforms = array($newforms); $i=0; foreach ($forms as &$form){ if ($form->getFormId() === null) $form->setFormId($newforms[$i]->getFormId()); $i++; } $sendChoices = array(); $i=0; foreach ( $choices as $choicelist ){ foreach ( $choicelist as $choice ){ $choice->setFormId($forms[$i]->getFormId()); $sendChoices[] = $choice; } $i++; } $choices = $sendChoices; $result = Request::routeRequest( 'POST', '/choice', $this->app->request->headers->all( ), Choice::encodeChoice($choices), $this->_choice, 'choice' ); // checks the correctness of the query if ( $result['status'] >= 200 && $result['status'] <= 299 ){ $newchoices = Choice::decodeChoice($result['content']); $choicelist = array(); $i=0; foreach ( $choices as &$choice ){ $choice->setChoiceId($newchoices[$i]->getChoiceId()); if (!isset($choicelist[$choice->getFormId()])) $choicelist[$choice->getFormId()] = array(); $choicelist[$choice->getFormId()][] = $choice; $i++; } foreach ( $forms as &$form ){ $form->setChoices($choicelist[$form->getFormId()]); } $res[] = $forms; } else{ // remove forms on failure foreach ($forms as $form){ $result = Request::routeRequest( 'DELETE', '/form/'.$form->getFormId(), $this->app->request->headers->all( ), '', $this->_form, 'form' ); } $res[] = null; $this->app->response->setStatus( 409 ); } } else { $res[] = null; $this->app->response->setStatus( 409 ); }*/ if ($this->app->response->getStatus() != 201) { Logger::Log('POST AddForms failed', LogLevel::ERROR); } if (!$arr && count($res) == 1) { $this->app->response->setBody(Form::encodeForm($res[0])); } else { $this->app->response->setBody(Form::encodeForm($res)); } }
/** * Processes a process * * Called when this component receives an HTTP POST request to * /process(/). */ public function postProcess() { $this->app->response->setStatus(201); $header = $this->app->request->headers->all(); $body = $this->app->request->getBody(); $process = Process::decodeProcess($body); // always been an array $arr = true; if (!is_array($process)) { $process = array($process); $arr = false; } // this array contains the indices of the inserted objects $res = array(); foreach ($process as $pro) { $eid = $pro->getExercise()->getId(); // loads the form from database $result = Request::routeRequest('GET', '/form/exercise/' . $eid, $this->app->request->headers->all(), '', $this->_formDb, 'form'); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { // only one form as result $forms = Form::decodeForm($result['content']); $forms = $forms[0]; $formdata = $pro->getRawSubmission()->getFile(); $timestamp = $formdata->getTimeStamp(); if ($timestamp === null) { $timestamp = time(); } if ($formdata !== null && $forms !== null) { $formdata = Form::decodeForm($formdata->getBody(true)); if (is_array($formdata)) { $formdata = $formdata[0]; } if ($formdata !== null) { // check the submission $fail = false; $parameter = explode(' ', strtolower($pro->getParameter())); $choices = $formdata->getChoices(); if ($forms->getType() == 0) { foreach ($choices as &$choice) { $i = 0; for ($i < 0; $i < count($parameter); $i++) { $param = $parameter[$i]; if ($param === null || $param === '') { continue; } switch ($param) { case 'isnumeric': if (!@preg_match("%^-?([0-9])+([,]([0-9])+)?\$%", DefaultNormalizer::normalizeText($choice->getText()))) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" ist keine gültige Zahl. <br>Bsp.: -0,00'); } break; case 'isdigit': if (!ctype_digit(DefaultNormalizer::normalizeText($choice->getText()))) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" ist keine gültige Ziffernfolge.'); } break; case 'isprintable': if (!ctype_print(DefaultNormalizer::normalizeText($choice->getText()))) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" enthält nicht-druckbare Zeichen.'); } break; case 'isalpha': if (!ctype_alpha(DefaultNormalizer::normalizeText($choice->getText()))) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" ist keine gültige Buchstabenfolge.'); } break; case 'isalphanum': if (!ctype_alnum(DefaultNormalizer::normalizeText($choice->getText()))) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" ist nicht alphanumerisch.'); } break; case 'ishex': if (!ctype_xdigit(DefaultNormalizer::normalizeText($choice->getText()))) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" ist keine gültige Hexadezimalzahl.'); } break; default: $test = $parameter[$i]; $i++; while ($i < count($parameter)) { if (@preg_match($test, DefaultNormalizer::normalizeText($choice->getText())) !== false) { break; } $test .= ' ' . $parameter[$i]; $i++; } $match = @preg_match($test, DefaultNormalizer::normalizeText($choice->getText())); if ($match === false) { $fail = true; $pro->addMessage('"' . $test . '" ist kein gültiger regulärer Ausdruck.'); } elseif ($match == false) { $fail = true; $pro->addMessage('"' . $choice->getText() . '" entspricht nicht dem regulären Ausdruck "' . $test . '".'); } break; } } } } if ($fail) { // received submission isn't correct $pro->setStatus(409); $res[] = $pro; $this->app->response->setStatus(409); continue; } // save the submission #region Form to PDF if ($pro->getSubmission() === null) { $raw = $pro->getRawSubmission(); $exerciseName = ''; if ($raw !== null) { $exerciseName = $raw->getExerciseName(); } $answer = ""; if ($forms->getType() == 0) { $answer = $formdata->getChoices()[0]->getText(); } if ($forms->getType() == 1) { $answer = $this->ChoiceIdToText($formdata->getChoices()[0]->getText(), $forms->getChoices()); } if ($forms->getType() == 2) { foreach ($formdata->getChoices() as $chosen) { $answer .= $this->ChoiceIdToText($chosen->getText(), $forms->getChoices()) . '<br>'; } } $Text = "<h1>AUFGABE {$exerciseName}</h1>" . "<hr>"; if ($forms->getTask() !== null && trim($forms->getTask()) != '') { $Text .= "<p>" . "<h2>Aufgabenstellung:</h2>" . $forms->getTask() . "</p>"; } $Text .= "<p>" . "<h2>Antwort:</h2>" . $answer . "</p>"; $pdf = Pdf::createPdf($Text); $pdf->setText($Text); //echo Pdf::encodePdf($pdf);return; $result = Request::routeRequest('POST', '/pdf', array(), Pdf::encodePdf($pdf), $this->_pdf, 'pdf'); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { $pdf = File::decodeFile($result['content']); $pdf->setDisplayName($exerciseName . '.pdf'); $pdf->setTimeStamp($timestamp); $pdf->setBody(null); if (is_object($pro->getRawSubmission())) { $submission = clone $pro->getRawSubmission(); } else { $submission = new Submission(); } $submission->setFile($pdf); $submission->setExerciseId($eid); $pro->setSubmission($submission); } else { $pro->setStatus(409); $res[] = $pro; $this->app->response->setStatus(409); continue; } } #endregion $rawSubmission = $pro->getRawSubmission(); $rawFile = $rawSubmission->getFile(); $rawFile->setBody(Form::encodeForm($formdata), true); $rawSubmission->setFile($rawFile); $rawSubmission->setExerciseId($eid); $pro->setRawSubmission($rawSubmission); $pro->setStatus(201); $res[] = $pro; continue; } } } $this->app->response->setStatus(409); $pro->setStatus(409); $res[] = $pro; } if (!$arr && count($res) == 1) { $this->app->response->setBody(Process::encodeProcess($res[0])); } else { $this->app->response->setBody(Process::encodeProcess($res)); } }
} else { $file = null; $error = 0; } if ($error === 0) { $errormsg = ''; // prüfe ob nur erlaubte Zeichen im Dateinamen verwendet wurden $pregRes = @preg_match("%^((?!\\.)[a-zA-Z0-9\\.\\-_]+)\$%", $file['name']); if ($file === null || $pregRes) { if (isset($_FILES[$fileName])) { $filePath = $file['tmp_name']; $uploadFile = File::createFile(null, $file['name'], null, $timestamp, null, null); $uploadFile->setBody(Reference::createReference($file['tmp_name'])); } else { $uploadFile = File::createFile(null, null, null, $timestamp, null, null); $uploadFile->setBody(Form::encodeForm($formdata), true); } $uploadSubmission = Submission::createSubmission(null, $uid, null, $exerciseId, $exercise['comment'], 1, $timestamp, null, $leaderId); $uploadSubmission->setFile($uploadFile); $uploadSubmission->setExerciseName(isset($exercise['name']) ? $exercise['name'] : null); $uploadSubmission->setSelectedForGroup('1'); if ($isExpired) { $uploadSubmission->setAccepted(0); } $URL = $serverURI . '/logic/LProcessor/submission'; ///echo Submission::encodeSubmission($uploadSubmission);return; $result = http_post_data($URL, Submission::encodeSubmission($uploadSubmission), true, $message); //echo $result; if ($message != "201") { $result = Submission::decodeSubmission($result); $exercise = $key + 1;
public function get($functionName, $sqlFile, $formid, $courseid, $esid, $eid, $singleResult = false, $checkSession = true) { Logger::Log('starts GET ' . $functionName, LogLevel::DEBUG); // checks whether incoming data has the correct data type $formid = DBJson::mysql_real_escape_string($formid); DBJson::checkInput($this->_app, $courseid == '' ? true : ctype_digit($courseid), $esid == '' ? true : ctype_digit($esid), $eid == '' ? true : ctype_digit($eid)); // starts a query, by using a given file $result = DBRequest::getRoutedSqlFile($this->query, $sqlFile, array('formid' => $formid, 'courseid' => $courseid, 'esid' => $esid, 'eid' => $eid), $checkSession); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { $query = Query::decodeQuery($result['content']); if (is_array($query)) { $query = $query[count($query) - 1]; } if ($query->getNumRows() > 0) { $res = Form::ExtractForm($query->getResponse(), $singleResult); $this->_app->response->setBody(Form::encodeForm($res)); $this->_app->response->setStatus(200); if (isset($result['headers']['Content-Type'])) { $this->_app->response->headers->set('Content-Type', $result['headers']['Content-Type']); } $this->_app->stop(); } else { $result['status'] = 404; } } Logger::Log('GET ' . $functionName . ' failed', LogLevel::ERROR); $this->_app->response->setStatus(isset($result['status']) ? $result['status'] : 409); $this->_app->response->setBody(Form::encodeForm(new Form())); $this->_app->stop(); }
} } if (isset($subexercise['choiceId'])) { $choiceIds = $subexercise['choiceId']; foreach ($choiceIds as $tempKey => $choiceData) { if (isset($choices[$tempKey])) { $choices[$tempKey]->setChoiceId($choiceData); } } } $choices = array_values($choices); $form->setChoices($choices); $forms[] = $form; } } $forms = json_decode(Form::encodeForm($forms), true); ######################## ### end create_forms ### ######################## #endregion #region create_processors ############################### ### begin create_processors ### ############################### // create processor data foreach ($exercise as $key2 => $subexercise) { if (isset($subexercise['processorType'])) { $tempProcessors = array(); $processorType = $subexercise['processorType']; foreach ($processorType as $tempKey => $Data) { $processor = new Process();