Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java,v diff -u -r1.19 -r1.20 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java 9 Sep 2014 16:38:40 -0000 1.19 +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/IQaQueUsrDAO.java 23 Feb 2016 04:06:26 -0000 1.20 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java,v diff -u -r1.27 -r1.28 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java 9 Sep 2014 16:38:40 -0000 1.27 +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dao/hibernate/QaQueUsrDAO.java 23 Feb 2016 04:06:26 -0000 1.28 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java,v diff -u -r1.74 -r1.75 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java 2 Nov 2015 02:45:47 -0000 1.74 +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java 23 Feb 2016 04:06:26 -0000 1.75 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java,v diff -u -r1.132 -r1.133 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java 30 Dec 2015 19:08:45 -0000 1.132 +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaServicePOJO.java 23 Feb 2016 04:06:26 -0000 1.133 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringAction.java,v diff -u -r1.80 -r1.81 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringAction.java 3 Jun 2014 16:22:21 -0000 1.80 +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringAction.java 23 Feb 2016 04:06:26 -0000 1.81 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java,v diff -u -r1.70 -r1.71 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java 21 May 2015 23:43:12 -0000 1.70 +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java 23 Feb 2016 04:06:26 -0000 1.71 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/web/monitoring/Reflections.jsp,v diff -u -r1.10 -r1.11 --- lams_tool_laqa/web/monitoring/Reflections.jsp 13 Apr 2014 16:36:04 -0000 1.10 +++ lams_tool_laqa/web/monitoring/Reflections.jsp 23 Feb 2016 04:05:52 -0000 1.11 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_laqa/web/monitoring/SummaryContent.jsp,v diff -u -r1.48 -r1.49 --- lams_tool_laqa/web/monitoring/SummaryContent.jsp 21 May 2015 23:43:13 -0000 1.48 +++ lams_tool_laqa/web/monitoring/SummaryContent.jsp 23 Feb 2016 04:05:52 -0000 1.49 @@ -26,6 +26,15 @@ + +

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

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