diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/FolderCommandHelper.java b/src/main/java/org/olat/core/commons/modules/bc/commands/FolderCommandHelper.java index 5d45aeb9d04fd3b94091325c82ebd6b3c7737e7b..65308a44a4db8209d6bcbfad874aaac4e208c6a8 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/FolderCommandHelper.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/FolderCommandHelper.java @@ -29,7 +29,6 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; -import org.olat.core.util.vfs.VFSManager; /** * @@ -112,7 +111,7 @@ public class FolderCommandHelper { * @return */ public static final int sanityCheck2(WindowControl wControl, FolderComponent fc, VFSItem currentItem) { - if(!VFSManager.exists(currentItem)) { + if(currentItem == null || !currentItem.exists()) { wControl.setError(fc.getTranslator().translate("FileDoesNotExist")); return FolderCommandStatus.STATUS_FAILED; } diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/CrumbRenderer.java b/src/main/java/org/olat/core/commons/modules/bc/components/CrumbRenderer.java index ffadd7719b4306c5145b5f3c351b7e701f3b026e..52b368a856c8e65629a1f3cbecd4571e60cab1e0 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/components/CrumbRenderer.java +++ b/src/main/java/org/olat/core/commons/modules/bc/components/CrumbRenderer.java @@ -67,6 +67,9 @@ public class CrumbRenderer { StringTokenizer st = new StringTokenizer(path, "/", false); while (st.hasMoreElements()) { String token = st.nextToken(); + if(pathLink.length() > 0) { + pathLink.append("/"); + } pathLink.append(ubu.encodeUrl(token)); if (st.hasMoreElements()) { sb.append("<li><a href='").append(pathLink).append("'"); diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java index 615dbe64b62f0e6e2a79250ec2d773c2f638a35d..77ac22de2ff1b408ccf476babe9e859ce7a571e3 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java +++ b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java @@ -52,7 +52,6 @@ import org.olat.core.util.Util; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; -import org.olat.core.util.vfs.VFSManager; import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; import org.olat.core.util.vfs.version.Versionable; @@ -349,7 +348,7 @@ public class FolderComponent extends AbstractComponent { public void updateChildren() { setDirty(true); //check if the container is still up-to-date, if not -> return to root - if(!VFSManager.exists(currentContainer)) { + if(!currentContainer.exists()) { currentContainer = rootContainer; currentContainerPath = "/"; } diff --git a/src/main/java/org/olat/course/MergedCourseContainer.java b/src/main/java/org/olat/course/MergedCourseContainer.java index 70ea9acaf18f6f2e39fb1426b049925200fc02aa..ca868725a24a2d3693686b71838d3e039926701a 100644 --- a/src/main/java/org/olat/course/MergedCourseContainer.java +++ b/src/main/java/org/olat/course/MergedCourseContainer.java @@ -21,12 +21,16 @@ package org.olat.course; import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; +import org.olat.core.commons.services.webdav.servlets.RequestUtil; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.vfs.MergeSource; import org.olat.core.util.vfs.NamedContainerImpl; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.callbacks.ReadOnlyCallback; +import org.olat.core.util.vfs.filters.VFSItemFilter; import org.olat.course.config.CourseConfig; import org.olat.course.nodes.BCCourseNode; import org.olat.course.nodes.CourseNode; @@ -42,7 +46,7 @@ public class MergedCourseContainer extends MergeSource { private static final OLog log = Tracing.createLoggerFor(MergedCourseContainer.class); - private Long courseId; + private final Long courseId; public MergedCourseContainer(Long courseId, String name) { super(null, name); @@ -89,21 +93,46 @@ public class MergedCourseContainer extends MergeSource { * @param course * @param nodesContainer * @param courseNode + * @return container for the current course node */ private void addFolderBuildingBlocks(PersistingCourseImpl course, MergeSource nodesContainer, CourseNode courseNode) { for (int i = 0; i < courseNode.getChildCount(); i++) { CourseNode child = (CourseNode) courseNode.getChildAt(i); + String folderName = RequestUtil.normalizeFilename(child.getShortTitle()); + MergeSource courseNodeContainer; if (child instanceof BCCourseNode) { - BCCourseNode bcNode = (BCCourseNode) child; + final BCCourseNode bcNode = (BCCourseNode) child; // add folder not to merge source. Use name and node id to have unique name String path = BCCourseNode.getFoldernodePathRelToFolderBase(course.getCourseEnvironment(), bcNode); OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(path, null); - String folderName = bcNode.getShortTitle() + " (" + bcNode.getIdent() + ")"; - OlatNamedContainerImpl BCFolder = new OlatNamedContainerImpl(folderName, rootFolder); - nodesContainer.addContainer(BCFolder); + + // add node ident if multiple files have same name + if (nodesContainer.getItems(new VFSItemFilter() { + @Override + public boolean accept(VFSItem vfsItem) { + return (bcNode.getShortTitle().equals(RequestUtil.normalizeFilename(bcNode.getShortTitle()))); + } + }).size() > 0) { + folderName = folderName + " (" + bcNode.getIdent() + ")"; + } + + // Create a container for this node content and wrap it with a merge source which is attached to tree + VFSContainer nodeContentContainer = new OlatNamedContainerImpl(folderName, rootFolder); + courseNodeContainer = new MergeSource(nodesContainer, folderName); + courseNodeContainer.addContainersChildren(nodeContentContainer, true); + nodesContainer.addContainer(courseNodeContainer); + // Do recursion for all children + addFolderBuildingBlocks(course, courseNodeContainer, child); + } else { + // For non-folder course nodes, add merge source (no files to show) ... + courseNodeContainer = new MergeSource(null, folderName); + // , then do recursion for all children ... + addFolderBuildingBlocks(course, courseNodeContainer, child); + // ... but only add this container if it contains any children with at least one BC course node + if (courseNodeContainer.getItems().size() > 0) { + nodesContainer.addContainer(courseNodeContainer); + } } - // recursion for all childrenØ - addFolderBuildingBlocks(course, nodesContainer, child); } }