Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java,v diff -u -r1.37 -r1.37.8.1 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java 21 Oct 2008 01:50:34 -0000 1.37 +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java 21 May 2009 15:10:37 -0000 1.37.8.1 @@ -118,8 +118,8 @@ * @see org.lamsfoundation.lams.tool.service.ILamsCoreToolService#createToolSession(org.lamsfoundation.lams.usermanagement.User, * org.lamsfoundation.lams.learningdesign.Activity) */ - public ToolSession createToolSession(User learner, ToolActivity activity, Lesson lesson) - throws LamsToolServiceException { + public synchronized ToolSession createToolSession(User learner, ToolActivity activity, Lesson lesson) + throws LamsToolServiceException, DataIntegrityViolationException { // look for an existing applicable tool session // could be either a grouped (class group or standard group) or an individual. // more likely to be grouped (more tools work that way!) @@ -135,19 +135,8 @@ } toolSession = activity.createToolSessionForActivity(learner, lesson); - try { - toolSessionDAO.saveToolSession(toolSession); - } catch (DataIntegrityViolationException e) { - LamsCoreToolService.log - .error("There was an attempt to create two tool sessions with the same name.", e); - /* - * LDEV-1533: Two users tried to create a tool session with the same name. One of them was successful, - * the other got an error. The second one will now retry. This might create a loop; on the other hand - * the second attempt should be successful, since either the existing session will be retrieved or a - * session with a new name will be created. - */ - toolSession = createToolSession(learner, activity, lesson); - } + toolSessionDAO.saveToolSession(toolSession); + return toolSession; } Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java,v diff -u -r1.102 -r1.102.4.1 --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java 10 Apr 2009 14:42:32 -0000 1.102 +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java 21 May 2009 15:10:37 -0000 1.102.4.1 @@ -106,12 +106,12 @@ private static IAuditService auditService; private IAuditService getAuditService() { - if (auditService == null) { + if (UserManagementService.auditService == null) { WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(HttpSessionManager .getInstance().getServletContext()); - auditService = (IAuditService) ctx.getBean("auditService"); + UserManagementService.auditService = (IAuditService) ctx.getBean("auditService"); } - return auditService; + return UserManagementService.auditService; } /** @@ -125,7 +125,7 @@ * Get i18n MessageService */ public MessageService getMessageService() { - return this.messageService; + return messageService; } public void setBaseDAO(IBaseDAO baseDAO) { @@ -159,24 +159,24 @@ log.debug(e); } } - + protected User saveUser(User user) { if (user != null) { // LDEV-2196 ensure names saved as UTF-8 try { - user.setFirstName(new String(user.getFirstName().getBytes(), "UTF-8")); - user.setLastName(new String(user.getLastName().getBytes(), "UTF-8")); + user.setFirstName(new String(user.getFirstName().getBytes(), "UTF-8")); + user.setLastName(new String(user.getLastName().getBytes(), "UTF-8")); } catch (UnsupportedEncodingException e) { log.error("Unsupported encoding...", e); } // create user if (user.getUserId() == null) { baseDAO.insertOrUpdate(user); // creating a workspace needs a userId - user = createWorkspaceForUser(user); - } + user = createWorkspaceForUser(user); + } // LDEV-2030 update workspace name if name changed Workspace workspace = user.getWorkspace(); - if (workspace != null && !StringUtils.equals(user.getFullName(), workspace.getName())){ + if (workspace != null && !StringUtils.equals(user.getFullName(), workspace.getName())) { workspace.setName(user.getFullName()); save(workspace); WorkspaceFolder folder = workspace.getDefaultFolder(); @@ -192,7 +192,7 @@ public void saveAll(Collection objects) { for (Object o : objects) { if (o instanceof User) { - baseDAO.insertOrUpdate((User) o); // creating a workspace needs + baseDAO.insertOrUpdate(o); // creating a workspace needs // a userId o = createWorkspaceForUser((User) o); } @@ -371,8 +371,9 @@ map.put("user.userId", user.getUserId()); map.put("organisation.organisationId", orgId); UserOrganisation userOrg = (UserOrganisation) baseDAO.findByProperties(UserOrganisation.class, map).get(0); - if (userOrg == null) + if (userOrg == null) { return null; + } Iterator i = userOrg.getUserOrganisationRoles().iterator(); while (i.hasNext()) { UserOrganisationRole userOrgRole = (UserOrganisationRole) i.next(); @@ -394,14 +395,16 @@ * @see org.lamsfoundation.lams.usermanagement.service.IUserManagementService#getUsersFromOrganisationByRole(java.lang.Integer, * java.lang.String) */ - public Vector getUsersFromOrganisationByRole(Integer organisationID, String roleName, boolean isFlashCall, boolean getUser) { + public Vector getUsersFromOrganisationByRole(Integer organisationID, String roleName, boolean isFlashCall, + boolean getUser) { Vector users = null; - if (isFlashCall) + if (isFlashCall) { users = new Vector(); - else if(getUser) - users = new Vector(); - else + } else if (getUser) { + users = new Vector(); + } else { users = new Vector(); + } Organisation organisation = (Organisation) baseDAO.find(Organisation.class, organisationID); if (organisation != null) { @@ -414,13 +417,15 @@ while (userOrganisationRoleIterator.hasNext()) { UserOrganisationRole userOrganisationRole = (UserOrganisationRole) userOrganisationRoleIterator .next(); - if (userOrganisationRole.getRole().getName().equals(roleName)) - if (isFlashCall && !getUser) - users.add(userOrganisation.getUser().getUserFlashDTO()); - else if(getUser) - users.add(userOrganisation.getUser()); - else - users.add(userOrganisation.getUser().getUserDTO()); + if (userOrganisationRole.getRole().getName().equals(roleName)) { + if (isFlashCall && !getUser) { + users.add(userOrganisation.getUser().getUserFlashDTO()); + } else if (getUser) { + users.add(userOrganisation.getUser()); + } else { + users.add(userOrganisation.getUser().getUserDTO()); + } + } } } } @@ -438,8 +443,9 @@ properties.put("userOrganisation.user.userId", userId); properties.put("userOrganisation.organisation.organisationId", orgId); properties.put("role.name", roleName); - if (baseDAO.findByProperties(UserOrganisationRole.class, properties).size() == 0) + if (baseDAO.findByProperties(UserOrganisationRole.class, properties).size() == 0) { return false; + } return true; } @@ -559,8 +565,9 @@ Organisation pOrg = organisation.getParentOrganisation(); // set parent's child orgs Set children = pOrg.getChildOrganisations(); - if (children == null) + if (children == null) { children = new HashSet(); + } children.add(organisation); pOrg.setChildOrganisations(children); // get course managers and give them staff role in this new @@ -585,8 +592,9 @@ // (i.e. if there are // several course managers). Set uos = organisation.getUserOrganisations(); - if (uos == null) + if (uos == null) { uos = new HashSet(); + } uos.add(uo); organisation.setUserOrganisations(uos); @@ -599,11 +607,13 @@ if (workspace != null) { workspace.setName(organisation.getName()); WorkspaceFolder defaultFolder = workspace.getDefaultFolder(); - if (defaultFolder != null) + if (defaultFolder != null) { defaultFolder.setName(organisation.getName()); + } WorkspaceFolder runSeqFolder = workspace.getDefaultRunSequencesFolder(); - if (runSeqFolder != null) + if (runSeqFolder != null) { runSeqFolder.setName(getRunSequencesFolderName(organisation.getName())); + } } } @@ -620,13 +630,15 @@ baseDAO.update(workspace); WorkspaceFolder defaultFolder = workspace.getDefaultFolder(); - if (defaultFolder != null) + if (defaultFolder != null) { defaultFolder.setName(organisation.getName()); + } baseDAO.update(defaultFolder); WorkspaceFolder runSeqFolder = workspace.getDefaultRunSequencesFolder(); - if (runSeqFolder != null) + if (runSeqFolder != null) { runSeqFolder.setName(getRunSequencesFolderName(organisation.getName())); + } baseDAO.update(runSeqFolder); } } @@ -636,12 +648,12 @@ // get i18n'd message according to server locale String[] tokenisedLocale = LanguageUtil.getDefaultLangCountry(); Locale serverLocale = new Locale(tokenisedLocale[0], tokenisedLocale[1]); - String runSeqName = messageService.getMessageSource().getMessage(SEQUENCES_FOLDER_NAME_KEY, - new Object[] { workspaceName }, serverLocale); + String runSeqName = messageService.getMessageSource().getMessage( + UserManagementService.SEQUENCES_FOLDER_NAME_KEY, new Object[] { workspaceName }, serverLocale); if (runSeqName != null && runSeqName.startsWith("???")) { - log.warn("Problem in the language file - can't find an entry for " + SEQUENCES_FOLDER_NAME_KEY - + ". Creating folder as \"run sequences\" "); + log.warn("Problem in the language file - can't find an entry for " + + UserManagementService.SEQUENCES_FOLDER_NAME_KEY + ". Creating folder as \"run sequences\" "); runSeqName = "run sequences"; } return runSeqName; @@ -847,8 +859,9 @@ // when a user gets these roles, they need a workspace if (role.getName().equals(Role.AUTHOR) || role.getName().equals(Role.AUTHOR_ADMIN) || role.getName().equals(Role.SYSADMIN)) { - if (user.getWorkspace() == null) + if (user.getWorkspace() == null) { createWorkspaceForUser(user); + } } } uo.setUserOrganisationRoles(uors); @@ -956,15 +969,17 @@ } public boolean hasRoleInOrganisation(User user, Integer roleId, Organisation organisation) { - if (roleDAO.getUserByOrganisationAndRole(user.getUserId(), roleId, organisation) != null) + if (roleDAO.getUserByOrganisationAndRole(user.getUserId(), roleId, organisation) != null) { return true; - else + } else { return false; + } } public void deleteChildUserOrganisations(User user, Organisation org) { - if (!org.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.COURSE_TYPE)) + if (!org.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.COURSE_TYPE)) { return; + } Set childOrgs = org.getChildOrganisations(); Iterator iter = childOrgs.iterator(); while (iter.hasNext()) { @@ -1000,47 +1015,49 @@ private Integer getRequestorId() { UserDTO userDTO = (UserDTO) SessionManager.getSession().getAttribute(AttributeNames.USER); - return (userDTO != null ? userDTO.getUserID() : null); + return userDTO != null ? userDTO.getUserID() : null; } public boolean isUserGlobalGroupAdmin() { Integer rootOrgId = getRootOrganisation().getOrganisationId(); Integer requestorId = getRequestorId(); - return (requestorId != null ? isUserInRole(requestorId, rootOrgId, Role.GROUP_ADMIN) : false); + return requestorId != null ? isUserInRole(requestorId, rootOrgId, Role.GROUP_ADMIN) : false; } public boolean isUserSysAdmin() { Integer rootOrgId = getRootOrganisation().getOrganisationId(); Integer requestorId = getRequestorId(); - return (requestorId != null ? isUserInRole(requestorId, rootOrgId, Role.SYSADMIN) : false); + return requestorId != null ? isUserInRole(requestorId, rootOrgId, Role.SYSADMIN) : false; } public Integer getCountRoleForSystem(Integer roleId) { Integer count = roleDAO.getCountRoleForSystem(roleId); - if (count != null) + if (count != null) { return count; - else + } else { return new Integer(0); + } } public Integer getCountRoleForOrg(Integer orgId, Integer roleId) { Integer count = roleDAO.getCountRoleForOrg(roleId, orgId); - if (count != null) + if (count != null) { return count; - else + } else { return new Integer(0); + } } public CSSThemeVisualElement getDefaultFlashTheme() { String flashName = Configuration.get(ConfigurationKeys.DEFAULT_FLASH_THEME); List list = findByProperty(CSSThemeVisualElement.class, "name", flashName); - return (list != null ? (CSSThemeVisualElement) list.get(0) : null); + return list != null ? (CSSThemeVisualElement) list.get(0) : null; } public CSSThemeVisualElement getDefaultHtmlTheme() { String htmlName = Configuration.get(ConfigurationKeys.DEFAULT_HTML_THEME); List list = findByProperty(CSSThemeVisualElement.class, "name", htmlName); - return (list != null ? (CSSThemeVisualElement) list.get(0) : null); + return list != null ? (CSSThemeVisualElement) list.get(0) : null; } public void auditPasswordChanged(User user, String moduleName) { @@ -1072,7 +1089,7 @@ private Integer getFindIntegerResult(String query) { List list = baseDAO.find(query); if (list != null && list.size() > 0) { - return (Integer) list.get(0); + return ((Number) list.get(0)).intValue(); } return null; } @@ -1111,17 +1128,17 @@ public List searchUserSingleTerm(String term) { term = StringEscapeUtils.escapeSql(term); - String query = "select u from User u where (u.login like '%" + term + "%' or u.firstName like '%" - + term + "%' or u.lastName like '%" + term + "%' or u.email like '%" + term + "%')" + String query = "select u from User u where (u.login like '%" + term + "%' or u.firstName like '%" + term + + "%' or u.lastName like '%" + term + "%' or u.email like '%" + term + "%')" + " and u.disabledFlag=0 order by u.login"; List list = baseDAO.find(query); return list; } public List searchUserSingleTerm(String term, Integer filteredOrgId) { term = StringEscapeUtils.escapeSql(term); - String query = "select u from User u where (u.login like '%" + term + "%' or u.firstName like '%" - + term + "%' or u.lastName like '%" + term + "%' or u.email like '%" + term + "%')" + String query = "select u from User u where (u.login like '%" + term + "%' or u.firstName like '%" + term + + "%' or u.lastName like '%" + term + "%' or u.email like '%" + term + "%')" + " and u.disabledFlag=0 and u.userId not in (select uo.user.userId from UserOrganisation uo" + " where uo.organisation.organisationId=" + filteredOrgId + ") order by u.login"; List list = baseDAO.find(query); @@ -1147,8 +1164,8 @@ whereClause = " or uo.organisation.parentOrganisation.organisationId=" + orgId; } - String query = "select u from User u where (u.login like '%" + term + "%' or u.firstName like '%" - + term + "%' or u.lastName like '%" + term + "%' or u.email like '%" + term + "%')" + String query = "select u from User u where (u.login like '%" + term + "%' or u.firstName like '%" + term + + "%' or u.lastName like '%" + term + "%' or u.email like '%" + term + "%')" + " and u.disabledFlag=0 and u.userId in (select uo.user.userId from UserOrganisation uo" + " where uo.organisation.organisationId=" + orgId + whereClause + ") order by u.login"; List list = baseDAO.find(query); @@ -1180,16 +1197,16 @@ } public boolean canEditGroup(Integer userId, Integer orgId) { - if (isUserSysAdmin() || isUserGlobalGroupAdmin()) + if (isUserSysAdmin() || isUserGlobalGroupAdmin()) { return true; + } Organisation org = (Organisation) findById(Organisation.class, orgId); if (org != null) { Integer groupId = orgId; if (org.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.CLASS_TYPE)) { groupId = org.getParentOrganisation().getOrganisationId(); } - return (isUserInRole(userId, groupId, Role.GROUP_ADMIN) || (isUserInRole(userId, groupId, - Role.GROUP_MANAGER))); + return isUserInRole(userId, groupId, Role.GROUP_ADMIN) || isUserInRole(userId, groupId, Role.GROUP_MANAGER); } return false; } Index: lams_common/src/java/org/lamsfoundation/lams/web/session/SessionManager.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/web/session/SessionManager.java,v diff -u -r1.12.8.1 -r1.12.8.2 --- lams_common/src/java/org/lamsfoundation/lams/web/session/SessionManager.java 13 May 2009 10:05:22 -0000 1.12.8.1 +++ lams_common/src/java/org/lamsfoundation/lams/web/session/SessionManager.java 21 May 2009 15:10:37 -0000 1.12.8.2 @@ -170,13 +170,18 @@ * Start a session for current ServletRequest and SerlvetResponse. If session does not exist, then create a new * session. If it exists, just using current session. * - * * @param req * @param res */ public static void startSession(ServletRequest req, ServletResponse res) { - Cookie cookie = findCookie((HttpServletRequest) req, SystemSessionFilter.SSO_SESSION_COOKIE); - + Cookie ssoCookie = findCookie((HttpServletRequest) req, SystemSessionFilter.SSO_SESSION_COOKIE); + if (ssoCookie == null) { + SessionManager.log.debug("==>Couldn't find the sso cookie"); + String value = (String) new UUIDHexGenerator().generate(null, null); + ssoCookie = createCookie((HttpServletResponse) res, SystemSessionFilter.SSO_SESSION_COOKIE, value); + SessionManager.log.debug("==>Created one - " + ssoCookie.getValue()); + } + Cookie cookie = findCookie((HttpServletRequest) req, SystemSessionFilter.SYS_SESSION_COOKIE); String currentSessionId = null; if (cookie != null) { currentSessionId = cookie.getValue(); @@ -185,31 +190,23 @@ // then delete the cookie first and set it null in order to create a new one if (obj == null) { createSession(currentSessionId); - /* - * After changing cookie name to JSESSIONID, left cookie lifecycle management to Server - * LDEV-2071: SSO session cookie is used to indicate shared session, as there were - * problems with JBoss JSESSIONID cookie management. For each WAR a new cookie was - * created by the server itself. Setting path and domain to "/" in createCookie() did - * not help - the cookie was not found by tool modules and a new was created by the - * server, resulting in a new session. - * - * removeCookie((HttpServletResponse) res,SystemSessionFilter.SYS_SESSION_COOKIE); - * cookie = null; - * - */ - + // After changing cookie name to JSESSIONID, left cookie lifecycle management to Server + // removeCookie((HttpServletResponse) res,SystemSessionFilter.SYS_SESSION_COOKIE); + // cookie = null; } } // can not be in else! if (cookie == null) { - // TODO remove this debugging - only put in to diagnose Ozgur's session problem - if (SessionManager.log.isDebugEnabled()) { - SessionManager.log.debug("SessionManager: SSO cookie does not exist, generating a new session"); - } + // create new session and set it into cookie currentSessionId = (String) new UUIDHexGenerator().generate(null, null); createSession(currentSessionId); - cookie = createCookie((HttpServletResponse) res, SystemSessionFilter.SSO_SESSION_COOKIE, currentSessionId); + // TODO remove this debugging - only put in to diagnose Ozgur's session problem + if (SessionManager.log.isDebugEnabled()) { + SessionManager.log.debug("SessionManager: cookie is null, generating a new session: " + + currentSessionId); + } + cookie = createCookie((HttpServletResponse) res, SystemSessionFilter.SYS_SESSION_COOKIE, currentSessionId); } setCurrentSessionId(currentSessionId); Index: lams_common/src/java/org/lamsfoundation/lams/web/session/SystemSessionFilter.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/web/session/SystemSessionFilter.java,v diff -u -r1.11.18.1 -r1.11.18.2 --- lams_common/src/java/org/lamsfoundation/lams/web/session/SystemSessionFilter.java 13 May 2009 10:05:21 -0000 1.11.18.1 +++ lams_common/src/java/org/lamsfoundation/lams/web/session/SystemSessionFilter.java 21 May 2009 15:10:37 -0000 1.11.18.2 @@ -46,13 +46,8 @@ */ public class SystemSessionFilter implements Filter { - /* - * The session name to trace shared session LDEV-2071: Removed because JBoss 5 uses this cookie differently. It is - * not shared among LAMS WARs like JSESSIONIDSSO. Setting path and domain parameters to root "/" does not help. - * JSESSIONIDSSO is used instead, as it is the same for all WARs and makes a good shared session indicator. public - * - * static final String SYS_SESSION_COOKIE = "JSESSIONID"; - */ + // The session name to trace shared session + public static final String SYS_SESSION_COOKIE = "JSESSIONID"; public static final String SSO_SESSION_COOKIE = "JSESSIONIDSSO";