Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/ISurveyService.java =================================================================== diff -u -r19c53ce28433c0e4d47c5f303be3e658c808329c -re980ad9a6281fd10d7935a7840ddfa200c5427ac --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/ISurveyService.java (.../ISurveyService.java) (revision 19c53ce28433c0e4d47c5f303be3e658c808329c) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/ISurveyService.java (.../ISurveyService.java) (revision e980ad9a6281fd10d7935a7840ddfa200c5427ac) @@ -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 -r19c53ce28433c0e4d47c5f303be3e658c808329c -re980ad9a6281fd10d7935a7840ddfa200c5427ac --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java (.../SurveyServiceImpl.java) (revision 19c53ce28433c0e4d47c5f303be3e658c808329c) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java (.../SurveyServiceImpl.java) (revision e980ad9a6281fd10d7935a7840ddfa200c5427ac) @@ -174,7 +174,7 @@ public SurveyUser getUserByIDAndSession(Long userId, Long sessionId) { return surveyUserDao.getUserByUserIDAndSessionID(userId, sessionId); } - + @Override public int getCountFinishedUsers(Long sessionId) { return surveyUserDao.getCountFinishedUsers(sessionId); @@ -224,7 +224,7 @@ } return nextUrl; } - + @Override public void setResponseFinalized(Long userUid) { SurveyUser user = (SurveyUser) surveyUserDao.getObject(SurveyUser.class, userUid); @@ -406,8 +406,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 @@ -461,70 +460,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; } @@ -573,36 +626,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); Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/MonitoringAction.java =================================================================== diff -u -rc9845f2002ce96c641bb4334b237ef4744cd83c4 -re980ad9a6281fd10d7935a7840ddfa200c5427ac --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision c9845f2002ce96c641bb4334b237ef4744cd83c4) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision e980ad9a6281fd10d7935a7840ddfa200c5427ac) @@ -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 -re980ad9a6281fd10d7935a7840ddfa200c5427ac --- 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 e980ad9a6281fd10d7935a7840ddfa200c5427ac) @@ -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());