Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r96f6a69a4c0be7e1c083ba981bd3c6e04a4afcc7 -r7eef220bc1575595385b722a0c337359ca02a397 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/dao/IBaseDAO.java =================================================================== diff -u -r42e6c9c7220f8baf3b245d73b57aca9be08191ea -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_common/src/java/org/lamsfoundation/lams/dao/IBaseDAO.java (.../IBaseDAO.java) (revision 42e6c9c7220f8baf3b245d73b57aca9be08191ea) +++ lams_common/src/java/org/lamsfoundation/lams/dao/IBaseDAO.java (.../IBaseDAO.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -305,4 +305,6 @@ * @return a list of objects which have the same property values */ public long countByProperties(Class clazz, Map properties); -} + + public void releaseFromCache(Object o); +} \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -re10da332d88104fe61b1f646b8bcac22bbfd15f0 -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision e10da332d88104fe61b1f646b8bcac22bbfd15f0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -50,14 +50,9 @@ import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.gradebook.service.IGradebookService; import org.lamsfoundation.lams.learning.service.ILearnerService; -import org.lamsfoundation.lams.learningdesign.Activity; -import org.lamsfoundation.lams.learningdesign.ToolActivity; -import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; -import org.lamsfoundation.lams.lesson.Lesson; -import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; @@ -66,7 +61,6 @@ import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolOutput; import org.lamsfoundation.lams.tool.ToolOutputDefinition; -import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.ToolSessionExportOutputData; import org.lamsfoundation.lams.tool.ToolSessionManager; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; @@ -100,9 +94,6 @@ import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.service.ILamsToolService; -import org.lamsfoundation.lams.usermanagement.Organisation; -import org.lamsfoundation.lams.usermanagement.OrganisationType; -import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; @@ -281,45 +272,46 @@ assessmentResultDao.saveObject(userResult); } - + @Override public void launchTimeLimit(Long assessmentUid, Long userId) { AssessmentResult lastResult = getLastAssessmentResult(assessmentUid, userId); lastResult.setTimeLimitLaunchedDate(new Date()); assessmentResultDao.saveObject(lastResult); } - + @Override public long getSecondsLeft(Assessment assessment, AssessmentUser user) { AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), user.getUserId()); - + long secondsLeft = 1; if (assessment.getTimeLimit() != 0) { // if user has pressed OK button already - calculate remaining time, and full time otherwise boolean isTimeLimitNotLaunched = (lastResult == null) || (lastResult.getTimeLimitLaunchedDate() == null); secondsLeft = isTimeLimitNotLaunched ? assessment.getTimeLimit() * 60 - : assessment.getTimeLimit() * 60 - (System.currentTimeMillis() - lastResult.getTimeLimitLaunchedDate().getTime()) / 1000; + : assessment.getTimeLimit() * 60 + - (System.currentTimeMillis() - lastResult.getTimeLimitLaunchedDate().getTime()) / 1000; // change negative or zero number to 1 secondsLeft = Math.max(1, secondsLeft); } - + return secondsLeft; } - + @Override public boolean checkTimeLimitExceeded(Assessment assessment, AssessmentUser groupLeader) { int timeLimit = assessment.getTimeLimit(); if (timeLimit == 0) { return false; } - + AssessmentResult lastLeaderResult = getLastAssessmentResult(assessment.getUid(), groupLeader.getUserId()); - + //check if the time limit is exceeded return (lastLeaderResult != null) && (lastLeaderResult.getTimeLimitLaunchedDate() != null) - && lastLeaderResult.getTimeLimitLaunchedDate().getTime() + timeLimit * 60000 < System.currentTimeMillis(); + && lastLeaderResult.getTimeLimitLaunchedDate().getTime() + timeLimit * 60000 < System + .currentTimeMillis(); } - @Override public List getUsersBySession(Long toolSessionID) { @@ -400,13 +392,8 @@ } @Override - public void releaseQuestionsAndReferencesFromCache(Assessment assessment) { - for (AssessmentQuestion question : (Set) assessment.getQuestions()) { - assessmentQuestionDao.evict(question); - } - for (QuestionReference reference : (Set) assessment.getQuestionReferences()) { - assessmentQuestionDao.evict(reference); - } + public void releaseFromCache(Object object) { + assessmentQuestionDao.evict(object); } @Override @@ -441,10 +428,11 @@ // don't instantiate new attempt if the previous one wasn't finished and thus continue working with it if (lastResult.getFinishDate() == null) { - + //check all required questionResults exist, it can be missing in case of random question - create new one then Set questionResults = lastResult.getQuestionResults(); - Set updatedQuestionResults = new TreeSet(new AssessmentQuestionResultComparator()); + Set updatedQuestionResults = new TreeSet( + new AssessmentQuestionResultComparator()); for (Set questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { @@ -462,10 +450,10 @@ } } lastResult.setQuestionResults(updatedQuestionResults); - assessmentResultDao.saveObject(lastResult); + assessmentResultDao.saveObject(lastResult); return; - // mark previous attempt as being not the latest any longer + // mark previous attempt as being not the latest any longer } else { lastResult.setLatest(false); assessmentResultDao.saveObject(lastResult); @@ -490,10 +478,15 @@ assessmentResultDao.saveObject(result); } - - /* Auiliary method for setAttemptStarted(). Simply init new AssessmentQuestionResult object and fills it in with values. + + /* + * Auiliary method for setAttemptStarted(). Simply init new AssessmentQuestionResult object and fills it in with + * values. + * * @param question + * * @param questionResults + * * @return */ private AssessmentQuestionResult createQuestionResultObject(AssessmentQuestion question) { @@ -659,7 +652,7 @@ } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) { for (AssessmentQuestionOption option : question.getOptions()) { - + //prepare regex which takes into account only * special character String regexWithOnlyAsteriskSymbolActive = "\\Q"; String optionString = option.getOptionString().trim(); @@ -672,7 +665,7 @@ } } regexWithOnlyAsteriskSymbolActive += "\\E"; - + //check whether answer matches regex Pattern pattern; if (question.isCaseSensitive()) { @@ -829,7 +822,7 @@ public Float getBestTotalScoreByUser(Long sessionId, Long userId) { return assessmentResultDao.getBestTotalScoreByUser(sessionId, userId); } - + @Override public List getBestTotalScoresByContentId(Long toolContentId) { return assessmentResultDao.getBestTotalScoresByContentId(toolContentId); @@ -839,7 +832,7 @@ public Float getFirstTotalScoreByUser(Long sessionId, Long userId) { return assessmentResultDao.getFirstTotalScoreByUser(sessionId, userId); } - + @Override public List getFirstTotalScoresByContentId(Long toolContentId) { return assessmentResultDao.getFirstTotalScoresByContentId(toolContentId); @@ -849,7 +842,7 @@ public Float getAvergeTotalScoreByUser(Long sessionId, Long userId) { return assessmentResultDao.getAvergeTotalScoreByUser(sessionId, userId); } - + @Override public List getAverageTotalScoresByContentId(Long toolContentId) { return assessmentResultDao.getAverageTotalScoresByContentId(toolContentId); @@ -952,13 +945,13 @@ } return nextUrl; } - + @Override public void unsetSessionFinished(Long toolSessionId, Long userId) { AssessmentUser user = assessmentUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); user.setSessionFinished(false); assessmentUserDao.saveObject(user); - } + } @Override public List getSessionDtos(Long contentId) { @@ -1231,7 +1224,7 @@ if (assessment.getQuestions() != null) { Set questions = assessment.getQuestions(); - + int count = 0; // question row title ExcelCell[] questionTitleRow = showUserNames ? new ExcelCell[10] : new ExcelCell[9]; @@ -1251,7 +1244,7 @@ for (AssessmentQuestion question : questions) { int colsNum = showUserNames ? 10 : 9; - + //add question title row if (question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { count = 0; @@ -1277,7 +1270,7 @@ hedgeQuestionTitleRow[count++] = new ExcelCell( option.getOptionString().replaceAll("\\<.*?\\>", ""), true); if (option.isCorrect()) { - hedgeQuestionTitleRow[count-1].setColor(IndexedColors.GREEN); + hedgeQuestionTitleRow[count - 1].setColor(IndexedColors.GREEN); } } hedgeQuestionTitleRow[count++] = new ExcelCell(getMessage("label.export.time.taken"), true); @@ -1286,7 +1279,6 @@ } else { questionSummaryTab.add(questionTitleRow); } - QuestionSummary questionSummary = questionSummaries.get(question.getUid()); @@ -1320,7 +1312,7 @@ userResultRow[count++] = new ExcelCell(questionResult.getFinishDate(), false); //answer if (question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { - + Set optionAnswers = questionResult.getOptionAnswers(); for (AssessmentQuestionOption option : question.getOptions()) { for (AssessmentOptionAnswer optionAnswer : optionAnswers) { @@ -1332,7 +1324,7 @@ } } else { userResultRow[count++] = new ExcelCell( - AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), false); + AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), false); } //time taken if (questionResult.getAssessmentResult() != null) { @@ -2264,7 +2256,7 @@ public ToolOutput getToolOutput(String name, Long toolSessionId, Long learnerId) { return assessmentOutputFactory.getToolOutput(name, this, toolSessionId, learnerId); } - + /** * Get the tool output for the given tool output name. * Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -re10da332d88104fe61b1f646b8bcac22bbfd15f0 -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision e10da332d88104fe61b1f646b8bcac22bbfd15f0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -79,15 +79,15 @@ */ void copyAnswersFromLeader(AssessmentUser user, AssessmentUser leader) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException; - + /** * Stores date when user has started activity with time limit. * * @param assessmentUid * @param userId */ void launchTimeLimit(Long assessmentUid, Long userId); - + /** * Calculates how many seconds left till the time limit will expire. If it's expired already - returns 1 in order to * show learning.jsp and autosubmit results. @@ -97,7 +97,7 @@ * @return */ long getSecondsLeft(Assessment assessment, AssessmentUser user); - + /** * @param assessment * @param groupLeader @@ -263,7 +263,7 @@ * @return */ Float getBestTotalScoreByUser(Long sessionId, Long userId); - + List getBestTotalScoresByContentId(Long toolContentId); /** @@ -274,7 +274,7 @@ * @return */ Float getFirstTotalScoreByUser(Long sessionId, Long userId); - + List getFirstTotalScoresByContentId(Long toolContentId); /** @@ -285,7 +285,7 @@ * @return */ Float getAvergeTotalScoreByUser(Long sessionId, Long userId); - + List getAverageTotalScoresByContentId(Long toolContentId); /** @@ -346,7 +346,7 @@ * @return */ String finishToolSession(Long toolSessionId, Long userId) throws AssessmentApplicationException; - + /** * Set userFinished to false * @@ -461,5 +461,5 @@ Set oldReferences, Set newReferences, List deletedReferences); - void releaseQuestionsAndReferencesFromCache(Assessment assessment); + void releaseFromCache(Object object); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java =================================================================== diff -u -r0a0ccdbc33e02ec8d764befc7f732a397914890b -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision 0a0ccdbc33e02ec8d764befc7f732a397914890b) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -352,7 +352,12 @@ //allow using old and modified questions and references altogether if (mode.isTeacher()) { - service.releaseQuestionsAndReferencesFromCache(assessmentPO); + for (AssessmentQuestion question : (Set) assessment.getQuestions()) { + service.releaseFromCache(question); + } + for (QuestionReference reference : (Set) assessment.getQuestionReferences()) { + service.releaseFromCache(reference); + } } Set oldQuestions = (assessmentPO == null) ? new HashSet() @@ -370,9 +375,7 @@ PropertyUtils.copyProperties(assessmentPO, assessment); // copyProperties() above may result in "collection assigned to two objects in a session" exception - // Below we remove reference to one of Assessment objects, - // so maybe there will be just one object in session when save is done - // If this fails, we may have to evict the object from session using DAO + service.releaseFromCache(assessment); assessmentForm.setAssessment(null); assessment = null; // set back UID Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/dao/DAO.java =================================================================== diff -u -r42e6c9c7220f8baf3b245d73b57aca9be08191ea -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/dao/DAO.java (.../DAO.java) (revision 42e6c9c7220f8baf3b245d73b57aca9be08191ea) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/dao/DAO.java (.../DAO.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -26,13 +26,15 @@ import java.io.Serializable; import java.util.List; +import org.lamsfoundation.lams.dao.IBaseDAO; + /** * Data Access Object (DAO) interface. This is an interface * used to tag our DAO classes and to provide common methods to all DAOs. * * @author Dapeng.Ni */ -public interface DAO { +public interface DAO extends IBaseDAO { /** * Generic method used to get all objects of a particular type. This Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/IResourceService.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/IResourceService.java (.../IResourceService.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/IResourceService.java (.../IResourceService.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -268,4 +268,6 @@ * @return */ boolean isGroupedActivity(long toolContentID); + + void evict(Object object); } Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/ResourceServiceImpl.java =================================================================== diff -u -rfcfd501036d7f1a3a8d51b830b3d08bca9277b11 -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/ResourceServiceImpl.java (.../ResourceServiceImpl.java) (revision fcfd501036d7f1a3a8d51b830b3d08bca9277b11) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/ResourceServiceImpl.java (.../ResourceServiceImpl.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -1038,7 +1038,7 @@ public ToolOutput getToolOutput(String name, Long toolSessionId, Long learnerId) { return getResourceOutputFactory().getToolOutput(name, this, toolSessionId, learnerId); } - + @Override public List getToolOutputs(String name, Long toolContentId) { return new ArrayList(); @@ -1242,4 +1242,8 @@ saveOrUpdateResource(resource); } + + public void evict(Object object) { + resourceDao.releaseFromCache(object); + } } \ No newline at end of file Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/action/AuthoringAction.java =================================================================== diff -u -r0a0ccdbc33e02ec8d764befc7f732a397914890b -r7eef220bc1575595385b722a0c337359ca02a397 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision 0a0ccdbc33e02ec8d764befc7f732a397914890b) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) @@ -543,9 +543,7 @@ PropertyUtils.copyProperties(resourcePO, resource); // copyProperties() above may result in "collection assigned to two objects in a session" exception - // Below we remove reference to one of Assessment objects, - // so maybe there will be just one object in session when save is done - // If this fails, we may have to evict the object from session using DAO + service.evict(resource); resourceForm.setResource(null); resource = null; // get back UID