Index: lams_central/src/java/org/lamsfoundation/lams/webservice/SPEnrolmentServlet.java =================================================================== diff -u -r36c729224d20ae6d3818047d7fef015bf50089f4 -rfb64b71d507fec0424ea6b7aed36e3f72aacb517 --- lams_central/src/java/org/lamsfoundation/lams/webservice/SPEnrolmentServlet.java (.../SPEnrolmentServlet.java) (revision 36c729224d20ae6d3818047d7fef015bf50089f4) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/SPEnrolmentServlet.java (.../SPEnrolmentServlet.java) (revision fb64b71d507fec0424ea6b7aed36e3f72aacb517) @@ -49,6 +49,8 @@ import org.lamsfoundation.lams.integration.ExtCourseClassMap; import org.lamsfoundation.lams.integration.ExtServer; import org.lamsfoundation.lams.integration.ExtUserUseridMap; +import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.security.RandomPasswordGenerator; import org.lamsfoundation.lams.integration.service.IIntegrationService; import org.lamsfoundation.lams.lesson.Lesson; @@ -80,13 +82,14 @@ private static final String FILE_INPUT_PARAM = "file-input"; private static final String DELIMITER = "\\|"; private static final String INTEGRATED_SERVER_NAME = "saml"; + private static final String ROLE_STAFF = "staff"; + private static final String BLANK_OUTPUT_VALUE = "-"; private static ILessonService lessonService = null; private static IUserManagementService userManagementService = null; private static ILogEventService logEventService = null; private static IIntegrationService integrationService = null; - @SuppressWarnings("unchecked") @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // check if path to input file is provided as GET parameter @@ -108,21 +111,28 @@ .map(line -> Arrays.stream(line.split(DELIMITER)).map(elem -> elem.trim()) .collect(Collectors.toList())) // filter out malformed rows - .filter(row -> row.size() == 6).collect(Collectors.toList()); + .filter(row -> row.size() == 7).collect(Collectors.toList()); // map of course code (ID) -> course name ConcurrentMap courses = lines.parallelStream().unordered().collect( Collectors.toConcurrentMap(elem -> elem.get(0), elem -> elem.get(1), (elem1, elem2) -> elem1)); - // map of user login (email) -> first name - ConcurrentMap users = lines.parallelStream().unordered().collect( - Collectors.toConcurrentMap(elem -> elem.get(5), elem -> elem.get(4), (elem1, elem2) -> elem1)); + // map of user login -> email, first name, role + // for learner email is login, for staff it is a different ID in email format + ConcurrentMap users = lines.parallelStream().unordered() + .collect(Collectors.toConcurrentMap( + elem -> elem.get(6).equals(ROLE_STAFF) ? elem.get(3) : elem.get(5), + elem -> new String[] { elem.get(5), elem.get(4), elem.get(6) }, + (elem1, elem2) -> elem1)); // map of course code -> subcourse code -> user logins + // for staff provisioning subcourse code is always "-" Map>> mappings = lines.stream() .collect(Collectors.groupingBy(elem -> elem.get(0), LinkedHashMap::new, Collectors.groupingBy(elem -> elem.get(2), LinkedHashMap::new, - Collectors.mapping(elem -> elem.get(5), Collectors.toList())))); + Collectors.mapping( + elem -> elem.get(6).equals(ROLE_STAFF) ? elem.get(3) : elem.get(5), + Collectors.toList())))); // map of user login -> course ID -> role IDs Map>> existingRoles = new HashMap<>(); @@ -138,239 +148,358 @@ throw new ServletException("Integrated server not found: " + INTEGRATED_SERVER_NAME); } - Set allUsersInSubcourses = new HashSet<>(); - Set allUsersParsed = new HashSet<>(); // create users - for (Entry userEntry : users.entrySet()) { - // email servers as login - String login = userEntry.getKey(); - User user = userManagementService.getUserByLogin(login); - if (user == null) { - String salt = HashUtil.salt(); - String password = HashUtil.sha256(RandomPasswordGenerator.nextPassword(10), salt); + Set allUsersParsed = createUsers(extServer, creatorId, users, userIDs, existingRoles); + Set allUsersinCourses = new HashSet<>(); + boolean isStaffMode = false; + // go through each course + for (Entry courseEntry : courses.entrySet()) { + String courseCode = courseEntry.getKey(); + // create or get existing course + Organisation course = getCourse(courseCode, courseEntry.getValue(), extServer, creatorId, + rootOrganisation); - ExtUserUseridMap userMap = integrationService.getImplicitExtUserUseridMap(extServer, login, - password, salt, userEntry.getValue(), ".", login); - user = userMap.getUser(); + // teachers are assigned to courses, not subcourses, so there is only on subcourse named "-" + // if we detect it is staff mode once, it is valid for all courses + isStaffMode |= mappings.get(courseCode).size() == 1 + && mappings.get(courseCode).containsKey(BLANK_OUTPUT_VALUE); - String message = "User created with login \"" + login + "\" and ID " + user.getUserId(); - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); + if (isStaffMode) { + // collect staff from this course + Set allUsersInCourse = assignTeachers(course, + mappings.get(courseCode).get(BLANK_OUTPUT_VALUE), extServer, creatorId, allUsersParsed, + userIDs, existingRoles); + allUsersinCourses.addAll(allUsersInCourse); } else { - ExtUserUseridMap userMap = integrationService.getExistingExtUserUseridMap(extServer, login); - if (userMap == null) { - userMap = new ExtUserUseridMap(); - userMap.setExtServer(extServer); - userMap.setUser(user); - userMap.setExtUsername(login); - userManagementService.save(userMap); - - String message = "External user created for existing user with login \"" + login - + "\" and ID " + user.getUserId(); - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); - } - if (user.getDisabledFlag()) { - // re-enable user who was disabled before - user.setDisabledFlag(false); - userManagementService.save(user); - } + // collect learners from all subcourses of this course + Set allUsersInSubcourses = assignLearners(course, mappings, extServer, creatorId, + allUsersParsed, userIDs, existingRoles); + allUsersinCourses.addAll(allUsersInSubcourses); } - - // fill data for later usage - existingRoles.put(login, userManagementService.getRolesForUser(user.getUserId())); - userIDs.put(login, user.getUserId()); - // add user to a collection of all users in the parsed file - allUsersParsed.add(user); } - // go through each course - for (Entry courseEntry : courses.entrySet()) { - Organisation course = null; - String code = courseEntry.getKey(); - List organisations = userManagementService.findByProperty(Organisation.class, "code", - code); - // create course - if (organisations.isEmpty()) { - String name = courseEntry.getValue(); - ExtCourseClassMap extOrgMap = integrationService.createExtCourseClassMap(extServer, creatorId, - name, name, rootOrganisation.getOrganisationId().toString(), false); - course = extOrgMap.getOrganisation(); - course.setCode(code); - userManagementService.save(course); + // users who are part of courses but are not in the file anymore are eligible for disabling + allUsersinCourses.removeAll(allUsersParsed); + for (User user : allUsersinCourses) { + // make a flat set of roles from all subcourses + Set roles = userManagementService.getRolesForUser(user.getUserId()).values().stream() + .collect(HashSet::new, Set::addAll, Set::addAll); + if (!isStaffMode) { + // check if the user is staff in any course + roles.remove(Role.ROLE_LEARNER); + } + if (isStaffMode || roles.isEmpty()) { + // he is only a learner or this is staff mode, so disable + userManagementService.disableUser(user.getUserId()); - String message = "Course created with code \"" + code + "\" and name \"" + name + "\" and ID " - + course.getOrganisationId(); + String message = "User \"" + user.getLogin() + "\" disabled"; logger.info(message); logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, "SPEnrolment: " + message); - } else { - course = organisations.get(0); - String name = course.getName(); + } + } - ExtCourseClassMap extOrgMap = integrationService.getExtCourseClassMap(extServer.getSid(), name); - if (extOrgMap == null) { - extOrgMap = new ExtCourseClassMap(); - extOrgMap.setCourseid(name); - extOrgMap.setExtServer(extServer); - extOrgMap.setOrganisation(course); - userManagementService.save(extOrgMap); + logger.info("SP enrolments provisioning completed successfully"); + } catch (Exception e) { + logger.error("Error while provisioning SP enrolments", e); + } finally { + HibernateSessionManager.closeSession(); + } + }).start(); - String message = "External course created for existing course with code \"" + code - + "\" and name \"" + name + "\" and ID " + course.getOrganisationId(); - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); - } - } + response.getWriter().print("Provisioning is running. Check logs."); + } - // go through each subcourse - for (Entry> subcourseEntry : mappings.get(code).entrySet()) { - Organisation subcourse = null; - String subcourseCode = subcourseEntry.getKey(); + private Set createUsers(ExtServer extServer, Integer creatorId, Map users, + Map userIDs, Map>> existingRoles) + throws UserInfoValidationException, UserInfoFetchException { + Set allUsersParsed = new HashSet<>(); + for (Entry userEntry : users.entrySet()) { + // email servers as login + String login = userEntry.getKey(); + User user = userManagementService.getUserByLogin(login); + if (user == null) { + String salt = HashUtil.salt(); + String password = HashUtil.sha256(RandomPasswordGenerator.nextPassword(10), salt); - Map queryParams = new HashMap<>(); - queryParams.put("code", subcourseCode); - queryParams.put("parentOrganisation.organisationId", course.getOrganisationId()); - organisations = userManagementService.findByProperties(Organisation.class, queryParams); + String email = userEntry.getValue()[0]; + String firstName = userEntry.getValue()[1]; + ExtUserUseridMap userMap = integrationService.getImplicitExtUserUseridMap(extServer, login, password, + salt, firstName, ".", email); + user = userMap.getUser(); - // create subcourse - if (organisations.isEmpty()) { + String message = "User created with login \"" + login + "\" and ID " + user.getUserId(); + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } else { + ExtUserUseridMap userMap = integrationService.getExistingExtUserUseridMap(extServer, login); + if (userMap == null) { + userMap = new ExtUserUseridMap(); + userMap.setExtServer(extServer); + userMap.setUser(user); + userMap.setExtUsername(login); + userManagementService.save(userMap); - ExtCourseClassMap extSubOrgMap = integrationService.createExtCourseClassMap(extServer, - creatorId, subcourseCode, subcourseCode, course.getOrganisationId().toString(), - false); - subcourse = extSubOrgMap.getOrganisation(); - subcourse.setCode(subcourseCode); - userManagementService.save(subcourse); + String message = "External user created for existing user with login \"" + login + "\" and ID " + + user.getUserId(); + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + if (user.getDisabledFlag()) { + // re-enable user who was disabled before + user.setDisabledFlag(false); + userManagementService.save(user); + } + } - String message = "Subcourse created with code and name \"" + code + "\" and ID " - + subcourse.getOrganisationId(); - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); - } else { - subcourse = organisations.get(0); - String name = subcourse.getName(); + // fill data for later usage + existingRoles.put(login, userManagementService.getRolesForUser(user.getUserId())); + userIDs.put(login, user.getUserId()); + // add user to a collection of all users in the parsed file + allUsersParsed.add(user); + } - ExtCourseClassMap extOrgMap = integrationService.getExtCourseClassMap(extServer.getSid(), - name); - if (extOrgMap == null) { - extOrgMap = new ExtCourseClassMap(); - extOrgMap.setCourseid(name); - extOrgMap.setExtServer(extServer); - extOrgMap.setOrganisation(subcourse); - userManagementService.save(extOrgMap); + return allUsersParsed; + } - String message = "External subcourse created for existing subcourse with code \"" + code - + "\" and name \"" + name + "\" and ID " + course.getOrganisationId(); - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); - } - } + @SuppressWarnings("unchecked") + private Organisation getCourse(String courseCode, String courseName, ExtServer extServer, Integer creatorId, + Organisation rootOrganisation) throws UserInfoValidationException { + Organisation course = null; + List organisations = userManagementService.findByProperty(Organisation.class, "code", courseCode); + // create course + if (organisations.isEmpty()) { + String name = courseName; + ExtCourseClassMap extOrgMap = integrationService.createExtCourseClassMap(extServer, creatorId, name, name, + rootOrganisation.getOrganisationId().toString(), false); + course = extOrgMap.getOrganisation(); + course.setCode(courseCode); + userManagementService.save(course); - Integer subcourseId = subcourse.getOrganisationId(); + String message = "Course created with code \"" + courseCode + "\" and name \"" + name + "\" and ID " + + course.getOrganisationId(); + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } else { + course = organisations.get(0); + String name = course.getName(); - // get existing learners for given subcourse - Collection subcourseLearners = userManagementService - .getUsersFromOrganisationByRole(subcourseId, Role.LEARNER, true); - // add users to set containing all users in any subcourse which is processed - allUsersInSubcourses.addAll(subcourseLearners); + ExtCourseClassMap extOrgMap = integrationService.getExtCourseClassMap(extServer.getSid(), name); + if (extOrgMap == null) { + extOrgMap = new ExtCourseClassMap(); + extOrgMap.setCourseid(name); + extOrgMap.setExtServer(extServer); + extOrgMap.setOrganisation(course); + userManagementService.save(extOrgMap); - // go through each user - for (String login : subcourseEntry.getValue()) { + String message = "External course created for existing course with code \"" + courseCode + + "\" and name \"" + name + "\" and ID " + course.getOrganisationId(); + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + } + return course; + } - // check if the user is already a learner in the subcourse - // if so, there is nothing to do - boolean userAlreadyLearner = false; - Integer userId = userIDs.get(login); - Iterator subcourseLearnerIterator = subcourseLearners.iterator(); - while (subcourseLearnerIterator.hasNext()) { - if (userId.equals(subcourseLearnerIterator.next().getUserId())) { - subcourseLearnerIterator.remove(); - userAlreadyLearner = true; - break; - } - } - if (userAlreadyLearner) { - continue; - } + @SuppressWarnings("unchecked") + private Set assignLearners(Organisation course, Map>> mappings, + ExtServer extServer, Integer creatorId, Set allUsersParsed, Map userIDs, + Map>> existingRoles) throws UserInfoValidationException { + Set allUsersInSubcourses = new HashSet<>(); + String courseCode = course.getCode(); + // go through each subcourse + for (Entry> subcourseEntry : mappings.get(courseCode).entrySet()) { + Organisation subcourse = null; + String subcourseCode = subcourseEntry.getKey(); - // the user is not a learner yet, so assign him the role and add him to lessons - Set existingSubcourseRoles = existingRoles.get(login).get(subcourseId); - if (existingSubcourseRoles == null) { - existingSubcourseRoles = new HashSet<>(); - } - existingSubcourseRoles.add(Role.ROLE_LEARNER); - userManagementService.setRolesForUserOrganisation(userId, subcourseId, - existingSubcourseRoles); + Map queryParams = new HashMap<>(); + queryParams.put("code", subcourseCode); + queryParams.put("parentOrganisation.organisationId", course.getOrganisationId()); + List organisations = userManagementService.findByProperties(Organisation.class, queryParams); - for (Lesson lesson : lessonService.getLessonsByGroup(subcourseId)) { - lessonService.addLearner(lesson.getLessonId(), userId); - } + // create subcourse + if (organisations.isEmpty()) { - String message = "Learner \"" + login + "\" added to subcourse " + subcourseId - + " and its lessons"; - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); - } + ExtCourseClassMap extSubOrgMap = integrationService.createExtCourseClassMap(extServer, creatorId, + subcourseCode, subcourseCode, course.getOrganisationId().toString(), false); + subcourse = extSubOrgMap.getOrganisation(); + subcourse.setCode(subcourseCode); + userManagementService.save(subcourse); - // user is a learner, but he should not; remove learner role from subcourse and lessons - for (User user : subcourseLearners) { - Map> existingSubcoursesRoles = existingRoles.get(user.getLogin()); - Set existingSubcourseRoles = existingSubcoursesRoles == null ? null - : existingSubcoursesRoles.get(subcourseId); - if (existingSubcourseRoles != null) { - existingSubcourseRoles.remove(Role.ROLE_LEARNER); - userManagementService.setRolesForUserOrganisation(user.getUserId(), subcourseId, - existingSubcourseRoles); + String message = "Subcourse created with code and name \"" + courseCode + "\" and ID " + + subcourse.getOrganisationId(); + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } else { + subcourse = organisations.get(0); + String name = subcourse.getName(); - for (Lesson lesson : lessonService.getLessonsByGroup(subcourseId)) { - lessonService.removeLearner(lesson.getLessonId(), user.getUserId()); - } + ExtCourseClassMap extOrgMap = integrationService.getExtCourseClassMap(extServer.getSid(), name); + if (extOrgMap == null) { + extOrgMap = new ExtCourseClassMap(); + extOrgMap.setCourseid(name); + extOrgMap.setExtServer(extServer); + extOrgMap.setOrganisation(subcourse); + userManagementService.save(extOrgMap); - String message = "Learner \"" + user.getLogin() + "\" removed from subcourse " - + subcourseId + " and its lessons"; - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); - } - } + String message = "External subcourse created for existing subcourse with code \"" + courseCode + + "\" and name \"" + name + "\" and ID " + course.getOrganisationId(); + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + } + + Integer subcourseId = subcourse.getOrganisationId(); + + // get existing learners for given subcourse + Collection subcourseLearners = userManagementService.getUsersFromOrganisationByRole(subcourseId, + Role.LEARNER, true); + // add users to set containing all users in any subcourse which is processed + allUsersInSubcourses.addAll(subcourseLearners); + + // go through each user + for (String login : subcourseEntry.getValue()) { + + // check if the user is already a learner in the subcourse + // if so, there is nothing to do + boolean userAlreadyLearner = false; + Integer userId = userIDs.get(login); + Iterator subcourseLearnerIterator = subcourseLearners.iterator(); + while (subcourseLearnerIterator.hasNext()) { + if (userId.equals(subcourseLearnerIterator.next().getUserId())) { + subcourseLearnerIterator.remove(); + userAlreadyLearner = true; + break; } } + if (userAlreadyLearner) { + continue; + } - // users who are part of courses but are not in the file anymore are eligible for disabling - allUsersInSubcourses.removeAll(allUsersParsed); - for (User user : allUsersInSubcourses) { - // make a flat set of roles from all subcourses - Set roles = userManagementService.getRolesForUser(user.getUserId()).values().stream() - .collect(HashSet::new, Set::addAll, Set::addAll); - // check if the user is staff in any course - roles.remove(Role.ROLE_LEARNER); - if (roles.isEmpty()) { - // he is only a learner, so disable - userManagementService.disableUser(user.getUserId()); + // the user is not a learner yet, so assign him the role and add him to lessons + Set existingSubcourseRoles = existingRoles.get(login).get(subcourseId); + if (existingSubcourseRoles == null) { + existingSubcourseRoles = new HashSet<>(); + } + existingSubcourseRoles.add(Role.ROLE_LEARNER); + userManagementService.setRolesForUserOrganisation(userId, subcourseId, existingSubcourseRoles); - String message = "Learner \"" + user.getLogin() + "\" disabled"; - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); + for (Lesson lesson : lessonService.getLessonsByGroup(subcourseId)) { + lessonService.addLearner(lesson.getLessonId(), userId); + } + + String message = "Learner \"" + login + "\" added to subcourse " + subcourseId + " and its lessons"; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + + // user is a learner, but he should not; remove learner role from subcourse and lessons + for (User user : subcourseLearners) { + Map> existingSubcoursesRoles = existingRoles.get(user.getLogin()); + Set existingSubcourseRoles = existingSubcoursesRoles == null ? null + : existingSubcoursesRoles.get(subcourseId); + if (existingSubcourseRoles != null) { + existingSubcourseRoles.remove(Role.ROLE_LEARNER); + userManagementService.setRolesForUserOrganisation(user.getUserId(), subcourseId, + existingSubcourseRoles); + + for (Lesson lesson : lessonService.getLessonsByGroup(subcourseId)) { + lessonService.removeLearner(lesson.getLessonId(), user.getUserId()); } + + String message = "Learner \"" + user.getLogin() + "\" removed from subcourse " + subcourseId + + " and its lessons"; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); } + } + } - logger.info("SP enrolments provisioning completed successfully"); - } catch (Exception e) { - logger.error("Error while provisioning SP enrolments", e); - } finally { - HibernateSessionManager.closeSession(); + return allUsersInSubcourses; + } + + @SuppressWarnings("unchecked") + private Set assignTeachers(Organisation course, List logins, ExtServer extServer, Integer creatorId, + Set allUsersParsed, Map userIDs, + Map>> existingRoles) throws UserInfoValidationException { + Set allUsersInCourses = new HashSet<>(); + Integer courseId = course.getOrganisationId(); + + // get existing teachers for given course + Collection courseTeachers = userManagementService.getUsersFromOrganisationByRole(courseId, Role.MONITOR, + true); + // add users to set containing all users in any subcourse which is processed + allUsersInCourses.addAll(courseTeachers); + + // go through each user + for (String login : logins) { + // check if the user is already a teacher in the subcourse + // if so, there is nothing to do + boolean userAlreadyStaff = false; + Integer userId = userIDs.get(login); + Iterator subcourseLearnerIterator = courseTeachers.iterator(); + while (subcourseLearnerIterator.hasNext()) { + if (userId.equals(subcourseLearnerIterator.next().getUserId())) { + subcourseLearnerIterator.remove(); + userAlreadyStaff = true; + break; + } } - }).start(); + if (userAlreadyStaff) { + continue; + } - response.getWriter().print("Provisioning is running. Check logs."); + // the user is not a teacher yet, so assign him roles and add him to lessons + Set existingCourseRoles = existingRoles.get(login).get(courseId); + if (existingCourseRoles == null) { + existingCourseRoles = new HashSet<>(); + } + existingCourseRoles.add(Role.ROLE_LEARNER); + existingCourseRoles.add(Role.ROLE_AUTHOR); + existingCourseRoles.add(Role.ROLE_MONITOR); + userManagementService.setRolesForUserOrganisation(userId, courseId, existingCourseRoles); + + for (Lesson lesson : lessonService.getLessonsByGroup(courseId)) { + lessonService.addStaffMember(lesson.getLessonId(), userId); + } + + String message = "Teacher \"" + login + "\" added to course " + courseId + " and its lessons"; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + + // user is a staff member, but he should not; remove learner role from course and lessons + for (User user : courseTeachers) { + Map> existingCoursesRoles = existingRoles.get(user.getLogin()); + Set existingCourseRoles = existingCoursesRoles == null ? null : existingCoursesRoles.get(courseId); + if (existingCourseRoles != null) { + existingCourseRoles.remove(Role.ROLE_LEARNER); + existingCourseRoles.remove(Role.ROLE_AUTHOR); + existingCourseRoles.remove(Role.ROLE_MONITOR); + userManagementService.setRolesForUserOrganisation(user.getUserId(), courseId, existingCourseRoles); + + for (Lesson lesson : lessonService.getLessonsByGroup(courseId)) { + lessonService.removeStaffMember(lesson.getLessonId(), user.getUserId()); + } + + String message = "Teacher \"" + user.getLogin() + "\" removed from course " + courseId + + " and its lessons"; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + } + + return allUsersInCourses; } @Override