Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java =================================================================== diff -u -r1a02559e19419af9991eaeb9363f809355b39bc7 -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java (.../IQaQueUsrDAO.java) (revision 1a02559e19419af9991eaeb9363f809355b39bc7) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java (.../IQaQueUsrDAO.java) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -25,7 +25,7 @@ import java.util.List; -import org.lamsfoundation.lams.tool.qa.QaContent; +import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; import org.lamsfoundation.lams.tool.qa.QaQueUsr; import org.lamsfoundation.lams.tool.qa.QaSession; @@ -45,4 +45,10 @@ int countSessionUser(QaSession qaSession); List getUserBySessionOnly(final QaSession qaSession); + + // Used for the user reflections tablesorter + List getUserReflectionsForTablesorter(final Long toolSessionId, int page, int size, int sorting, + String searchString, ICoreNotebookService coreNotebookService); + int getCountUsersBySessionWithSearch(final Long toolSessionId, String searchString); + } Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java =================================================================== diff -u -r0aae4208886026f429f05b458b79c14f8d7030d4 -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java (.../QaQueUsrDAO.java) (revision 0aae4208886026f429f05b458b79c14f8d7030d4) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java (.../QaQueUsrDAO.java) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -26,8 +26,16 @@ import java.util.List; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.hibernate.FlushMode; +import org.hibernate.Hibernate; +import org.hibernate.SQLQuery; +import org.hibernate.type.StringType; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; +import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; +import org.lamsfoundation.lams.tool.qa.QaAppConstants; import org.lamsfoundation.lams.tool.qa.QaQueUsr; import org.lamsfoundation.lams.tool.qa.QaSession; import org.lamsfoundation.lams.tool.qa.dao.IQaQueUsrDAO; @@ -78,4 +86,82 @@ getSession().delete(qaQueUsr); } + private void buildNameSearch(StringBuilder queryText, String searchString) { + String filteredSearchString = null; + if (!StringUtils.isBlank(searchString)) { + String[] tokens = searchString.trim().split("\\s+"); + for (String token : tokens) { + String escToken = StringEscapeUtils.escapeSql(token); + queryText.append(" WHERE (fullname LIKE '%").append(escToken) + .append("%' OR username LIKE '%").append(escToken).append("%') "); + } + } + } + + @SuppressWarnings("unchecked") + /** + * Will return List<[username (String), fullname(String), String (notebook entry)]> + * Takes the tool session id as the main input. + */ + public List getUserReflectionsForTablesorter(final Long toolSessionId, int page, int size, int sorting, + String searchString, ICoreNotebookService coreNotebookService) { + String sortingOrder; + switch (sorting) { + case QaAppConstants.SORT_BY_USERNAME_ASC: + sortingOrder = "fullname ASC"; + break; + case QaAppConstants.SORT_BY_USERNAME_DESC: + sortingOrder = "fullname DESC"; + break; + default: + sortingOrder = "username"; + } + + // Get the sql to join across to get the entries + String[] notebookEntryStrings = coreNotebookService.getNotebookEntrySQLStrings("session.qa_session_id", + QaAppConstants.MY_SIGNATURE, "user.que_usr_id"); + + // Basic select for the user records + StringBuilder queryText = new StringBuilder(); + queryText.append("SELECT user.username username, user.fullname fullname "); + queryText.append(notebookEntryStrings[0]); + queryText.append(" FROM tl_laqa11_que_usr user "); + queryText.append(" JOIN tl_laqa11_session session ON user.qa_session_id = session.uid AND session.qa_session_id = :toolSessionId "); + + // Add the notebook join + queryText.append(notebookEntryStrings[1]); + + // If filtering by name add a name based where clause + buildNameSearch(queryText, searchString); + + // Now specify the sort based on the switch statement above. + queryText.append(" ORDER BY " + sortingOrder); + + SQLQuery query = getSession().createSQLQuery(queryText.toString()); + query.addScalar("username", StringType.INSTANCE) + .addScalar("fullname", StringType.INSTANCE) + .addScalar("notebookEntry", StringType.INSTANCE) + .setLong("toolSessionId", toolSessionId.longValue()) + .setFirstResult(page * size).setMaxResults(size); + + return query.list(); + } + + private static final String GET_COUNT_USERS_FOR_SESSION_AND_QUESTION_WITH_NAME_SEARCH = "SELECT COUNT(*) FROM tl_laqa11_que_usr user " + +" JOIN tl_laqa11_session session ON user.qa_session_id = session.uid AND session.qa_session_id = :toolSessionId "; + + public int getCountUsersBySessionWithSearch(final Long toolSessionId, String searchString) { + + StringBuilder queryText = new StringBuilder(GET_COUNT_USERS_FOR_SESSION_AND_QUESTION_WITH_NAME_SEARCH); + buildNameSearch(queryText, searchString); + + SQLQuery query = getSession().createSQLQuery(queryText.toString()); + query.setLong("toolSessionId", toolSessionId); + List list = query.list(); + + if (list == null || list.size() == 0) { + return 0; + } + return ((Number) list.get(0)).intValue(); + } } \ No newline at end of file Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java =================================================================== diff -u -r8afb8434b5d3f27f2ff413a62b02c92b6cc32f24 -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 8afb8434b5d3f27f2ff413a62b02c92b6cc32f24) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -318,15 +318,31 @@ String getLearnerContentFolder(Long toolSessionId, Long userId); /** - * Return reflection data for all sessions. + * Return reflection data for all sessions. Used for Export Portfolio. For monitoring use getUserReflectionsForTablesorter * * @param content * @param userID * @return */ List getReflectList(QaContent content, String userID); + /** + * + * Takes the tool session id as the main input. + */ + /** + * Return username and reflections for a sessions. Paged. Used for monitoring. + * Will return List<[username (String), fullname(String), String (notebook entry)]> + * + * @param content + * @param userID + * @return + */ + List getUserReflectionsForTablesorter(Long toolSessionId, int page, int size, int sorting, String searchString); + int getCountUsersBySessionWithSearch(Long toolSessionId, String searchString); + + /** * ends up populating the attempt history for all the users of all the tool sessions for a content * * User id is needed if isUserNamesVisible is false && is learnerRequest = true, as it is required to work out if @@ -344,4 +360,5 @@ */ void notifyTeachersOnResponseSubmit(Long sessionId); + } Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java =================================================================== diff -u -r8be2bc782a2c7066c8c33f5605962584df7a2f9b -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java (.../QaServicePOJO.java) (revision 8be2bc782a2c7066c8c33f5605962584df7a2f9b) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java (.../QaServicePOJO.java) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -662,6 +662,14 @@ return reflectionDTOs; } + public List getUserReflectionsForTablesorter(Long toolSessionId, int page, int size, int sorting, String searchString) { + return qaQueUsrDAO.getUserReflectionsForTablesorter(toolSessionId, page, size, sorting, searchString, getCoreNotebookService()); + } + public int getCountUsersBySessionWithSearch(Long toolSessionId, String searchString) { + return qaQueUsrDAO.getCountUsersBySessionWithSearch(toolSessionId, searchString); + } + + @Override public List exportLearner(QaContent qaContent, boolean isUserNamesVisible, boolean isLearnerRequest, String sessionId, String userId) { Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringAction.java =================================================================== diff -u -ra7661f206a3f21114f1c05f9a29f56e20f5e35f0 -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringAction.java (.../QaMonitoringAction.java) (revision a7661f206a3f21114f1c05f9a29f56e20f5e35f0) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringAction.java (.../QaMonitoringAction.java) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -25,17 +25,22 @@ import java.io.IOException; import java.util.Date; +import java.util.List; import java.util.TimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +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.tool.exception.ToolException; import org.lamsfoundation.lams.tool.qa.QaAppConstants; import org.lamsfoundation.lams.tool.qa.QaContent; @@ -129,4 +134,51 @@ return QaServiceProxy.getQaService(getServlet().getServletContext()); } + /** + * Get Paged Reflections + * + * @param mapping + * @param form + * @param request + * @param response + * @return + */ + public ActionForward getReflectionsJSON(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException, ToolException, JSONException { + + Long toolSessionId = WebUtil.readLongParam(request, QaAppConstants.TOOL_SESSION_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); + String searchString = request.getParameter("fcol[0]"); + + int sorting = QaAppConstants.SORT_BY_NO; + if ( sortByName != null ) + sorting = sortByName.equals(0) ? QaAppConstants.SORT_BY_USERNAME_ASC : QaAppConstants.SORT_BY_USERNAME_DESC; + + //return user list according to the given sessionID + IQaService qaService = getQAService(); + List users = qaService.getUserReflectionsForTablesorter(toolSessionId, page, size, sorting, searchString); + + JSONArray rows = new JSONArray(); + JSONObject responsedata = new JSONObject(); + responsedata.put("total_rows", qaService.getCountUsersBySessionWithSearch(toolSessionId, searchString)); + + for (Object[] userAndReflection: users) { + JSONObject responseRow = new JSONObject(); + responseRow.put("username", StringEscapeUtils.escapeHtml((String) userAndReflection[1])); + if ( userAndReflection.length > 2 && userAndReflection[2] != null) { + String reflection = StringEscapeUtils.escapeHtml((String)userAndReflection[2]); + responseRow.put(QaAppConstants.NOTEBOOK, reflection.replaceAll("\n", "
")); + } + rows.put(responseRow); + } + responsedata.put("rows", rows); + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(new String(responsedata.toString())); + return null; + } + } \ No newline at end of file Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java =================================================================== diff -u -r55645d4b796f36715b66a70fce66406a986ee647 -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java (.../QaMonitoringStarterAction.java) (revision 55645d4b796f36715b66a70fce66406a986ee647) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java (.../QaMonitoringStarterAction.java) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -143,11 +143,6 @@ } request.setAttribute(LIST_ALL_GROUPS_DTO, groupDTOs); - if (qaContent.isReflect()) { - List reflectionDTOs = qaService.getReflectList(qaContent, null); - request.setAttribute(QaAppConstants.REFLECTIONS_CONTAINER_DTO, reflectionDTOs); - } - // setting up the advanced summary for LDEV-1662 request.setAttribute(QaAppConstants.ATTR_CONTENT, qaContent); Index: lams_tool_laqa/web/monitoring/Reflections.jsp =================================================================== diff -u -ra9be1e159cb556fd73eb4dc5a9f458030f7fda4d -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/web/monitoring/Reflections.jsp (.../Reflections.jsp) (revision a9be1e159cb556fd73eb4dc5a9f458030f7fda4d) +++ lams_tool_laqa/web/monitoring/Reflections.jsp (.../Reflections.jsp) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -1,22 +1,134 @@ + <%@ include file="/common/taglibs.jsp"%> + - - - - - - - - - - - + <fmt:message key="label.view.reflection"/> -
- -
- - -
- + + <%@ include file="/common/header.jsp"%> -
+ + + + + + + + + + + + + + + + + +
+ +

+ +
+ + + + + + + + + +
+ + +
+
+ + + + + + +
+
+
+ +
+ + +
Index: lams_tool_laqa/web/monitoring/SummaryContent.jsp =================================================================== diff -u -r55645d4b796f36715b66a70fce66406a986ee647 -r154d89ad4f8062f0f04705c56c8d232e7d855c7a --- lams_tool_laqa/web/monitoring/SummaryContent.jsp (.../SummaryContent.jsp) (revision 55645d4b796f36715b66a70fce66406a986ee647) +++ lams_tool_laqa/web/monitoring/SummaryContent.jsp (.../SummaryContent.jsp) (revision 154d89ad4f8062f0f04705c56c8d232e7d855c7a) @@ -26,6 +26,15 @@ + +

+ /monitoring/Reflections.jsp?toolSessionID=${groupDto.sessionId} + + + +

+
+
@@ -80,13 +89,9 @@
- + - - - - <%@include file="AdvanceOptions.jsp"%> <%@include file="dateRestriction.jsp"%>