/// <summary> /// The deserialize EDUGAME questions. /// </summary> /// <param name="format"> /// The format. /// </param> /// <param name="filePath"> /// The file path. /// </param> /// <param name="schemaPath"> /// The schema path. /// </param> /// <returns> /// The <see cref="EdugameQuestions"/>. /// </returns> /// <exception cref="FileNotFoundException"> /// File not found /// </exception> /// <exception cref="SerializationException"> /// Serialized exception /// </exception> /// <exception cref="ArgumentException"> /// Argument exception /// </exception> private EdugameQuestions DeserializeEdugameQuestions(FormatsEnum format, string filePath, string schemaPath) { if (!System.IO.File.Exists(filePath) || !System.IO.File.Exists(schemaPath)) { throw new FileNotFoundException(); } string rawData = System.IO.File.ReadAllText(filePath); string data = format == FormatsEnum.WebEx ? HttpUtility.HtmlDecode(rawData) : rawData; string validationError; if (!XsdValidator.ValidateXmlAgainsXsd(data, schemaPath, out validationError)) { throw new SerializationException(validationError); } EdugameQuestions questions = this.ImportFromString(data, format); if (string.IsNullOrEmpty(data) || questions == null || questions.Questions == null || questions.Questions.Count == 0) { throw new ArgumentException(); } return(questions); }
/// <summary> /// Import questions from string. /// </summary> /// <param name="data"> /// String for importing. /// </param> /// <param name="format"> /// Questions format. /// </param> /// <returns> /// Questions collection. /// </returns> private EdugameQuestions ImportFromString(string data, FormatsEnum format) { var result = new EdugameQuestions(); try { switch (format) { case FormatsEnum.Edugame: result = data.Deserialize <EdugameQuestions>(); break; case FormatsEnum.WebEx: List <QuestionType> questionTypes = this.QuestionTypeModel.GetAllActive().ToList(); var pool = data.Deserialize <WebExPool>(); result = WebExConverter.Convert(pool, questionTypes); break; } } // ReSharper disable once EmptyGeneralCatchClause catch { // It will be handled later. } return(result); }
/// <summary> /// Converts WebEx pool to Edugame questions. /// </summary> /// <param name="value">WebEx pool.</param> /// <param name="questionTypes">Question types DTO.</param> /// <returns>Edugame questions.</returns> public static EdugameQuestions Convert(WebExPool value, List <QuestionType> questionTypes) { if (value == null) { return(null); } var result = new EdugameQuestions(); var questions = value.Questions.Select(question => Convert(question, questionTypes)); result.Questions.AddRange(questions); return(result); }
/// <summary> /// Export questions to string. /// </summary> /// <param name="smi"> /// The sub module item. /// </param> /// <param name="questionIds"> /// Question Ids. /// </param> /// <returns> /// Serialized string. /// </returns> private string ExportToString(SubModuleItem smi, List <int> questionIds = null) { string result = string.Empty; List <Question> questionsSource = this.QuestionModel.GetByQuestionIdsAndSmiID(smi.Id, questionIds).ToList(); List <QuestionFor> customQuestions = this.QuestionModel.GetCustomQuestionsByQuestionIdsWithTypes( questionsSource.Select(x => new KeyValuePair <int, int>(x.Id, x.QuestionType.Id))).ToList(); List <Distractor> distractors = this.DistractorModel.GetAllByQuestionsIds(questionsSource.Select(x => x.Id).ToList()).ToList(); bool isInvalid; List <EdugameQuestion> edugameQuestions = this.GetEdugameQuestions( questionsSource, customQuestions, distractors, out isInvalid); if (!isInvalid) { if (edugameQuestions.Any()) { try { var list = new EdugameQuestions(smi.SubModuleCategory.SubModule.Id, edugameQuestions); result = list.Serialize(); } // ReSharper disable once EmptyGeneralCatchClause catch { // It will be handled later. } } } return(result); }
/// <summary> /// Get questions from imported file. /// </summary> /// <param name="fileId"> /// Imported file id. /// </param> /// <param name="smiId"> /// Sub module item id. /// </param> /// <param name="userId"> /// The user Id. /// </param> /// <param name="format"> /// Questions format. /// </param> /// <returns> /// The <see cref="ServiceResponse"/>. /// </returns> protected QuestionDTO[] Import(string fileId, int?smiId, int?userId, FormatsEnum format) { var questionDtos = new List <QuestionDTO>(); Error error = null; try { SubModuleItem subModuleItem = smiId.HasValue ? this.SubModuleItemModel.GetOneById(smiId.Value).Value : null; User creator = userId.HasValue ? this.UserModel.GetOneById(userId.Value).Value : null; string fileName = fileId + ".xml"; string filePath = Path.Combine(this.ImportPath, fileName); string schemaPath = Path.Combine(this.SchemasPath, format + ".xsd"); if (subModuleItem == null && creator == null) { throw new ArgumentException(); } EdugameQuestions questions = this.DeserializeEdugameQuestions(format, filePath, schemaPath); QuestionModel questionModel = this.QuestionModel; DistractorModel distractorModel = this.DistractorModel; Func <string, string, File> saveImage = this.GetSaveImageRutine(subModuleItem, creator); List <QuestionType> questionTypes = this.QuestionTypeModel.GetAllActive().ToList(); foreach (EdugameQuestion question in questions.Questions) { Question convertedQuestion = EdugameConverter.Convert(question, questionTypes); convertedQuestion.SubModuleItem = subModuleItem; if (convertedQuestion.CreatedBy == null) { convertedQuestion.CreatedBy = subModuleItem.Return(x => x.CreatedBy, creator); } if (convertedQuestion.ModifiedBy == null) { convertedQuestion.ModifiedBy = convertedQuestion.CreatedBy; } File questionImage = saveImage(question.ImageName, question.Image); if (questionImage != null) { convertedQuestion.Image = questionImage; } convertedQuestion.RandomizeAnswers = convertedQuestion.QuestionType.Id == (int)QuestionTypeEnum.Sequence ? (bool?)true : null; if (subModuleItem != null) { questionModel.RegisterSave(convertedQuestion); } QuestionFor customQuestion = this.ProcessCustomQuestionType(convertedQuestion, question); ProcessDistractors(question, convertedQuestion, saveImage, subModuleItem, creator, distractorModel); questionDtos.Add(new QuestionDTO(convertedQuestion, customQuestion)); } System.IO.File.Delete(filePath); } catch (ArgumentException) { error = new Error( Errors.CODE_ERRORTYPE_REQUEST_NOT_PROCESSED, ErrorsTexts.ImportError_Subject, ErrorsTexts.ImportError_NoData); } catch (SerializationException) { error = new Error( Errors.CODE_ERRORTYPE_REQUEST_NOT_PROCESSED, ErrorsTexts.ImportError_Subject, ErrorsTexts.ImportError_InvalidFormat); } catch (FileNotFoundException) { error = new Error( Errors.CODE_ERRORTYPE_REQUEST_NOT_PROCESSED, ErrorsTexts.ImportError_Subject, ErrorsTexts.ImportError_NotFound); } catch (Exception ex) { Logger.Error("Import", ex); error = new Error( Errors.CODE_ERRORTYPE_REQUEST_NOT_PROCESSED, ErrorsTexts.ImportError_Subject, ErrorsTexts.ImportError_Unknown); } if (error != null) { this.LogError("Export.Import", error); throw new FaultException <Error>(error, error.errorMessage); } return(questionDtos.ToArray()); }