Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java =================================================================== diff -u -r4d139bddc3cdd41d32d9f3033f2100c711d8c0c5 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java (.../IQaQueUsrDAO.java) (revision 4d139bddc3cdd41d32d9f3033f2100c711d8c0c5) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java (.../IQaQueUsrDAO.java) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -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 -r4d139bddc3cdd41d32d9f3033f2100c711d8c0c5 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java (.../QaQueUsrDAO.java) (revision 4d139bddc3cdd41d32d9f3033f2100c711d8c0c5) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java (.../QaQueUsrDAO.java) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -26,9 +26,14 @@ 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.lamsfoundation.lams.tool.qa.QaContent; +import org.hibernate.Hibernate; +import org.hibernate.SQLQuery; +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; @@ -84,4 +89,82 @@ this.getHibernateTemplate().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", Hibernate.STRING) + .addScalar("fullname", Hibernate.STRING) + .addScalar("notebookEntry", Hibernate.STRING) + .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 -r95202c29d0cab6765b9c03fff3a721826ab7ec9d -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 95202c29d0cab6765b9c03fff3a721826ab7ec9d) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -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 Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java =================================================================== diff -u -r9aad33f52b06632e7a8ed3705a7708338bcc00f8 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java (.../QaServicePOJO.java) (revision 9aad33f52b06632e7a8ed3705a7708338bcc00f8) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java (.../QaServicePOJO.java) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -667,6 +667,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 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- 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 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -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 -rdd4087c8c38ddcf2e97af7fc2dda25a8c948bcf0 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java (.../QaMonitoringStarterAction.java) (revision dd4087c8c38ddcf2e97af7fc2dda25a8c948bcf0) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java (.../QaMonitoringStarterAction.java) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -29,9 +29,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.SortedSet; import java.util.TimeZone; import java.util.TreeSet; @@ -41,27 +39,18 @@ import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; -import org.apache.struts.Globals; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.apache.struts.action.ActionMessage; -import org.apache.struts.action.ActionMessages; -import org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator; -import org.lamsfoundation.lams.rating.dto.ItemRatingDTO; import org.lamsfoundation.lams.tool.qa.QaAppConstants; -import org.lamsfoundation.lams.tool.qa.QaCondition; import org.lamsfoundation.lams.tool.qa.QaContent; import org.lamsfoundation.lams.tool.qa.QaQueContent; import org.lamsfoundation.lams.tool.qa.QaQueUsr; import org.lamsfoundation.lams.tool.qa.QaSession; -import org.lamsfoundation.lams.tool.qa.QaUsrResp; import org.lamsfoundation.lams.tool.qa.dto.GroupDTO; -import org.lamsfoundation.lams.tool.qa.dto.QaMonitoredAnswersDTO; import org.lamsfoundation.lams.tool.qa.dto.QaQuestionDTO; import org.lamsfoundation.lams.tool.qa.dto.QaStatsDTO; -import org.lamsfoundation.lams.tool.qa.dto.ReflectionDTO; import org.lamsfoundation.lams.tool.qa.service.IQaService; import org.lamsfoundation.lams.tool.qa.service.QaServiceProxy; import org.lamsfoundation.lams.tool.qa.util.QaApplicationException; @@ -73,7 +62,6 @@ import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; -import org.lamsfoundation.lams.web.util.SessionMap; /** * Starts up the monitoring module @@ -143,11 +131,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 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/web/monitoring/Reflections.jsp (.../Reflections.jsp) (revision a9be1e159cb556fd73eb4dc5a9f458030f7fda4d) +++ lams_tool_laqa/web/monitoring/Reflections.jsp (.../Reflections.jsp) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -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 -rdd4087c8c38ddcf2e97af7fc2dda25a8c948bcf0 -r8c5b90b876d68d60183b78b5f5edb681a942cfa9 --- lams_tool_laqa/web/monitoring/SummaryContent.jsp (.../SummaryContent.jsp) (revision dd4087c8c38ddcf2e97af7fc2dda25a8c948bcf0) +++ lams_tool_laqa/web/monitoring/SummaryContent.jsp (.../SummaryContent.jsp) (revision 8c5b90b876d68d60183b78b5f5edb681a942cfa9) @@ -26,6 +26,15 @@ + +

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

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