Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -ra0ef65af815f042f01af7135248a0c5d39f734fd -rfc0a85ca7a12cd69d71d582eb17c62fc8d27101c Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/IWorkspaceManagementService.java =================================================================== diff -u -rb31438f14603ef90bb73d6a0621a6b3e10f01ba7 -rfc0a85ca7a12cd69d71d582eb17c62fc8d27101c --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/IWorkspaceManagementService.java (.../IWorkspaceManagementService.java) (revision b31438f14603ef90bb73d6a0621a6b3e10f01ba7) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/IWorkspaceManagementService.java (.../IWorkspaceManagementService.java) (revision fc0a85ca7a12cd69d71d582eb17c62fc8d27101c) @@ -23,11 +23,14 @@ package org.lamsfoundation.lams.workspace.service; import java.io.IOException; -import java.util.Date; +import java.util.Vector; +import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; +import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.exception.UserException; import org.lamsfoundation.lams.usermanagement.exception.WorkspaceFolderException; +import org.lamsfoundation.lams.workspace.dto.FolderContentDTO; /** * @author Manpreet Minhas @@ -39,6 +42,12 @@ public static final String REPOSITORY_WORKSPACE="FlashClientsWorkspace"; /** + * Get the workspace folder for a particular id. Does not check the user permissions - that will be checked if you try to get + * anything from the folder. + */ + public WorkspaceFolder getWorkspaceFolder(Integer workspaceFolderID); + + /** * This method returns the contents of the folder with given * workspaceFolderID depending upon the mode. * Before it does so, it checks whether the given User @@ -74,13 +83,12 @@ * method with workspaceFolderID of A1. * * @param userID The user_id of the User who has requested the contents - * @param workspaceFolderID The workspace_folder_id of the WorkspaceFolder - * whose contents are requested + * @param workspaceFolder The WorkspaceFolder whose contents are requested * @param mode It can be either 1(AUTHORING) or 2(MONITORING) - * @return String The required information in WDDX format + * @return A list of the FolderContentDTOs in a format suitable for WDDX * @throws Exception */ - public String getFolderContents(Integer userID, Integer workspaceFolderID, Integer mode)throws Exception; + public Vector getFolderContents(Integer userID, WorkspaceFolder workspaceFolder, Integer mode)throws UserAccessDeniedException, RepositoryCheckedException ; /** * This method does the same as getFolderContents() except that it doesn't return @@ -89,13 +97,12 @@ * folder from the getAccessibleWorkspaceFolders() call. * * @param userID The user_id of the User who has requested the contents - * @param workspaceFolderID The workspace_folder_id of the WorkspaceFolder - * whose contents are requested + * @param workspaceFolder The WorkspaceFolder whose contents are requested * @param mode It can be either 1(AUTHORING) or 2(MONITORING) - * @return String The required information in WDDX format + * @return A list of the FolderContentDTOs in a format suitable for WDDX * @throws Exception */ - public String getFolderContentsExcludeHome(Integer userID, Integer workspaceFolderID, Integer mode)throws Exception; + public Vector getFolderContentsExcludeHome(Integer userID, WorkspaceFolder workspaceFolder, Integer mode)throws UserAccessDeniedException, RepositoryCheckedException ; /** * This method creates a new folder under the given parentFolder @@ -235,56 +242,30 @@ public String deleteContentWithVersion(Long uuid, Long versionToBeDeleted,Long folderContentID)throws Exception; /** - * This method returns a list of workspace folders for which + * This method returns a list of organisation workspace folders. + * + * The organisation folders returned are determined based on whether * the user has "write" access. A user can write/save his content - * in a folder in one of the following cases - *
    - *
  1. He is the OWNER of the given workspace folder
  2. - *
  3. He is a MEMBER of the organisation to which the - * folder belongs and he has one or all of the follwing - * roles (SYSADMIN. ADMIN, AUTHOR, STAFF, TEACHER)
  4. - *
+ * in an organisation folder the user is a MEMBER of the organisation to + * which the folder belongs and the user has one or all of the follwing + * roles (SYSADMIN. ADMIN, AUTHOR, STAFF, TEACHER) * - * The information returned is categorized under 3 main heads - * - * * @param userID The user_id of the user for whom the * folders have to fetched - * @return String The required information in WDDX format + * @return List of folders, in a format suitable for WDDX * @throws IOException */ - public String getAccessibleWorkspaceFolders(Integer userID)throws IOException; + public Vector getAccessibleOrganisationWorkspaceFolders(Integer userID)throws IOException; /** - * This method returns a list of workspace folders for which - * the user has "write" access. A user can write/save his content - * in a folder in one of the following cases - *
    - *
  1. He is the OWNER of the given workspace folder
  2. - *
  3. He is a MEMBER of the organisation to which the - * folder belongs and he has one or all of the follwing - * roles (SYSADMIN. ADMIN, AUTHOR, STAFF, TEACHER)
  4. - *
+ * This method returns the root workspace folder for a particular user. * - * The information returned is categorized under 3 main heads - * - * - * This is a modified version which returns FolderContentDTO, rather than UserAccessFoldersDTO - * * @param userID The user_id of the user for whom the * folders have to fetched - * @return String The required information in WDDX format + * @return FolderContentDTO for the user's root workspace folder * @throws IOException */ - public String getAccessibleWorkspaceFoldersNew(Integer userID)throws IOException; + public FolderContentDTO getUserWorkspaceFolder(Integer userID)throws IOException; /** * This method renames the workspaceFolder/learning design with the Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java =================================================================== diff -u -ra0ef65af815f042f01af7135248a0c5d39f734fd -rfc0a85ca7a12cd69d71d582eb17c62fc8d27101c --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision a0ef65af815f042f01af7135248a0c5d39f734fd) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision fc0a85ca7a12cd69d71d582eb17c62fc8d27101c) @@ -51,7 +51,6 @@ import org.lamsfoundation.lams.contentrepository.service.SimpleCredentials; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.dao.ILearningDesignDAO; -import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; @@ -64,7 +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.UserAccessFoldersDTO; +import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.exception.UserException; import org.lamsfoundation.lams.usermanagement.exception.WorkspaceFolderException; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; @@ -339,59 +338,57 @@ } /** + * Get the workspace folder for a particular id. Does not check the user permissions - that will be checked if you try to get + * anything from the folder. + */ + public WorkspaceFolder getWorkspaceFolder(Integer workspaceFolderID) { + return workspaceFolderDAO.getWorkspaceFolderByID(workspaceFolderID); + } + + /** * (non-Javadoc) * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getFolderContentsExcludeHome(java.lang.Integer, java.lang.Integer, java.lang.Integer) */ - public String getFolderContentsExcludeHome(Integer userID, Integer workspaceFolderID, Integer mode)throws Exception{ + public Vector getFolderContentsExcludeHome(Integer userID, WorkspaceFolder folder, Integer mode)throws UserAccessDeniedException, RepositoryCheckedException { User user = userDAO.getUserById(userID); - WorkspaceFolder folder = user.getWorkspace().getRootFolder(); - return getFolderContentsInternal(user, workspaceFolderID, mode, "getFolderContentsExcludeHome", - folder != null ? folder.getWorkspaceFolderId() : null); + return getFolderContentsInternal(user, folder, mode, "getFolderContentsExcludeHome", user.getWorkspace().getRootFolder()); } /** * (non-Javadoc) * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getFolderContents(java.lang.Integer, java.lang.Integer, java.lang.Integer) */ - public String getFolderContents(Integer userID, Integer workspaceFolderID, Integer mode)throws Exception{ + public Vector getFolderContents(Integer userID, WorkspaceFolder folder, Integer mode)throws UserAccessDeniedException, RepositoryCheckedException { User user = userDAO.getUserById(userID); - return getFolderContentsInternal(user, workspaceFolderID, mode, "getFolderContents", null); + return getFolderContentsInternal(user, folder, mode, "getFolderContents", null); } + /** * Get the contents of a folder. Internal method used for both getFolderContentsExcludeHome() and getFolderContents(). * If skipContentId is not null, then skip any contents found with this id. + * @throws UserAccessDeniedException + * @throws RepositoryCheckedException */ - public String getFolderContentsInternal(User user, Integer workspaceFolderID, Integer mode, String methodName, Integer skipContentId)throws Exception{ - WorkspaceFolder workspaceFolder = null; - Integer permissions = null; + public Vector getFolderContentsInternal(User user, WorkspaceFolder workspaceFolder, Integer mode, String methodName, WorkspaceFolder skipFolder)throws UserAccessDeniedException, RepositoryCheckedException { + Vector contentDTO = new Vector(); if(user!=null){ - workspaceFolder = workspaceFolderDAO.getWorkspaceFolderByID(workspaceFolderID); - if(workspaceFolder!=null){ - permissions = getPermissions(workspaceFolder,user); - if(permissions!=WorkspaceFolder.NO_ACCESS){ - Vector contentDTO = new Vector(); - getFolderContent(workspaceFolder,permissions,mode,contentDTO); - if(workspaceFolder.hasSubFolders()) - getSubFolderDetails(workspaceFolder,permissions,contentDTO, skipContentId); - Vector repositoryContent = getContentsFromRepository(new Long(workspaceFolderID.intValue()),permissions); - if(repositoryContent!=null) - contentDTO.addAll(repositoryContent); - flashMessage = new FlashMessage(methodName,createFolderContentPacket(workspaceFolder,contentDTO)); - } - else - flashMessage = new FlashMessage(methodName, - "Access Denied for user with user_id:" + user.getUserId(), - FlashMessage.ERROR); + Integer permissions = getPermissions(workspaceFolder,user); + if(permissions!=WorkspaceFolder.NO_ACCESS){ + getFolderContent(workspaceFolder,permissions,mode,contentDTO); + if(workspaceFolder.hasSubFolders()) + getSubFolderDetails(workspaceFolder,permissions,contentDTO, skipFolder); + Vector repositoryContent = getContentsFromRepository(workspaceFolder.getWorkspaceFolderId(),permissions); + if(repositoryContent!=null) + contentDTO.addAll(repositoryContent); + } else { + throw new UserAccessDeniedException(user); } - else - flashMessage = new FlashMessage(methodName, - "No such workspaceFolder with workspace_folder_id of:" + workspaceFolderID + " exists", - FlashMessage.ERROR); - }else - flashMessage = FlashMessage.getNoSuchUserExists(methodName,user.getUserId()); - return flashMessage.serializeMessage(); + }else { + throw new UserAccessDeniedException(user); + } + return contentDTO; } private void getFolderContent(WorkspaceFolder workspaceFolder, Integer permissions, Integer mode,Vector contentDTO){ @@ -408,11 +405,12 @@ /** * Get the folders in the given workspaceFolder. If skipContentId is not null, then skip any contents found with this id. */ - private void getSubFolderDetails(WorkspaceFolder workspaceFolder,Integer permissions, Vector subFolderContent, Integer skipContentId){ + private void getSubFolderDetails(WorkspaceFolder workspaceFolder,Integer permissions, Vector subFolderContent, WorkspaceFolder skipFolder){ + Integer skipFolderID = skipFolder != null ? skipFolder.getWorkspaceFolderId() : null; Iterator iterator = workspaceFolder.getChildWorkspaceFolders().iterator(); while(iterator.hasNext()){ WorkspaceFolder subFolder = (WorkspaceFolder)iterator.next(); - if ( skipContentId==null || ! skipContentId.equals(subFolder.getWorkspaceFolderId()) ) { + if ( skipFolderID==null || ! skipFolderID.equals(subFolder.getWorkspaceFolderId()) ) { subFolderContent.add(new FolderContentDTO(subFolder,permissions)); } } @@ -501,13 +499,6 @@ return folderContent; } - private Hashtable createFolderContentPacket(WorkspaceFolder workspaceFolder, Vector contents){ - Hashtable packet = new Hashtable(); - packet.put("parentWorkspaceFolderID", workspaceFolder.getParentWorkspaceFolder().getWorkspaceFolderId()); - packet.put("workspaceFolderID", workspaceFolder.getWorkspaceFolderId()); - packet.put("contents", contents); - return packet; - } /** * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#copyResource(Long, String, Integer, Integer, Integer) */ @@ -1146,10 +1137,12 @@ * requested from the Repositor * @param permissions The permissions on this WorkspaceFolder and hence all its contents * @return Vector A collection of required information. + * @throws AccessDeniedException + * @throws RepositoryCheckedException * @throws Exception */ - private Vector getContentsFromRepository(Long workspaceFolderID, Integer permissions)throws Exception{ - List content = workspaceFolderContentDAO.getContentByWorkspaceFolder(workspaceFolderID); + private Vector getContentsFromRepository(Integer workspaceFolderID, Integer permissions) throws RepositoryCheckedException{ + List content = workspaceFolderContentDAO.getContentByWorkspaceFolder(new Long(workspaceFolderID.longValue())); if(content.size()==0) return null; else{ @@ -1164,19 +1157,16 @@ return repositoryContent; } } + /** * (non-Javadoc) - * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getAccessibleWorkspaceFolders(java.lang.Integer) + * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getAccessibleOrganisationWorkspaceFolders(java.lang.Integer) */ - public String getAccessibleWorkspaceFolders(Integer userID) throws IOException { + public Vector getAccessibleOrganisationWorkspaceFolders(Integer userID) throws IOException { User user = userDAO.getUserById(userID); - Hashtable table = new Hashtable(); - Vector workspaces = new Vector(); + Vector folders = new Vector(); if (user != null) { - //add the user's own folder to the list - table.put("PRIVATE", new UserAccessFoldersDTO(user.getWorkspace().getRootFolder())); - // Get a list of organisations of which the given user is a member List userMemberships = userOrganisationDAO.getUserOrganisationsByUser(user); if (userMemberships != null) { @@ -1191,68 +1181,40 @@ * he has acess add that folder to the list. */ if (hasWriteAccess(roles)) { - workspaces.add(new UserAccessFoldersDTO(member.getOrganisation().getWorkspace().getRootFolder())); + WorkspaceFolder orgFolder = member.getOrganisation().getWorkspace().getRootFolder(); + folders.add(new FolderContentDTO(orgFolder,getPermissions(orgFolder,user))); } } - table.put("ORGANISATIONS", workspaces); - flashMessage = new FlashMessage("getAccessibleWorkspaceFolders", table); - }else - flashMessage = new FlashMessage("getAccessibleWorkspaceFolders", - "User with user_id of: " + userID - + " is not a member of any organisation", - FlashMessage.ERROR); - } else - flashMessage = FlashMessage.getNoSuchUserExists("getAccessibleWorkspaceFolders", userID); + } else { + log.warn("getAccessibleWorkspaceFolders: Trying to get user memberships for user "+userID+". User doesn't belong to any organisations. Returning no folders."); + } + } else { + log.warn("getAccessibleWorkspaceFolders: User "+userID+" does not exist. Returning no folders."); + } - return flashMessage.serializeMessage(); + return folders; } /** * (non-Javadoc) - * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getAccessibleWorkspaceFolders(java.lang.Integer) + * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getUserWorkspaceFolder(java.lang.Integer) */ - public String getAccessibleWorkspaceFoldersNew(Integer userID) throws IOException { + public FolderContentDTO getUserWorkspaceFolder(Integer userID) throws IOException { User user = userDAO.getUserById(userID); - Hashtable table = new Hashtable(); - Vector workspaces = new Vector(); if (user != null) { //add the user's own folder to the list WorkspaceFolder privateFolder = user.getWorkspace().getRootFolder(); Integer permissions = getPermissions(privateFolder,user); - table.put("PRIVATE", new FolderContentDTO(privateFolder, permissions)); + return new FolderContentDTO(privateFolder, permissions); - // Get a list of organisations of which the given user is a member - List userMemberships = userOrganisationDAO.getUserOrganisationsByUser(user); - if (userMemberships != null) { - Iterator memberships = userMemberships.iterator(); - while (memberships.hasNext()) { - UserOrganisation member = (UserOrganisation) memberships.next(); - // Get a list of roles that the user has in this organisation - Set roles = member.getUserOrganisationRoles(); - - /*Check if the user has write access, which is available - * only if the user has an AUTHOR, TEACHER or STAFF role. If - * he has acess add that folder to the list. - */ - if (hasWriteAccess(roles)) { - WorkspaceFolder orgFolder = member.getOrganisation().getWorkspace().getRootFolder(); - workspaces.add(new FolderContentDTO(orgFolder,getPermissions(orgFolder,user))); - } - } - table.put("ORGANISATIONS", workspaces); - flashMessage = new FlashMessage("getAccessibleWorkspaceFolders", table); - }else - flashMessage = new FlashMessage("getAccessibleWorkspaceFolders", - "User with user_id of: " + userID - + " is not a member of any organisation", - FlashMessage.ERROR); - } else - flashMessage = FlashMessage.getNoSuchUserExists("getAccessibleWorkspaceFolders", userID); + } else { + log.warn("getAccessibleWorkspaceFolders: User "+userID+" does not exist. Returning no folders."); + } - return flashMessage.serializeMessage(); + return null; } - + /** * This a utility method that checks whether user has write access. He can * save his contents to a folder only if he is an AUTHOR,TEACHER or STAFF Index: lams_central/src/java/org/lamsfoundation/lams/workspace/web/WorkspaceAction.java =================================================================== diff -u -rb31438f14603ef90bb73d6a0621a6b3e10f01ba7 -rfc0a85ca7a12cd69d71d582eb17c62fc8d27101c --- lams_central/src/java/org/lamsfoundation/lams/workspace/web/WorkspaceAction.java (.../WorkspaceAction.java) (revision b31438f14603ef90bb73d6a0621a6b3e10f01ba7) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/web/WorkspaceAction.java (.../WorkspaceAction.java) (revision fc0a85ca7a12cd69d71d582eb17c62fc8d27101c) @@ -24,7 +24,8 @@ import java.io.IOException; import java.io.PrintWriter; -import java.util.Date; +import java.util.Hashtable; +import java.util.Vector; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -34,13 +35,12 @@ import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; -import org.lamsfoundation.lams.authoring.service.IAuthoringService; -import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; -import org.lamsfoundation.lams.usermanagement.exception.UserException; -import org.lamsfoundation.lams.usermanagement.exception.WorkspaceFolderException; -import org.lamsfoundation.lams.util.DateUtil; +import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; +import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.util.wddx.FlashMessage; import org.lamsfoundation.lams.web.util.AttributeNames; +import org.lamsfoundation.lams.workspace.dto.FolderContentDTO; import org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -58,6 +58,20 @@ public static final String RESOURCE_ID = "resourceID"; public static final String RESOURCE_TYPE = "resourceType"; + /** + * Special value for folderID on getFolderContents(). Triggers getting the + * dummy value for the organisations (see ORG_FOLDER_ID) and the user's + * private folder. See the method for more details. + */ + public static final Integer BOOTSTRAP_FOLDER_ID = new Integer(-1); + + /** + * Special value for folderID on getFolderContents(). Triggers getting the + * organisation folders that are available to a user. See + * the method for more details. + */ + public static final Integer ORG_FOLDER_ID = new Integer(-2); + /** If you want the output given as a jsp, set the request parameter "jspoutput" to * some value other than an empty string (e.g. 1, true, 0, false, blah). * If you want it returned as a stream (ie for Flash), do not define this parameter @@ -97,6 +111,33 @@ return null; } } + + /** Send the flash message back to Flash */ + private ActionForward returnWDDXPacket(FlashMessage flashMessage, HttpServletResponse response) throws IOException { + PrintWriter writer = response.getWriter(); + writer.println(flashMessage.serializeMessage()); + return null; + } + + /** Is the folder id one of our special dummy ids? If so, we can't process the normal create, copy, paste, move + * functions on this folder. + * @return error packet if it is a special id. Should return packet to Flash with no further processing. + */ + private String checkResourceNotDummyValue(String methodName, Integer folderID, String resourceType) throws IOException { + return checkResourceNotDummyValue(methodName, new Long(folderID.longValue()), resourceType); + } + + /** Is the folder id one of our special dummy ids? If so, we can't process the normal create, copy, paste, move + * functions on this folder. + */ + private String checkResourceNotDummyValue(String methodName, Long folderID, String resourceType) throws IOException { + if ( FolderContentDTO.FOLDER.equals(resourceType) && (BOOTSTRAP_FOLDER_ID.equals(folderID) || ORG_FOLDER_ID.equals(folderID)) ) { + FlashMessage msg = new FlashMessage(methodName, "FolderID "+folderID+" invalid for this call.",FlashMessage.ERROR); + return msg.serializeMessage(); + } + return null; + } + /** * For details please refer to * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService @@ -113,6 +154,10 @@ HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{ Integer parentFolderID = new Integer(WebUtil.readIntParam(request,"parentFolderID")); + String errorPacket = checkResourceNotDummyValue("createFolderForFlash", parentFolderID, FolderContentDTO.FOLDER); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + String folderName = (String)WebUtil.readStrParam(request,"name"); Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); @@ -121,7 +166,24 @@ } /** - * For details please refer to + * getFolderContents returns the details of the folders, learning designs and files + * contained in a folder. + * + * If getFolderContents gets the BOOTSTRAP_FOLDER_ID (-1), then it return the user's private + * folder and the root folder. + * + * If getFolderContents gets the ORG_FOLDER_ID (-2) then it will return all the workspace + * folders that the user can access. + * + * This method handles the special values for the BOOTSTRAP_FOLDER_ID and the ORG_FOLDER_ID + * as these values are only meaningful to the Flash client - they are not meaningful to + * the progress engine or the like. If we ever had to return this data to another client, + * the data may be returned in a different way. + * + * The calls made to the service layer vary depending on what is required - this decouple's + * the client's special needs from the overall logic of the workspaces. + * + * For more details please refer to * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService * * @param mapping @@ -135,39 +197,75 @@ public ActionForward getFolderContents(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response)throws ServletException,Exception{ + HttpServletResponse response)throws ServletException,IOException{ Integer folderID = new Integer(WebUtil.readIntParam(request,"folderID")); Integer mode = new Integer(WebUtil.readIntParam(request,"mode")); Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); - String wddxPacket = workspaceManagementService.getFolderContents(userID,folderID,mode); - return outputPacket(mapping, request, response, wddxPacket, "details"); - } + String methodKey = "getFolderContents"; + Hashtable packet = null; + + try { + if ( BOOTSTRAP_FOLDER_ID.equals(folderID )) { + // return back the dummy org DTO and the user's workspace folder + Vector folders = new Vector(); + FolderContentDTO userFolder = workspaceManagementService.getUserWorkspaceFolder(userID); + if ( userFolder != null ) + folders.add(userFolder); + + // TODO I8N the organisation strings + FolderContentDTO dummyOrgFolder = new FolderContentDTO("Organisations", "Folder", + null, null, + FolderContentDTO.FOLDER, new Long(ORG_FOLDER_ID.longValue()), WorkspaceFolder.READ_ACCESS, + null); + + folders.add(dummyOrgFolder); + + packet = createFolderContentPacket(null, BOOTSTRAP_FOLDER_ID, folders); + + } else if ( ORG_FOLDER_ID.equals(folderID) ) { + // return back all the organisation folders that the user can access + Vector folders = workspaceManagementService.getAccessibleOrganisationWorkspaceFolders(userID); + packet = createFolderContentPacket(BOOTSTRAP_FOLDER_ID, ORG_FOLDER_ID, folders); + + } else { + // normal case - just return back the contents of this folder. + WorkspaceFolder folder = workspaceManagementService.getWorkspaceFolder(folderID); + if ( folder != null ) { + Vector items; + items = workspaceManagementService.getFolderContentsExcludeHome(userID,folder,mode); + WorkspaceFolder parentWorkspaceFolder = folder.getParentWorkspaceFolder(); + packet = createFolderContentPacket(parentWorkspaceFolder!=null?parentWorkspaceFolder.getWorkspaceFolderId():null, + folder.getWorkspaceFolderId(), + items); + } else { + return returnWDDXPacket(FlashMessage.getNoSuchWorkspaceFolderContentExsists(methodKey,new Long(folderID.longValue())), response); + } + } + } catch (UserAccessDeniedException e) { + return returnWDDXPacket(FlashMessage.getUserNotAuthorized(methodKey, userID), response); + } catch (Exception e) { + return returnWDDXPacket(FlashMessage.getExceptionOccured(methodKey, e.getMessage()), response); + } - /** - * For details please refer to - * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService - * - * @param mapping - * @param form - * @param request - * @param response - * @return ActionForward - * @throws ServletException - * @throws Exception - */ - public ActionForward getFolderContentsExcludeHome(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response)throws ServletException,Exception{ - Integer folderID = new Integer(WebUtil.readIntParam(request,"folderID")); - Integer mode = new Integer(WebUtil.readIntParam(request,"mode")); - Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); - IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); - String wddxPacket = workspaceManagementService.getFolderContentsExcludeHome(userID,folderID,mode); - return outputPacket(mapping, request, response, wddxPacket, "details"); + return returnWDDXPacket(new FlashMessage(methodKey,packet), response); } + private Hashtable createFolderContentPacket(Integer parentWorkspaceFolderID, Integer workspaceFolderID, Vector contents){ + Hashtable packet = new Hashtable(); + + if ( parentWorkspaceFolderID != null ) + packet.put("parentWorkspaceFolderID", parentWorkspaceFolderID); + + if ( workspaceFolderID != null ) + packet.put("workspaceFolderID", workspaceFolderID); + + if ( contents != null ) + packet.put("contents", contents); + return packet; + } + + /** * For details please refer to * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService @@ -185,7 +283,11 @@ HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ Long resourceID = new Long(WebUtil.readLongParam(request,RESOURCE_ID)); - String resourceType = WebUtil.readStrParam(request,RESOURCE_TYPE); + String resourceType = WebUtil.readStrParam(request,RESOURCE_TYPE); + String errorPacket = checkResourceNotDummyValue("deleteResource", resourceID, FolderContentDTO.FOLDER); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); String wddxPacket = workspaceManagementService.deleteResource(resourceID,resourceType,userID); @@ -213,6 +315,10 @@ Long resourceID = new Long(WebUtil.readLongParam(request,RESOURCE_ID)); String resourceType = WebUtil.readStrParam(request,RESOURCE_TYPE); Integer targetFolderID = new Integer(WebUtil.readIntParam(request,"targetFolderID")); + String errorPacket = checkResourceNotDummyValue("copyResource", targetFolderID, FolderContentDTO.FOLDER); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + Integer copyType = WebUtil.readIntParam(request, "copyType", true); Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); @@ -241,6 +347,10 @@ Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); Integer targetFolderID = new Integer(WebUtil.readIntParam(request,"targetFolderID")); + String errorPacket = checkResourceNotDummyValue("copyResource", targetFolderID, FolderContentDTO.FOLDER); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); String wddxPacket = workspaceManagementService.moveResource(resourceID,targetFolderID,resourceType,userID); PrintWriter writer = response.getWriter(); @@ -273,6 +383,10 @@ String mimeType = WebUtil.readStrParam(request,"mimeType"); String path = WebUtil.readStrParam(request,"path"); + String errorPacket = checkResourceNotDummyValue("createWorkspaceFolderContent", workspaceFolderID, FolderContentDTO.FOLDER); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); String wddxPacket = workspaceManagementService.createWorkspaceFolderContent(contentTypeID,name,description, workspaceFolderID, @@ -297,6 +411,7 @@ HttpServletResponse response)throws ServletException, Exception{ Long folderContentID = new Long(WebUtil.readLongParam(request,"folderContentID")); String path = WebUtil.readStrParam(request,"path"); + IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); String wddxPacket = workspaceManagementService.updateWorkspaceFolderContent(folderContentID,path); return outputPacket(mapping, request, response, wddxPacket, "details"); @@ -312,54 +427,18 @@ * @return ActionForward * @throws IOException */ - public ActionForward getAccessibleWorkspaceFolders(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response)throws IOException{ - Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); - IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); - String wddxPacket = workspaceManagementService.getAccessibleWorkspaceFolders(userID); - return outputPacket(mapping, request, response, wddxPacket, "details"); - } - /** - * For details please refer to - * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService - * - * @param mapping - * @param form - * @param request - * @param response - * @return ActionForward - * @throws IOException - */ - public ActionForward getAccessibleWorkspaceFoldersNew(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response)throws IOException{ - Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); - IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); - String wddxPacket = workspaceManagementService.getAccessibleWorkspaceFoldersNew(userID); - return outputPacket(mapping, request, response, wddxPacket, "details"); - } - - /** - * For details please refer to - * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService - * - * @param mapping - * @param form - * @param request - * @param response - * @return ActionForward - * @throws IOException - */ public ActionForward renameResource(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws IOException{ Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); Long resourceID = new Long(WebUtil.readLongParam(request,RESOURCE_ID)); String resourceType = WebUtil.readStrParam(request,RESOURCE_TYPE); + + String errorPacket = checkResourceNotDummyValue("renameResource", resourceID, resourceType); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + String name = WebUtil.readStrParam(request,"name"); IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); String wddxPacket = workspaceManagementService.renameResource(resourceID,resourceType,name,userID); @@ -376,27 +455,6 @@ * @param form * @param request * @param response - * @return ActionForward - * @throws IOException - */ - public ActionForward getWorkspace(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response)throws IOException{ - Integer userID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); - IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); - String wddxPacket = workspaceManagementService.getWorkspace(userID); - return outputPacket(mapping, request, response, wddxPacket, "details"); - } - - /** - * For details please refer to - * org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService - * - * @param mapping - * @param form - * @param request - * @param response * @return * @throws IOException */ @@ -407,6 +465,11 @@ Long uuID = new Long(WebUtil.readIntParam(request,"uuID")); Long versionID= new Long(WebUtil.readIntParam(request,"versionID")); Long folderContentID = new Long(WebUtil.readIntParam(request,"folderContentID")); + + String errorPacket = checkResourceNotDummyValue("deleteContentWithVersion", folderContentID, FolderContentDTO.FOLDER); + if ( errorPacket != null) + return outputPacket(mapping, request, response, errorPacket, "details"); + IWorkspaceManagementService workspaceManagementService = getWorkspaceManagementService(); String wddxPacket = workspaceManagementService.deleteContentWithVersion(uuID,versionID,folderContentID); return outputPacket(mapping, request, response, wddxPacket, "details");