Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java
===================================================================
diff -u -r18ee903dfc2e0bd139881af731e60abcb0aac27c -r2394f483084185d5e05ddc62bdc85b232786c9ff
--- lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision 18ee903dfc2e0bd139881af731e60abcb0aac27c)
+++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision 2394f483084185d5e05ddc62bdc85b232786c9ff)
@@ -167,15 +167,7 @@
"Cannot delete this folder as it is the Root folder.",
FlashMessage.ERROR);
else{
- if(!workspaceFolder.isEmpty())
- flashMessage = new FlashMessage("deleteFolder",
- "Cannot delete folder with folder_id of: " + folderID +
- " as it is not empty. Please delete its contents first.",
- FlashMessage.ERROR);
- else{
- workspaceFolderDAO.delete(workspaceFolder);
- flashMessage = new FlashMessage("deleteFolder","Folder deleted:" + folderID);
- }
+ flashMessage = deleteFolderContents(workspaceFolder, userID);
}
}else
flashMessage = FlashMessage.getNoSuchWorkspaceFolderExsists("deleteFolder",folderID);
@@ -184,8 +176,106 @@
flashMessage = FlashMessage.getNoSuchUserExists("deleteFolder",userID);
return flashMessage.serializeMessage();
- }
+ }
/**
+ * This method will try to delete the folder
. If the folder is not empty
+ * it will attempt to delete all resources inside the folder. If the user does not
+ * have permission to delete that resource then a FlashMessage will be returned
+ * indicating which resource it was unable to delete.
+ * If all resources inside that folder
are successfully deleted, then
+ * the folder will be deleted and a FlashMessage will be returned indicating it was
+ * successfully deleted.
+ * TODO: put all flash messages in a message resource file so it can be
+ * internationalised
+ * @param folder
+ */
+ private FlashMessage deleteFolderContents(WorkspaceFolder folder, Integer userID) throws IOException
+ {
+ boolean isDeleteSuccessful = true;
+
+ Integer folderID = folder.getWorkspaceFolderId();
+
+ if (!folder.isEmpty())
+ {
+ if (folder.hasSubFolders())
+ {
+ Set subFolders = folder.getChildWorkspaceFolders();
+ Iterator subFolderIterator = subFolders.iterator();
+ while (subFolderIterator.hasNext())
+ {
+ WorkspaceFolder subFolder = (WorkspaceFolder)subFolderIterator.next();
+ deleteFolder(subFolder.getWorkspaceFolderId(), userID);
+ }
+ }
+ else
+ {
+
+ //delete all files within the directory
+ Set folderContents = folder.getFolderContent();
+ Iterator i = folderContents.iterator();
+ while (i.hasNext())
+ {
+ WorkspaceFolderContent folderContent = (WorkspaceFolderContent)i.next();
+ folderContent.setWorkspaceFolder(null);
+ folder.getFolderContent().remove(folderContent);
+ }
+
+ //delete all learning designs within folder (if created by the user)
+ Set learningDesigns = folder.getLearningDesigns();
+ Iterator j = learningDesigns.iterator();
+ while (j.hasNext())
+ {
+ LearningDesign learningDesign = (LearningDesign)j.next();
+ //have to ensure that the user has permission to delete the learning design
+ //method taken from deleteLearningDesign
+ //code has been duplicated because it is not desirable to return a string.
+ Long learningDesignID = learningDesign.getLearningDesignId();
+ if (learningDesign != null) {
+ if (learningDesign.getUser().getUserId().equals(userID))
+ {
+ if (learningDesign.getReadOnly().booleanValue()) {
+ isDeleteSuccessful = false;
+ flashMessage = new FlashMessage("deleteFolder",
+ "Cannot delete design with learning_design_id of :" + learningDesignID +
+ " as it is READ ONLY.", FlashMessage.ERROR);
+ }
+ else
+ {
+ List list = learningDesignDAO.getLearningDesignsByParent(learningDesignID);
+ if(list==null || list.size()==0){
+ folder.getLearningDesigns().remove(learningDesign);
+ learningDesign.setWorkspaceFolder(null);
+ }
+ else
+ {
+ isDeleteSuccessful = false;
+ flashMessage = new FlashMessage("deleteFolder",
+ "Cannot delete design with learning_design_id of:" + learningDesignID +
+ " as it is a PARENT.",
+ FlashMessage.ERROR);
+ }
+ }
+ }
+ }
+ }
+
+ workspaceFolderDAO.update(folder); //this call will delete the files and learningdesigns which were removed from the collection above.
+
+ }
+
+ }
+ if(isDeleteSuccessful) //it will only delete this folder if all the files/folder/learningDesigns are all deleted
+ {
+ workspaceFolderDAO.delete(folder);
+ flashMessage = new FlashMessage("deleteFolder","Folder deleted:" + folderID);
+ }
+
+ return flashMessage;
+
+ }
+
+
+ /**
* This method checks if the given workspaceFolder
is the
* root folder of any Organisation
or User
*
@@ -551,6 +641,7 @@
User user = userDAO.getUserById(userID);
if(user!=null){
LearningDesign learningDesign = learningDesignDAO.getLearningDesignById(learningDesignID);
+
if(learningDesign!=null){
if(learningDesign.getUser().getUserId().equals(user.getUserId())){
if(learningDesign.getReadOnly().booleanValue()){
@@ -1029,4 +1120,6 @@
return userMgmtService.getUsersFromOrganisationByRole(organisationID, role);
}
+
+
}