From 32f6e2c8c7f0e6fe2f79ddf7f7f1ea0f087c4ce6 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Tue, 14 Jun 2016 18:01:52 +0200 Subject: [PATCH] OO-2059: fix copy of checklist course element --- .../export/CourseEnvironmentMapper.java | 21 +++++++ .../course/nodes/CheckListCourseNode.java | 57 ++++++++++++++++++- .../olat/course/nodes/cl/CheckboxManager.java | 5 +- .../nodes/cl/manager/CheckboxManagerImpl.java | 4 +- .../cl/ui/CheckListBoxListEditController.java | 2 +- .../nodes/cl/ui/CheckListRunController.java | 2 +- .../nodes/cl/ui/CheckboxEditController.java | 2 +- .../wizard/CheckListStepRunnerCallback.java | 2 +- 8 files changed, 83 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java b/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java index 833d47181dc..7fdf81460c7 100644 --- a/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java +++ b/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java @@ -21,8 +21,10 @@ package org.olat.course.export; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -40,6 +42,7 @@ public class CourseEnvironmentMapper { private final List<BGAreaReference> areas = new ArrayList<BGAreaReference>(); private final List<BusinessGroupReference> groups = new ArrayList<BusinessGroupReference>(); + private final Map<String,Map<String,String>> mapUniqueKeys = new HashMap<>(); private Identity author; @@ -54,6 +57,24 @@ public class CourseEnvironmentMapper { public void setAuthor(Identity author) { this.author = author; } + + public void addUniqueKeyPair(String ident, String sourceKey, String targetKey) { + Map<String,String> map; + if(mapUniqueKeys.containsKey(ident)) { + map = mapUniqueKeys.get(ident); + } else { + map = new HashMap<>(); + mapUniqueKeys.put(ident, map); + } + map.put(sourceKey, targetKey); + } + + public String getTargetUniqueKey(String ident, String sourceKey) { + if(mapUniqueKeys.containsKey(ident)) { + return mapUniqueKeys.get(ident).get(sourceKey); + } + return null; + } public List<BGAreaReference> getAreas() { return areas; diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java index a2818e861d3..6300d765dac 100644 --- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java +++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java @@ -60,6 +60,7 @@ import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.NodeEditController; import org.olat.course.editor.PublishEvents; import org.olat.course.editor.StatusDescription; +import org.olat.course.export.CourseEnvironmentMapper; import org.olat.course.nodes.cl.CheckboxManager; import org.olat.course.nodes.cl.model.Checkbox; import org.olat.course.nodes.cl.model.CheckboxList; @@ -477,7 +478,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements Set<String> usedNames = new HashSet<String>(); for(Checkbox checkbox:list.getList()) { - VFSContainer dir = checkboxManager.getFileContainer(course.getCourseEnvironment(), this, checkbox); + VFSContainer dir = checkboxManager.getFileContainer(course.getCourseEnvironment(), this); if(dir != null) { VFSItem item = dir.resolve(checkbox.getFilename()); if(item instanceof VFSLeaf) { @@ -504,7 +505,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX); if(list != null && list.getList() != null) { for(Checkbox checkbox:list.getList()) { - File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this, checkbox); + File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this); if(dir.exists()) { File fFileExportDir = new File(fExportDirectory, "checklistfiles/" + getIdent() + "/" + checkbox.getCheckboxId()); fFileExportDir.mkdirs(); @@ -526,7 +527,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements String newCheckboxId = UUID.randomUUID().toString(); checkbox.setCheckboxId(newCheckboxId); if(fFileImportDir.exists()) { - File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this, checkbox); + File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this); dir.mkdirs(); FileUtils.copyDirContentsToDir(fFileImportDir, dir, false, "import file of checkbox"); } @@ -614,6 +615,56 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements userCourseEnv.getScoreAccounting().scoreInfoChanged(this, sceval); } + + @Override + public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course, Identity author) { + CheckListCourseNode cNode = (CheckListCourseNode)super.createInstanceForCopy(isNewTitle, course, author); + CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class); + CheckboxList list = (CheckboxList)cNode.getModuleConfiguration().get(CONFIG_KEY_CHECKBOX); + for(Checkbox checkbox:list.getList()) { + checkbox.setCheckboxId(UUID.randomUUID().toString()); + } + // the ident of the course node is the same + File sourceDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this); + if(sourceDir.exists()) { + File targetDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), cNode); + if(!targetDir.exists()) { + targetDir.mkdirs(); + FileUtils.copyDirContentsToDir(sourceDir, targetDir, false, "copy files of checkbox"); + } + } + + return cNode; + } + + @Override + public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCourse) { + ModuleConfiguration config = getModuleConfiguration(); + CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class); + CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX); + for(Checkbox checkbox:list.getList()) { + String sourceId = checkbox.getCheckboxId(); + String targetId = envMapper.getTargetUniqueKey(getIdent(), sourceId); + if(targetId == null) { + targetId = UUID.randomUUID().toString(); + envMapper.addUniqueKeyPair(getIdent(), sourceId, targetId); + } + checkbox.setCheckboxId(targetId); + } + + // the ident of the course node is the same + File sourceDir = checkboxManager.getFileDirectory(sourceCourse.getCourseEnvironment(), this); + if(sourceDir.exists()) { + File targetDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this); + if(!targetDir.exists()) { + targetDir.mkdirs(); + FileUtils.copyDirContentsToDir(sourceDir, targetDir, false, "copy files of checkbox"); + } + } + + checkboxManager.syncCheckbox(list, course, getIdent()); + super.postCopy(envMapper, processType, course, sourceCourse); + } @Override public void updateOnPublish(Locale locale, ICourse course, Identity publisher, PublishEvents publishEvents) { diff --git a/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java b/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java index f968ac3b7bc..a0a444f399b 100644 --- a/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java +++ b/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java @@ -28,7 +28,6 @@ import org.olat.core.util.vfs.VFSContainer; import org.olat.course.nodes.CheckListCourseNode; import org.olat.course.nodes.cl.model.AssessmentBatch; import org.olat.course.nodes.cl.model.AssessmentData; -import org.olat.course.nodes.cl.model.Checkbox; import org.olat.course.nodes.cl.model.CheckboxList; import org.olat.course.nodes.cl.model.DBCheck; import org.olat.course.nodes.cl.model.DBCheckbox; @@ -96,7 +95,7 @@ public interface CheckboxManager { */ public List<AssessmentData> getAssessmentDatas(OLATResourceable ores, String resSubPath, RepositoryEntry re, List<BusinessGroup> groups); - public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox); + public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode); - public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox); + public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode); } diff --git a/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java b/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java index 956335a8f3d..dee62ad9eef 100644 --- a/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java +++ b/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java @@ -510,14 +510,14 @@ public class CheckboxManagerImpl implements CheckboxManager { } @Override - public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox) { + public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode) { String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent(); OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(path, null); return rootFolder; } @Override - public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox) { + public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode) { String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent(); File rootFolder = new File(FolderConfig.getCanonicalRoot(), path); return rootFolder; diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java index 7919956d24a..9657a5c2dca 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java @@ -148,7 +148,7 @@ public class CheckListBoxListEditController extends FormBasicController { if(list != null && list.getList() != null) { for(Checkbox checkbox:list.getList()) { DownloadLink download = null; - VFSContainer container = checkboxManager.getFileContainer(courseEnv, courseNode, checkbox); + VFSContainer container = checkboxManager.getFileContainer(courseEnv, courseNode); if(container != null) { VFSItem item = container.resolve(checkbox.getFilename()); if(item instanceof VFSLeaf) { diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java index fc6d9850aa8..084d373955a 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java @@ -204,7 +204,7 @@ public class CheckListRunController extends FormBasicController implements Contr DownloadLink downloadLink = null; if(StringHelper.containsNonWhitespace(checkbox.getFilename())) { - VFSContainer container = checkboxManager.getFileContainer(userCourseEnv.getCourseEnvironment(), courseNode, checkbox); + VFSContainer container = checkboxManager.getFileContainer(userCourseEnv.getCourseEnvironment(), courseNode); VFSItem item = container.resolve(checkbox.getFilename()); if(item instanceof VFSLeaf) { String name = "file_" + checkbox.getCheckboxId(); diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java index 05b2cadd6fa..598f08e17d3 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java @@ -305,7 +305,7 @@ public class CheckboxEditController extends FormBasicController { } else { ICourse course = CourseFactory.loadCourse(courseOres); CourseEnvironment courseEnv = course.getCourseEnvironment(); - container = checkboxManager.getFileContainer(courseEnv, courseNode, checkbox); + container = checkboxManager.getFileContainer(courseEnv, courseNode); } return container; } diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java index 2bb5d07d2ae..fcf870967d3 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java @@ -103,7 +103,7 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback { VFSContainer tmpContainer = new LocalFolderImpl(path); VFSItem item = tmpContainer.resolve(templateBox.getFilename()); if(item instanceof VFSLeaf) { - VFSContainer container = checkboxManager.getFileContainer(courseEnv, checkNode, checkbox); + VFSContainer container = checkboxManager.getFileContainer(courseEnv, checkNode); VFSManager.copyContent(tmpContainer, container); tmpContainer.deleteSilently(); } -- GitLab