From d18713e1ad49f61aa7aa7beba92a2dcde2dd3c63 Mon Sep 17 00:00:00 2001
From: gnaegi <none@none>
Date: Fri, 21 Jul 2017 10:11:11 +0200
Subject: [PATCH] OO-2830 rename userproperty context on upgrade

---
 .../manager/MembersExportManager.java         |  4 +-
 .../ui/MembersDisplayRunController.java       |  3 +-
 .../org/olat/upgrade/OLATUpgrade_12_0_0.java  | 77 ++++++++++++++++++-
 3 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/olat/commons/memberlist/manager/MembersExportManager.java b/src/main/java/org/olat/commons/memberlist/manager/MembersExportManager.java
index d33b004e60f..efb5025e93f 100644
--- a/src/main/java/org/olat/commons/memberlist/manager/MembersExportManager.java
+++ b/src/main/java/org/olat/commons/memberlist/manager/MembersExportManager.java
@@ -25,12 +25,12 @@ import java.util.List;
 import java.util.Map;
 
 import org.olat.basesecurity.BaseSecurity;
+import org.olat.commons.memberlist.ui.MembersTableController;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.util.Util;
 import org.olat.course.nodes.members.Member;
-import org.olat.course.nodes.members.MembersCourseNodeRunController;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupService;
@@ -51,7 +51,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class MembersExportManager {
 	
-	public static final String USER_PROPS_ID = MembersCourseNodeRunController.class.getName();
+	public static final String USER_PROPS_ID = MembersTableController.class.getName();
 	
 	public static final int USER_PROPS_OFFSET = 500;
 	
diff --git a/src/main/java/org/olat/commons/memberlist/ui/MembersDisplayRunController.java b/src/main/java/org/olat/commons/memberlist/ui/MembersDisplayRunController.java
index 492f3b67eb7..bb2759ff1bf 100644
--- a/src/main/java/org/olat/commons/memberlist/ui/MembersDisplayRunController.java
+++ b/src/main/java/org/olat/commons/memberlist/ui/MembersDisplayRunController.java
@@ -33,7 +33,6 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.util.prefs.Preferences;
-import org.olat.course.nodes.members.MembersCourseNodeRunController;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.group.BusinessGroup;
 
@@ -44,7 +43,7 @@ import org.olat.group.BusinessGroup;
 public class MembersDisplayRunController extends BasicController {
 	// User property context ID's used in all the child controllers defined here 
 	static final String USER_PROPS_LIST_ID = MembersTableController.class.getName();
-	static final String USER_PROPS_PRINT_ID = MembersCourseNodeRunController.class.getName(); //MembersPrintController.class.getName(); //MembersCourseNodeRunController
+	static final String USER_PROPS_PRINT_ID = MembersPrintController.class.getName();
 	static final String USER_PROPS_AVATAR_ID = MembersAvatarDisplayRunController.class.getName();
 
 	private static final String GUIPREF_KEY_GROUPMEMBER = "groupmemberdisplay";
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java
index be32cc7b32c..ce7fa7090f3 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java
@@ -19,10 +19,18 @@
  */
 package org.olat.upgrade;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Properties;
 
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.util.WebappHelper;
 import org.olat.fileresource.types.BlogFileResource;
 import org.olat.fileresource.types.PodcastFileResource;
 import org.olat.modules.webFeed.manager.FeedManager;
@@ -40,6 +48,7 @@ public class OLATUpgrade_12_0_0 extends OLATUpgrade {
 
 	private static final String VERSION = "OLAT_12.0.0";
 	private static final String FEED_XML_TO_DB = "FEED XML TO DB";
+	private static final String USER_PROPERTY_CONTEXT_RENAME = "USER PROPERTY CONTEXT RENAME";
 	
 	@Autowired
 	private DB dbInstance;
@@ -71,8 +80,11 @@ public class OLATUpgrade_12_0_0 extends OLATUpgrade {
 		}
 		
 		boolean allOk = true;
+		// migrate all blogs and podcasts from xml to database data structure
 		allOk &= upgradeBlogXmlToDb(upgradeManager, uhd);
-
+		// rename a user property context name to a more suitable name
+		allOk &= changeUserPropertyContextName(upgradeManager, uhd);
+		
 		uhd.setInstallationComplete(allOk);
 		upgradeManager.setUpgradesHistory(uhd, VERSION);
 		if(allOk) {
@@ -106,5 +118,68 @@ public class OLATUpgrade_12_0_0 extends OLATUpgrade {
 		}
 		return allOk;
 	}
+	
+	/**
+	 * Copy existing user property configuration to the new user property
+	 * context handler name. The handler was renamed because it is now not only
+	 * used in the course but also in the group.
+	 * 
+	 * @param upgradeManager
+	 * @param uhd
+	 * @return
+	 */
+	private boolean changeUserPropertyContextName(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		boolean allOk = true;
+		if (!uhd.getBooleanDataValue(USER_PROPERTY_CONTEXT_RENAME)) {		
+			// Load configured properties from properties file		
+			String userDataDirectory = WebappHelper.getUserDataRoot();
+			File configurationPropertiesFile = Paths.get(userDataDirectory, "system", "configuration", "com.frentix.olat.admin.userproperties.UsrPropCfgManager.properties").toFile();
+			if (configurationPropertiesFile.exists()) {
+				InputStream is = null;
+				OutputStream fileStream = null;
+				try {
+					is = new FileInputStream(configurationPropertiesFile);
+					Properties configuredProperties = new Properties();
+					configuredProperties.load(is);
+					is.close();
+					boolean dirty = false;
+					// list of possible user property appendices
+					List<String> appendices = Arrays.asList("", "_hndl_", "_hndl_mandatory", "_hndl_usrreadonly", "_hndl_adminonly");
+					for (String appendix : appendices) {
+						String oldKey = "org.olat.course.nodes.members.MembersCourseNodeRunController" + appendix;
+						String existingConfig = configuredProperties.getProperty(oldKey);
+						String newKey = "org.olat.commons.memberlist.ui.MembersPrintController" + appendix;
+						String existingNewConfig = configuredProperties.getProperty(newKey);
+						if (existingConfig != null && existingNewConfig == null) {
+							configuredProperties.setProperty("org.olat.commons.memberlist.ui.MembersPrintController" + appendix, existingConfig);
+							dirty = true;
+							log.info("Migrated user property context handler config from::" + oldKey + " to::" + newKey);
+						}						
+					}
+					if (dirty) {
+						fileStream = new FileOutputStream(configurationPropertiesFile);
+						configuredProperties.store(fileStream, null);
+						// Flush and close before sending events to other nodes to make changes appear on other node
+						fileStream.flush();
+					}
+				} catch (Exception e) {
+					log.error("Error when reading / writing user properties config file from path::" + configurationPropertiesFile.getAbsolutePath(), e);
+					allOk &= false;
+				} finally {
+					try {
+						if (is != null ) is.close();
+						if (fileStream != null ) fileStream.close();
+					} catch (Exception e) {
+						log.error("Could not close stream after storing config to file::" + configurationPropertiesFile.getAbsolutePath(), e);
+						allOk &= false;
+					}
+				}
+			}
+			
+			uhd.setBooleanDataValue(USER_PROPERTY_CONTEXT_RENAME, allOk);
+			upgradeManager.setUpgradesHistory(uhd, VERSION);
+		}
+		return allOk;
+	}
 
 }
-- 
GitLab