Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r03392c988a23f5e9129967f8ae692488213632fe -rcea798b3457c895676bf1cc5ebb3013eee53f505 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/IWorkspaceManagementService.java =================================================================== diff -u -r1454b2fd27486dd14b1ccf172b96df61a0b0d355 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/IWorkspaceManagementService.java (.../IWorkspaceManagementService.java) (revision 1454b2fd27486dd14b1ccf172b96df61a0b0d355) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/IWorkspaceManagementService.java (.../IWorkspaceManagementService.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -53,6 +53,7 @@ public static final String MSG_KEY_CREATE_WKF_CONTENT = "createWorkspaceFolderContent"; public static final String MSG_KEY_UPDATE_WKF_CONTENT = "updateWorkspaceFolderContent"; public static final String MSG_KEY_DELETE_VERSION = "deleteContentWithVersion"; + public static final String MSG_KEY_ORG = "getUserOrganisation"; public static final String MSG_KEY_ORG_BY_ROLE = "getOrganisationsByUserRole"; public static final String MSG_KEY_USER_BY_ROLE = "getUsersFromOrganisationByRole"; @@ -321,9 +322,10 @@ * in WDDX format * @param userID * @param roles + * @param organisationID if null returns all organisations, if set returns child organisations for this organisation * @return */ - public String getOrganisationsByUserRole(Integer userID, List roleNames) throws IOException; + public String getOrganisationsByUserRole(Integer userID, List roleNames, Integer organisationId) throws IOException; /** * Returns the users within the Organisation with organisationID @@ -334,4 +336,10 @@ */ public Vector getUsersFromOrganisationByRole(Integer organisationID, String role) throws IOException; + /** + * Returns a single OrganisationDTO with the user's roles included. If the user does not have + * any roles in this organisation, then no organisation is returned. + */ + public String getUserOrganisation(Integer userID, Integer organisationId) throws IOException; + } Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java =================================================================== diff -u -rdf6deaa8ac6cd72359c5436608ab66b1b87529e0 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision df6deaa8ac6cd72359c5436608ab66b1b87529e0) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -63,6 +63,7 @@ import org.lamsfoundation.lams.usermanagement.dao.IUserOrganisationDAO; import org.lamsfoundation.lams.usermanagement.dao.IWorkspaceDAO; import org.lamsfoundation.lams.usermanagement.dao.IWorkspaceFolderDAO; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.exception.UserException; @@ -1384,13 +1385,18 @@ /** * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getOrganisationsByUserRole(Integer, String) */ - public String getOrganisationsByUserRole(Integer userID, List roleNames) throws IOException + public String getOrganisationsByUserRole(Integer userID, List roleNames, Integer organisationId) throws IOException { User user = userDAO.getUserById(userID); if (user!=null) { - flashMessage = new FlashMessage( - MSG_KEY_ORG_BY_ROLE, userMgmtService.getOrganisationsForUserByRole(user, roleNames)); + if ( organisationId == null ) { + flashMessage = new FlashMessage( + MSG_KEY_ORG_BY_ROLE, userMgmtService.getOrganisationsForUserByRole(user, roleNames)); + } else { + flashMessage = new FlashMessage( + MSG_KEY_ORG_BY_ROLE, userMgmtService.getOrganisationsForUserByRole(user, roleNames, organisationId)); + } } else flashMessage = FlashMessage.getNoSuchUserExists( MSG_KEY_ORG_BY_ROLE, userID); @@ -1399,6 +1405,28 @@ } + /** + * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getUserOrganisation(Integer, String) + */ + public String getUserOrganisation(Integer userID, Integer organisationId) throws IOException + { + User user = userDAO.getUserById(userID); + + if (user!=null) { + OrganisationDTO orgDTO = userMgmtService.getOrganisationForUserWithRole(user, organisationId); + if ( orgDTO != null ) { + flashMessage = new FlashMessage(MSG_KEY_ORG, orgDTO); + } else { + flashMessage = FlashMessage.getNoSuchOrganisationExists(MSG_KEY_ORG, organisationId); + } + } else + flashMessage = FlashMessage.getNoSuchUserExists( + MSG_KEY_ORG_BY_ROLE, userID); + + return flashMessage.serializeMessage(); + + } + /** * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getUsersFromOrganisationByRole(Integer, String) */ Index: lams_central/src/java/org/lamsfoundation/lams/workspace/web/WorkspaceAction.java =================================================================== diff -u -r1454b2fd27486dd14b1ccf172b96df61a0b0d355 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_central/src/java/org/lamsfoundation/lams/workspace/web/WorkspaceAction.java (.../WorkspaceAction.java) (revision 1454b2fd27486dd14b1ccf172b96df61a0b0d355) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/web/WorkspaceAction.java (.../WorkspaceAction.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -514,10 +514,12 @@ roleList.add(role); } + Integer orgId = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID,true); + String wddxPacket = null; try { IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); - wddxPacket = workspaceManagementService.getOrganisationsByUserRole(userID, roleList); + wddxPacket = workspaceManagementService.getOrganisationsByUserRole(userID, roleList,orgId); } catch (Exception e) { log.error("getOrganisationsByUserRole: Exception occured. userID "+userID+" role "+roles.toString(), e); FlashMessage flashMessage = FlashMessage.getExceptionOccured(IWorkspaceManagementService.MSG_KEY_ORG_BY_ROLE, e.getMessage()); @@ -530,6 +532,7 @@ ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception{ + Integer organisationID = new Integer(WebUtil.readIntParam(request,"organisationID")); String role = WebUtil.readStrParam(request, "role"); @@ -547,5 +550,23 @@ return returnWDDXPacket(wddxPacket, response); } + public ActionForward getUserOrganisation(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response)throws Exception{ + + Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); + Integer orgId = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID,true); + + String wddxPacket = null; + try { + IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); + wddxPacket = workspaceManagementService.getUserOrganisation(userID, orgId); + } catch (Exception e) { + log.error("getUserOrganisation: Exception occured. userID "+userID+" organisationId "+orgId, e); + FlashMessage flashMessage = FlashMessage.getExceptionOccured(IWorkspaceManagementService.MSG_KEY_ORG_BY_ROLE, e.getMessage()); + wddxPacket = flashMessage.serializeMessage(); + } + return returnWDDXPacket(wddxPacket, response); } } Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IUserOrganisationDAO.java =================================================================== diff -u -r34b959260a0f8f8285793a4481a95ca3580eabc5 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IUserOrganisationDAO.java (.../IUserOrganisationDAO.java) (revision 34b959260a0f8f8285793a4481a95ca3580eabc5) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IUserOrganisationDAO.java (.../IUserOrganisationDAO.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -68,6 +68,14 @@ */ public List getUserOrganisationsByUser(User user); + /** + * Gets userOrganisation objects for this user, where the organisations are child organisations of the given parent organisation + * @param user the userOrganisation's user + * @param parentOrganisation the parent organisation + * @return List populated list of userOrganisations + */ + public List getChildUserOrganisationsByUser(User user, Organisation parentOrganisation); + /** * Gets userOrganisation objects based on organisation. * @param organisation the userOrganisation's organisation Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/UserOrganisationDAO.java =================================================================== diff -u -r34b959260a0f8f8285793a4481a95ca3580eabc5 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/UserOrganisationDAO.java (.../UserOrganisationDAO.java) (revision 34b959260a0f8f8285793a4481a95ca3580eabc5) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/UserOrganisationDAO.java (.../UserOrganisationDAO.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -82,6 +82,15 @@ } /** + * @see org.lamsfoundation.lams.usermanagement.dao.IUserOrganisationDAO#getChildUserOrganisationsByUser(org.lamsfoundation.lams.usermanagement.User,org.lamsfoundation.lams.usermanagement.Organisation) + */ + public List getChildUserOrganisationsByUser(User user, Organisation parentOrganisation) { + String queryString = "from UserOrganisation uo where uo.user.userId=? " + +" and uo.organisation.parentOrganisation.organisationId=?"; + return getHibernateTemplate().find(queryString,new Object[] {user.getUserId(), parentOrganisation.getOrganisationId()}); + } + + /** * @see org.lamsfoundation.lams.usermanagement.dao.IUserOrganisationDAO#getUserOrganisationsByOrganisation(org.lamsfoundation.lams.usermanagement.Organisation) */ public List getUserOrganisationsByOrganisation(Organisation organisation) { Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java =================================================================== diff -u -r1454b2fd27486dd14b1ccf172b96df61a0b0d355 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java (.../IUserManagementService.java) (revision 1454b2fd27486dd14b1ccf172b96df61a0b0d355) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java (.../IUserManagementService.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -192,6 +192,22 @@ public OrganisationDTO getOrganisationsForUserByRole(User user, List restrictToRoleNames); /** + * Retrieves a tree of child organisations for this user/organisation. The top of the + * tree is a "dummy" root organisation, just so that we have a real tree. This makes life easier for Flash. + * + * If restrictToRoleNames contains any role names (ie not null and size > 0 ) + * then it will restrict the organisations to those in which the user has one of the + * given roles. If restrictToRoleNames is null/empty then till return all organisations + * to which the user belongs. + */ + public OrganisationDTO getOrganisationsForUserByRole(User user, List restrictToRoleNames, Integer organisationId); + + /** + * Gets an organisation for a user, with the user's roles. Doesn't not return a tree of organisations + */ + public OrganisationDTO getOrganisationForUserWithRole(User user, Integer organisationId); + + /** * Retrieves child organisations of the parentOrg * * @param parentOrg the parent organisation Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java =================================================================== diff -u -r1454b2fd27486dd14b1ccf172b96df61a0b0d355 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java (.../UserManagementService.java) (revision 1454b2fd27486dd14b1ccf172b96df61a0b0d355) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java (.../UserManagementService.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -291,34 +291,89 @@ * @see org.lamsfoundation.lams.usermanagement.service.IUserManagementService#getOrganisationRolesForUser(org.lamsfoundation.lams.usermanagement.User, java.util.List) */ public OrganisationDTO getOrganisationsForUserByRole(User user, List restrictToRoleNames) { + // TODO optimise db access List list = new ArrayList(); Iterator i = userOrganisationDAO.getUserOrganisationsByUser(user).iterator(); - // work out whether or not the restriction applies once only - performance tweak - boolean restrictRoles = restrictToRoleNames != null && restrictToRoleNames.size() > 0; while (i.hasNext()) { UserOrganisation userOrganisation = (UserOrganisation) i.next(); OrganisationDTO dto = userOrganisation.getOrganisation().getOrganisationDTO(); - Iterator i2 = userOrganisation.getUserOrganisationRoles().iterator(); + boolean aRoleFound = addRolesToDTO(restrictToRoleNames, userOrganisation, dto); + if ( aRoleFound ) { + list.add(dto); + } + } + return OrganisationDTOFactory.createTree(list); + } - boolean roleFound = false; - while (i2.hasNext()) { + /** + * @see org.lamsfoundation.lams.usermanagement.service.IUserManagementService#getOrganisationRolesForUser(org.lamsfoundation.lams.usermanagement.User, java.util.List, java.util.Integer) + */ + public OrganisationDTO getOrganisationsForUserByRole(User user, List restrictToRoleNames, Integer organisationId) { + // TODO optimise db access + List dtolist = new ArrayList(); + Organisation org = organisationDAO.getOrganisationById(organisationId); + getChildOrganisations(user, org, restrictToRoleNames, dtolist); + return OrganisationDTOFactory.createTree(dtolist); + } + + private void getChildOrganisations(User user, Organisation org, List restrictToRoleNames, List dtolist) { + if ( org != null ) { + List childOrgs = userOrganisationDAO.getChildUserOrganisationsByUser(user, org); + for ( UserOrganisation userOrganisation : childOrgs) { + OrganisationDTO dto = userOrganisation.getOrganisation().getOrganisationDTO(); + boolean aRoleFound = addRolesToDTO(restrictToRoleNames, userOrganisation, dto); + if ( aRoleFound ) { + dtolist.add(dto); + } - UserOrganisationRole userOrganisationRole = (UserOrganisationRole) i2.next(); - String roleName = userOrganisationRole.getRole().getName(); - if ( ! restrictRoles || restrictToRoleNames.contains(roleName) ) { - dto.addRoleName(roleName); - roleFound = true; + // now, process any children of this org + Organisation childOrganisation = userOrganisation.getOrganisation(); + if ( org.getChildOrganisations().size() > 0 ) { + getChildOrganisations(user, childOrganisation, restrictToRoleNames, dtolist); } } - if ( roleFound ) { - list.add(dto); + } + } + + /** + * Go through the roles for this user organisation and add the roles to the dto. + * @param restrictToRoleNames + * @param userOrganisation + * @param dto + * @return true if a role is found, false otherwise + */ + private boolean addRolesToDTO(List restrictToRoleNames, UserOrganisation userOrganisation, OrganisationDTO dto) { + Iterator iter = userOrganisation.getUserOrganisationRoles().iterator(); + + boolean roleFound = false; + while (iter.hasNext()) { + + UserOrganisationRole userOrganisationRole = (UserOrganisationRole) iter.next(); + String roleName = userOrganisationRole.getRole().getName(); + if ( restrictToRoleNames == null || restrictToRoleNames.size()==0 || restrictToRoleNames.contains(roleName) ) { + dto.addRoleName(roleName); + roleFound = true; } } - return OrganisationDTOFactory.createTree(list); + return roleFound; } /** + * Gets an organisation for a user, with the user's roles. Doesn't not return a tree of organisations. + * Will not return the organisation if there isn't any roles for this user. + */ + public OrganisationDTO getOrganisationForUserWithRole(User user, Integer organisationId) { + if ( user != null && organisationId !=null ) { + UserOrganisation userOrganisation = getUserOrganisation(user.getUserId(), organisationId); + OrganisationDTO dto = userOrganisation.getOrganisation().getOrganisationDTO(); + addRolesToDTO(null, userOrganisation, dto); + return dto; + } + return null; + } + + /** * @see org.lamsfoundation.lams.usermanagement.service.IUserManagementService#getChildOrganisations(org.lamsfoundation.lams.usermanagement.Organisation) */ public List getChildOrganisations(Organisation parentOrg) { Index: lams_common/src/java/org/lamsfoundation/lams/util/wddx/FlashMessage.java =================================================================== diff -u -r34b959260a0f8f8285793a4481a95ca3580eabc5 -rcea798b3457c895676bf1cc5ebb3013eee53f505 --- lams_common/src/java/org/lamsfoundation/lams/util/wddx/FlashMessage.java (.../FlashMessage.java) (revision 34b959260a0f8f8285793a4481a95ca3580eabc5) +++ lams_common/src/java/org/lamsfoundation/lams/util/wddx/FlashMessage.java (.../FlashMessage.java) (revision cea798b3457c895676bf1cc5ebb3013eee53f505) @@ -121,6 +121,11 @@ "No such User with a user_id of :" + userID + " exists", ERROR); } + public static FlashMessage getNoSuchOrganisationExists(String methodName, Integer organisationID){ + return new FlashMessage(methodName, + "No such Organisation with a organisationID of :" + organisationID + " exists", + ERROR); + } public static FlashMessage getUserNotAuthorized(String methodName, Integer userID){ return new FlashMessage(methodName, "User with user_id of:" + userID +" is not authorized to perfom this action:", Index: lams_documents/lams_common/WorkspaceFolder.doc =================================================================== diff -u -r468967515a84286ba430413d8f2cc1fe9309c78f -rcea798b3457c895676bf1cc5ebb3013eee53f505 Binary files differ