Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r7817bc4fce30416c9737875ae2d137be0c6aa8ba -r0c8690c0ea9d545ef75c3f0391de11794e6ebfc9 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java =================================================================== diff -u -r43f8f16ca0315ccd7839dc91632bd3d10a666c57 -r0c8690c0ea9d545ef75c3f0391de11794e6ebfc9 --- lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 43f8f16ca0315ccd7839dc91632bd3d10a666c57) +++ lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 0c8690c0ea9d545ef75c3f0391de11794e6ebfc9) @@ -154,28 +154,9 @@ } if (extCourseId != null) { - ExtCourseClassMap orgMap = getService().getExtCourseClassMap(serverMap, userMap, extCourseId, - countryIsoCode, langIsoCode, courseName, method, prefix); - Organisation org = orgMap.getOrganisation(); - IUserManagementService userManagementService = LoginRequestServlet.integrationService.getService(); - UserOrganisation uo = userManagementService.getUserOrganisation(user.getUserId(), - org.getOrganisationId()); - // make sure external user has minimal set of roles, i.e. learner - Integer[] roleIds = new Integer[] { Role.ROLE_LEARNER }; - // we have to assign all the roles to the external user here, because once the user logged in, the roles - // are cached in JBoss, all the calls of request.isUserInRole() will be based on the cached roles - Map properties = new HashMap(); - properties.put("userOrganisation.userOrganisationId", uo.getUserOrganisationId()); - for (Integer roleId : roleIds) { - properties.put("role.roleId", roleId); - List list = userManagementService.findByProperties( - UserOrganisationRole.class, properties); - if ((list == null) || (list.size() == 0)) { - UserOrganisationRole uor = new UserOrganisationRole(uo, (Role) userManagementService.findById( - Role.class, roleId)); - userManagementService.save(uor); - } - } + //check if organisation, ExtCourseClassMap and user roles exist and up-to-date, and if not update them + getService().getExtCourseClassMap(serverMap, userMap, extCourseId, countryIsoCode, langIsoCode, + courseName, method, prefix); } LoginRequestServlet.log.debug("Session Id - " + hses.getId()); Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -rb0952eab3024458158903e62579ab202ee2a6838 -r0c8690c0ea9d545ef75c3f0391de11794e6ebfc9 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision b0952eab3024458158903e62579ab202ee2a6838) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 0c8690c0ea9d545ef75c3f0391de11794e6ebfc9) @@ -129,47 +129,67 @@ public ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, Boolean isTeacher, Boolean prefix) { + ExtCourseClassMap map; + Organisation org; + User user = userMap.getUser(); + Map properties = new HashMap(); properties.put("courseid", extCourseId); properties.put("extServerOrgMap.sid", serverMap.getSid()); - List list = service.findByProperties(ExtCourseClassMap.class, properties); - if (list == null || list.size() == 0) { - return createExtCourseClassMap(serverMap, userMap.getUser(), extCourseId, extCourseName, countryIsoCode, - langIsoCode, parentOrgId, isTeacher, prefix); + List mapList = service.findByProperties(ExtCourseClassMap.class, properties); + if (mapList == null || mapList.size() == 0) { + //create new ExtCourseClassMap + + org = createOrganisation(serverMap, user, extCourseId, extCourseName, countryIsoCode, + langIsoCode, parentOrgId, prefix); + map = new ExtCourseClassMap(); + map.setCourseid(extCourseId); + map.setExtServerOrgMap(serverMap); + map.setOrganisation(org); + service.save(map); + } else { - ExtCourseClassMap map = (ExtCourseClassMap) list.get(0); - User user = userMap.getUser(); - Organisation org = map.getOrganisation(); + map = mapList.get(0); + org = map.getOrganisation(); // update external course name if if has changed String requestedCourseName = prefix ? buildName(serverMap.getPrefix(), extCourseName) : extCourseName; if (extCourseName != null && !org.getName().equals(requestedCourseName)) { org.setName(requestedCourseName); service.updateOrganisationandWorkspaceNames(org); } - if (service.getUserOrganisation(user.getUserId(), org.getOrganisationId()) == null) { - addMemberships(user, org, isTeacher); - } - return map; } + + updateUserRoles(user, org, isTeacher); + + return map; } - private void addMemberships(User user, Organisation org, Boolean isTeacher) { - UserOrganisation uo = new UserOrganisation(user, org); - service.save(uo); + private void updateUserRoles(User user, Organisation org, Boolean isTeacher) { + + //create UserOrganisation if it doesn't exist + UserOrganisation uo = service.getUserOrganisation(user.getUserId(), org.getOrganisationId()); + if (uo == null) { + uo = new UserOrganisation(user, org); + service.save(uo); + user.addUserOrganisation(uo); + service.save(user); + } + Integer[] roles; if (isTeacher) { roles = new Integer[] { Role.ROLE_AUTHOR, Role.ROLE_MONITOR, Role.ROLE_LEARNER }; } else { roles = new Integer[] { Role.ROLE_LEARNER }; } for (Integer roleId : roles) { - UserOrganisationRole uor = new UserOrganisationRole(uo, (Role) service.findById(Role.class, roleId)); - service.save(uor); - uo.addUserOrganisationRole(uor); + if (!service.hasRoleInOrganisation(user, roleId, org)) { + UserOrganisationRole uor = new UserOrganisationRole(uo, (Role) service.findById(Role.class, roleId)); + service.save(uor); + uo.addUserOrganisationRole(uor); + service.save(uo); + } } - user.addUserOrganisation(uo); - service.save(user); } public ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) @@ -233,20 +253,6 @@ } } - private ExtCourseClassMap createExtCourseClassMap(ExtServerOrgMap serverMap, User user, String extCourseId, - String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, Boolean isTeacher, - Boolean prefix) { - Organisation org = createOrganisation(serverMap, user, extCourseId, extCourseName, countryIsoCode, langIsoCode, - parentOrgId, prefix); - addMemberships(user, org, isTeacher); - ExtCourseClassMap map = new ExtCourseClassMap(); - map.setCourseid(extCourseId); - map.setExtServerOrgMap(serverMap); - map.setOrganisation(org); - service.save(map); - return map; - } - private Organisation createOrganisation(ExtServerOrgMap serverMap, User user, String extCourseId, String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, Boolean prefix) { Organisation org = new Organisation();