/// <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> /// 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> /// 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()); }