Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/DAO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rf5e59b4320e8fdfb492b6432ca965c2381918d91 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/DAO.java (.../DAO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/DAO.java (.../DAO.java) (revision f5e59b4320e8fdfb492b6432ca965c2381918d91) @@ -26,18 +26,20 @@ 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 Andrey Balan */ -public interface DAO { +public interface DAO extends IBaseDAO { /** * Generic method used to get all objects of a particular type. This * is the same as lookup up all rows in a table. - * + * * @param clazz * the type of objects (a.k.a. while table) to get data from * @return List of populated objects @@ -59,7 +61,7 @@ /** * Generic method to save an object - handles both update and insert. - * + * * @param o * the object to save */ Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== diff -u -rcbf95a868252401757c61327b3d9a383119ff9b5 -rf5e59b4320e8fdfb492b6432ca965c2381918d91 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision cbf95a868252401757c61327b3d9a383119ff9b5) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision f5e59b4320e8fdfb492b6432ca965c2381918d91) @@ -25,11 +25,9 @@ import java.io.IOException; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.List; import java.util.Set; - import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -45,7 +43,6 @@ import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; import org.lamsfoundation.lams.tool.service.ICommonToolService; -import org.lamsfoundation.lams.util.excel.ExcelCell; import org.lamsfoundation.lams.util.excel.ExcelSheet; import org.quartz.SchedulerException; @@ -63,22 +60,23 @@ * @return */ Scratchie getScratchieByContentId(Long contentId); - + /** * Populate scratchie items with the confidence levels from the activity specified in author - * + * * @param userId * @param toolSessionId * @param confidenceLevelsActivityUiid * @param items */ void populateItemsWithConfidenceLevels(Long userId, Long toolSessionId, Integer confidenceLevelsActivityUiid, Collection items); - + /** * Returns all activities that precede specified activity and produce confidence levels. - * - * @param toolContentId toolContentId of the specified activity + * + * @param toolContentId + * toolContentId of the specified activity * @return */ Set getPrecedingConfidenceLevelsActivities(Long toolContentId); @@ -90,18 +88,18 @@ * @param toolSessionId */ ScratchieUser checkLeaderSelectToolForSessionLeader(ScratchieUser user, Long toolSessionId); - + /** * Stores date when user has started activity with time limit. - * + * * @param sessionId - * @throws SchedulerException + * @throws SchedulerException */ void launchTimeLimit(Long sessionId) throws SchedulerException; - + /** * Checks if non-leaders should still wait for leader to submit notebook. - * + * * @param toolSession * @return */ @@ -154,16 +152,18 @@ */ ScratchieUser getUserByIDAndSession(Long userId, Long sessionId); + ScratchieUser getUserByLoginAndSessionId(String login, long toolSessionId); + /** * Get users by given toolSessionId. * * @param toolSessionId * @return */ List getUsersBySession(Long toolSessionId); - + ScratchieUser getUserByUserIDAndContentID(Long userId, Long contentId); - + int countUsersByContentId(Long contentId); /** @@ -203,10 +203,10 @@ * @return */ ScratchieSession getScratchieSessionBySessionId(Long sessionId); - + /** * Return all sessions realted to the specified toolContentId. - * + * * @param toolContentId * @return */ @@ -260,8 +260,8 @@ * Mark all users in agroup as ScratchingFinished so that users can't continue scratching after this. * * @param toolSessionId - * @throws IOException - * @throws JSONException + * @throws IOException + * @throws JSONException */ void setScratchingFinished(Long toolSessionId) throws IOException; @@ -293,7 +293,8 @@ * @param sessionId * optional parameter, if it's specified, BurningQuestionDTOs will also contain information what leader * of this group has liked - * @param includeEmptyItems whether it should include questions that don't have any burning questions + * @param includeEmptyItems + * whether it should include questions that don't have any burning questions * @return */ List getBurningQuestionDtos(Scratchie scratchie, Long sessionId, boolean includeEmptyItems); @@ -390,24 +391,24 @@ ScratchieConfigItem getConfigItem(String key); void saveOrUpdateScratchieConfigItem(ScratchieConfigItem item); - + /** * Return preset marks that is going to be used for calculating learners' marks. Return scratchie.presetMarks if * it's not null, otherwise returns default setting stored as admin config setting. - * + * * @param scratchie * @return */ String[] getPresetMarks(Scratchie scratchie); - + /** * Return a maximum possible mark that user can get on answering all questions. - * + * * @param scratchie * @return */ int getMaxPossibleScore(Scratchie scratchie); - + /** Get the raw marks for display in a graph in monitoring */ List getMarksArray(Long contentId); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r20b0f9dcce5dda74c6adcf70239de3b75a7e775d -rf5e59b4320e8fdfb492b6432ca965c2381918d91 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 20b0f9dcce5dda74c6adcf70239de3b75a7e775d) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision f5e59b4320e8fdfb492b6432ca965c2381918d91) @@ -197,7 +197,15 @@ return scratchieUserDao.getUserByUserIDAndSessionID(userId, sessionId); } + @SuppressWarnings("unchecked") @Override + public ScratchieUser getUserByLoginAndSessionId(String login, long toolSessionId) { + List user = scratchieUserDao.findByProperty(User.class, "login", login); + return user.isEmpty() ? null + : scratchieUserDao.getUserByUserIDAndSessionID(user.get(0).getUserId().longValue(), toolSessionId); + } + + @Override public int countUsersByContentId(Long contentId) { return scratchieUserDao.countUsersByContentId(contentId); } @@ -237,7 +245,7 @@ } //remove all white spaces and split the settings around matches of "," - return presetMarks.replaceAll("\\s+","").split(","); + return presetMarks.replaceAll("\\s+", "").split(","); } @Override @@ -271,8 +279,8 @@ for (ScratchieItem item : items) { //init answers' confidenceLevelDtos list - for (ScratchieAnswer answer : (Set) item.getAnswers()) { - LinkedList confidenceLevelDtosTemp = new LinkedList(); + for (ScratchieAnswer answer : item.getAnswers()) { + LinkedList confidenceLevelDtosTemp = new LinkedList<>(); answer.setConfidenceLevelDtos(confidenceLevelDtosTemp); } @@ -284,7 +292,7 @@ if (question.equals(confidenceLevelDto.getQuestion().replaceAll("(\\r|\\n)", ""))) { //find according answer - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { String answerText = answer.getDescription().replaceAll("(\\r|\\n)", ""); if (answerText.equals(confidenceLevelDto.getAnswer().replaceAll("(\\r|\\n)", ""))) { answer.getConfidenceLevelDtos().add(confidenceLevelDto); @@ -301,7 +309,7 @@ public Set getPrecedingConfidenceLevelsActivities(Long toolContentId) { return toolService.getPrecedingConfidenceLevelsActivities(toolContentId); } - + @Override public boolean isUserGroupLeader(Long userId, Long toolSessionId) { ScratchieSession session = getScratchieSessionBySessionId(toolSessionId); @@ -611,7 +619,7 @@ ScratchieUser user = scratchieUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); user.setSessionFinished(true); scratchieUserDao.saveObject(user); - + //if this is a leader finishes, complete all non-leaders as well boolean isUserGroupLeader = user.getSession().isUserGroupLeader(user.getUid()); if (isUserGroupLeader) { @@ -712,7 +720,7 @@ List itemLogs = scratchieAnswerVisitDao.getLogsBySessionAndItem(sessionId, item.getUid()); - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { int attemptNumber; ScratchieAnswerVisitLog log = scratchieAnswerVisitDao.getLog(answer.getUid(), sessionId); @@ -746,7 +754,7 @@ for (ScratchieItem item : items) { - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { // find according log if it exists ScratchieAnswerVisitLog log = null; @@ -782,7 +790,7 @@ private boolean isItemUnraveled(ScratchieItem item, List userLogs) { boolean isItemUnraveled = false; - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { ScratchieAnswerVisitLog log = null; for (ScratchieAnswerVisitLog userLog : userLogs) { @@ -1077,7 +1085,7 @@ items.addAll(scratchie.getScratchieItems()); int numberOfItems = items.size(); - List sheets = new LinkedList(); + List sheets = new LinkedList<>(); // ======================================================= For Immediate Analysis page // ======================================= @@ -1086,7 +1094,7 @@ ExcelRow row = immediateAnalysisSheet.initRow(); row.addCell(getMessage("label.quick.analysis"), true); - + row = immediateAnalysisSheet.initRow(); row.addEmptyCell(); row.addCell(getMessage("label.in.table.below.we.show")); @@ -1143,7 +1151,7 @@ row = reportByTeamSheet.initRow(); row.addCell(getMessage("label.quick.analysis"), true); - + row = reportByTeamSheet.initRow(); row.addEmptyCell(); row.addCell(getMessage("label.table.below.shows.which.answer.teams.selected.first.try")); @@ -1164,7 +1172,7 @@ // find out the correct answer's sequential letter - A,B,C... String correctAnswerLetter = ""; int answerCount = 1; - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { if (answer.isCorrect()) { correctAnswerLetter = String.valueOf((char) ((answerCount + 'A') - 1)); break; @@ -1222,7 +1230,7 @@ if ((percentages.length % 2) == 1) { median = percentages[middle]; } else { - median = (double) ((percentages[middle - 1] + percentages[middle]) / 2.0); + median = (percentages[middle - 1] + percentages[middle]) / 2.0; } row = reportByTeamSheet.initRow(); row.addCell(getMessage("label.median")); @@ -1434,8 +1442,7 @@ for (ScratchieItem item : items) { row = researchAndAnalysisSheet.initRow(); - row.addCell(getMessage("label.question.semicolon", new Object[] { item.getTitle() }), - false); + row.addCell(getMessage("label.question.semicolon", new Object[] { item.getTitle() }), false); int i = 1; List logs = scratchieAnswerVisitDao.getLogsBySessionAndItem(sessionId, @@ -1723,7 +1730,7 @@ String sequencialLetter = ""; int answerCount = 1; - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { if (answer.getUid().equals(asnwer.getUid())) { sequencialLetter = String.valueOf((char) ((answerCount + 'A') - 1)); break; @@ -1765,7 +1772,7 @@ public void auditLogStartEditingActivityInMonitor(long toolContentID) { toolService.auditLogStartEditingActivityInMonitor(toolContentID); } - + @Override public boolean isLastActivity(Long toolSessionId) { return toolService.isLastActivity(toolSessionId); @@ -2111,7 +2118,7 @@ scratchieUser = new ScratchieUser(user.getUserDTO(), session); createUser(scratchieUser); } - + checkLeaderSelectToolForSessionLeader(scratchieUser, toolSessionId); //if this is a leader finishes, complete all non-leaders as well boolean isUserGroupLeader = session.isUserGroupLeader(scratchieUser.getUid()); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java =================================================================== diff -u -rb8797193dabd790bbeb45f08fbbae52f0f07bf6d -rf5e59b4320e8fdfb492b6432ca965c2381918d91 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision b8797193dabd790bbeb45f08fbbae52f0f07bf6d) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision f5e59b4320e8fdfb492b6432ca965c2381918d91) @@ -24,6 +24,7 @@ import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswer; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; +import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; import org.lamsfoundation.lams.tool.scratchie.service.IScratchieService; import org.lamsfoundation.lams.util.hibernate.HibernateSessionManager; import org.lamsfoundation.lams.web.session.SessionManager; @@ -221,6 +222,14 @@ public void registerUser(Session websocket) throws IOException { Long toolSessionId = Long .valueOf(websocket.getRequestParameterMap().get(AttributeNames.PARAM_TOOL_SESSION_ID).get(0)); + String login = websocket.getUserPrincipal().getName(); + ScratchieUser user = LearningWebsocketServer.getScratchieService().getUserByLoginAndSessionId(login, + toolSessionId); + if (user == null) { + throw new SecurityException("User \"" + login + + "\" is not a participant in Scratchie activity with tool session ID " + toolSessionId); + } + Set sessionWebsockets = LearningWebsocketServer.websockets.get(toolSessionId); if (sessionWebsockets == null) { sessionWebsockets = ConcurrentHashMap.newKeySet(); @@ -232,8 +241,7 @@ sessionWebsockets.add(websocket); if (log.isDebugEnabled()) { - log.debug("User " + websocket.getUserPrincipal().getName() + " entered Scratchie with toolSessionId: " - + toolSessionId); + log.debug("User " + login + " entered Scratchie with toolSessionId: " + toolSessionId); } }