Index: lams_tool_spreadsheet/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r9dcdc46408a8664a0fb27f09ae58a340c15f5764 -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 9dcdc46408a8664a0fb27f09ae58a340c15f5764) +++ lams_tool_spreadsheet/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -119,6 +119,6 @@ label.on =On label.off =Off label.submit =Finish +label.search =Search... - #======= End labels: Exported 113 labels for en AU ===== Index: lams_tool_spreadsheet/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r9dcdc46408a8664a0fb27f09ae58a340c15f5764 -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 9dcdc46408a8664a0fb27f09ae58a340c15f5764) +++ lams_tool_spreadsheet/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -119,6 +119,6 @@ label.on =On label.off =Off label.submit =Finish +label.search =Search... - #======= End labels: Exported 113 labels for en AU ===== Index: lams_tool_spreadsheet/conf/xdoclet/struts-actions.xml =================================================================== diff -u -rbe07c35c372d904a65581d98660e73f3b13b69db -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision be07c35c372d904a65581d98660e73f3b13b69db) +++ lams_tool_spreadsheet/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -102,6 +102,10 @@ parameter="summary" > + + @@ -137,11 +141,6 @@ - - - getBySessionID(Long sessionId); + + List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, String searchString); + + int getCountUsersBySession(final Long sessionId, String searchString); } Index: lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/dao/hibernate/SpreadsheetUserDAOHibernate.java =================================================================== diff -u -r7f9f772433a7fd55c4475241d4e3bc0765f474e8 -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/dao/hibernate/SpreadsheetUserDAOHibernate.java (.../SpreadsheetUserDAOHibernate.java) (revision 7f9f772433a7fd55c4475241d4e3bc0765f474e8) +++ lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/dao/hibernate/SpreadsheetUserDAOHibernate.java (.../SpreadsheetUserDAOHibernate.java) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -25,6 +25,11 @@ import java.util.List; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.hibernate.Hibernate; +import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; +import org.lamsfoundation.lams.tool.spreadsheet.SpreadsheetConstants; import org.lamsfoundation.lams.tool.spreadsheet.dao.SpreadsheetUserDAO; import org.lamsfoundation.lams.tool.spreadsheet.model.SpreadsheetUser; @@ -53,5 +58,72 @@ return this.getHibernateTemplate().find(FIND_BY_SESSION_ID,sessionId); } + @SuppressWarnings("unchecked") + public List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, String searchString) { + String sortingOrder; + switch (sorting) { + case SpreadsheetConstants.SORT_BY_USERNAME_ASC: + sortingOrder = "user.lastName ASC, user.firstName ASC"; + break; + case SpreadsheetConstants.SORT_BY_USERNAME_DESC: + sortingOrder = "user.lastName DESC, user.firstName DESC"; + break; + case SpreadsheetConstants.SORT_BY_MARKED_ASC: + sortingOrder = " mark.marks ASC"; + break; + case SpreadsheetConstants.SORT_BY_MARKED_DESC: + sortingOrder = " mark.marks DESC"; + break; + default: + sortingOrder = "user.lastName, user.firstName"; + } + String filteredSearchString = buildNameSearch(searchString); + String queryText = "SELECT user FROM " + SpreadsheetUser.class.getName() + " as user "; + if (sorting == SpreadsheetConstants.SORT_BY_MARKED_ASC + || sorting == SpreadsheetConstants.SORT_BY_MARKED_DESC) { + queryText += " LEFT JOIN user.userModifiedSpreadsheet as ums " + + " LEFT JOIN ums.mark as mark "; + } + + queryText+= " WHERE user.session.sessionId=:sessionId " + + ( filteredSearchString != null ? filteredSearchString : "" ) + + " ORDER BY " + sortingOrder; + + return getSession().createQuery(queryText).setLong("sessionId", sessionId.longValue()).setFirstResult(page * size).setMaxResults(size).list(); + } + + private String buildNameSearch(String searchString) { + String filteredSearchString = null; + if (!StringUtils.isBlank(searchString)) { + StringBuilder searchStringBuilder = new StringBuilder(""); + String[] tokens = searchString.trim().split("\\s+"); + for (String token : tokens) { + String escToken = StringEscapeUtils.escapeSql(token); + searchStringBuilder.append(" AND (user.firstName LIKE '%").append(escToken) + .append("%' OR user.lastName LIKE '%").append(escToken) + .append("%' OR user.loginName LIKE '%").append(escToken).append("%')"); + } + filteredSearchString = searchStringBuilder.toString(); + } + return filteredSearchString; + } + + @SuppressWarnings("rawtypes") + public int getCountUsersBySession(final Long sessionId, String searchString) { + + String filteredSearchString = buildNameSearch(searchString); + String queryText = "SELECT count(*) FROM " + SpreadsheetUser.class.getName() + " user WHERE user.session.sessionId=:sessionId "; + if ( filteredSearchString != null ) + queryText += filteredSearchString; + + List list = getSession().createQuery(queryText).setLong("sessionId", sessionId.longValue()).list(); + + if (list == null || list.size() == 0) { + return 0; + } + return ((Number) list.get(0)).intValue(); + } + + } Index: lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/service/ISpreadsheetService.java =================================================================== diff -u -rbe07c35c372d904a65581d98660e73f3b13b69db -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/service/ISpreadsheetService.java (.../ISpreadsheetService.java) (revision be07c35c372d904a65581d98660e73f3b13b69db) +++ lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/service/ISpreadsheetService.java (.../ISpreadsheetService.java) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -139,12 +139,25 @@ /** * Return monitoring summary list. The return value is list of spreadsheet summaries for each groups. + * It does not return the users in each session as we now use paging. * @param contentId * @return */ List getSummary(Long contentId); + + /** + * Get a paged, optionally sorted and filtered, list of users. + * @return + */ + List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, String searchString); /** + * Get the number of users that would be returned by getUsersForTablesorter() if it was not paged. Supports filtering. + * @return + */ + int getCountUsersBySession(Long sessionId, String searchString); + + /** * Return monitoring statistic list. The return value is list of statistics for each groups. * @param contentId * @return @@ -214,5 +227,7 @@ * @return */ boolean isGroupedActivity(long toolContentID); + + } Index: lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/service/SpreadsheetServiceImpl.java =================================================================== diff -u -ra789c1395e0f8c1f0ded10147c464574c979b69c -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/service/SpreadsheetServiceImpl.java (.../SpreadsheetServiceImpl.java) (revision a789c1395e0f8c1f0ded10147c464574c979b69c) +++ lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/service/SpreadsheetServiceImpl.java (.../SpreadsheetServiceImpl.java) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -23,10 +23,6 @@ /* $$Id$$ */ package org.lamsfoundation.lams.tool.spreadsheet.service; -import java.io.File; -import java.io.FileFilter; -import java.io.FileNotFoundException; -import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -39,20 +35,7 @@ import java.util.TreeMap; import java.util.TreeSet; -import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; -import org.apache.struts.upload.FormFile; -import org.lamsfoundation.lams.contentrepository.AccessDeniedException; -import org.lamsfoundation.lams.contentrepository.ICredentials; -import org.lamsfoundation.lams.contentrepository.ITicket; -import org.lamsfoundation.lams.contentrepository.IVersionedNode; -import org.lamsfoundation.lams.contentrepository.InvalidParameterException; -import org.lamsfoundation.lams.contentrepository.LoginException; -import org.lamsfoundation.lams.contentrepository.NodeKey; -import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; -import org.lamsfoundation.lams.contentrepository.WorkspaceNotFoundException; -import org.lamsfoundation.lams.contentrepository.service.IRepositoryService; -import org.lamsfoundation.lams.contentrepository.service.SimpleCredentials; import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; @@ -90,7 +73,6 @@ import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.MessageService; -import org.lamsfoundation.lams.util.audit.IAuditService; /** * @@ -293,22 +275,34 @@ } public List getSummary(Long contentId) { + Spreadsheet spreadsheet = spreadsheetDao.getByContentId(contentId); List sessionList = spreadsheetSessionDao.getByContentId(contentId); List summaryList = new ArrayList(); // create the user list of all whom were started this task for (SpreadsheetSession session : sessionList) { - List userList = spreadsheetUserDao.getBySessionID(session.getSessionId()); - - Summary summary = new Summary(session, spreadsheet, userList); + // LDEV-3590 Monitoring is now paged so don't get the list of users + // List userList = spreadsheetUserDao.getBySessionID(session.getSessionId()); + Summary summary = new Summary(session, spreadsheet, null); summaryList.add(summary); } return summaryList; } + @Override + public List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, String searchString) { + return spreadsheetUserDao.getUsersForTablesorter(sessionId, page, size, sorting, searchString); + } + + @Override + public int getCountUsersBySession(Long sessionId, String searchString) { + return spreadsheetUserDao.getCountUsersBySession(sessionId, searchString); + } + + public List getStatistics(Long contentId) { List sessionList = spreadsheetSessionDao.getByContentId(contentId); Index: lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/web/action/MonitoringAction.java =================================================================== diff -u -rbe07c35c372d904a65581d98660e73f3b13b69db -re1a335ed6fa2072efc12776a3573856a386938dc --- lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision be07c35c372d904a65581d98660e73f3b13b69db) +++ lams_tool_spreadsheet/src/java/org/lamsfoundation/lams/tool/spreadsheet/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision e1a335ed6fa2072efc12776a3573856a386938dc) @@ -27,15 +27,20 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.text.DateFormat; import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; @@ -50,6 +55,9 @@ import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.tool.spreadsheet.SpreadsheetConstants; @@ -60,8 +68,10 @@ import org.lamsfoundation.lams.tool.spreadsheet.model.SpreadsheetMark; import org.lamsfoundation.lams.tool.spreadsheet.model.SpreadsheetSession; import org.lamsfoundation.lams.tool.spreadsheet.model.SpreadsheetUser; +import org.lamsfoundation.lams.tool.spreadsheet.model.UserModifiedSpreadsheet; import org.lamsfoundation.lams.tool.spreadsheet.service.ISpreadsheetService; import org.lamsfoundation.lams.tool.spreadsheet.web.form.MarkForm; +import org.lamsfoundation.lams.util.DateUtil; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.web.util.SessionMap; @@ -73,14 +83,17 @@ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws IOException, ServletException, JSONException { String param = mapping.getParameter(); request.setAttribute("initialTabId", WebUtil.readLongParam(request, AttributeNames.PARAM_CURRENT_TAB, true)); if (param.equals("summary")) { return summary(mapping, form, request, response); } + if (param.equals("getUsers")) { + return getUsers(mapping, form, request, response); + } if (param.equals("doStatistic")) { return doStatistic(mapping, form, request, response); } @@ -99,11 +112,6 @@ if (param.equals("saveMark")) { return saveMark(mapping, form, request, response); } - - if (param.equals("viewReflection")) { - return viewReflection(mapping, form, request, response); - } - return mapping.findForward(SpreadsheetConstants.ERROR); } @@ -122,21 +130,77 @@ Spreadsheet spreadsheet = service.getSpreadsheetByContentId(contentId); - Map> reflectList = service.getReflectList(contentId, false); - //cache into sessionMap sessionMap.put(SpreadsheetConstants.ATTR_SUMMARY_LIST, summaryList); sessionMap.put(SpreadsheetConstants.PAGE_EDITABLE, spreadsheet.isContentInUse()); sessionMap.put(SpreadsheetConstants.ATTR_RESOURCE, spreadsheet); sessionMap.put(SpreadsheetConstants.ATTR_TOOL_CONTENT_ID, contentId); - sessionMap.put(SpreadsheetConstants.ATTR_REFLECT_LIST, reflectList); sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID)); sessionMap.put(SpreadsheetConstants.ATTR_IS_GROUPED_ACTIVITY, service.isGroupedActivity(contentId)); return mapping.findForward(SpreadsheetConstants.SUCCESS); } + + private ActionForward getUsers(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) + throws JSONException, IOException { + + Long sessionID = new Long(WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID)); + Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + + // paging parameters of tablesorter + int size = WebUtil.readIntParam(request, "size"); + int page = WebUtil.readIntParam(request, "page"); + Integer sortByName = WebUtil.readIntParam(request, "column[0]", true); + Integer sortByMarked = WebUtil.readIntParam(request, "column[1]", true); + String searchString = request.getParameter("fcol[0]"); + + int sorting = SpreadsheetConstants.SORT_BY_NO; + if ( sortByName != null ) { + sorting = sortByName.equals(0) ? SpreadsheetConstants.SORT_BY_USERNAME_ASC : SpreadsheetConstants.SORT_BY_USERNAME_DESC; + } else if ( sortByMarked !=null ) { + sorting = sortByMarked.equals(0) ? SpreadsheetConstants.SORT_BY_MARKED_ASC : SpreadsheetConstants.SORT_BY_MARKED_DESC; + } + + //return user list according to the given sessionID + ISpreadsheetService service = getSpreadsheetService(); + List users = service.getUsersForTablesorter(sessionID, page, size, sorting, searchString); + + JSONArray rows = new JSONArray(); + JSONObject responsedata = new JSONObject(); + responsedata.put("total_rows", service.getCountUsersBySession(sessionID, searchString)); + + Spreadsheet spreadsheet = service.getSpreadsheetByContentId(contentId); + boolean reflect = spreadsheet.isReflectOnActivity(); + + for (SpreadsheetUser user : users) { + + JSONObject responseRow = new JSONObject(); + responseRow.put(SpreadsheetConstants.ATTR_USER_UID, user.getUid()); + responseRow.put(SpreadsheetConstants.ATTR_USER_NAME, StringEscapeUtils.escapeHtml(user.getLastName() + " " + user.getFirstName())); + if ( user.getUserModifiedSpreadsheet() != null ) { + responseRow.put("userModifiedSpreadsheet", "true"); + if ( user.getUserModifiedSpreadsheet().getMark() != null ) { + responseRow.put("mark", user.getUserModifiedSpreadsheet().getMark().getMarks()); + } + } + + if ( reflect ) { + NotebookEntry notebookEntry = service.getEntry(sessionID, CoreNotebookConstants.NOTEBOOK_TOOL, + SpreadsheetConstants.TOOL_SIGNATURE, user.getUserId().intValue()); + if ( notebookEntry != null ) + responseRow.put("reflection", notebookEntry.getEntry()); + } + + rows.put(responseRow); + } + responsedata.put("rows", rows); + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(new String(responsedata.toString())); + return null; + } + /** * AJAX call to refresh statistic page. * @param mapping @@ -367,67 +431,16 @@ getSpreadsheetService().saveOrUpdateUserModifiedSpreadsheet(user.getUserModifiedSpreadsheet()); } - //update user data in sessionMap - String sessionMapID = markForm.getSessionMapID(); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - List summaryList = (List) sessionMap.get(SpreadsheetConstants.ATTR_SUMMARY_LIST); - for (Summary summary : summaryList) { - for (SpreadsheetUser sessionUser : summary.getUsers()) { - if (sessionUser.getUid().equals(user.getUid())) { - sessionUser.setUserModifiedSpreadsheet(user.getUserModifiedSpreadsheet()); - } - } - } - + request.setAttribute("mark",markForm.getMarks()); + request.setAttribute("userUid",userUid); + //set session map ID so that itemlist.jsp can get sessionMAP request.setAttribute(SpreadsheetConstants.ATTR_SESSION_MAP_ID, markForm.getSessionMapID()); return mapping.findForward(SpreadsheetConstants.SUCCESS); } - // private ActionForward listuser(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { - // Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); - // Long itemUid = WebUtil.readLongParam(request, SpreadsheetConstants.PARAM_RESOURCE_ITEM_UID); - //// - //// //get user list by given item uid - // ISpreadsheetService service = getSpreadsheetService(); - // //TODO - // List list = null; - //// List list = service.getUserListBySessionItem(sessionId, itemUid); - // - // //set to request - // request.setAttribute(SpreadsheetConstants.ATTR_USER_LIST, list); - // return mapping.findForward(SpreadsheetConstants.SUCCESS); - // } - private ActionForward viewReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) { - - Long uid = WebUtil.readLongParam(request, SpreadsheetConstants.ATTR_USER_UID); - - ISpreadsheetService service = getSpreadsheetService(); - SpreadsheetUser user = service.getUser(uid); - Long sessionID = user.getSession().getSessionId(); - NotebookEntry notebookEntry = service.getEntry(sessionID, CoreNotebookConstants.NOTEBOOK_TOOL, - SpreadsheetConstants.TOOL_SIGNATURE, user.getUserId().intValue()); - - SpreadsheetSession session = service.getSessionBySessionId(sessionID); - - ReflectDTO refDTO = new ReflectDTO(user); - if (notebookEntry == null) { - refDTO.setFinishReflection(false); - refDTO.setReflect(null); - } - else { - refDTO.setFinishReflection(true); - refDTO.setReflect(notebookEntry.getEntry()); - } - refDTO.setReflectInstructions(session.getSpreadsheet().getReflectInstructions()); - - request.setAttribute("userDTO", refDTO); - return mapping.findForward("success"); - } - // ************************************************************************************* // Private method // *************************************************************************************