Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/ISurveyService.java =================================================================== diff -u -r098d686653002409f33aff0f69b1183e07c1eab3 -r1d63c45a130f0978753bcb9a5e38f409dd1df295 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/ISurveyService.java (.../ISurveyService.java) (revision 098d686653002409f33aff0f69b1183e07c1eab3) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/ISurveyService.java (.../ISurveyService.java) (revision 1d63c45a130f0978753bcb9a5e38f409dd1df295) @@ -233,9 +233,9 @@ // ****************************************************************************************** // Export portfolio methods // ****************************************************************************************** - SortedMap>> exportByLearner(SurveyUser learner); + SortedMap>> exportLearnerPortfolio(SurveyUser learner); - SortedMap>> exportByContentId(Long toolContentID); + SortedMap>> exportClassPortfolio(Long toolContentID); // This export for exporting Excel format file in Survey monitoring summary page: SortedMap>> exportBySessionId(Long toolSessionID); Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java =================================================================== diff -u -r10a9708b4b2ef22a1954a7f813fd65446add22a0 -r1d63c45a130f0978753bcb9a5e38f409dd1df295 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java (.../SurveyServiceImpl.java) (revision 10a9708b4b2ef22a1954a7f813fd65446add22a0) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java (.../SurveyServiceImpl.java) (revision 1d63c45a130f0978753bcb9a5e38f409dd1df295) @@ -47,6 +47,7 @@ import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.learning.service.ILearnerService; +import org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; @@ -180,7 +181,7 @@ public SurveyUser getUserByIDAndSession(Long userId, Long sessionId) { return surveyUserDao.getUserByUserIDAndSessionID(userId, sessionId); } - + @Override public int getCountFinishedUsers(Long sessionId) { return surveyUserDao.getCountFinishedUsers(sessionId); @@ -230,7 +231,7 @@ } return nextUrl; } - + @Override public void setResponseFinalized(Long userUid) { SurveyUser user = (SurveyUser) surveyUserDao.getObject(SurveyUser.class, userUid); @@ -412,8 +413,7 @@ @Override public List getOpenResponsesForTablesorter(final Long qaSessionId, final Long questionId, int page, int size, int sorting) { - return surveyAnswerDao.getOpenResponsesForTablesorter(qaSessionId, questionId, page, size, - sorting); + return surveyAnswerDao.getOpenResponsesForTablesorter(qaSessionId, questionId, page, size, sorting); } @Override @@ -467,70 +467,124 @@ } @Override - public SortedMap>> exportByContentId(Long toolContentID) { + public SortedMap>> exportClassPortfolio(Long toolContentID) { - SortedMap>> summary = new TreeMap>>( - new SurveySessionComparator()); - - // get all tool sessions in this content + //construct sessionToUsers Map + Map> sessionToUsersMap = new HashMap>(); List sessions = surveySessionDao.getByContentId(toolContentID); if (sessions != null) { for (SurveySession session : sessions) { // get all users under this session List users = surveyUserDao.getBySessionID(session.getSessionId()); - - // container for this user's answers - List> learnerAnswers = new ArrayList>(); - if (users != null) { - // for every user, get answers of all questions. - for (SurveyUser user : users) { - List answers = getQuestionAnswers(user.getSession().getSessionId(), user.getUid()); - learnerAnswers.add(answers); - } - } - toQuestionMap(summary, session, learnerAnswers); + sessionToUsersMap.put(session, users); } } - return summary; + return getExportSummary(sessionToUsersMap); } @Override public SortedMap>> exportBySessionId(Long toolSessionID) { - SortedMap>> summary = new TreeMap>>( - new SurveySessionComparator()); - - // get tool sessions SurveySession session = surveySessionDao.getSessionBySessionId(toolSessionID); - List users = surveyUserDao.getBySessionID(session.getSessionId()); + List users = surveyUserDao.getBySessionID(toolSessionID); - // container for this user's answers - List> learnerAnswers = new ArrayList>(); - if (users != null) { - // for every user, get answers of all questions. - for (SurveyUser user : users) { - List answers = getQuestionAnswers(user.getSession().getSessionId(), user.getUid()); - learnerAnswers.add(answers); - } - } - toQuestionMap(summary, session, learnerAnswers); + Map> sessionToUsersMap = new HashMap>(); + sessionToUsersMap.put(session, users); - return summary; + return getExportSummary(sessionToUsersMap); } @Override - public SortedMap>> exportByLearner(SurveyUser learner) { + public SortedMap>> exportLearnerPortfolio(SurveyUser learner) { + + Map> sessionToUsersMap = new HashMap>(); + SurveySession session = learner.getSession(); + sessionToUsersMap.put(session, Arrays.asList(learner)); + + return getExportSummary(sessionToUsersMap); + } + + /** + * Creates data for export methods. Suitable both for single/multiple users + * + * @param sessionToUsersMap map containing all session to users pairs that require data to be exported + * @return + */ + private SortedMap>> getExportSummary( + Map> sessionToUsersMap) { + SortedMap>> summary = new TreeMap>>( new SurveySessionComparator()); - SurveySession session = learner.getSession(); - List answers = getQuestionAnswers(session.getSessionId(), learner.getUid()); - List> learnerAnswers = new ArrayList>(); - learnerAnswers.add(answers); + // all questions + List questions = new ArrayList(); + if (!sessionToUsersMap.isEmpty()) { + SurveySession session = sessionToUsersMap.keySet().iterator().next(); + Survey survey = session.getSurvey(); + questions.addAll(survey.getQuestions()); + } - toQuestionMap(summary, session, learnerAnswers); + // traverse all sessions + for (SurveySession session : sessionToUsersMap.keySet()) { + SortedMap> questionMap = new TreeMap>( + new QuestionsComparator()); + + // traverse all questions + for (SurveyQuestion question : questions) { + + List users = sessionToUsersMap.get(session); + List answerDtos = new ArrayList(); + + // if it's for a single user - query DB for only one answer for this current user + if (users.size() == 1) { + SurveyUser user = users.get(0); + + AnswerDTO answerDTO = new AnswerDTO(question); + SurveyAnswer answer = surveyAnswerDao.getAnswer(question.getUid(), user.getUid()); + if (answer != null) { + answer.setChoices(SurveyWebUtils.getChoiceList(answer.getAnswerChoices())); + } + answerDTO.setAnswer(answer); + answerDTO.setReplier(user); + answerDtos.add(answerDTO); + + // if it's for more than one user - query DB for all answers for this session to this question + } else { + + // get all question answers for this session + List answers = surveyAnswerDao.getSessionAnswer(session.getSessionId(), + question.getUid()); + // traverse all users + for (SurveyUser user : users) { + + // find user's answer + SurveyAnswer learnerAnswer = null; + for (SurveyAnswer answer : answers) { + if (answer.getUser().getUid().equals(user.getUid())) { + learnerAnswer = answer; + break; + } + } + + AnswerDTO answerDTO = new AnswerDTO(question); + if (learnerAnswer != null) { + learnerAnswer.setChoices(SurveyWebUtils.getChoiceList(learnerAnswer.getAnswerChoices())); + } + answerDTO.setAnswer(learnerAnswer); + answerDTO.setReplier(user); + answerDtos.add(answerDTO); + } + + } + + questionMap.put(question, answerDtos); + } + + summary.put(session, questionMap); + } + return summary; } @@ -579,36 +633,7 @@ // ***************************************************************************** // private methods // ***************************************************************************** - /** - * Convert all user's answers to another map sorted by SurveyQuestion, rather than old sorted by user. - */ - private void toQuestionMap(SortedMap>> summary, - SurveySession session, List> learnerAnswers) { - // after get all users' all answers, then sort them by SurveyQuestion - SortedMap> questionMap = new TreeMap>( - new QuestionsComparator()); - Survey survey = getSurveyBySessionId(session.getSessionId()); - Set questionList = survey.getQuestions(); - if (questionList != null) { - for (SurveyQuestion question : questionList) { - List queAnsList = new ArrayList(); - questionMap.put(question, queAnsList); - for (List listAns : learnerAnswers) { - for (AnswerDTO answerDTO : listAns) { - // get a user's answer for this question - if (answerDTO.getUid().equals(question.getUid())) { - queAnsList.add(answerDTO); - break; - } - } - // find another user's answer - } - }// for this question, get all users answer, the continue next - } - summary.put(session, questionMap); - } - private Survey getDefaultSurvey() throws SurveyApplicationException { Long defaultSurveyId = getToolDefaultContentIdBySignature(SurveyConstants.TOOL_SIGNATURE); Survey defaultSurvey = getSurveyByContentId(defaultSurveyId); @@ -636,6 +661,7 @@ // ToolContentManager, ToolSessionManager methods // ******************************************************************************* + @Override public void exportToolContent(Long toolContentId, String rootPath) throws DataMissingException, ToolException { Survey toolContentObj = surveyDao.getByContentId(toolContentId); if (toolContentObj == null) { @@ -658,6 +684,7 @@ } } + @Override public void importToolContent(Long toolContentId, Integer newUserUid, String toolContentPath, String fromVersion, String toVersion) throws ToolException { @@ -694,14 +721,7 @@ } } - /** - * Get the definitions for possible output for an activity, based on the toolContentId. These may be definitions - * that are always available for the tool (e.g. number of marks for Multiple Choice) or a custom definition created - * for a particular activity such as the answer to the third question contains the word Koala and hence the need for - * the toolContentId - * - * @return SortedMap of ToolOutputDefinitions with the key being the name of each definition - */ + @Override public SortedMap getToolOutputDefinitions(Long toolContentId, int definitionType) throws ToolException { Survey survey = surveyDao.getByContentId(toolContentId); @@ -715,6 +735,7 @@ return getSurveyOutputFactory().getToolOutputDefinitions(survey, definitionType); } + @Override public void copyToolContent(Long fromContentId, Long toContentId) throws ToolException { if (toContentId == null) { throw new ToolException("Failed to create the SharedSurveyFiles tool seession"); @@ -746,6 +767,7 @@ } } + @Override public String getToolContentTitle(Long toolContentId) { return getSurveyByContentId(toolContentId).getTitle(); } Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/MonitoringAction.java =================================================================== diff -u -r098d686653002409f33aff0f69b1183e07c1eab3 -r1d63c45a130f0978753bcb9a5e38f409dd1df295 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 098d686653002409f33aff0f69b1183e07c1eab3) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 1d63c45a130f0978753bcb9a5e38f409dd1df295) @@ -24,7 +24,6 @@ /* $Id$ */ package org.lamsfoundation.lams.tool.survey.web.action; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; @@ -37,16 +36,18 @@ import java.util.TreeMap; import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; @@ -76,8 +77,8 @@ import org.springframework.web.context.support.WebApplicationContextUtils; public class MonitoringAction extends Action { - - public ISurveyService surveyService; + + public ISurveyService surveyService; private static final String MSG_LABEL_QUESTION = "label.question"; private static final String MSG_LABEL_OPEN_RESPONSE = "label.open.response"; private static final String MSG_LABEL_SESSION_NAME = "label.session.name"; @@ -106,7 +107,7 @@ if (param.equals("exportSurvey")) { return exportSurvey(mapping, form, request, response); } - + if (param.equals("setSubmissionDeadline")) { return setSubmissionDeadline(mapping, form, request, response); } @@ -126,17 +127,17 @@ private ActionForward summary(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { - - // get session from shared session. - HttpSession ss = SessionManager.getSession(); - + + // get session from shared session. + HttpSession ss = SessionManager.getSession(); + // initial Session Map SessionMap sessionMap = new SessionMap(); request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); request.setAttribute(SurveyConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); // save contentFolderID into session - sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, WebUtil.readStrParam(request, - AttributeNames.PARAM_CONTENT_FOLDER_ID)); + sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, + WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID)); request.setAttribute("initialTabId", WebUtil.readLongParam(request, AttributeNames.PARAM_CURRENT_TAB, true)); @@ -163,20 +164,20 @@ sessionMap.put(AttributeNames.PARAM_TOOL_CONTENT_ID, contentId); sessionMap.put(SurveyConstants.ATTR_REFLECT_LIST, relectList); sessionMap.put(SurveyConstants.ATTR_IS_GROUPED_ACTIVITY, service.isGroupedActivity(contentId)); - + // check if there is submission deadline Date submissionDeadline = survey.getSubmissionDeadline(); - + if (submissionDeadline != null) { - - UserDTO learnerDto = (UserDTO) ss.getAttribute(AttributeNames.USER); + + UserDTO learnerDto = (UserDTO) ss.getAttribute(AttributeNames.USER); TimeZone learnerTimeZone = learnerDto.getTimeZone(); Date tzSubmissionDeadline = DateUtil.convertToTimeZoneFromDefault(learnerTimeZone, submissionDeadline); MonitoringAction.log.info("Time:" + tzSubmissionDeadline.getTime()); - //store submission deadline to sessionMap + // store submission deadline to sessionMap sessionMap.put(SurveyConstants.ATTR_SUBMISSION_DEADLINE, tzSubmissionDeadline.getTime()); - } + } return mapping.findForward(SurveyConstants.SUCCESS); } @@ -255,11 +256,11 @@ MessageService resource = getMessageService(); try { // create an empty excel file - HSSFWorkbook wb = new HSSFWorkbook(); - HSSFSheet sheet = wb.createSheet("Survey"); + Workbook workbook = new SXSSFWorkbook(); + Sheet sheet = workbook.createSheet("Survey"); sheet.setColumnWidth(0, 5000); - HSSFRow row; - HSSFCell cell; + Row row; + Cell cell; int idx = 0; Set>>> entries = groupList.entrySet(); for (Entry>> entry : entries) { @@ -391,19 +392,16 @@ } } - } - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - wb.write(bos); - // construct download file response header - String fileName = "lams_survey_" + toolSessionID + ".xls"; - String mineType = "application/vnd.ms-excel"; - String header = "attachment; filename=\"" + fileName + "\";"; - response.setContentType(mineType); - response.setHeader("Content-Disposition", header); + } - byte[] data = bos.toByteArray(); - response.getOutputStream().write(data, 0, data.length); - response.getOutputStream().flush(); + String fileName = "lams_survey_" + toolSessionID + ".xlsx"; + response.setContentType("application/x-download"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + + ServletOutputStream out = response.getOutputStream(); + workbook.write(out); + out.close(); + } catch (Exception e) { MonitoringAction.log.error(e); errors = new ActionMessage("error.monitoring.export.excel", e.toString()).toString(); @@ -419,7 +417,7 @@ } return null; } - + /** * Set Submission Deadline * @@ -432,10 +430,10 @@ public ActionForward setSubmissionDeadline(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { surveyService = getSurveyService(); - + Long contentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); Survey survey = surveyService.getSurveyByContentId(contentID); - + Long dateParameter = WebUtil.readLongParam(request, SurveyConstants.ATTR_SUBMISSION_DEADLINE, true); Date tzSubmissionDeadline = null; if (dateParameter != null) { @@ -450,9 +448,10 @@ return null; } - + /** * Removes all the html tags from a string + * * @param string * @return */ Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/servlet/ExportServlet.java =================================================================== diff -u -r8b97231e320c0c5b674f07c14da711f232ba9e1c -r1d63c45a130f0978753bcb9a5e38f409dd1df295 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/servlet/ExportServlet.java (.../ExportServlet.java) (revision 8b97231e320c0c5b674f07c14da711f232ba9e1c) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/servlet/ExportServlet.java (.../ExportServlet.java) (revision 1d63c45a130f0978753bcb9a5e38f409dd1df295) @@ -148,7 +148,7 @@ sessionMap.put(SurveyConstants.ATTR_REFLECT_LIST, map); } - SortedMap>> groupList = service.exportByLearner(learner); + SortedMap>> groupList = service.exportLearnerPortfolio(learner); sessionMap.put(SurveyConstants.ATTR_TITLE, content.getTitle()); sessionMap.put(SurveyConstants.ATTR_SUMMARY_LIST, groupList); } @@ -170,7 +170,7 @@ logger.error(error); throw new SurveyApplicationException(error); } - SortedMap>> groupList = service.exportByContentId(toolContentID); + SortedMap>> groupList = service.exportClassPortfolio(toolContentID); // Add flag to indicate whether to render user notebook entries sessionMap.put(SurveyConstants.ATTR_REFLECTION_ON, content.isReflectOnActivity());