Index: lams_tool_doku/conf/hibernate/mappings/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.hbm.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/conf/hibernate/mappings/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.hbm.xml,v diff -u -r1.2 -r1.3 --- lams_tool_doku/conf/hibernate/mappings/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.hbm.xml 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/conf/hibernate/mappings/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.hbm.xml 25 Jan 2017 07:24:15 -0000 1.3 @@ -132,6 +132,14 @@ insert="true" column="use_select_leader_tool_ouput" /> + + getBySessionID(Long sessionId); + + /** + * Get the list of all leaders in the specified session. This method is applicable only in case allowMultipleLeaders option is ON. + * + * @param sessionId + * @return + */ + List getLeadersBySessionId(Long sessionId); } Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dao/hibernate/DokumaranUserDAOHibernate.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dao/hibernate/DokumaranUserDAOHibernate.java,v diff -u -r1.1 -r1.2 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dao/hibernate/DokumaranUserDAOHibernate.java 16 Jan 2017 15:28:10 -0000 1.1 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dao/hibernate/DokumaranUserDAOHibernate.java 25 Jan 2017 07:24:15 -0000 1.2 @@ -39,6 +39,8 @@ + " as u where u.userId =? and u.session.sessionId=?"; private static final String FIND_BY_SESSION_ID = "from " + DokumaranUser.class.getName() + " as u where u.session.sessionId=?"; + private static final String FIND_LEADERS_BY_SESSION_ID = "from " + DokumaranUser.class.getName() + + " as u where u.session.sessionId=? AND u.leader=1"; @Override public DokumaranUser getUserByUserIDAndSessionID(Long userID, Long sessionId) { @@ -63,5 +65,10 @@ public List getBySessionID(Long sessionId) { return (List) this.doFind(FIND_BY_SESSION_ID, sessionId); } + + @Override + public List getLeadersBySessionId(Long sessionId) { + return (List) this.doFind(FIND_LEADERS_BY_SESSION_ID, sessionId); + } } Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java,v diff -u -r1.2 -r1.3 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java 25 Jan 2017 07:24:15 -0000 1.3 @@ -52,6 +52,8 @@ // advance private boolean useSelectLeaderToolOuput; + + private boolean allowMultipleLeaders; private boolean showChat; @@ -349,7 +351,19 @@ public void setUseSelectLeaderToolOuput(boolean useSelectLeaderToolOuput) { this.useSelectLeaderToolOuput = useSelectLeaderToolOuput; } + + /** + * + * @return + */ + public boolean isAllowMultipleLeaders() { + return allowMultipleLeaders; + } + public void setAllowMultipleLeaders(boolean allowMultipleLeaders) { + this.allowMultipleLeaders = allowMultipleLeaders; + } + /** * * @return Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/DokumaranSession.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/DokumaranSession.java,v diff -u -r1.2 -r1.3 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/DokumaranSession.java 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/DokumaranSession.java 25 Jan 2017 07:24:15 -0000 1.3 @@ -142,11 +142,6 @@ public void setGroupLeader(DokumaranUser groupLeader) { this.groupLeader = groupLeader; } - - public boolean isUserGroupLeader(Long userUid) { - boolean isUserLeader = (this.groupLeader != null) && userUid.equals(this.groupLeader.getUid()); - return isUserLeader; - } /** * @return Returns the etherpadReadOnlyId Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java,v diff -u -r1.2 -r1.3 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java 25 Jan 2017 07:24:15 -0000 1.3 @@ -217,48 +217,132 @@ } @Override - public DokumaranUser checkLeaderSelectToolForSessionLeader(DokumaranUser user, Long toolSessionId) { + public List checkLeaderSelectToolForSessionLeader(DokumaranUser user, Long toolSessionId, boolean isFirstTimeAccess) { if ((user == null) || (toolSessionId == null)) { return null; } DokumaranSession session = getDokumaranSessionBySessionId(toolSessionId); - Long toolContentId = session.getDokumaran().getContentId(); - boolean isMultipleLeadersAllowed = isGroupedActivity(toolContentId); - if (isMultipleLeadersAllowed) { + Dokumaran dokumaran = session.getDokumaran(); + List leaders = new ArrayList(); + if (dokumaran.isAllowMultipleLeaders() && !isGroupedActivity(dokumaran.getContentId())) { + + List createdLeaders = dokumaranUserDao.getLeadersBySessionId(toolSessionId); + leaders.addAll(createdLeaders); + + // check leader select tool for a leader only in case Dokumaran activity is accessed by this user for the first + // time. We need to add this check in order to reduce amount of queries to Leader Selection tool. + if (isFirstTimeAccess) { + //get all leaders from Leader Selection tool + Set allLeaderUserIds = toolService.getAllLeaderUserIds(toolSessionId, user.getUserId().intValue()); + for (Long leaderUserId : allLeaderUserIds) { + //in case current user is leader - store his leader status + if (leaderUserId.equals(user.getUserId())) { + user.setLeader(true); + saveUser(user); + leaders.add(user); + continue; + } + + //check if such leader is already created inside doKumaran + boolean isLeaderCreated = false; + for (DokumaranUser leader : createdLeaders) { + if (leader.getUserId().equals(leaderUserId)) { + isLeaderCreated = true; + break; + } + } + + //if the leader is not yet created - create him + if (!isLeaderCreated && (getUserByIDAndSession(leaderUserId, toolSessionId) == null)) { + log.debug("creating new user with userId: " + leaderUserId); + User leaderDto = (User) userManagementService.findById(User.class, leaderUserId.intValue()); + DokumaranUser leader = new DokumaranUser(leaderDto.getUserDTO(), session); + leader.setLeader(true); + saveUser(leader); + leaders.add(leader); + } + } + + } } else { + DokumaranUser leader = session.getGroupLeader(); + // check leader select tool for a leader only in case Dokumaran tool doesn't know it. As otherwise it will + // screw + // up previous scratches done + if (leader == null) { - } + Long leaderUserId = toolService.getLeaderUserId(toolSessionId, user.getUserId().intValue()); + if (leaderUserId != null) { + leader = getUserByIDAndSession(leaderUserId, toolSessionId); - DokumaranUser leader = session.getGroupLeader(); - // check leader select tool for a leader only in case Dokumaran tool doesn't know it. As otherwise it will screw - // up previous scratches done - if (leader == null) { + // create new user in a DB + if (leader == null) { + log.debug("creating new user with userId: " + leaderUserId); + User leaderDto = (User) userManagementService.findById(User.class, leaderUserId.intValue()); + leader = new DokumaranUser(leaderDto.getUserDTO(), session); + saveUser(leader); + } - Long leaderUserId = toolService.getLeaderUserId(toolSessionId, user.getUserId().intValue()); - if (leaderUserId != null) { - leader = getUserByIDAndSession(leaderUserId, toolSessionId); - - // create new user in a DB - if (leader == null) { - log.debug("creating new user with userId: " + leaderUserId); - User leaderDto = (User) userManagementService.findById(User.class, leaderUserId.intValue()); - leader = new DokumaranUser(leaderDto.getUserDTO(), session); - createUser(leader); + // set group leader + session.setGroupLeader(leader); + dokumaranSessionDao.saveObject(session); } + } + + leaders.add(leader); + } - // set group leader - session.setGroupLeader(leader); - dokumaranSessionDao.saveObject(session); + return leaders; + } + + @Override + public boolean isUserLeader(List leaders, Long userId) { + for (DokumaranUser leader : leaders) { + if (userId.equals(leader.getUserId())) { + return true; } } + return false; + } + + @Override + public boolean isLeaderResponseFinalized(List leaders) { + for (DokumaranUser leader : leaders) { + if (leader.isSessionFinished()) { + return true; + } + } + return false; + } + + @Override + public boolean isLeaderResponseFinalized(Long toolSessionId) { + DokumaranSession session = getDokumaranSessionBySessionId(toolSessionId); + Dokumaran dokumaran = session.getDokumaran(); + + boolean isLeaderResponseFinalized = false; + if (dokumaran.isAllowMultipleLeaders() && !isGroupedActivity(dokumaran.getContentId())) { + + List leaders = dokumaranUserDao.getLeadersBySessionId(toolSessionId); + for (DokumaranUser leader : leaders) { + if (leader.isSessionFinished()) { + isLeaderResponseFinalized = true; + break; + } + } + + } else { + DokumaranUser leader = session.getGroupLeader(); + isLeaderResponseFinalized = (leader != null) && leader.isSessionFinished(); + } - return leader; + return isLeaderResponseFinalized; } @Override - public void createUser(DokumaranUser dokumaranUser) { + public void saveUser(DokumaranUser dokumaranUser) { dokumaranUserDao.saveObject(dokumaranUser); } @@ -1029,6 +1113,7 @@ dokumaran.setReflectOnActivity(JsonUtil.opt(toolContentJSON, RestTags.REFLECT_ON_ACTIVITY, Boolean.FALSE)); dokumaran.setReflectInstructions(JsonUtil.opt(toolContentJSON, RestTags.REFLECT_INSTRUCTIONS, (String) null)); dokumaran.setUseSelectLeaderToolOuput(JsonUtil.opt(toolContentJSON, "useSelectLeaderToolOuput", Boolean.FALSE)); + dokumaran.setAllowMultipleLeaders(JsonUtil.opt(toolContentJSON, "allowMultipleLeaders", Boolean.FALSE)); dokumaran.setContentInUse(false); dokumaran.setDefineLater(false); Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java,v diff -u -r1.2 -r1.3 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java 25 Jan 2017 07:24:15 -0000 1.3 @@ -69,9 +69,40 @@ * * @param userId * @param toolSessionId + * @param isFirstTimeAccess + * whether user is accessing this doKumaran tool for the first time. If it's true - it will try to update + * leaders list from the Leader Selection activity */ - DokumaranUser checkLeaderSelectToolForSessionLeader(DokumaranUser user, Long toolSessionId); + List checkLeaderSelectToolForSessionLeader(DokumaranUser user, Long toolSessionId, boolean isFirstTimeAccess); + /** + * Is user is as a leader. It works OK in all cases regardless whether isAllowMultipleLeaders option is ON or OFF + * (as all leaders are kept in leaders list anyway). + * + * @param leaders + * @param userId + * @return + */ + boolean isUserLeader(List leaders, Long userId); + + /** + * Checks whether at least one of the leaders has finished activity and thus all non-leaders can proceed with finishing it as well. + * + * @param leaders + * @return + */ + boolean isLeaderResponseFinalized(List leaders); + + /** + * Checks whether at least one of the leaders has finished activity and thus all non-leaders can proceed with + * finishing it as well. It differs from the above method that is should be used when leaders list is not + * constructed yet. + * + * @param session + * @return + */ + boolean isLeaderResponseFinalized(Long toolSessionId); + Cookie createEtherpadCookieForLearner(DokumaranUser user, DokumaranSession session) throws DokumaranConfigurationException, URISyntaxException; Cookie createEtherpadCookieForMonitor(UserDTO user, Long contentId) throws DokumaranConfigurationException, URISyntaxException; @@ -89,7 +120,7 @@ /** * Create a new user in database. */ - void createUser(DokumaranUser dokumaranUser); + void saveUser(DokumaranUser dokumaranUser); /** * Get user by given userID and toolContentID. Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/action/LearningAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/action/LearningAction.java,v diff -u -r1.2 -r1.3 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/action/LearningAction.java 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/action/LearningAction.java 25 Jan 2017 07:24:15 -0000 1.3 @@ -128,21 +128,30 @@ // get back the dokumaran and item list and display them on page DokumaranUser user = null; + boolean isFirstTimeAccess = false; if ((mode != null) && mode.isTeacher()) { // monitoring mode - user is specified in URL // dokumaranUser may be null if the user was force completed. user = getSpecifiedUser(service, toolSessionId, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false)); } else { - user = getCurrentUser(service, toolSessionId); + // get back login user DTO + HttpSession ss = SessionManager.getSession(); + UserDTO userDto = (UserDTO) ss.getAttribute(AttributeNames.USER); + user = service.getUserByIDAndSession(new Long(userDto.getUserID().intValue()), toolSessionId); + if (user == null) { + user = new DokumaranUser(userDto, session); + service.saveUser(user); + isFirstTimeAccess = true; + } } // support for leader select feature - DokumaranUser groupLeader = dokumaran.isUseSelectLeaderToolOuput() - ? service.checkLeaderSelectToolForSessionLeader(user, new Long(toolSessionId).longValue()) + List leaders = dokumaran.isUseSelectLeaderToolOuput() + ? service.checkLeaderSelectToolForSessionLeader(user, new Long(toolSessionId).longValue(), isFirstTimeAccess) : null; - // forwards to the leaderSelection page - if (dokumaran.isUseSelectLeaderToolOuput() && (groupLeader == null) && !mode.isTeacher()) { + // forwards to the leaderSelection page + if (dokumaran.isUseSelectLeaderToolOuput() && leaders.isEmpty() && !mode.isTeacher()) { // get group users and store it to request as DTO objects List groupUsers = service.getUsersBySession(toolSessionId); @@ -157,8 +166,7 @@ request.setAttribute(DokumaranConstants.ATTR_DOKUMARAN, dokumaran); return mapping.findForward("waitforleader"); } - sessionMap.put(DokumaranConstants.ATTR_GROUP_LEADER, groupLeader); - boolean isUserLeader = session.isUserGroupLeader(user.getUid()); + boolean isUserLeader = (user != null) && service.isUserLeader(leaders, user.getUserId()); // check whether finish lock is on/off boolean finishedLock = dokumaran.getLockWhenFinished() && (user != null) && user.isSessionFinished(); @@ -170,10 +178,9 @@ sessionMap.put(DokumaranConstants.ATTR_INSTRUCTIONS, dokumaran.getInstructions()); sessionMap.put(DokumaranConstants.ATTR_FINISH_LOCK, finishedLock); sessionMap.put(DokumaranConstants.ATTR_LOCK_ON_FINISH, dokumaran.getLockWhenFinished()); - sessionMap.put(DokumaranConstants.ATTR_USER_FINISHED, - (user != null) && user.isSessionFinished()); + sessionMap.put(DokumaranConstants.ATTR_USER_FINISHED, (user != null) && user.isSessionFinished()); sessionMap.put(DokumaranConstants.ATTR_HAS_EDIT_RIGHT, hasEditRight); - sessionMap.put(DokumaranConstants.ATTR_IS_LEADER_RESPONSE_FINALIZED, groupLeader != null && groupLeader.isSessionFinished()); + sessionMap.put(DokumaranConstants.ATTR_IS_LEADER_RESPONSE_FINALIZED, service.isLeaderResponseFinalized(leaders)); sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionId); sessionMap.put(AttributeNames.ATTR_MODE, mode); @@ -227,8 +234,10 @@ request.setAttribute(DokumaranConstants.ATTR_PAD_ID, padId); //add new sessionID cookie in order to access pad - Cookie etherpadSessionCookie = service.createEtherpadCookieForLearner(user, session); - response.addCookie(etherpadSessionCookie); + if (user != null) { + Cookie etherpadSessionCookie = service.createEtherpadCookieForLearner(user, session); + response.addCookie(etherpadSessionCookie); + } return mapping.findForward(DokumaranConstants.SUCCESS); } @@ -242,11 +251,8 @@ IDokumaranService service = getDokumaranService(); Long toolSessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); - DokumaranSession session = service.getDokumaranSessionBySessionId(toolSessionId); - DokumaranUser leader = session.getGroupLeader(); + boolean isLeaderResponseFinalized = service.isLeaderResponseFinalized(toolSessionId); - boolean isLeaderResponseFinalized = leader.isSessionFinished(); - JSONObject JSONObject = new JSONObject(); JSONObject.put(DokumaranConstants.ATTR_IS_LEADER_RESPONSE_FINALIZED, isLeaderResponseFinalized); response.setContentType("application/x-json;charset=utf-8"); @@ -380,21 +386,6 @@ return LearningAction.dokumaranService; } - private DokumaranUser getCurrentUser(IDokumaranService service, Long sessionId) { - // try to get form system session - HttpSession ss = SessionManager.getSession(); - // get back login user DTO - UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - DokumaranUser dokumaranUser = service.getUserByIDAndSession(new Long(user.getUserID().intValue()), sessionId); - - if (dokumaranUser == null) { - DokumaranSession session = service.getDokumaranSessionBySessionId(sessionId); - dokumaranUser = new DokumaranUser(user, session); - service.createUser(dokumaranUser); - } - return dokumaranUser; - } - private DokumaranUser getSpecifiedUser(IDokumaranService service, Long sessionId, Integer userId) { DokumaranUser dokumaranUser = service.getUserByIDAndSession(new Long(userId.intValue()), sessionId); if (dokumaranUser == null) { Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/form/DokumaranForm.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/form/DokumaranForm.java,v diff -u -r1.1 -r1.2 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/form/DokumaranForm.java 16 Jan 2017 15:28:09 -0000 1.1 +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/form/DokumaranForm.java 25 Jan 2017 07:24:15 -0000 1.2 @@ -76,6 +76,7 @@ dokumaran.setLockWhenFinished(false); dokumaran.setDefineLater(false); dokumaran.setUseSelectLeaderToolOuput(false); + dokumaran.setAllowMultipleLeaders(false); dokumaran.setReflectOnActivity(false); } } Index: lams_tool_doku/web/pages/authoring/advance.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/web/pages/authoring/advance.jsp,v diff -u -r1.2 -r1.3 --- lams_tool_doku/web/pages/authoring/advance.jsp 24 Jan 2017 09:45:45 -0000 1.2 +++ lams_tool_doku/web/pages/authoring/advance.jsp 25 Jan 2017 07:24:15 -0000 1.3 @@ -10,6 +10,14 @@ + +
+ +
@@ -74,4 +82,9 @@ $('#shared-pad-id').keyup(function(){ $('#shared-pad-id-on').prop('checked', !isEmpty($(this).val())); }); + + //automatically turn on shared-pad-id-on option if there are text input in shared-pad-id area + $('#useSelectLeaderToolOuput').change(function(){ + $('#allowMultipleLeaders').prop('disabled', !$('#allowMultipleLeaders').prop('disabled')); + }); Index: lams_tool_doku/web/pages/monitoring/advanceoptions.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_doku/web/pages/monitoring/advanceoptions.jsp,v diff -u -r1.1 -r1.2 --- lams_tool_doku/web/pages/monitoring/advanceoptions.jsp 16 Jan 2017 15:28:09 -0000 1.1 +++ lams_tool_doku/web/pages/monitoring/advanceoptions.jsp 25 Jan 2017 07:24:15 -0000 1.2 @@ -40,6 +40,23 @@ + + + + + + + + + + + + + + + + +