Index: lams_tool_assessment/lams_tool_assessment.eml =================================================================== diff -u -r21c7529af602718ef4a963e75e902c964f986831 -r56aa4c936a358e32b0cbc287465f90fdfb9a90d5 --- lams_tool_assessment/lams_tool_assessment.eml (.../lams_tool_assessment.eml) (revision 21c7529af602718ef4a963e75e902c964f986831) +++ lams_tool_assessment/lams_tool_assessment.eml (.../lams_tool_assessment.eml) (revision 56aa4c936a358e32b0cbc287465f90fdfb9a90d5) @@ -1,26 +1,37 @@ - + + + + + + + + + + + + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rf4f2bdc7f40b65cec61ba1d534ca0c5f97b4c84a -r56aa4c936a358e32b0cbc287465f90fdfb9a90d5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision f4f2bdc7f40b65cec61ba1d534ca0c5f97b4c84a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 56aa4c936a358e32b0cbc287465f90fdfb9a90d5) @@ -282,7 +282,11 @@ if (lastResult == null) { return null; } - LocalDateTime launchedDate = LocalDateTime.now(); + LocalDateTime launchedDate = lastResult.getTimeLimitLaunchedDate(); + if (launchedDate != null) { + return launchedDate; + } + launchedDate = LocalDateTime.now(); lastResult.setTimeLimitLaunchedDate(launchedDate); assessmentResultDao.saveObject(lastResult); return launchedDate; Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java =================================================================== diff -u -rca5a2db0956e5e04be5cbf1354c234f47c7c6353 -r56aa4c936a358e32b0cbc287465f90fdfb9a90d5 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision ca5a2db0956e5e04be5cbf1354c234f47c7c6353) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision 56aa4c936a358e32b0cbc287465f90fdfb9a90d5) @@ -23,21 +23,9 @@ package org.lamsfoundation.lams.tool.dokumaran.service; -import java.io.IOException; -import java.security.InvalidParameterException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.function.Function; -import java.util.stream.Collectors; - -import javax.servlet.http.HttpServletResponse; - +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; +import net.gjerull.etherpad.client.EPLiteClient; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.confidencelevel.ConfidenceLevelDTO; @@ -62,13 +50,7 @@ import org.lamsfoundation.lams.rating.service.IRatingService; import org.lamsfoundation.lams.rest.RestTags; import org.lamsfoundation.lams.rest.ToolRestManager; -import org.lamsfoundation.lams.tool.ToolCompletionStatus; -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.*; import org.lamsfoundation.lams.tool.dokumaran.DokumaranConstants; import org.lamsfoundation.lams.tool.dokumaran.dao.DokumaranDAO; import org.lamsfoundation.lams.tool.dokumaran.dao.DokumaranSessionDAO; @@ -88,11 +70,14 @@ import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.security.InvalidParameterException; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; -import net.gjerull.etherpad.client.EPLiteClient; - /** * @author Dapeng.Ni */ @@ -283,8 +268,9 @@ public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { DokumaranSession session = getDokumaranSessionBySessionId(toolSessionId); if (DokumaranConstants.COMPLETED == session.getStatus()) { - throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId - + " to a finished session wtih ID " + toolSessionId); + throw new InvalidParameterException( + "Attempting to assing a new leader with user ID " + leaderUserId + " to a finished session wtih ID " + + toolSessionId); } DokumaranUser existingLeader = session.getGroupLeader(); @@ -327,17 +313,17 @@ DokumaranSession session = user.getSession(); Dokumaran dokumaran = session.getDokumaran(); - if (user.getTimeLimitLaunchedDate() == null) { - LocalDateTime launchedDate = LocalDateTime.now(); + LocalDateTime launchedDate = user.getTimeLimitLaunchedDate(); + if (launchedDate == null) { + launchedDate = LocalDateTime.now(); user.setTimeLimitLaunchedDate(launchedDate); dokumaranUserDao.saveObject(user); - - // if the user is not a leader, store his launch date, but return null so the leader's launch date is in use - if (!dokumaran.isUseSelectLeaderToolOuput() || (session.getGroupLeader() != null - && session.getGroupLeader().getUserId().equals(Long.valueOf(userId)))) { - return launchedDate; - } } + // if the user is not a leader, store his launch date, but return null so the leader's launch date is in use + if (!dokumaran.isUseSelectLeaderToolOuput() || (session.getGroupLeader() != null && session.getGroupLeader() + .getUserId().equals(Long.valueOf(userId)))) { + return launchedDate; + } } return null; } @@ -482,8 +468,8 @@ group.setReadOnlyPadId(session.getEtherpadReadOnlyId()); //mark all session that has had problems with pad initializations so that they could be fixed in monitoring by a teacher - if (StringUtils.isEmpty(session.getEtherpadReadOnlyId()) - || StringUtils.isEmpty(session.getEtherpadGroupId())) { + if (StringUtils.isEmpty(session.getEtherpadReadOnlyId()) || StringUtils.isEmpty( + session.getEtherpadGroupId())) { group.setSessionFaulty(true); } @@ -513,7 +499,8 @@ if (entry != null) { ReflectDTO ref = new ReflectDTO(user); ref.setReflect(entry.getEntry()); - Date postedDate = (entry.getLastModified() != null) ? entry.getLastModified() + Date postedDate = (entry.getLastModified() != null) + ? entry.getLastModified() : entry.getCreateDate(); ref.setDate(postedDate); reflections.add(ref); @@ -555,8 +542,8 @@ @Override public Grouping getGrouping(long toolContentId) { - ToolActivity toolActivity = (ToolActivity) userManagementService - .findByProperty(ToolActivity.class, "toolContentId", toolContentId).get(0); + ToolActivity toolActivity = (ToolActivity) userManagementService.findByProperty(ToolActivity.class, + "toolContentId", toolContentId).get(0); return toolActivity.getApplyGrouping() ? toolActivity.getGrouping() : null; } @@ -584,8 +571,8 @@ } if (criteria.isEmpty()) { - ToolActivityRatingCriteria criterion = (ToolActivityRatingCriteria) RatingCriteria - .getRatingCriteriaInstance(RatingCriteria.TOOL_ACTIVITY_CRITERIA_TYPE); + ToolActivityRatingCriteria criterion = (ToolActivityRatingCriteria) RatingCriteria.getRatingCriteriaInstance( + RatingCriteria.TOOL_ACTIVITY_CRITERIA_TYPE); criterion.setTitle(messageService.getMessage("label.pad.rating.title")); criterion.setOrderId(1); criterion.setRatingStyle(RatingCriteria.RATING_STYLE_STAR); @@ -851,14 +838,14 @@ @SuppressWarnings("unchecked") public void removeLearnerContent(Long toolContentId, Integer userId) throws ToolException { if (DokumaranService.log.isDebugEnabled()) { - DokumaranService.log - .debug("Removing Dokumaran content for user ID " + userId + " and toolContentId " + toolContentId); + DokumaranService.log.debug( + "Removing Dokumaran content for user ID " + userId + " and toolContentId " + toolContentId); } Dokumaran dokumaran = dokumaranDao.getByContentId(toolContentId); if (dokumaran == null) { - DokumaranService.log - .warn("Did not find activity with toolContentId: " + toolContentId + " to remove learner content"); + DokumaranService.log.warn( + "Did not find activity with toolContentId: " + toolContentId + " to remove learner content"); return; } @@ -955,7 +942,8 @@ return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_NOT_ATTEMPTED, null, null); } - return new ToolCompletionStatus(learner.isSessionFinished() ? ToolCompletionStatus.ACTIVITY_COMPLETED + return new ToolCompletionStatus(learner.isSessionFinished() + ? ToolCompletionStatus.ACTIVITY_COMPLETED : ToolCompletionStatus.ACTIVITY_ATTEMPTED, null, null); } @@ -1037,10 +1025,12 @@ session.setStatus(DokumaranConstants.COMPLETED); dokumaranSessionDao.saveObject(session); } else { - DokumaranService.log.error("Fail to leave tool Session.Could not find shared dokumaran " - + "session by given session id: " + toolSessionId); - throw new DataMissingException("Fail to leave tool Session." - + "Could not find shared dokumaran session by given session id: " + toolSessionId); + DokumaranService.log.error( + "Fail to leave tool Session.Could not find shared dokumaran " + "session by given session id: " + + toolSessionId); + throw new DataMissingException( + "Fail to leave tool Session." + "Could not find shared dokumaran session by given session id: " + + toolSessionId); } return toolService.completeToolSession(toolSessionId, learnerId); } @@ -1218,4 +1208,4 @@ saveOrUpdate(dokumaran); } -} +} \ No newline at end of file Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java =================================================================== diff -u -rfc1e0b9d9e66313d54b4f1fad291a8e9d0054767 -r56aa4c936a358e32b0cbc287465f90fdfb9a90d5 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java (.../WhiteboardService.java) (revision fc1e0b9d9e66313d54b4f1fad291a8e9d0054767) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java (.../WhiteboardService.java) (revision 56aa4c936a358e32b0cbc287465f90fdfb9a90d5) @@ -23,26 +23,8 @@ package org.lamsfoundation.lams.tool.whiteboard.service; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.security.InvalidParameterException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.function.Function; -import java.util.stream.Collectors; - +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -63,12 +45,7 @@ import org.lamsfoundation.lams.rating.model.RatingCriteria; import org.lamsfoundation.lams.rating.model.ToolActivityRatingCriteria; import org.lamsfoundation.lams.rating.service.IRatingService; -import org.lamsfoundation.lams.tool.ToolCompletionStatus; -import org.lamsfoundation.lams.tool.ToolContentManager; -import org.lamsfoundation.lams.tool.ToolOutput; -import org.lamsfoundation.lams.tool.ToolOutputDefinition; -import org.lamsfoundation.lams.tool.ToolSessionExportOutputData; -import org.lamsfoundation.lams.tool.ToolSessionManager; +import org.lamsfoundation.lams.tool.*; import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.service.ILamsToolService; @@ -92,8 +69,15 @@ import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.security.InvalidParameterException; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; public class WhiteboardService implements IWhiteboardService, ToolContentManager, ToolSessionManager { private static Logger log = Logger.getLogger(WhiteboardService.class.getName()); @@ -183,8 +167,9 @@ public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { WhiteboardSession session = getWhiteboardSessionBySessionId(toolSessionId); if (WhiteboardConstants.COMPLETED == session.getStatus()) { - throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId - + " to a finished session wtih ID " + toolSessionId); + throw new InvalidParameterException( + "Attempting to assing a new leader with user ID " + leaderUserId + " to a finished session wtih ID " + + toolSessionId); } WhiteboardUser existingLeader = session.getGroupLeader(); @@ -227,9 +212,13 @@ WhiteboardSession session = user.getSession(); Whiteboard whiteboard = session.getWhiteboard(); - LocalDateTime launchedDate = LocalDateTime.now(); - user.setTimeLimitLaunchedDate(launchedDate); - whiteboardUserDao.update(user); + LocalDateTime launchedDate = user.getTimeLimitLaunchedDate(); + if (launchedDate == null) { + launchedDate = LocalDateTime.now(); + user.setTimeLimitLaunchedDate(launchedDate); + whiteboardUserDao.update(user); + } + // if the user is not a leader, store his launch date, but return null so the leader's launch date is in use if (!whiteboard.isUseSelectLeaderToolOuput() || (session.getGroupLeader() != null && session.getGroupLeader().getUserId().equals(Long.valueOf(userId)))) { @@ -326,8 +315,9 @@ } List groupList = new ArrayList<>(); - Long userSessionId = ratingUserId == null || !whiteboard.isGalleryWalkStarted() - || !whiteboard.isGalleryWalkEditEnabled() ? null + Long userSessionId = + ratingUserId == null || !whiteboard.isGalleryWalkStarted() || !whiteboard.isGalleryWalkEditEnabled() + ? null : getUserByIDAndContent(ratingUserId, contentId).getSession().getSessionId(); for (WhiteboardSession session : sessionList) { // one new group for one session. @@ -339,10 +329,10 @@ String wid = whiteboard.getContentId() + "-" + session.getSessionId(); wid = getWhiteboardPrefixedId(wid); - + // show read only pad if it is a learner and no reedit was enabled - if (ratingUserId != null && (userSessionId == null || !session.getSessionId().equals(userSessionId) - || (whiteboard.isUseSelectLeaderToolOuput() && (session.getGroupLeader() == null + if (ratingUserId != null && (userSessionId == null || !session.getSessionId().equals(userSessionId) || ( + whiteboard.isUseSelectLeaderToolOuput() && (session.getGroupLeader() == null || !session.getGroupLeader().getUserId().equals(ratingUserId))))) { wid = getWhiteboardReadOnlyWid(wid); } @@ -396,7 +386,8 @@ if (entry != null) { ReflectDTO ref = new ReflectDTO(user); ref.setReflect(entry.getEntry()); - Date postedDate = (entry.getLastModified() != null) ? entry.getLastModified() + Date postedDate = (entry.getLastModified() != null) + ? entry.getLastModified() : entry.getCreateDate(); ref.setDate(postedDate); reflections.add(ref); @@ -438,8 +429,8 @@ @Override public Grouping getGrouping(long toolContentId) { - ToolActivity toolActivity = (ToolActivity) userManagementService - .findByProperty(ToolActivity.class, "toolContentId", toolContentId).get(0); + ToolActivity toolActivity = (ToolActivity) userManagementService.findByProperty(ToolActivity.class, + "toolContentId", toolContentId).get(0); return toolActivity.getApplyGrouping() ? toolActivity.getGrouping() : null; } @@ -467,8 +458,8 @@ } if (criteria.isEmpty()) { - ToolActivityRatingCriteria criterion = (ToolActivityRatingCriteria) RatingCriteria - .getRatingCriteriaInstance(RatingCriteria.TOOL_ACTIVITY_CRITERIA_TYPE); + ToolActivityRatingCriteria criterion = (ToolActivityRatingCriteria) RatingCriteria.getRatingCriteriaInstance( + RatingCriteria.TOOL_ACTIVITY_CRITERIA_TYPE); criterion.setTitle(messageService.getMessage("label.pad.rating.title")); criterion.setOrderId(1); criterion.setRatingStyle(RatingCriteria.RATING_STYLE_STAR); @@ -552,8 +543,8 @@ @Override public String getWhiteboardServerUrl() throws WhiteboardApplicationException { WhiteboardConfigItem whiteboardServerUrlConfigItem = getConfigItem(WhiteboardConfigItem.KEY_SERVER_URL); - if (whiteboardServerUrlConfigItem == null - || StringUtils.isBlank(whiteboardServerUrlConfigItem.getConfigValue())) { + if (whiteboardServerUrlConfigItem == null || StringUtils.isBlank( + whiteboardServerUrlConfigItem.getConfigValue())) { throw new WhiteboardApplicationException( "Whiteboard server URL is not configured on sysadmin tool management page"); } @@ -575,8 +566,8 @@ return null; } WhiteboardConfigItem whiteboardAccessTokenConfigItem = getConfigItem(WhiteboardConfigItem.KEY_ACCESS_TOKEN); - if (whiteboardAccessTokenConfigItem == null - || StringUtils.isBlank(whiteboardAccessTokenConfigItem.getConfigValue())) { + if (whiteboardAccessTokenConfigItem == null || StringUtils.isBlank( + whiteboardAccessTokenConfigItem.getConfigValue())) { return null; } // sourceWid is present when we want to copy content from other canvas @@ -958,14 +949,14 @@ @Override public void removeLearnerContent(Long toolContentId, Integer userId) throws ToolException { if (WhiteboardService.log.isDebugEnabled()) { - WhiteboardService.log - .debug("Removing Whiteboard content for user ID " + userId + " and toolContentId " + toolContentId); + WhiteboardService.log.debug( + "Removing Whiteboard content for user ID " + userId + " and toolContentId " + toolContentId); } Whiteboard whiteboard = whiteboardDao.getByContentId(toolContentId); if (whiteboard == null) { - WhiteboardService.log - .warn("Did not find activity with toolContentId: " + toolContentId + " to remove learner content"); + WhiteboardService.log.warn( + "Did not find activity with toolContentId: " + toolContentId + " to remove learner content"); return; } @@ -1002,7 +993,8 @@ return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_NOT_ATTEMPTED, null, null); } - return new ToolCompletionStatus(learner.isSessionFinished() ? ToolCompletionStatus.ACTIVITY_COMPLETED + return new ToolCompletionStatus(learner.isSessionFinished() + ? ToolCompletionStatus.ACTIVITY_COMPLETED : ToolCompletionStatus.ACTIVITY_ATTEMPTED, null, null); } @@ -1022,8 +1014,8 @@ session.setStatus(WhiteboardConstants.COMPLETED); whiteboardSessionDao.update(session); } else { - WhiteboardService.log - .error("Fail to leave tool Session. Could not find Whiteboard session by given session id: " + WhiteboardService.log.error( + "Fail to leave tool Session. Could not find Whiteboard session by given session id: " + toolSessionId); throw new DataMissingException( "Fail to leave tool Session. Could not find Whiteboard session by given session id: "