Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -rf9c66e78afa51f175afcaf22ee81f9b3460afea8 -r1b530a88ae6d3a1e553081b3d56117ec5ad3622a --- lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision f9c66e78afa51f175afcaf22ee81f9b3460afea8) +++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -892,7 +892,11 @@ label.search.question.bank =Search question bank label.question.type =Type: label.question.successfully.imported =Question successfully imported -label.import.qti =Import IMS QTI -label.export.qti =Export IMS QTI +label.import.qti =Import questions in IMS QTI format +label.export.qti =Export questions in IMS QTI format +label.import.xml =Import questions in XML format +label.export.xml =Export questions in XML format +msg.import.file.format =The import file must be .xml file exported from assessment tool and not exceed size of {0} +error.import.file.format =The import file is not an .xml file. #======= End labels: Exported 872 labels for en AU ===== Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/XmlQuestionsController.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/web/qb/XmlQuestionsController.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/XmlQuestionsController.java (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -0,0 +1,188 @@ +package org.lamsfoundation.lams.web.qb; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; +import org.lamsfoundation.lams.qb.model.QbCollection; +import org.lamsfoundation.lams.qb.model.QbOption; +import org.lamsfoundation.lams.qb.model.QbQuestion; +import org.lamsfoundation.lams.qb.service.IQbService; +import org.lamsfoundation.lams.questions.Answer; +import org.lamsfoundation.lams.questions.Question; +import org.lamsfoundation.lams.questions.QuestionExporter; +import org.lamsfoundation.lams.questions.QuestionParser; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.FileUtil; +import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.util.SessionMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.StaxDriver; +import com.thoughtworks.xstream.security.AnyTypePermission; + +/** + * Exports and imports questions from the given collection in XML format. + * + * @author Andrey Balan + */ +@Controller +@RequestMapping("/xmlQuestions") +public class XmlQuestionsController { + private static Logger log = Logger.getLogger(XmlQuestionsController.class); + + @Autowired + private IQbService qbService; + + @Autowired + private IUserManagementService userManagementService; + + /** + * Initializes import questions page. + */ + @RequestMapping("/initImportQuestionsXml") + public String initImportQuestionsXml() throws ServletException { + return "qb/importQuestionsXml"; + } + + /** + * Imports questions into question bank from uploaded xml file. + */ + @SuppressWarnings("unchecked") + @RequestMapping("/importQuestionsXml") + @ResponseBody + public void importQuestionsXml(@RequestParam("UPLOAD_FILE") MultipartFile file, HttpServletRequest request, + @RequestParam long collectionUid) throws ServletException { + int questionId = qbService.getMaxQuestionId(); + + List toolsErrorMsgs = new ArrayList<>(); + try { + String uploadPath = FileUtil.createTempDirectory("_uploaded_2questions_xml"); + + // filename on the client + String filename = FileUtil.getFileName(file.getOriginalFilename()); + File destinationFile = new File(uploadPath, filename); + file.transferTo(destinationFile); + + String fileExtension = FileUtil.getFileExtension(filename); + if (!fileExtension.equalsIgnoreCase("xml")) { + throw new RuntimeException("Wrong file extension. Xml is expected"); + } + // String learningDesignPath = ZipFileUtil.expandZip(new FileInputStream(designFile), filename2); + + // import learning design + String fullFilePath = destinationFile.getAbsolutePath();// FileUtil.getFullPath(learningDesignPath, + // ExportToolContentService.LEARNING_DESIGN_FILE_NAME); + List questions = (List) FileUtil.getObjectFromXML(null, fullFilePath); + if (questions != null) { + for (QbQuestion qbQuestion : questions) { + qbQuestion.setQuestionId(++questionId); + qbQuestion.setCreateDate(new Date()); + userManagementService.save(qbQuestion); + + qbService.addQuestionToCollection(collectionUid, qbQuestion.getUid(), false); + + if (log.isDebugEnabled()) { + log.debug("Imported XML question. Name: " + qbQuestion.getName() + ", uid: " + + qbQuestion.getUid()); + } + } + } + + } catch (Exception e) { + log.error("Error occured during import", e); + toolsErrorMsgs.add(e.getClass().getName() + " " + e.getMessage()); + } + + if (toolsErrorMsgs.size() > 0) { + request.setAttribute("toolsErrorMessages", toolsErrorMsgs); + } + } + + /** + * Exports xml format questions from question collection. + */ + @RequestMapping("/exportQuestionsXml") + public void exportQuestionsXml(HttpServletRequest request, HttpServletResponse response, @RequestParam long collectionUid) { + List qbQuestions = qbService.getCollectionQuestions(collectionUid); + String errors = null; + try { + ArrayList questionsToExport = new ArrayList<>(); + for (QbQuestion qbQuestion : qbQuestions) { + QbQuestion clonedQuestion = (QbQuestion) qbQuestion.clone(); + clonedQuestion.clearID(); + clonedQuestion.setVersion(1); + questionsToExport.add(clonedQuestion); + } + // exporting XML + XStream designXml = new XStream(new StaxDriver()); + designXml.addPermission(AnyTypePermission.ANY); + String resultedXml = designXml.toXML(questionsToExport); + + QbCollection collection = qbService.getCollectionByUid(collectionUid); + String fileTitle = collection.getName() + "_questions.xml"; + + response.setContentType("application/x-download"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileTitle); + log.debug("Exporting assessment questions to an xml. Collection uid " + collectionUid); + + OutputStream out = null; + try { + out = response.getOutputStream(); + out.write(resultedXml.getBytes()); + int count = resultedXml.getBytes().length; + log.debug("Wrote out " + count + " bytes"); + response.setContentLength(count); + out.flush(); + } catch (Exception e) { + log.error("Exception occured writing out file:" + e.getMessage()); + throw new ExportToolContentException(e); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (Exception e) { + log.error("Error Closing file. File already written out - no exception being thrown.", e); + } + } + + } catch (Exception e) { + errors = "Unable to export tool content: " + e.toString(); + log.error(errors); + } + + if (errors != null) { + try { + PrintWriter out = response.getWriter(); + out.write(errors); + out.flush(); + } catch (IOException e) { + } + } + } +} Index: lams_central/web/qb/collection.jsp =================================================================== diff -u -r35ddd2ff17fa5c28f316465a7828106a0537511b -r1b530a88ae6d3a1e553081b3d56117ec5ad3622a --- lams_central/web/qb/collection.jsp (.../collection.jsp) (revision 35ddd2ff17fa5c28f316465a7828106a0537511b) +++ lams_central/web/qb/collection.jsp (.../collection.jsp) (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -293,6 +293,11 @@ frame.src = '?collectionUid=${collection.uid}'; } + function exportQuestionsXml(){ + var reqIDVar = new Date(); + location.href="?collectionUid=${collection.uid}&reqID="+reqIDVar.getTime(); + } + //create proper href for "Create question" button function initLinkHref() { var questionType = document.getElementById("question-type").selectedIndex + 1; @@ -348,8 +353,25 @@ + + +
+ QTI + Index: lams_central/web/qb/importQuestionsXml.jsp =================================================================== diff -u --- lams_central/web/qb/importQuestionsXml.jsp (revision 0) +++ lams_central/web/qb/importQuestionsXml.jsp (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -0,0 +1,106 @@ + +<%@ page contentType="text/html; charset=utf-8" language="java"%> +<%@ taglib uri="tags-lams" prefix="lams"%> +<%@ taglib uri="tags-fmt" prefix="fmt"%> +<%@ taglib uri="tags-core" prefix="c"%> + +<%@ page import="org.lamsfoundation.lams.util.Configuration" %> +<%@ page import="org.lamsfoundation.lams.util.ConfigurationKeys" %> +<%@ page import="org.lamsfoundation.lams.util.FileValidatorUtil" %> +<%=Configuration.get(ConfigurationKeys.UPLOAD_FILE_LARGE_MAX_SIZE)%> +<%=FileValidatorUtil.formatSize(Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_LARGE_MAX_SIZE))%> +<%=Configuration.get(ConfigurationKeys.EXE_EXTENSIONS)%> + + + + x + + + + + + + + + + + +
+
+
+ +
+
+ +
+ +
?collectionUid=${param.collectionUid}" method="post" + enctype="multipart/form-data" id="importForm"> + + + + + +
+ + + +   + +
+ + +
+ + + + + + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java =================================================================== diff -u -rf9c66e78afa51f175afcaf22ee81f9b3460afea8 -r1b530a88ae6d3a1e553081b3d56117ec5ad3622a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision f9c66e78afa51f175afcaf22ee81f9b3460afea8) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -724,138 +724,6 @@ } /** - * Initializes import questions page. - */ - @RequestMapping("/importInit") - public String importInit(HttpServletRequest request) throws ServletException { - String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); - request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMapID); - - return "pages/authoring/importQuestions"; - } - - /** - * Imports questions into question bank from uploaded xml file. - */ - @SuppressWarnings("unchecked") - @RequestMapping("/importQuestions") - public String importQuestions(@RequestParam("UPLOAD_FILE") MultipartFile file, HttpServletRequest request) throws ServletException { - SessionMap sessionMap = getSessionMap(request); - SortedSet oldQuestions = getQuestionList(sessionMap); - - List toolsErrorMsgs = new ArrayList<>(); - try { - String uploadPath = FileUtil.createTempDirectory("_uploaded_2questions_xml"); - - // filename on the client - String filename = FileUtil.getFileName(file.getOriginalFilename()); - File destinationFile = new File(uploadPath, filename); - file.transferTo(destinationFile); - - String fileExtension = FileUtil.getFileExtension(filename); - if (!fileExtension.equalsIgnoreCase("xml")) { - throw new RuntimeException("Wrong file extension. Xml is expected"); - } - // String learningDesignPath = ZipFileUtil.expandZip(new FileInputStream(designFile), filename2); - - // import learning design - String fullFilePath = destinationFile.getAbsolutePath();// FileUtil.getFullPath(learningDesignPath, - // ExportToolContentService.LEARNING_DESIGN_FILE_NAME); - List questions = (List) FileUtil.getObjectFromXML(null, - fullFilePath); - if (questions != null) { - for (AssessmentQuestion question : questions) { - int maxSeq = 1; - if ((oldQuestions != null) && (oldQuestions.size() > 0)) { - AssessmentQuestion last = oldQuestions.last(); - maxSeq = last.getDisplayOrder() + 1; - } - question.setDisplayOrder(maxSeq); - oldQuestions.add(question); - } - } - - } catch (Exception e) { - log.error("Error occured during import", e); - toolsErrorMsgs.add(e.getClass().getName() + " " + e.getMessage()); - } - - if (toolsErrorMsgs.size() > 0) { - request.setAttribute("toolsErrorMessages", toolsErrorMsgs); - } - - reinitializeAvailableQuestions(sessionMap); - return "pages/authoring/parts/questionlist"; - } - - /** - * Exports xml format questions from question bank. - */ - @RequestMapping("/exportQuestions") - public String exportQuestions(HttpServletRequest request, HttpServletResponse response) { - SessionMap sessionMap = getSessionMap(request); - - AssessmentForm assessmentForm = (AssessmentForm) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT_FORM); - Assessment assessment = assessmentForm.getAssessment(); - - String errors = null; - if (assessment != null) { - try { - ArrayList questionsToExport = new ArrayList<>(); - - for (AssessmentQuestion question : getQuestionList(sessionMap)) { - AssessmentQuestion clonedQuestion = (AssessmentQuestion) question.clone(); - questionsToExport.add(clonedQuestion); - } - // exporting XML - XStream designXml = new XStream(new StaxDriver()); - designXml.addPermission(AnyTypePermission.ANY); - String resultedXml = designXml.toXML(questionsToExport); - - response.setContentType("application/x-download"); - response.setHeader("Content-Disposition", - "attachment;filename=" + AssessmentConstants.EXPORT_QUESTIONS_FILENAME); - log.debug("Exporting assessment questions to an xml: " + assessment.getContentId()); - - OutputStream out = null; - try { - out = response.getOutputStream(); - out.write(resultedXml.getBytes()); - int count = resultedXml.getBytes().length; - log.debug("Wrote out " + count + " bytes"); - response.setContentLength(count); - out.flush(); - } catch (Exception e) { - log.error("Exception occured writing out file:" + e.getMessage()); - throw new ExportToolContentException(e); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (Exception e) { - log.error("Error Closing file. File already written out - no exception being thrown.", e); - } - } - - } catch (Exception e) { - errors = "Unable to export tool content: " + e.toString(); - log.error(errors); - } - - } - if (errors != null) { - try { - PrintWriter out = response.getWriter(); - out.write(errors); - out.flush(); - } catch (IOException e) { - } - } - return null; - } - - /** * Ajax call, will add one more input line for new resource item instruction. */ @RequestMapping("/addOption") Index: lams_tool_assessment/web/pages/authoring/basic.jsp =================================================================== diff -u -r14f09ab0c0d6351201073b5f1ffe6aec576508ee -r1b530a88ae6d3a1e553081b3d56117ec5ad3622a --- lams_tool_assessment/web/pages/authoring/basic.jsp (.../basic.jsp) (revision 14f09ab0c0d6351201073b5f1ffe6aec576508ee) +++ lams_tool_assessment/web/pages/authoring/basic.jsp (.../basic.jsp) (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -100,12 +100,6 @@ }); return serializedMaxMarks; } - - function exportQuestions(){ - var reqIDVar = new Date(); - var param = "?sessionMapID=${sessionMapID}&reqID="+reqIDVar.getTime(); - location.href="" + param; - }; function createNewQuestionInitHref() { var questionTypeDropdown = document.getElementById("questionType"); Fisheye: Tag 1b530a88ae6d3a1e553081b3d56117ec5ad3622a refers to a dead (removed) revision in file `lams_tool_assessment/web/pages/authoring/importQuestions.jsp'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp =================================================================== diff -u -r14f09ab0c0d6351201073b5f1ffe6aec576508ee -r1b530a88ae6d3a1e553081b3d56117ec5ad3622a --- lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp (.../questionlist.jsp) (revision 14f09ab0c0d6351201073b5f1ffe6aec576508ee) +++ lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp (.../questionlist.jsp) (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a) @@ -139,18 +139,6 @@
- -
- - ?sessionMapID=${sessionMapID}&KeepThis=true&TB_iframe=true - - - - - - - -