Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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());
        }