From cc646f62afd047bc1aefad6174ed1074a5ae59bb Mon Sep 17 00:00:00 2001
From: gnaegi <none@none>
Date: Thu, 24 Jul 2014 15:17:55 +0200
Subject: [PATCH] OO-1148 put courses into semester term folders in WebDAV

---
 .../commons/services/webdav/WebDAVModule.java | 20 +++++++
 .../services/webdav/_spring/webdavContext.xml |  1 +
 .../webdav/ui/WebDAVAdminController.java      | 15 +++++-
 .../webdav/ui/_chelp/webdavconfig.html        |  1 +
 .../ui/_i18n/LocalStrings_de.properties       |  2 +
 .../ui/_i18n/LocalStrings_en.properties       |  3 ++
 .../course/CoursefolderWebDAVMergeSource.java | 53 +++++++++++++++++--
 .../resources/serviceconfig/olat.properties   |  3 ++
 8 files changed, 94 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/services/webdav/WebDAVModule.java b/src/main/java/org/olat/core/commons/services/webdav/WebDAVModule.java
index 1ac2b495046..ec0b089f5cd 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/WebDAVModule.java
+++ b/src/main/java/org/olat/core/commons/services/webdav/WebDAVModule.java
@@ -46,12 +46,14 @@ public class WebDAVModule extends AbstractOLATModule implements ConfigOnOff {
 	private static final String WEBDAV_ENABLED = "webdav.enabled";
 	private static final String WEBDAV_LINKS_ENABLED = "webdav.links.enabled";
 	private static final String DIGEST_AUTH_ENABLED = "auth.digest.enabled";
+	private static final String TERMS_FOLDERS_ENABLED = "webdav.termsfolders.enabled";
 	
 	private Map<String, WebDAVProvider> webdavProviders;
 
 	private boolean enabled;
 	private boolean linkEnabled;
 	private boolean digestAuthenticationEnabled;
+	private boolean termsFoldersEnabled;
 	
 	@Override
 	public void init() {
@@ -70,6 +72,12 @@ public class WebDAVModule extends AbstractOLATModule implements ConfigOnOff {
 		if(StringHelper.containsNonWhitespace(digestEnabledObj)) {
 			digestAuthenticationEnabled = "true".equals(digestEnabledObj);
 		}
+
+		String termsFoldersEnabledObj = getStringPropertyValue(TERMS_FOLDERS_ENABLED, true);
+		if(StringHelper.containsNonWhitespace(termsFoldersEnabledObj)) {
+			termsFoldersEnabled = "true".equals(termsFoldersEnabledObj);
+		}
+
 	}
 	
 	@Override
@@ -77,6 +85,7 @@ public class WebDAVModule extends AbstractOLATModule implements ConfigOnOff {
 		enabled = getBooleanConfigParameter(WEBDAV_ENABLED, true);
 		linkEnabled = getBooleanConfigParameter(WEBDAV_LINKS_ENABLED, true);
 		digestAuthenticationEnabled = getBooleanConfigParameter(DIGEST_AUTH_ENABLED, true);
+		termsFoldersEnabled = getBooleanConfigParameter(TERMS_FOLDERS_ENABLED, true);
 	}
 
 	@Override
@@ -116,6 +125,17 @@ public class WebDAVModule extends AbstractOLATModule implements ConfigOnOff {
 		String enabledStr = digestAuthenticationEnabled ? "true" : "false";
 		setStringProperty(DIGEST_AUTH_ENABLED, enabledStr, true);
 	}
+	
+
+	public void setTermsFoldersEnabled(boolean termsFoldersEnabled) {
+		String enabledStr = termsFoldersEnabled ? "true" : "false";
+		setStringProperty(TERMS_FOLDERS_ENABLED, enabledStr, true);
+	}
+
+	public boolean isTermsFoldersEnabled() {
+		return termsFoldersEnabled;
+	}
+
 
 	/**
 	 * Return an unmodifiable map
diff --git a/src/main/java/org/olat/core/commons/services/webdav/_spring/webdavContext.xml b/src/main/java/org/olat/core/commons/services/webdav/_spring/webdavContext.xml
index 08d76211879..d10b1624773 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/_spring/webdavContext.xml
+++ b/src/main/java/org/olat/core/commons/services/webdav/_spring/webdavContext.xml
@@ -32,6 +32,7 @@
 				webdav.enabled=${webdav.enabled}
 				webdav.links.enabled=${webdav.links.enabled}
 				auth.digest.enabled=${auth.digest.enabled}
+				webdav.termsfolders.enabled=${webdav.termsfolders.enabled}
 			</value>
 		</property>
 	</bean>
diff --git a/src/main/java/org/olat/core/commons/services/webdav/ui/WebDAVAdminController.java b/src/main/java/org/olat/core/commons/services/webdav/ui/WebDAVAdminController.java
index 71bb683a213..7093868a9c4 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/ui/WebDAVAdminController.java
+++ b/src/main/java/org/olat/core/commons/services/webdav/ui/WebDAVAdminController.java
@@ -37,7 +37,7 @@ import org.olat.core.gui.control.WindowControl;
  */
 public class WebDAVAdminController extends FormBasicController {
 	
-	private MultipleSelectionElement enableModuleEl, enableLinkEl, enableDigestEl;
+	private MultipleSelectionElement enableModuleEl, enableLinkEl, enableDigestEl, enableTermsFoldersEl;
 	private final WebDAVModule webDAVModule;
 	
 	public WebDAVAdminController(UserRequest ureq, WindowControl wControl) {
@@ -69,6 +69,15 @@ public class WebDAVAdminController extends FormBasicController {
 		enableDigestEl.select("xx", webDAVModule.isDigestAuthenticationEnabled());
 		enableDigestEl.addActionListener(FormEvent.ONCHANGE);
 		enableDigestEl.setEnabled(enabled);
+		
+		uifactory.addSpacerElement("spacer1", formLayout, false);
+		
+		enableTermsFoldersEl = uifactory.addCheckboxesHorizontal("webdavTermsFolders", "webdav.termsfolders", formLayout, new String[]{"xx"}, values);
+		enableTermsFoldersEl.select("xx", webDAVModule.isTermsFoldersEnabled());
+		enableTermsFoldersEl.addActionListener(FormEvent.ONCHANGE);
+		enableTermsFoldersEl.setEnabled(enabled);
+		
+		
 	}
 
 	@Override
@@ -83,12 +92,16 @@ public class WebDAVAdminController extends FormBasicController {
 			webDAVModule.setEnabled(enabled);
 			enableLinkEl.setEnabled(enabled);
 			enableDigestEl.setEnabled(enabled);
+			enableTermsFoldersEl.setEnabled(enabled);
 		} else if(source == enableLinkEl) {
 			boolean enabled = enableLinkEl.isAtLeastSelected(1);
 			webDAVModule.setLinkEnabled(enabled);
 		} else if(source == enableDigestEl) {
 			boolean enabled = enableDigestEl.isAtLeastSelected(1);
 			webDAVModule.setDigestAuthenticationEnabled(enabled);
+		} else if(source == enableTermsFoldersEl) {
+			boolean enabled = enableTermsFoldersEl.isAtLeastSelected(1);
+			webDAVModule.setTermsFoldersEnabled(enabled);
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/core/commons/services/webdav/ui/_chelp/webdavconfig.html b/src/main/java/org/olat/core/commons/services/webdav/ui/_chelp/webdavconfig.html
index c55b27c4836..6770dbb7117 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/ui/_chelp/webdavconfig.html
+++ b/src/main/java/org/olat/core/commons/services/webdav/ui/_chelp/webdavconfig.html
@@ -22,6 +22,7 @@
 	<li><b>$r.translate("webdav.module")</b><br />$r.translate("chelp.webdav.module")</li>
 	<li><b>$r.translate("webdav.link")</b><br />$r.translate("chelp.webdav.link")</li>
 	<li><b>$r.translate("webdav.digest")</b><br />$r.translate("chelp.webdav.digest")</li>
+	<li><b>$r.translate("webdav.termsfolders")</b><br />$r.translate("chelp.webdav.termsfolders")</li>
 
 </ul>
 <p class="o_important">
diff --git a/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_de.properties
index bc61a4efaf3..4ed8e6b5842 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_de.properties
@@ -7,6 +7,7 @@ chelp.webdav.digest.disclaimer=Die Digest-Authentication Verschl\u00FCsselung ve
 chelp.webdav.link=Unabh\u00E4ngig von der WebDAV Funktion k\u00F6nnen Sie entscheiden ob die WebDAV URL in der Ordnerkomponente angezeigt werden soll oder nicht. Wenn diese Funktion ausgeschaltet ist kann WebDAV immer noch verwendet werden, es wird lediglich der Link nicht angezeigt.
 chelp.webdav.module=Schalten Sie den WebDAV Zugang systemweit ein oder aus. Wenn das Modul eingeschaltet ist k\u00F6nnen alle OpenOLAT Benutzer das System \u00FCber WebDAV nutzen (empfohlen).
 chelp.webdav.more=Weitere Informationen zur Anwendung von WebDAV in OpenOLAT\: 
+chelp.webdav.termsfolders=Aktivieren Sie diese Option um für jedes Semester einen Unterordner zu erstellen der alle Kurses dieses Semesters enthält. Diese Option erhöht die Nutzbarkeit bei vielen Kursen. 
 chelp.webdav.usage=Verwendung
 chelp.webdavconfig.intro=Das WebDAV Modul kann f\u00FCr das gesamte OpenOLAT System ein- oder ausgeschaltet werden. Die folgenden Konfigurationen k\u00F6nnen vorgenommen werden\:
 chelp.webdavconfig.title=WebDAV Modulkonfiguration
@@ -16,3 +17,4 @@ webdav.digest=Digest Authentication bei HTTP Zugang verwenden
 webdav.link=WebDAV Links anzeigen
 webdav.module=WebDAV Zugang
 webdav.on=ein
+webdav.termsfolders=Kurse nach Semesterdaten gruppieren
diff --git a/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_en.properties
index 37f95254f03..e7f3ad82c50 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/commons/services/webdav/ui/_i18n/LocalStrings_en.properties
@@ -7,6 +7,7 @@ chelp.webdav.digest.disclaimer=The Digest Authentication method does not use str
 chelp.webdav.link=Decide if the WebDAV URL is displayed in the folder component or not. This is independent of the the WebDAV access. When disabled, WebDAV can still be used but the WebDAV link must be known by users as it is not displayed in the web interface.
 chelp.webdav.module=Enable or disable the WebDAV access. When enabled, all system users can access their OpenOLAT folder using WebDAV (recommended).
 chelp.webdav.more=More information about WebDAV usage in OpenOLAT
+chelp.webdav.termsfolders=Enable this flag to list the available semester terms first and within a semester term only the courses from this term. This greatly improves usability with many courses.
 chelp.webdav.usage=Usage
 chelp.webdavconfig.intro=The WebDAV module can be enabled/disabled system wide. The following parameters can be configured
 chelp.webdavconfig.title=WebDAV module configuration
@@ -16,3 +17,5 @@ webdav.digest=Digest Authentication for HTTP access
 webdav.link=Show WebDAV links
 webdav.module=WebDAV access
 webdav.on=enabled
+webdav.termsfolders=Group courses by semester terms
+
diff --git a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
index 6f42055cfe9..49907ab320f 100644
--- a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
+++ b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
@@ -20,15 +20,21 @@
 package org.olat.course;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.services.webdav.WebDAVModule;
 import org.olat.core.commons.services.webdav.manager.WebDAVMergeSource;
 import org.olat.core.commons.services.webdav.servlets.RequestUtil;
 import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.VirtualContainer;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.model.RepositoryEntryLifecycle;
 
 /**
  * This WebDAV provider delivery all folders in courses where the user
@@ -36,8 +42,7 @@ import org.olat.repository.RepositoryManager;
  * 
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {
-	
+class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {	
 	public CoursefolderWebDAVMergeSource(Identity identity) {
 		super(identity);
 	}
@@ -47,12 +52,54 @@ class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {
 		RepositoryManager rm = RepositoryManager.getInstance();
 		List<RepositoryEntry> courseEntries = rm.queryByEditor(getIdentity(), CourseModule.getCourseTypeName());
 		List<VFSContainer> containers = new ArrayList<>();
+		
+		Map<String, VFSContainer> terms = null;
+		VirtualContainer noTermContainer = null;
+		
+		WebDAVModule webDAVModule = CoreSpringFactory.getImpl(WebDAVModule.class);
+		boolean useTerms = webDAVModule.isTermsFoldersEnabled();
+		if (useTerms) {
+			// prepare no-terms folder for all resources without semester term info or private date
+			terms = new HashMap<String, VFSContainer>();
+			noTermContainer = new VirtualContainer("other");
+		}
+		
 		// Add all found repo entries to merge source
 		for (RepositoryEntry re:courseEntries) {
 			String courseTitle = RequestUtil.normalizeFilename(re.getDisplayname());
 			NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(courseTitle, re.getOlatResource());
-			addContainerToList(cfContainer, containers);
+			
+			if (useTerms) {
+				RepositoryEntryLifecycle lc = re.getLifecycle();
+				if (lc != null && !lc.isPrivateCycle()) {
+					// when a semester term info is found, add it to corresponding term folder
+					String termSoftKey = lc.getSoftKey();
+					VFSContainer termContainer = terms.get(termSoftKey);
+					if (termContainer == null) {
+						// folder for this semester term does not yet exist, create one and add to map
+						String normalizedKey = RequestUtil.normalizeFilename(termSoftKey);
+						termContainer = new VirtualContainer(normalizedKey);
+						terms.put(termSoftKey, termContainer);
+						addContainerToList(termContainer, containers);
+					}
+					termContainer.getItems().add(cfContainer);
+				} else {
+					// no semester term found, add to no-term folder
+					noTermContainer.getItems().add(cfContainer);
+				
+				}
+			} else {
+				addContainerToList(cfContainer, containers);				
+			}
 		}
+
+		if (useTerms) {
+			// add no-terms folder if any have been found
+			if (noTermContainer.getItems().size() > 0) {
+				addContainerToList(noTermContainer, containers);
+			}
+		}
+
 		return containers;
 	}
 }
\ No newline at end of file
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index e8487a248fb..8d8a4d82dc4 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -438,6 +438,9 @@ webdav.enabled=true
 #webdav manager (show or don't webdav links in GUI)
 webdav.links.enabled=true
 auth.digest.enabled=true
+#sort courses using semester terms for better discoverability. Only 
+#usefull when semester terms are defined in admin area and used by courses 
+webdav.termsfolders.enabled=true
 
 ########################################################################
 # Image and PDF scale/thumbnail options
-- 
GitLab