Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dao/PeerreviewUserDAO.java =================================================================== diff -u -r9f2c1f957570c3885c34d8d162a1f14d82e3aba2 -rf99ba3decf8c8e2c60346de01726623939afcd99 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dao/PeerreviewUserDAO.java (.../PeerreviewUserDAO.java) (revision 9f2c1f957570c3885c34d8d162a1f14d82e3aba2) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dao/PeerreviewUserDAO.java (.../PeerreviewUserDAO.java) (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -35,6 +35,8 @@ List getBySessionID(Long sessionId); + List getUserIdsBySessionID(Long sessionId); + List getByContentId(Long toolContentId); int getCountUsersBySession(final Long toolSessionId, final Long excludeUserId); Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dao/hibernate/PeerreviewUserDAOHibernate.java =================================================================== diff -u -r9f2c1f957570c3885c34d8d162a1f14d82e3aba2 -rf99ba3decf8c8e2c60346de01726623939afcd99 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dao/hibernate/PeerreviewUserDAOHibernate.java (.../PeerreviewUserDAOHibernate.java) (revision 9f2c1f957570c3885c34d8d162a1f14d82e3aba2) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dao/hibernate/PeerreviewUserDAOHibernate.java (.../PeerreviewUserDAOHibernate.java) (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -37,6 +37,8 @@ + " AS u WHERE u.userId =? AND u.session.sessionId=?"; private static final String FIND_BY_SESSION_ID = "FROM " + PeerreviewUser.class.getName() + " AS u WHERE u.session.sessionId=?"; + private static final String GET_USERIDS_BY_SESSION_ID = "SELECT userId FROM " + PeerreviewUser.class.getName() + + " AS u WHERE u.session.sessionId=?"; private static final String FIND_BY_CONTENT_ID = "FROM " + PeerreviewUser.class.getName() + " AS u WHERE u.session.peerreview.contentId=?"; @@ -69,6 +71,11 @@ } @Override + public List getUserIdsBySessionID(Long sessionId) { + return this.getHibernateTemplate().find(GET_USERIDS_BY_SESSION_ID, sessionId); + } + + @Override public List getByContentId(Long toolContentId) { return this.getHibernateTemplate().find(FIND_BY_CONTENT_ID, toolContentId); } Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dbupdates/patch20150825.sql =================================================================== diff -u --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dbupdates/patch20150825.sql (revision 0) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dbupdates/patch20150825.sql (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -0,0 +1,13 @@ +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------Put all sql statements below here------------------------- + +ALTER TABLE `tl_laprev11_user` +ADD UNIQUE INDEX `prev11uniqusersession` (`user_id` ASC, `session_uid` ASC); + +-- --------------------Put all sql statements above here------------------------- +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java =================================================================== diff -u -r0e69531f65529363399c5472a6c42bae1aa88408 -rf99ba3decf8c8e2c60346de01726623939afcd99 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java (.../IPeerreviewService.java) (revision 0e69531f65529363399c5472a6c42bae1aa88408) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java (.../IPeerreviewService.java) (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -193,10 +193,15 @@ PeerreviewUser getUser(Long uid); /** + * Trigger the user creation, based on the lesson/grouping class, if needed. This + * should be called by the web layer to trigger an update. Returns almost straight away - + * any updates are done in a separate thread. + * Returns true if a check/update is triggered, returns false if a check is already underway. * @param toolSessionId * @return + * @throws Throwable */ - List fetchUsersFromLesson(Long toolSessionId); + boolean fetchUsersFromLesson(Long toolSessionId) throws Throwable; /** * Returns whether activity is grouped and therefore it is expected more than one tool session. Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java =================================================================== diff -u -r3ccf2da662a461f879bd902e9bf0eb648acf9983 -rf99ba3decf8c8e2c60346de01726623939afcd99 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision 3ccf2da662a461f879bd902e9bf0eb648acf9983) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.Hashtable; import java.util.Iterator; @@ -33,7 +34,9 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; +import java.util.SortedSet; import java.util.TreeMap; +import java.util.TreeSet; import javax.servlet.http.HttpServletRequest; @@ -91,7 +94,7 @@ private PeerreviewUserDAO peerreviewUserDao; private PeerreviewSessionDAO peerreviewSessionDao; - + // tool service private PeerreviewToolContentHandler peerreviewToolContentHandler; @@ -111,6 +114,12 @@ private IRatingService ratingService; + private SortedSet creatingUsersForSessionIds; + + PeerreviewServiceImpl() { + creatingUsersForSessionIds = Collections.synchronizedSortedSet(new TreeSet()); + } + // ******************************************************************************* // Service method // ******************************************************************************* @@ -302,38 +311,70 @@ } @Override - public List fetchUsersFromLesson(Long toolSessionId) { + public boolean fetchUsersFromLesson(Long toolSessionId) throws Throwable { //can we change lesson's class? //boolean isGroupedActivity = isGroupedActivity(toolContentId); - PeerreviewSession session = getPeerreviewSessionBySessionId(toolSessionId); - Set lessonUsers = toolService.getUsersFromGroupingActivity(toolSessionId); - List sessionUsers = peerreviewUserDao.getBySessionID(toolSessionId); - - //create all new users - for (User lessonUser: lessonUsers) { - - boolean isCorrespondingUserExist = false; - for (PeerreviewUser sessionUser: sessionUsers) { - if (lessonUser.getUserId().longValue() == sessionUser.getUserId().longValue()) { - isCorrespondingUserExist = true; - break; - } + try { + boolean wasNotInSetAlready = creatingUsersForSessionIds.add(toolSessionId); + if ( ! wasNotInSetAlready ) { + log.debug("Peer Review: Already processing session "+toolSessionId); + return false; } - if (!isCorrespondingUserExist) { - PeerreviewUser newUser = new PeerreviewUser(lessonUser.getUserDTO(), session); - createUser(newUser); - } - + log.debug("Peer Review: Processing session "+toolSessionId); + Thread t = new Thread(new UserCreateThread(toolSessionId)); + t.start(); + return true; + } catch (Throwable e) { + creatingUsersForSessionIds.remove(toolSessionId); + String message = e.getMessage() != null ? e.getMessage() : e.getClass().getName(); + this.log.error("Exception thrown creating Peer Review users for session "+toolSessionId+": "+message,e); + e.printStackTrace(); + throw(e); } - - return sessionUsers; } - + // ***************************************************************************** // private methods // ***************************************************************************** + private class UserCreateThread implements Runnable { + private Long toolSessionId; + + private Logger log = Logger.getLogger(UserCreateThread.class); + + public UserCreateThread(Long toolSessionId) { + this.toolSessionId = toolSessionId; + } + + public void run() { + long start = System.currentTimeMillis(); + try { + PeerreviewSession session = getPeerreviewSessionBySessionId(toolSessionId); + Set lessonUsers = toolService.getUsersFromGroupingActivity(toolSessionId); + List sessionUserIds = peerreviewUserDao.getUserIdsBySessionID(toolSessionId); + boolean needsUpdate = sessionUserIds.size() <= lessonUsers.size(); + + if ( needsUpdate ) { + //create all new users + for (User lessonUser: lessonUsers) { + if (!sessionUserIds.contains(lessonUser.getUserId().longValue())) { + PeerreviewUser newUser = new PeerreviewUser(lessonUser.getUserDTO(), session); + createUser(newUser); + } + } + } + this.log.debug("UserCreateThread "+toolSessionId+": Update Took "+ (System.currentTimeMillis()-start) +"ms."); + } catch (Throwable e) { + String message = e.getMessage() != null ? e.getMessage() : e.getClass().getName(); + this.log.error("Exception thrown creating Peer Review users for session "+toolSessionId+": "+message,e); + e.printStackTrace(); + } finally { + creatingUsersForSessionIds.remove(toolSessionId); + } + } + } // end Thread class + private Peerreview getDefaultPeerreview() throws PeerreviewApplicationException { Long defaultPeerreviewId = getToolDefaultContentIdBySignature(PeerreviewConstants.TOOL_SIGNATURE); Peerreview defaultPeerreview = getPeerreviewByContentId(defaultPeerreviewId); Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/action/LearningAction.java =================================================================== diff -u -r0e69531f65529363399c5472a6c42bae1aa88408 -rf99ba3decf8c8e2c60346de01726623939afcd99 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/action/LearningAction.java (.../LearningAction.java) (revision 0e69531f65529363399c5472a6c42bae1aa88408) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/action/LearningAction.java (.../LearningAction.java) (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -113,10 +113,11 @@ * method run successfully. * * This method will avoid read database again and lost un-saved resouce item lost when user "refresh page", + * @throws IOException * */ private ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) throws IOException { IPeerreviewService service = getPeerreviewService(); @@ -174,9 +175,13 @@ return mapping.findForward("defineLater"); } - // handle rating criterias - service.fetchUsersFromLesson(sessionId); + try { + service.fetchUsersFromLesson(sessionId); + } catch ( Throwable e ) { + throw new IOException(e); + } + // handle rating criterias boolean isCommentsEnabled = service.isCommentsEnabled(peerreview.getContentId()); sessionMap.put("isCommentsEnabled", isCommentsEnabled); Index: lams_tool_preview/web/pages/learning/learning.jsp =================================================================== diff -u -r0e69531f65529363399c5472a6c42bae1aa88408 -rf99ba3decf8c8e2c60346de01726623939afcd99 --- lams_tool_preview/web/pages/learning/learning.jsp (.../learning.jsp) (revision 0e69531f65529363399c5472a6c42bae1aa88408) +++ lams_tool_preview/web/pages/learning/learning.jsp (.../learning.jsp) (revision f99ba3decf8c8e2c60346de01726623939afcd99) @@ -203,6 +203,11 @@ function continueReflect(){ document.location.href=''; } + + function refresh(){ + document.location.href=''; + } + @@ -349,6 +354,11 @@ +
+ + + +