Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java,v diff -u -r1.112.2.5 -r1.112.2.6 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java 11 May 2016 07:36:13 -0000 1.112.2.5 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java 15 Jun 2016 07:59:47 -0000 1.112.2.6 @@ -271,6 +271,12 @@ public static final String MODE = "mode"; public static final String LEARNING_MODE = "learningMode"; public static final String REFLECT = "reflect"; + + //output definitions + public static final String ATTR_ACTIVITY_EVALUATION = "activityEvaluation"; + public static final String ATTR_TOOL_OUTPUT_DEFINITIONS = "toolOutputDefinitions"; + public static final String OUTPUT_NAME_LEARNER_MARK = "learner.mark"; + public static final String OUTPUT_NAME_LEARNER_ALL_CORRECT = "learner.all.correct"; /* * exception constants Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml,v diff -u -r1.23.2.8 -r1.23.2.9 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml 8 Apr 2016 11:41:28 -0000 1.23.2.8 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml 15 Jun 2016 07:59:47 -0000 1.23.2.9 @@ -96,6 +96,7 @@ PROPAGATION_REQUIRED,-McApplicationException PROPAGATION_REQUIRED,-McApplicationException PROPAGATION_REQUIRED, -McApplicationException + PROPAGATION_REQUIRED,-McApplicationException PROPAGATION_REQUIRED,-McApplicationException PROPAGATION_REQUIRED, -MccpApplicationException PROPAGATION_REQUIRED,-McApplicationException Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java,v diff -u -r1.26.2.2 -r1.26.2.3 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java 11 May 2016 07:36:12 -0000 1.26.2.2 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java 15 Jun 2016 07:59:47 -0000 1.26.2.3 @@ -24,6 +24,7 @@ import java.util.List; +import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McUsrAttempt; /** @@ -101,5 +102,13 @@ int getUserTotalMark(final Long userUid); McUsrAttempt getUserAttemptByUid(Long uid); + + /** + * Returns all existing total marks for users belonging to tool content. + * + * @param toolContentId + * @return + */ + List getLearnerMarksByContentId(Long toolContentId); } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java,v diff -u -r1.31.2.4 -r1.31.2.5 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java 11 May 2016 07:36:14 -0000 1.31.2.4 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java 15 Jun 2016 07:59:47 -0000 1.31.2.5 @@ -22,11 +22,14 @@ package org.lamsfoundation.lams.tool.mc.dao.hibernate; +import java.util.ArrayList; import java.util.List; import org.hibernate.FlushMode; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.tool.mc.dao.IMcUsrAttemptDAO; +import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; +import org.lamsfoundation.lams.tool.mc.pojos.McQueUsr; import org.lamsfoundation.lams.tool.mc.pojos.McUsrAttempt; import org.springframework.stereotype.Repository; @@ -132,5 +135,32 @@ } return ((Number) list.get(0)).intValue(); } + + @Override + public List getLearnerMarksByContentId(Long toolContentId) { + + final String FIND_MARKS_FOR_CONTENT_ID = "SELECT user.queUsrId, user.lastAttemptTotalMark FROM " + + McQueUsr.class.getName() + + " user WHERE user.mcSession.mcContent.mcContentId = ? AND user.responseFinalised = true"; + List list = (List) doFind(FIND_MARKS_FOR_CONTENT_ID, new Object[] { toolContentId }); + + List toolOutputDtos = new ArrayList(); + if (list != null && list.size() > 0) { + for (Object[] element : list) { + + Long userId = ((Number) element[0]).longValue(); + Integer grade = (Integer) element[1]; + + ToolOutputDTO toolOutputDto = new ToolOutputDTO(); + toolOutputDto.setUserId(userId.intValue()); + toolOutputDto.setMark(grade); + toolOutputDtos.add(toolOutputDto); + } + + } + + return toolOutputDtos; + } + } \ No newline at end of file Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/ToolOutputDTO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java,v diff -u -r1.77.2.7 -r1.77.2.8 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java 11 May 2016 07:36:11 -0000 1.77.2.7 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java 15 Jun 2016 07:59:47 -0000 1.77.2.8 @@ -38,6 +38,7 @@ import org.lamsfoundation.lams.tool.mc.McSessionMarkDTO; import org.lamsfoundation.lams.tool.mc.McUserMarkDTO; import org.lamsfoundation.lams.tool.mc.ReflectionDTO; +import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McContent; import org.lamsfoundation.lams.tool.mc.pojos.McOptsContent; import org.lamsfoundation.lams.tool.mc.pojos.McQueContent; @@ -131,6 +132,8 @@ void updateMcOptionsContent(McOptsContent mcOptsContent) throws McApplicationException; McUsrAttempt getUserAttemptByQuestion(Long queUsrUid, Long mcQueContentId) throws McApplicationException; + + List getLearnerMarksByContentId(Long toolContentId); void copyToolContent(Long fromContentId, Long toContentId) throws ToolException; @@ -173,6 +176,18 @@ boolean isGroupedActivity(long toolContentID); /** + * Get the definitions for possible output for an activity, based on the toolContentId. These may be definitions + * that are always available for the tool (e.g. number of marks for Multiple Choice) or a custom definition created + * for a particular activity such as the answer to the third question contains the word Koala and hence the need for + * the toolContentId + * + * @return SortedMap of ToolOutputDefinitions with the key being the name of each definition + */ + String getActivityEvaluation(Long toolContentId); + + void setActivityEvaluation(Long toolContentId, String toolOutputDefinition); + + /** * @param mcContent * @param user * user; pass null if there is no need to populate previous answers Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java,v diff -u -r1.9.2.2 -r1.9.2.3 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java 11 May 2016 07:36:11 -0000 1.9.2.2 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java 15 Jun 2016 07:59:47 -0000 1.9.2.3 @@ -23,14 +23,18 @@ package org.lamsfoundation.lams.tool.mc.service; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.lamsfoundation.lams.tool.OutputFactory; import org.lamsfoundation.lams.tool.ToolOutput; import org.lamsfoundation.lams.tool.ToolOutputDefinition; +import org.lamsfoundation.lams.tool.mc.McAppConstants; +import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McContent; import org.lamsfoundation.lams.tool.mc.pojos.McOptsContent; import org.lamsfoundation.lams.tool.mc.pojos.McQueContent; @@ -40,9 +44,6 @@ public class MCOutputFactory extends OutputFactory { - protected static final String OUTPUT_NAME_LEARNER_MARK = "learner.mark"; - protected static final String OUTPUT_NAME_LEARNER_ALL_CORRECT = "learner.all.correct"; - /** * @see org.lamsfoundation.lams.tool.OutputDefinitionFactory#getToolOutputDefinitions(java.lang.Object) */ @@ -51,15 +52,15 @@ int definitionType) { TreeMap definitionMap = new TreeMap(); - ToolOutputDefinition definition = buildBooleanOutputDefinition(OUTPUT_NAME_LEARNER_ALL_CORRECT); - definitionMap.put(OUTPUT_NAME_LEARNER_ALL_CORRECT, definition); + ToolOutputDefinition definition = buildBooleanOutputDefinition(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT); + definitionMap.put(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, definition); if (toolContentObject != null) { McContent content = (McContent) toolContentObject; - definition = buildRangeDefinition(OUTPUT_NAME_LEARNER_MARK, new Long(0), + definition = buildRangeDefinition(McAppConstants.OUTPUT_NAME_LEARNER_MARK, new Long(0), new Long(content.getTotalMarksPossible().longValue()), true); - definitionMap.put(OUTPUT_NAME_LEARNER_MARK, definition); + definitionMap.put(McAppConstants.OUTPUT_NAME_LEARNER_MARK, definition); } else { log.error( "Unable to build content based output definitions for Multiple Choice as no tool content object supplied. Only including the definitions that do not need any content."); @@ -79,11 +80,12 @@ McQueUsr queUser = mcService.getMcUserBySession(learnerId, session.getUid()); if (queUser != null) { - if (names == null || names.contains(OUTPUT_NAME_LEARNER_MARK)) { - output.put(OUTPUT_NAME_LEARNER_MARK, getLearnerMark(queUser)); + if (names == null || names.contains(McAppConstants.OUTPUT_NAME_LEARNER_MARK)) { + output.put(McAppConstants.OUTPUT_NAME_LEARNER_MARK, getLearnerMark(queUser)); } - if (names == null || names.contains(OUTPUT_NAME_LEARNER_ALL_CORRECT)) { - output.put(OUTPUT_NAME_LEARNER_ALL_CORRECT, getLearnerAllCorrect(mcService, queUser)); + if (names == null || names.contains(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT)) { + output.put(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, + getLearnerAllCorrect(mcService, queUser)); } } } @@ -98,17 +100,64 @@ McQueUsr queUser = mcService.getMcUserBySession(learnerId, session.getUid()); if (queUser != null) { - if (name.equals(OUTPUT_NAME_LEARNER_MARK)) { + if (name.equals(McAppConstants.OUTPUT_NAME_LEARNER_MARK)) { return getLearnerMark(queUser); - } else if (name.equals(OUTPUT_NAME_LEARNER_ALL_CORRECT)) { + } else if (name.equals(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT)) { return getLearnerAllCorrect(mcService, queUser); } } } } return null; } + + public List getToolOutputs(String name, IMcService assessmentService, Long toolContentId) { + if ((name != null) && (toolContentId != null)) { + if (name.equals(McAppConstants.OUTPUT_NAME_LEARNER_MARK)) { + List toolOutputDtos = assessmentService.getLearnerMarksByContentId(toolContentId); + + //convert toolOutputDtos to toolOutputs + List toolOutputs = new ArrayList(); + for (ToolOutputDTO toolOutputDto : toolOutputDtos) { + float totalMark = toolOutputDto.getMark() == null ? 0 : toolOutputDto.getMark().floatValue(); + + ToolOutput toolOutput = new ToolOutput(McAppConstants.OUTPUT_NAME_LEARNER_MARK, + getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_MARK, true), totalMark); + toolOutput.setUserId(toolOutputDto.getUserId().intValue()); + toolOutputs.add(toolOutput); + } + + return toolOutputs; + + } else if (name.equals(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT)) { + List toolOutputDtos = assessmentService.getLearnerMarksByContentId(toolContentId); + + //calculate max possible total mark + int maxMark = 0; + McContent mcContent = assessmentService.getMcContent(toolContentId); + for (McQueContent question : (Set)mcContent.getMcQueContents()) { + maxMark += question.getMark(); + } + + //convert toolOutputDtos to toolOutputs + List toolOutputs = new ArrayList(); + for (ToolOutputDTO toolOutputDto : toolOutputDtos) { + float totalMark = toolOutputDto.getMark() == null ? 0 : toolOutputDto.getMark().floatValue(); + boolean isAllQuestionAnswersCorrect = totalMark == maxMark; + + ToolOutput toolOutput = new ToolOutput(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, + getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, true), isAllQuestionAnswersCorrect); + toolOutput.setUserId(toolOutputDto.getUserId().intValue()); + toolOutputs.add(toolOutput); + } + + return toolOutputs; + } + } + return null; + } + /** * Get the mark for a specific user. This gets the mark associated with the last attempt. Will always return a * ToolOutput object. @@ -120,8 +169,8 @@ } else { mark = new Long(0); } - return new ToolOutput(MCOutputFactory.OUTPUT_NAME_LEARNER_MARK, - getI18NText(MCOutputFactory.OUTPUT_NAME_LEARNER_MARK, true), mark); + return new ToolOutput(McAppConstants.OUTPUT_NAME_LEARNER_MARK, + getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_MARK, true), mark); } /** @@ -130,8 +179,8 @@ */ private ToolOutput getLearnerAllCorrect(IMcService mcService, McQueUsr queUser) { boolean allCorrect = allQuestionsCorrect(mcService, queUser); - return new ToolOutput(MCOutputFactory.OUTPUT_NAME_LEARNER_ALL_CORRECT, - getI18NText(MCOutputFactory.OUTPUT_NAME_LEARNER_ALL_CORRECT, true), allCorrect); + return new ToolOutput(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, + getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, true), allCorrect); } // written to cope with more than one correct option for each question but only tested with Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java,v diff -u -r1.128.2.15 -r1.128.2.16 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java 11 May 2016 07:36:11 -0000 1.128.2.15 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java 15 Jun 2016 07:59:46 -0000 1.128.2.16 @@ -93,6 +93,7 @@ import org.lamsfoundation.lams.tool.mc.dao.IMcSessionDAO; import org.lamsfoundation.lams.tool.mc.dao.IMcUserDAO; import org.lamsfoundation.lams.tool.mc.dao.IMcUsrAttemptDAO; +import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McContent; import org.lamsfoundation.lams.tool.mc.pojos.McOptsContent; import org.lamsfoundation.lams.tool.mc.pojos.McQueContent; @@ -673,6 +674,11 @@ e); } } + + @Override + public List getLearnerMarksByContentId(Long toolContentId) { + return mcUsrAttemptDAO.getLearnerMarksByContentId(toolContentId); + } @Override public List getQuestionsByContentUid(final Long contentUid) throws McApplicationException { @@ -1618,6 +1624,11 @@ public ToolOutput getToolOutput(String name, Long toolSessionId, Long learnerId) { return mcOutputFactory.getToolOutput(name, this, toolSessionId, learnerId); } + + @Override + public List getToolOutputs(String name, Long toolContentId) { + return mcOutputFactory.getToolOutputs(name, this, toolContentId); + } @Override public void forceCompleteUser(Long toolSessionId, User user) { @@ -1673,6 +1684,16 @@ return toolService.isGroupedActivity(toolContentID); } + @Override + public String getActivityEvaluation(Long toolContentId) { + return toolService.getActivityEvaluation(toolContentId); + } + + @Override + public void setActivityEvaluation(Long toolContentId, String toolOutputDefinition) { + toolService.setActivityEvaluation(toolContentId, toolOutputDefinition); + } + /** * @param mcContentDAO * The mcContentDAO to set. Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java,v diff -u -r1.58.2.4 -r1.58.2.5 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java 11 May 2016 07:36:14 -0000 1.58.2.4 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java 15 Jun 2016 07:59:47 -0000 1.58.2.5 @@ -261,6 +261,32 @@ } /** + * Set tool's activityEvaluation + * + * @param mapping + * @param form + * @param request + * @param response + * @return + * @throws JSONException + * @throws IOException + */ + public ActionForward setActivityEvaluation(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws JSONException, IOException { + IMcService service = McServiceProxy.getMcService(getServlet().getServletContext()); + + Long contentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + String activityEvaluation = WebUtil.readStrParam(request, McAppConstants.ATTR_ACTIVITY_EVALUATION); + service.setActivityEvaluation(contentID, activityEvaluation); + + JSONObject responseJSON = new JSONObject(); + responseJSON.put("success", "true"); + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(new String(responseJSON.toString())); + return null; + } + + /** * Populate user jqgrid table on summary page. */ public ActionForward userMasterDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/MonitoringUtil.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/MonitoringUtil.java,v diff -u -r1.43.2.3 -r1.43.2.4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/MonitoringUtil.java 11 May 2016 07:36:14 -0000 1.43.2.3 +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/MonitoringUtil.java 15 Jun 2016 07:59:47 -0000 1.43.2.4 @@ -22,6 +22,7 @@ package org.lamsfoundation.lams.tool.mc.web; +import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.LinkedList; @@ -174,6 +175,14 @@ request.setAttribute("submissionDeadline", tzSubmissionDeadline.getTime()); } + //prepare toolOutputDefinitions and activityEvaluation + List toolOutputDefinitions = new ArrayList(); + toolOutputDefinitions.add(McAppConstants.OUTPUT_NAME_LEARNER_MARK); + toolOutputDefinitions.add(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT); + String activityEvaluation = mcService.getActivityEvaluation(content.getMcContentId()); + request.setAttribute(McAppConstants.ATTR_TOOL_OUTPUT_DEFINITIONS, toolOutputDefinitions); + request.setAttribute(McAppConstants.ATTR_ACTIVITY_EVALUATION, activityEvaluation); + boolean isGroupedActivity = mcService.isGroupedActivity(new Long(content.getMcContentId())); request.setAttribute("isGroupedActivity", isGroupedActivity); } Index: lams_tool_lamc/web/monitoring/Stats.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_lamc/web/monitoring/Stats.jsp,v diff -u -r1.24.2.2 -r1.24.2.3 --- lams_tool_lamc/web/monitoring/Stats.jsp 24 May 2016 13:45:13 -0000 1.24.2.2 +++ lams_tool_lamc/web/monitoring/Stats.jsp 15 Jun 2016 07:59:47 -0000 1.24.2.3 @@ -1,8 +1,36 @@ <%@ include file="/common/taglibs.jsp"%> - + + -
@@ -21,4 +49,6 @@
\ No newline at end of file + + +<%@ include file="parts/toolOutput.jsp"%> Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_tool_lamc/web/monitoring/parts/toolOutput.jsp'. Fisheye: No comparison available. Pass `N' to diff?