Index: lams_build/lib/lams/lams-gradebook.jar =================================================================== diff -u -r294a26345c2dec685d6a5fe5aa37ab9ce1433dab -r52a4d603e80751438f18864c4a3797c6126de8e4 Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r294a26345c2dec685d6a5fe5aa37ab9ce1433dab -r52a4d603e80751438f18864c4a3797c6126de8e4 Binary files differ Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookAction.java =================================================================== diff -u -rbec136e7207405d99fa7f18e39a19bed555f0ee3 -r52a4d603e80751438f18864c4a3797c6126de8e4 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookAction.java (.../GradebookAction.java) (revision bec136e7207405d99fa7f18e39a19bed555f0ee3) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookAction.java (.../GradebookAction.java) (revision 52a4d603e80751438f18864c4a3797c6126de8e4) @@ -34,8 +34,6 @@ 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.JSONObject; import org.lamsfoundation.lams.gradebook.GradebookUserLesson; import org.lamsfoundation.lams.gradebook.dto.GBLessonGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO; @@ -66,6 +64,10 @@ import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + /** * @author lfoxton * @@ -211,12 +213,12 @@ List gradebookActivityDTOs = getGradebookService().getGBLessonComplete(lessonId, userId); - JSONObject resultJSON = new JSONObject(); + ObjectNode resultJSON = JsonNodeFactory.instance.objectNode(); resultJSON.put(GradebookConstants.ELEMENT_RECORDS, gradebookActivityDTOs.size()); - JSONArray rowsJSON = new JSONArray(); + ArrayNode rowsJSON = JsonNodeFactory.instance.arrayNode(); for (GradebookGridRowDTO gradebookActivityDTO : gradebookActivityDTOs) { - JSONObject rowJSON = new JSONObject(); + ObjectNode rowJSON = JsonNodeFactory.instance.objectNode(); String id = gradebookActivityDTO.getId(); String[] idParts = id.split("_"); if (idParts.length > 1) { @@ -226,21 +228,21 @@ } rowJSON.put(GradebookConstants.ELEMENT_ID, id); - JSONArray cellJSON = new JSONArray(); - cellJSON.put(gradebookActivityDTO.getRowName()); - cellJSON.put(gradebookActivityDTO.getStatus()); - cellJSON.put(gradebookActivityDTO.getAverageMark() == null ? GradebookConstants.CELL_EMPTY + ArrayNode cellJSON = JsonNodeFactory.instance.arrayNode(); + cellJSON.add(gradebookActivityDTO.getRowName()); + cellJSON.add(gradebookActivityDTO.getStatus()); + cellJSON.add(gradebookActivityDTO.getAverageMark() == null ? GradebookConstants.CELL_EMPTY : GradebookUtil.niceFormatting(gradebookActivityDTO.getAverageMark())); - cellJSON.put(gradebookActivityDTO.getMark() == null ? GradebookConstants.CELL_EMPTY + cellJSON.add(gradebookActivityDTO.getMark() == null ? GradebookConstants.CELL_EMPTY : GradebookUtil.niceFormatting(gradebookActivityDTO.getMark())); - rowJSON.put(GradebookConstants.ELEMENT_CELL, cellJSON); - rowsJSON.put(rowJSON); + rowJSON.set(GradebookConstants.ELEMENT_CELL, cellJSON); + rowsJSON.add(rowJSON); } - resultJSON.put(GradebookConstants.ELEMENT_ROWS, rowsJSON); + resultJSON.set(GradebookConstants.ELEMENT_ROWS, rowsJSON); // make a mapping of activity ID -> URL, same as in progress bar - JSONObject activityURLJSON = new JSONObject(); + ObjectNode activityURLJSON = JsonNodeFactory.instance.objectNode(); Object[] ret = getLearnerService().getStructuredActivityURLs(userId, lessonId); for (ActivityURL activity : (List) ret[0]) { String url = activity.getUrl(); @@ -256,7 +258,7 @@ activityURLJSON.put(activity.getActivityId().toString(), activity.getUrl()); } } - resultJSON.put("urls", activityURLJSON); + resultJSON.set("urls", activityURLJSON); boolean isWeighted = getGradebookService().isWeightedMarks(lessonId); GradebookUserLesson gradebookUserLesson = getGradebookService().getGradebookUserLesson(lessonId, userId); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== diff -u -r0ed9749f00a1e1f92b989b270857d7f3c3f237cb -r52a4d603e80751438f18864c4a3797c6126de8e4 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 0ed9749f00a1e1f92b989b270857d7f3c3f237cb) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 52a4d603e80751438f18864c4a3797c6126de8e4) @@ -39,8 +39,6 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.apache.tomcat.util.json.JSONException; -import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.gradebook.service.IGradebookService; import org.lamsfoundation.lams.learning.presence.PresenceWebsocketServer; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; @@ -68,6 +66,9 @@ import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + /** * *

@@ -212,8 +213,8 @@ // make a copy of attempted and completed activities Date archiveDate = new Date(); LearnerProgress learnerProgress = learnerService.getProgress(userID, lessonID); - Map attemptedActivities = new HashMap(learnerProgress.getAttemptedActivities()); - Map completedActivities = new HashMap(); + Map attemptedActivities = new HashMap<>(learnerProgress.getAttemptedActivities()); + Map completedActivities = new HashMap<>(); for (Entry entry : learnerProgress.getCompletedActivities().entrySet()) { CompletedActivityProgressArchive activityArchive = new CompletedActivityProgressArchive(learnerProgress, entry.getKey(), entry.getValue().getStartDate(), entry.getValue().getFinishDate()); @@ -250,7 +251,7 @@ */ @SuppressWarnings("unchecked") public ActionForward getLearnerProgress(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws JSONException, IOException { + HttpServletResponse response) throws IOException { Integer learnerId = WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, true); Integer monitorId = null; HttpSession ss = SessionManager.getSession(); @@ -264,7 +265,7 @@ monitorId = userId; } - JSONObject responseJSON = new JSONObject(); + ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID, true); if (lessonId == null) { // depending on when this is called, there may only be a toolSessionId known, not the lessonId. @@ -274,7 +275,7 @@ lessonId = toolSession.getLesson().getLessonId(); } - responseJSON.put("messages", getProgressBarMessages()); + responseJSON.set("messages", getProgressBarMessages()); ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); Object[] ret = learnerService.getStructuredActivityURLs(learnerId, lessonId); @@ -283,18 +284,18 @@ return null; } - responseJSON.put("currentActivityId", ret[1]); - responseJSON.put("isPreview", ret[2]); + responseJSON.put("currentActivityId", (Long) ret[1]); + responseJSON.put("isPreview", (boolean) ret[2]); for (ActivityURL activity : (List) ret[0]) { if (activity.getFloating()) { // these are support activities for (ActivityURL childActivity : activity.getChildActivities()) { - responseJSON.append("support", - activityProgressToJSON(childActivity, null, lessonId, learnerId, monitorId)); + responseJSON.withArray("support") + .add(activityProgressToJSON(childActivity, null, lessonId, learnerId, monitorId)); } } else { - responseJSON.append("activities", - activityProgressToJSON(activity, (Long) ret[1], lessonId, learnerId, monitorId)); + responseJSON.withArray("activities") + .add(activityProgressToJSON(activity, (Long) ret[1], lessonId, learnerId, monitorId)); } } @@ -356,9 +357,9 @@ /** * Converts an activity in learner progress to a JSON object. */ - private JSONObject activityProgressToJSON(ActivityURL activity, Long currentActivityId, Long lessonId, - Integer learnerId, Integer monitorId) throws JSONException, IOException { - JSONObject activityJSON = new JSONObject(); + private ObjectNode activityProgressToJSON(ActivityURL activity, Long currentActivityId, Long lessonId, + Integer learnerId, Integer monitorId) throws IOException { + ObjectNode activityJSON = JsonNodeFactory.instance.objectNode(); activityJSON.put("id", activity.getActivityId()); activityJSON.put("name", activity.getTitle()); activityJSON.put("status", activity.getActivityId().equals(currentActivityId) ? 0 : activity.getStatus()); @@ -397,16 +398,16 @@ if (activity.getChildActivities() != null) { for (ActivityURL childActivity : activity.getChildActivities()) { - activityJSON.append("childActivities", - activityProgressToJSON(childActivity, currentActivityId, lessonId, learnerId, monitorId)); + activityJSON.withArray("childActivities") + .add(activityProgressToJSON(childActivity, currentActivityId, lessonId, learnerId, monitorId)); } } return activityJSON; } - private JSONObject getProgressBarMessages() throws JSONException { - JSONObject progressBarMessages = new JSONObject(); + private ObjectNode getProgressBarMessages() { + ObjectNode progressBarMessages = JsonNodeFactory.instance.objectNode(); MessageService messageService = LearnerServiceProxy .getMonitoringMessageService(getServlet().getServletContext()); for (String key : MONITOR_MESSAGE_KEYS) { @@ -425,9 +426,9 @@ * Gets the lesson details based on lesson id or the current tool session */ public ActionForward getLessonDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws JSONException, IOException { + HttpServletResponse response) throws IOException { - JSONObject responseJSON = new JSONObject(); + ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); Lesson lesson = null; Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID, true); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -re385399d7e2c968aa2df352218c7d64b876c52d7 -r52a4d603e80751438f18864c4a3797c6126de8e4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision e385399d7e2c968aa2df352218c7d64b876c52d7) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 52a4d603e80751438f18864c4a3797c6126de8e4) @@ -51,9 +51,6 @@ import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; -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.confidencelevel.ConfidenceLevelDTO; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.gradebook.service.IGradebookService; @@ -113,6 +110,10 @@ import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.dao.DataAccessException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + /** * * The POJO implementation of Mc service. All business logics of MCQ tool are implemented in this class. It translate @@ -1534,7 +1535,7 @@ McContent content = getMcSessionById(toolSessionId).getMcContent(); - //in case McContent is leader aware return all leaders confidences, otherwise - confidences from the users from the same group as requestor + //in case McContent is leader aware return all leaders confidences, otherwise - confidences from the users from the same group as requestor List userAttemptsAndPortraits = content.isUseSelectLeaderToolOuput() ? mcUsrAttemptDAO.getLeadersFinalizedAttemptsByContentId(content.getMcContentId()) : mcUsrAttemptDAO.getFinalizedAttemptsBySessionId(toolSessionId); @@ -1545,7 +1546,7 @@ : ((Number) userAttemptAndPortraitIter[1]).longValue(); Long userId = userAttempt.getQueUsrId(); - //fill in question's and user answer's hashes + //fill in question's and user answer's hashes McQueContent question = userAttempt.getMcQueContent(); String answer = userAttempt.getMcOptionsContent().getMcQueOptionText(); @@ -1822,17 +1823,20 @@ for (McUsrAttempt item : attempts) { Date newDate = item.getAttemptTime(); if (newDate != null) { - if (startDate == null || newDate.before(startDate)) + if (startDate == null || newDate.before(startDate)) { startDate = newDate; - if (endDate == null || newDate.after(endDate)) + } + if (endDate == null || newDate.after(endDate)) { endDate = newDate; + } } } - if (learner.isResponseFinalised()) + if (learner.isResponseFinalised()) { return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, startDate, endDate); - else + } else { return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, startDate, null); + } } @Override @@ -1905,16 +1909,15 @@ /** * Rest call to create a new Multiple Choice content. Required fields in toolContentJSON: "title", "instructions", - * "questions". The questions entry should be JSONArray containing JSON objects, which in turn must contain - * "questionText", "displayOrder" (Integer) and a JSONArray "answers". The answers entry should be JSONArray + * "questions". The questions entry should be ArrayNode containing JSON objects, which in turn must contain + * "questionText", "displayOrder" (Integer) and a ArrayNode "answers". The answers entry should be ArrayNode * containing JSON objects, which in turn must contain "answerText", "displayOrder" (Integer), "correct" (Boolean). * * Retries are controlled by lockWhenFinished, which defaults to true (no retries). */ @SuppressWarnings("unchecked") @Override - public void createRestToolContent(Integer userID, Long toolContentID, JSONObject toolContentJSON) - throws JSONException { + public void createRestToolContent(Integer userID, Long toolContentID, ObjectNode toolContentJSON) { McContent mcq = new McContent(); Date updateDate = new Date(); @@ -1925,40 +1928,40 @@ mcq.setDefineLater(false); mcq.setMcContentId(toolContentID); - mcq.setTitle(toolContentJSON.getString(RestTags.TITLE)); - mcq.setInstructions(toolContentJSON.getString(RestTags.INSTRUCTIONS)); + mcq.setTitle(JsonUtil.optString(toolContentJSON, RestTags.TITLE)); + mcq.setInstructions(JsonUtil.optString(toolContentJSON, RestTags.INSTRUCTIONS)); - mcq.setRetries(JsonUtil.opt(toolContentJSON, "allowRetries", Boolean.FALSE)); + mcq.setRetries(JsonUtil.optBoolean(toolContentJSON, "allowRetries", Boolean.FALSE)); mcq.setUseSelectLeaderToolOuput( - JsonUtil.opt(toolContentJSON, RestTags.USE_SELECT_LEADER_TOOL_OUTPUT, Boolean.FALSE)); - mcq.setReflect(JsonUtil.opt(toolContentJSON, RestTags.REFLECT_ON_ACTIVITY, Boolean.FALSE)); - mcq.setReflectionSubject(JsonUtil.opt(toolContentJSON, RestTags.REFLECT_INSTRUCTIONS, "")); - mcq.setQuestionsSequenced(JsonUtil.opt(toolContentJSON, "questionsSequenced", Boolean.FALSE)); - mcq.setRandomize(JsonUtil.opt(toolContentJSON, "randomize", Boolean.FALSE)); - mcq.setShowReport(JsonUtil.opt(toolContentJSON, "showReport", Boolean.FALSE)); - mcq.setDisplayAnswers(JsonUtil.opt(toolContentJSON, "displayAnswers", Boolean.FALSE)); - mcq.setDisplayFeedbackOnly(JsonUtil.opt(toolContentJSON, "displayFeedbackOnly", Boolean.FALSE)); - mcq.setShowMarks(JsonUtil.opt(toolContentJSON, "showMarks", Boolean.FALSE)); - mcq.setPrefixAnswersWithLetters(JsonUtil.opt(toolContentJSON, "prefixAnswersWithLetters", Boolean.TRUE)); - mcq.setPassMark(JsonUtil.opt(toolContentJSON, "passMark", 0)); - mcq.setEnableConfidenceLevels(JsonUtil.opt(toolContentJSON, "enableConfidenceLevels", Boolean.FALSE)); + JsonUtil.optBoolean(toolContentJSON, RestTags.USE_SELECT_LEADER_TOOL_OUTPUT, Boolean.FALSE)); + mcq.setReflect(JsonUtil.optBoolean(toolContentJSON, RestTags.REFLECT_ON_ACTIVITY, Boolean.FALSE)); + mcq.setReflectionSubject(JsonUtil.optString(toolContentJSON, RestTags.REFLECT_INSTRUCTIONS, "")); + mcq.setQuestionsSequenced(JsonUtil.optBoolean(toolContentJSON, "questionsSequenced", Boolean.FALSE)); + mcq.setRandomize(JsonUtil.optBoolean(toolContentJSON, "randomize", Boolean.FALSE)); + mcq.setShowReport(JsonUtil.optBoolean(toolContentJSON, "showReport", Boolean.FALSE)); + mcq.setDisplayAnswers(JsonUtil.optBoolean(toolContentJSON, "displayAnswers", Boolean.FALSE)); + mcq.setDisplayFeedbackOnly(JsonUtil.optBoolean(toolContentJSON, "displayFeedbackOnly", Boolean.FALSE)); + mcq.setShowMarks(JsonUtil.optBoolean(toolContentJSON, "showMarks", Boolean.FALSE)); + mcq.setPrefixAnswersWithLetters(JsonUtil.optBoolean(toolContentJSON, "prefixAnswersWithLetters", Boolean.TRUE)); + mcq.setPassMark(JsonUtil.optInt(toolContentJSON, "passMark", 0)); + mcq.setEnableConfidenceLevels(JsonUtil.optBoolean(toolContentJSON, "enableConfidenceLevels", Boolean.FALSE)); // submissionDeadline is set in monitoring createMc(mcq); // Questions - JSONArray questions = toolContentJSON.getJSONArray(RestTags.QUESTIONS); - for (int i = 0; i < questions.length(); i++) { - JSONObject questionData = (JSONObject) questions.get(i); - String questionText = questionData.getString(RestTags.QUESTION_TEXT); - McQueContent question = new McQueContent(questionText, null, questionData.getInt(RestTags.DISPLAY_ORDER), 1, - "", mcq, null, new HashSet()); + ArrayNode questions = JsonUtil.optArray(toolContentJSON, RestTags.QUESTIONS); + for (JsonNode questionData : questions) { + McQueContent question = new McQueContent(JsonUtil.optString(questionData, RestTags.QUESTION_TEXT), null, + JsonUtil.optInt(questionData, RestTags.DISPLAY_ORDER), 1, "", mcq, null, + new HashSet()); - JSONArray optionsData = questionData.getJSONArray(RestTags.ANSWERS); - for (int j = 0; j < optionsData.length(); j++) { - JSONObject optionData = (JSONObject) optionsData.get(j); - question.getMcOptionsContents().add(new McOptsContent(optionData.getInt(RestTags.DISPLAY_ORDER), - optionData.getBoolean(RestTags.CORRECT), optionData.getString(RestTags.ANSWER_TEXT), question)); + ArrayNode optionsData = JsonUtil.optArray(questionData, RestTags.ANSWERS); + for (JsonNode optionData : optionsData) { + question.getMcOptionsContents() + .add(new McOptsContent(JsonUtil.optInt(optionData, RestTags.DISPLAY_ORDER), + JsonUtil.optBoolean(optionData, RestTags.CORRECT), + JsonUtil.optString(optionData, RestTags.ANSWER_TEXT), question)); } saveOrUpdateMcQueContent(question); }