From 7d17a07e66e97bbc60233efdb38db0d749d4ca9e Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 17 Jan 2019 14:50:32 +0100
Subject: [PATCH] OO-3818: allow to pick a page from shared folder in multi SP
 tool

---
 .../course/editor/EditorMainController.java   |  3 +-
 .../olat/course/editor/MultiSPController.java | 37 ++-----------------
 .../run/environment/CourseEnvironment.java    |  3 ++
 .../environment/CourseEnvironmentImpl.java    | 33 +++--------------
 .../run/preview/PreviewCourseEnvironment.java |  6 +++
 5 files changed, 20 insertions(+), 62 deletions(-)

diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java
index 0c6159ff9e2..8266f673596 100644
--- a/src/main/java/org/olat/course/editor/EditorMainController.java
+++ b/src/main/java/org/olat/course/editor/EditorMainController.java
@@ -92,6 +92,7 @@ import org.olat.course.CourseFactory;
 import org.olat.course.DisposedCourseRestartController;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentModeManager;
+import org.olat.course.folder.CourseContainerOptions;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -1131,7 +1132,7 @@ public class EditorMainController extends MainLayoutBasicController implements G
 		removeAsListenerAndDispose(multiSPChooserCtr);
 		removeAsListenerAndDispose(cmc);
 		
-		VFSContainer rootContainer = course.getCourseEnvironment().getCourseFolderContainer();
+		VFSContainer rootContainer = course.getCourseEnvironment().getCourseFolderContainer(CourseContainerOptions.withoutElements());
 		CourseEditorTreeNode selectedNode = (CourseEditorTreeNode)menuTree.getSelectedNode();
 		multiSPChooserCtr = new MultiSPController(ureq, getWindowControl(), rootContainer, ores, selectedNode);
 		listenTo(multiSPChooserCtr);
diff --git a/src/main/java/org/olat/course/editor/MultiSPController.java b/src/main/java/org/olat/course/editor/MultiSPController.java
index 278d13e1df3..a442b06916f 100644
--- a/src/main/java/org/olat/course/editor/MultiSPController.java
+++ b/src/main/java/org/olat/course/editor/MultiSPController.java
@@ -40,11 +40,10 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.util.CSSHelper;
 import org.olat.core.id.OLATResourceable;
-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.VFSLeaf;
+import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
@@ -84,19 +83,9 @@ public class MultiSPController extends FormBasicController {
 	public MultiSPController(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer,
 			OLATResourceable ores, CourseEditorTreeNode selectedNode) {
 		super(ureq, wControl, "choosesps");
-		
 		this.ores = ores;
 		this.selectedNode = selectedNode;
-
-		if(rootContainer instanceof MergeSource) {
-			//we cannot link to files from course elements or groups folders without single page BB update
-			VFSContainer realContainer = ((MergeSource)rootContainer).getRootWriteContainer();
-			VFSContainer namedRoot = new NamedContainerImpl(rootContainer.getName(), realContainer);
-			this.rootContainer = namedRoot;
-		} else {
-			this.rootContainer = rootContainer;
-		}
-
+		this.rootContainer = rootContainer;
 		initForm(ureq);
 	}
 	
@@ -219,7 +208,7 @@ public class MultiSPController extends FormBasicController {
 				//create node
 				newNode = createCourseNode(item, "sp");
 				ModuleConfiguration moduleConfig = newNode.getModuleConfiguration();
-				String path = getRelativePath(item);
+				String path = VFSManager.getRelativeItemPath(item, rootContainer, null);
 				moduleConfig.set(SPEditController.CONFIG_KEY_FILE, path);
 				moduleConfig.setBooleanEntry(SPEditController.CONFIG_KEY_ALLOW_RELATIVE_LINKS, true);
 			} else if (item instanceof VFSContainer) {
@@ -265,26 +254,6 @@ public class MultiSPController extends FormBasicController {
 		return newNode;
 	}
 	
-	private String getRelativePath(VFSItem item) {
-		String path = "";
-		while(item != null && !isSameAsRootContainer(item)) {
-			path = "/" + item.getName() + path;
-			item = item.getParentContainer();
-		}
-		return path;
-	}
-	
-	private boolean isSameAsRootContainer(VFSItem item) {
-		if(item instanceof VFSContainer) {
-			VFSContainer blocker = rootContainer;
-			if(blocker instanceof MergeSource) {
-				blocker = ((MergeSource)blocker).getRootWriteContainer();
-			}
-			return blocker.isSame(item);
-		}
-		return false;
-	}
-	
 	/**
 	 * @param nodeSelection The node that should be selected recursively
 	 * @param select true: select the node and its children; false: deselect the node and its children
diff --git a/src/main/java/org/olat/course/run/environment/CourseEnvironment.java b/src/main/java/org/olat/course/run/environment/CourseEnvironment.java
index 67b124d0d8c..32a41de8ca8 100644
--- a/src/main/java/org/olat/course/run/environment/CourseEnvironment.java
+++ b/src/main/java/org/olat/course/run/environment/CourseEnvironment.java
@@ -31,6 +31,7 @@ import org.olat.course.Structure;
 import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.config.CourseConfig;
+import org.olat.course.folder.CourseContainerOptions;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.repository.RepositoryEntry;
@@ -103,6 +104,8 @@ public interface CourseEnvironment {
 	 */
 	public VFSContainer getCourseFolderContainer();
 	
+	public VFSContainer getCourseFolderContainer(CourseContainerOptions options);
+	
 	/**
 	 * Return the course base path.
 	 * @return the course base path
diff --git a/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java b/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java
index 8cf000dcf0c..ca55685f358 100644
--- a/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java
+++ b/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java
@@ -35,6 +35,7 @@ import org.olat.course.assessment.manager.CourseAssessmentManagerImpl;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.auditing.UserNodeAuditManagerImpl;
 import org.olat.course.config.CourseConfig;
+import org.olat.course.folder.CourseContainerOptions;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.groupsandrights.PersistingCourseGroupManager;
 import org.olat.course.properties.CoursePropertyManager;
@@ -80,9 +81,6 @@ public class CourseEnvironmentImpl implements CourseEnvironment {
 		cgm.updateRepositoryEntry(courseEntry);
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getCurrentTimeMillis()
-	 */
 	@Override
 	public long getCurrentTimeMillis() {
 		return System.currentTimeMillis();
@@ -93,41 +91,26 @@ public class CourseEnvironmentImpl implements CourseEnvironment {
 		return false;
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getCourseGroupManager()
-	 */
 	@Override
 	public CourseGroupManager getCourseGroupManager() {
 		return cgm;
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getCourseResourceableId()
-	 */
 	@Override
 	public Long getCourseResourceableId() {
 		return course.getResourceableId();
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getCoursePropertyManager()
-	 */
 	@Override
 	public CoursePropertyManager getCoursePropertyManager() {
 		return propertyManager;
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getAssessmentManager()
-	 */
 	@Override
 	public AssessmentManager getAssessmentManager() {
 		return assessmentManager;
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getAuditManager()
-	 */
 	@Override
 	public UserNodeAuditManager getAuditManager() {
 		/**
@@ -139,9 +122,6 @@ public class CourseEnvironmentImpl implements CourseEnvironment {
 		return this.auditManager;
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getRunStructure()
-	 */
 	@Override
 	public Structure getRunStructure() {
 		Structure runStructure = course.getRunStructure();
@@ -149,17 +129,11 @@ public class CourseEnvironmentImpl implements CourseEnvironment {
 		return runStructure;
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getCourseTitle()
-	 */
 	@Override
 	public String getCourseTitle() {
 		return course.getCourseTitle();
 	}
 
-	/**
-	 * @see org.olat.course.run.environment.CourseEnvironment#getCourseConfig()
-	 */
 	@Override
 	public CourseConfig getCourseConfig() {
 		return course.getCourseConfig();
@@ -170,6 +144,11 @@ public class CourseEnvironmentImpl implements CourseEnvironment {
 		return course.getCourseFolderContainer();
 	}
 
+	@Override
+	public VFSContainer getCourseFolderContainer(CourseContainerOptions options) {
+		return course.getCourseFolderContainer(options);
+	}
+
 	@Override
 	public LocalFolderImpl getCourseBaseContainer() {
 		return course.getCourseBaseContainer();
diff --git a/src/main/java/org/olat/course/run/preview/PreviewCourseEnvironment.java b/src/main/java/org/olat/course/run/preview/PreviewCourseEnvironment.java
index 37a65b2b096..001afb5bc86 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewCourseEnvironment.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewCourseEnvironment.java
@@ -33,6 +33,7 @@ import org.olat.course.Structure;
 import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.config.CourseConfig;
+import org.olat.course.folder.CourseContainerOptions;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.run.environment.CourseEnvironment;
@@ -138,6 +139,11 @@ final class PreviewCourseEnvironment implements CourseEnvironment {
 	public VFSContainer getCourseFolderContainer() {
 		return courseFolderContainer;
 	}
+	
+	@Override
+	public VFSContainer getCourseFolderContainer(CourseContainerOptions options) {
+		return courseFolderContainer;
+	}
 
 	@Override
 	public LocalFolderImpl getCourseBaseContainer() {
-- 
GitLab