From 4ebb9c06d162bfd9d7a5cb706441782caba8c40d Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 3 Nov 2014 11:59:21 +0100
Subject: [PATCH] OO-1263: add upgrader for system-wide and personal settings

---
 .../admin/user/tools/UserToolsModule.java     |  35 +++++
 .../gui/control/OlatTopNavController.java     |   3 +-
 .../gui/control/UserToolsMenuController.java  |   3 +-
 .../org/olat/gui/control/_content/menu.html   |  28 ++--
 .../org/olat/upgrade/OLATUpgrade_10_1_0.java  | 134 ++++++++++++++++++
 .../olat/upgrade/_spring/upgradeContext.xml   |   1 +
 .../org/olat/user/ToolsPrefsController.java   |   6 +-
 7 files changed, 191 insertions(+), 19 deletions(-)
 create mode 100644 src/main/java/org/olat/upgrade/OLATUpgrade_10_1_0.java

diff --git a/src/main/java/org/olat/admin/user/tools/UserToolsModule.java b/src/main/java/org/olat/admin/user/tools/UserToolsModule.java
index dfc698d28d7..ae2c823ed5d 100644
--- a/src/main/java/org/olat/admin/user/tools/UserToolsModule.java
+++ b/src/main/java/org/olat/admin/user/tools/UserToolsModule.java
@@ -29,8 +29,10 @@ import org.olat.core.extensions.ExtManager;
 import org.olat.core.extensions.Extension;
 import org.olat.core.extensions.ExtensionElement;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.WindowManager;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
+import org.olat.core.util.prefs.Preferences;
 import org.olat.home.HomeMainController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -76,6 +78,39 @@ public class UserToolsModule extends AbstractSpringModule {
 		init();
 	}
 	
+	public String getUserTools(Preferences prefs) {
+		String selectedToolV2s = (String)prefs.get(WindowManager.class, "user-tools-v2");
+		if(!StringHelper.containsNonWhitespace(selectedToolV2s)) {
+			String selectedTools = (String)prefs.get(WindowManager.class, "user-tools");
+			if(StringHelper.containsNonWhitespace(selectedTools)) {
+				//upgrade
+				
+				StringBuilder selectedToolSb = new StringBuilder(selectedTools);
+				String[] newPresets = new String[]{
+						"org.olat.home.HomeMainController:org.olat.gui.control.PrintUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.gui.control.HelpUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.instantMessaging.ui.ImpressumMainController"
+				};
+				
+				for(String newPreset:newPresets) {
+					if(selectedToolSb.indexOf(newPreset) < 0) {
+						if(selectedToolSb.length() > 0) selectedToolSb.append(",");
+						selectedToolSb.append(newPreset);
+					}
+				}
+				prefs.put(WindowManager.class, "user-tools-v2", selectedToolSb.toString());
+				prefs.save();
+				selectedToolV2s = selectedToolSb.toString();
+			}
+		}
+		return selectedToolV2s;
+	}
+	
+	public void setUserTools(Preferences prefs, String settings) {
+		prefs.put(WindowManager.class, "user-tools-v2", settings);
+		prefs.save();
+	}
+	
 	public List<UserToolExtension> getUserToolExtensions(UserRequest ureq) {
 		List<UserToolExtension> tools = new ArrayList<>();
 		if(!isUserToolsDisabled()) {
diff --git a/src/main/java/org/olat/gui/control/OlatTopNavController.java b/src/main/java/org/olat/gui/control/OlatTopNavController.java
index a3cf622d8c6..d7e99327bc1 100644
--- a/src/main/java/org/olat/gui/control/OlatTopNavController.java
+++ b/src/main/java/org/olat/gui/control/OlatTopNavController.java
@@ -30,7 +30,6 @@ import org.olat.admin.user.tools.UserToolsModule;
 import org.olat.core.dispatcher.DispatcherModule;
 import org.olat.core.extensions.ExtManager;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.WindowManager;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
@@ -121,7 +120,7 @@ public class OlatTopNavController extends BasicController {
 		List<Tool> toolSetLinksName = new ArrayList<Tool>();
 		
 		Preferences prefs = ureq.getUserSession().getGuiPreferences();
-		String selectedTools = (String)prefs.get(WindowManager.class, "user-tools");
+		String selectedTools = userToolsModule.getUserTools(prefs);
 		if(!StringHelper.containsNonWhitespace(selectedTools)) {
 			selectedTools = userToolsModule.getDefaultPresetOfUserTools();
 		}
diff --git a/src/main/java/org/olat/gui/control/UserToolsMenuController.java b/src/main/java/org/olat/gui/control/UserToolsMenuController.java
index 8f252f40201..61e48d9f253 100644
--- a/src/main/java/org/olat/gui/control/UserToolsMenuController.java
+++ b/src/main/java/org/olat/gui/control/UserToolsMenuController.java
@@ -30,7 +30,6 @@ import org.olat.admin.user.tools.UserToolExtension;
 import org.olat.admin.user.tools.UserToolsModule;
 import org.olat.basesecurity.AuthHelper;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.WindowManager;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Disposable;
@@ -79,7 +78,7 @@ public class UserToolsMenuController extends BasicController  {
 		List<String> systemLinksName = new ArrayList<String>();
 		
 		Preferences prefs = ureq.getUserSession().getGuiPreferences();
-		String selectedTools = (String)prefs.get(WindowManager.class, "user-tools");
+		String selectedTools = userToolsModule.getUserTools(prefs);
 		if(!StringHelper.containsNonWhitespace(selectedTools)) {
 			selectedTools = userToolsModule.getDefaultPresetOfUserTools();
 		}
diff --git a/src/main/java/org/olat/gui/control/_content/menu.html b/src/main/java/org/olat/gui/control/_content/menu.html
index 844aa364400..1a1856dce9c 100644
--- a/src/main/java/org/olat/gui/control/_content/menu.html
+++ b/src/main/java/org/olat/gui/control/_content/menu.html
@@ -3,19 +3,25 @@
 	#foreach($search in $searchs)
 	 	<li>$r.render($search)</li>
 	#end
-	<li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.tools")</li>
-	#foreach($personalTool in $personalTools)
-	 	<li>$r.render($personalTool)</li>
+	#if($personalTools.size() > 0)
+		<li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.tools")</li>
+		#foreach($personalTool in $personalTools)
+		 	<li>$r.render($personalTool)</li>
+		#end
 	#end
-	<li role="presentation" class="divider"></li>
-	<li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.configurations")</li>
-	#foreach($config in $configs)
-	 	<li>$r.render($config)</li>
+	#if($configs.size() > 0)
+		<li role="presentation" class="divider"></li>
+		<li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.configurations")</li>
+		#foreach($config in $configs)
+		 	<li>$r.render($config)</li>
+		#end
 	#end
-	<li role="presentation" class="divider"></li>
-	<li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.systems")</li>
-	#foreach($system in $systems)
-	 	<li>$r.render($system)</li>
+	#if($systems.size() > 0)
+		<li role="presentation" class="divider"></li>
+		<li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.systems")</li>
+		#foreach($system in $systems)
+		 	<li>$r.render($system)</li>
+		#end
 	#end
 	<li role="presentation" class="divider"></li>
 	<li>
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_10_1_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_10_1_0.java
new file mode 100644
index 00000000000..362b86f9207
--- /dev/null
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_10_1_0.java
@@ -0,0 +1,134 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.upgrade;
+
+import org.olat.admin.user.tools.UserToolsModule;
+import org.olat.core.commons.persistence.DB;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 27.02.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class OLATUpgrade_10_1_0 extends OLATUpgrade {
+	
+	private static final String TASK_USER_TOOLS = "Upgrade user tools";
+	private static final String VERSION = "OLAT_10.1.0";
+
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private UserToolsModule userToolsModule;
+
+	
+	public OLATUpgrade_10_1_0() {
+		super();
+	}
+
+	@Override
+	public String getVersion() {
+		return VERSION;
+	}
+	
+	@Override
+	public boolean doPreSystemInitUpgrade(UpgradeManager upgradeManager) {
+		return false;
+	}
+
+	@Override
+	public boolean doPostSystemInitUpgrade(UpgradeManager upgradeManager) {
+		UpgradeHistoryData uhd = upgradeManager.getUpgradesHistory(VERSION);
+		if (uhd == null) {
+			// has never been called, initialize
+			uhd = new UpgradeHistoryData();
+		} else if (uhd.isInstallationComplete()) {
+			return false;
+		}
+		
+		boolean allOk = true;
+		allOk &= upgradeUserTools(upgradeManager, uhd);
+
+		
+		uhd.setInstallationComplete(allOk);
+		upgradeManager.setUpgradesHistory(uhd, VERSION);
+		if(allOk) {
+			log.audit("Finished OLATUpgrade_10_1_0 successfully!");
+		} else {
+			log.audit("OLATUpgrade_10_1_0 not finished, try to restart OpenOLAT!");
+		}
+		return allOk;
+	}
+	
+	/**
+	 * Add the static tools to the configurable ones.
+	 * 
+	 * @param upgradeManager
+	 * @param uhd
+	 * @return
+	 */
+	private boolean upgradeUserTools(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		if (!uhd.getBooleanDataValue(TASK_USER_TOOLS)) {
+			try {
+				String tools = userToolsModule.getAvailableUserTools();
+				StringBuilder toolsSb = new StringBuilder(tools);
+				String[] defaultUserTools = new String[]{
+						"org.olat.home.HomeMainController:org.olat.gui.control.PrintUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.gui.control.SearchUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.gui.control.HelpUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.instantMessaging.ui.ImpressumMainController",
+						"org.olat.home.HomeMainController:org.olat.instantMessaging.ui.InstantMessagingMainController"
+				};
+				
+				for(String defaultUserTool:defaultUserTools) {
+					if(toolsSb.indexOf(defaultUserTool) < 0) {
+						if(toolsSb.length() > 0) toolsSb.append(",");
+						toolsSb.append(defaultUserTool);
+					}
+				}
+				userToolsModule.setAvailableUserTools(toolsSb.toString());
+
+				String defPreset = userToolsModule.getDefaultPresetOfUserTools();
+				StringBuilder defPresetSb = new StringBuilder(defPreset);
+				String[] defaultPresets = new String[]{
+						"org.olat.home.HomeMainController:org.olat.gui.control.PrintUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.gui.control.HelpUserToolExtension",
+						"org.olat.home.HomeMainController:org.olat.instantMessaging.ui.ImpressumMainController"
+				};
+				
+				for(String defaultPreset:defaultPresets) {
+					if(defPresetSb.indexOf(defaultPreset) < 0) {
+						if(defPresetSb.length() > 0) defPresetSb.append(",");
+						defPresetSb.append(defaultPreset);
+					}
+				}
+				userToolsModule.setDefaultPresetOfUserTools(defPresetSb.toString());
+
+				uhd.setBooleanDataValue(TASK_USER_TOOLS, false);
+				upgradeManager.setUpgradesHistory(uhd, VERSION);
+			} catch (Exception e) {
+				log.error("", e);
+				return false;
+			}
+		}
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
index 6aca92e0cda..1114906de85 100644
--- a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
+++ b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
@@ -42,6 +42,7 @@
 				<bean id="upgrade_9_4_0" class="org.olat.upgrade.OLATUpgrade_9_4_0"/>
 				<bean id="upgrade_10_0_0" class="org.olat.upgrade.OLATUpgrade_10_0_0"/>
 				<bean id="upgrade_10_0_3" class="org.olat.upgrade.OLATUpgrade_10_0_3"/>
+				<bean id="upgrade_10_1_0" class="org.olat.upgrade.OLATUpgrade_10_1_0"/>
 			</list>
 		</property>
 	</bean>
diff --git a/src/main/java/org/olat/user/ToolsPrefsController.java b/src/main/java/org/olat/user/ToolsPrefsController.java
index dedb09eabf4..efe020d08d0 100644
--- a/src/main/java/org/olat/user/ToolsPrefsController.java
+++ b/src/main/java/org/olat/user/ToolsPrefsController.java
@@ -28,7 +28,6 @@ import org.olat.admin.user.tools.UserToolExtension;
 import org.olat.admin.user.tools.UserToolsModule;
 import org.olat.core.extensions.ExtManager;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.WindowManager;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
@@ -153,7 +152,7 @@ public class ToolsPrefsController extends FormBasicController {
 	}
 
 	private void initPresetElementUserData() {
-		String selectedTools = (String)prefs.get(WindowManager.class, "user-tools");
+		String selectedTools = userToolsModule.getUserTools(prefs);
 		if(!StringHelper.containsNonWhitespace(selectedTools)) {
 			// use presets when user has not yet any values
 			selectedTools = userToolsModule.getDefaultPresetOfUserTools();
@@ -184,7 +183,6 @@ public class ToolsPrefsController extends FormBasicController {
 		} else {
 			sb.append("none");
 		}
-		prefs.put(WindowManager.class, "user-tools", sb.toString());
-		prefs.save();
+		userToolsModule.setUserTools(prefs, sb.toString());
 	}
 }
-- 
GitLab