From 7675ae18976dbfeee499fee79037a12eb84a85e0 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Wed, 10 Jul 2019 14:56:45 +0200
Subject: [PATCH] OO-4142: Change weight of a used question except if it used
 in manual scouring course element

---
 .../course/nodes/ms/MSConfigController.java   |   3 +-
 .../org/olat/course/nodes/ms/MSService.java   |   7 +-
 .../nodes/ms/manager/MSServiceImpl.java       |  24 +++--
 .../modules/forms/EvaluationFormManager.java  |   2 +
 .../forms/handler/AllHandlerPageProvider.java |   2 +-
 .../forms/handler/EvaluationFormHandler.java  |   5 +-
 .../modules/forms/handler/RubricHandler.java  |   6 +-
 .../manager/EvaluationFormManagerImpl.java    |   7 ++
 .../manager/EvaluationFormSurveyDAO.java      |  20 ++++
 .../ui/EvaluationFormEditorController.java    |   7 +-
 .../forms/ui/RubricEditorController.java      |   7 +-
 .../org/olat/upgrade/OLATUpgrade_14_1_0.java  | 102 ++++++++++++++++++
 .../olat/upgrade/_spring/upgradeContext.xml   |   1 +
 .../manager/EvaluationFormSurveyDAOTest.java  |  18 ++++
 14 files changed, 190 insertions(+), 21 deletions(-)
 create mode 100644 src/main/java/org/olat/upgrade/OLATUpgrade_14_1_0.java

diff --git a/src/main/java/org/olat/course/nodes/ms/MSConfigController.java b/src/main/java/org/olat/course/nodes/ms/MSConfigController.java
index 1778ce1cb04..3f183935426 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSConfigController.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSConfigController.java
@@ -46,7 +46,6 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
-import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.StringHelper;
 import org.olat.course.ICourse;
 import org.olat.course.nodes.MSCourseNode;
@@ -97,7 +96,7 @@ public class MSConfigController extends FormBasicController {
 	private LayoutMain3ColsPreviewController previewCtr;
 	
 	private final ModuleConfiguration config;
-	private final OLATResourceable ores;
+	private final RepositoryEntry ores;
 	private final String nodeIdent;
 	private RepositoryEntry formEntry;
 	private MinMax formMinMax;
diff --git a/src/main/java/org/olat/course/nodes/ms/MSService.java b/src/main/java/org/olat/course/nodes/ms/MSService.java
index 9a4e8320972..4990ab5d565 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSService.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSService.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import java.util.function.Function;
 
 import org.olat.core.id.Identity;
-import org.olat.core.id.OLATResourceable;
 import org.olat.modules.forms.EvaluationFormSession;
 import org.olat.modules.forms.EvaluationFormSessionRef;
 import org.olat.modules.forms.EvaluationFormSessionStatus;
@@ -41,6 +40,8 @@ import org.olat.repository.RepositoryEntry;
  */
 public interface MSService {
 	
+	String SURVEY_ORES_TYPE_NAME = "course-ms";
+
 	EvaluationFormSession getOrCreateSession(RepositoryEntry formEntry, RepositoryEntry ores, String nodeIdent,
 			Identity assessedIdentity, AuditEnv auditEnv);
 
@@ -53,9 +54,9 @@ public interface MSService {
 
 	EvaluationFormSession reopenSession(EvaluationFormSession session, AuditEnv auditEnv);
 
-	boolean hasSessions(OLATResourceable ores, String nodeIdent);
+	boolean hasSessions(RepositoryEntry ores, String nodeIdent);
 	
-	List<EvaluationFormSession> getSessions(OLATResourceable ores, String nodeIdent);
+	List<EvaluationFormSession> getSessions(RepositoryEntry ores, String nodeIdent);
 	
 	void deleteSession(RepositoryEntry ores, String nodeIdent, Identity assessedIdentity, AuditEnv auditEnv);
 
diff --git a/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java b/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java
index c123ccc591c..57afd01b8eb 100644
--- a/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java
+++ b/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java
@@ -32,6 +32,7 @@ import java.util.stream.Collectors;
 
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.nodes.ms.AuditEnv;
 import org.olat.course.nodes.ms.MSService;
@@ -88,7 +89,16 @@ public class MSServiceImpl implements MSService {
 
 	private EvaluationFormSurveyIdentifier getSurveyIdentitfier(RepositoryEntry ores, String nodeIdent,
 			Identity assessedIdentity) {
-		return of(ores, nodeIdent, assessedIdentity.getKey().toString());
+		OLATResourceable msOres = getMsOlatResourceable(ores);
+		return of(msOres, nodeIdent, assessedIdentity.getKey().toString());
+	}
+
+	private EvaluationFormSurveyIdentifier getSurveysIdentifier(RepositoryEntry ores, String nodeIdent) {
+		return of(getMsOlatResourceable(ores), nodeIdent);
+	}
+
+	private OLATResourceable getMsOlatResourceable(RepositoryEntry ores) {
+		return OresHelper.createOLATResourceableInstance(SURVEY_ORES_TYPE_NAME, ores.getKey());
 	}
 	
 	private EvaluationFormSurvey loadOrCreateSurvey(RepositoryEntry formEntry, EvaluationFormSurveyIdentifier surveyIdent) {
@@ -147,13 +157,13 @@ public class MSServiceImpl implements MSService {
 	}
 
 	@Override
-	public boolean hasSessions(OLATResourceable ores, String nodeIdent) {
-		return !evaluationFormManager.loadSurveys(of(ores, nodeIdent)).isEmpty();
+	public boolean hasSessions(RepositoryEntry ores, String nodeIdent) {
+		return !evaluationFormManager.loadSurveys(getSurveysIdentifier(ores, nodeIdent)).isEmpty();
 	}
 
 	@Override
-	public List<EvaluationFormSession> getSessions(OLATResourceable ores, String nodeIdent) {
-		SessionFilter filter = SessionFilterFactory.create(of(ores, nodeIdent));
+	public List<EvaluationFormSession> getSessions(RepositoryEntry ores, String nodeIdent) {
+		SessionFilter filter = SessionFilterFactory.create(getSurveysIdentifier(ores, nodeIdent));
 		return evaluationFormManager.loadSessionsFiltered(filter, 0, -1);
 	}
 
@@ -167,7 +177,7 @@ public class MSServiceImpl implements MSService {
 
 	@Override
 	public void deleteSessions(RepositoryEntry ores, String nodeIdent) {
-		List<EvaluationFormSurvey> surveys = evaluationFormManager.loadSurveys(of(ores, nodeIdent));
+		List<EvaluationFormSurvey> surveys = evaluationFormManager.loadSurveys(getSurveysIdentifier(ores, nodeIdent));
 		for (EvaluationFormSurvey survey : surveys) {
 			evaluationFormManager.deleteSurvey(survey);
 		}
@@ -205,7 +215,7 @@ public class MSServiceImpl implements MSService {
 					.flatMap(r -> r.getSliders().stream())
 					.map(Slider::getId)
 					.collect(Collectors.toList());
-			SessionFilter filter = SessionFilterFactory.create(of(ores, nodeIdent));
+			SessionFilter filter = SessionFilterFactory.create(getSurveysIdentifier(ores, nodeIdent));
 			List<EvaluationFormResponse> responses = evaluationFormManager.getResponses(responseIdentifiers, filter , Limit.all());
 			Map<EvaluationFormSession, List<EvaluationFormResponse>> sessionToResponses = responses.stream()
 					.collect(Collectors.groupingBy(EvaluationFormResponse::getSession));
diff --git a/src/main/java/org/olat/modules/forms/EvaluationFormManager.java b/src/main/java/org/olat/modules/forms/EvaluationFormManager.java
index 815a83ce53b..32bb2666882 100644
--- a/src/main/java/org/olat/modules/forms/EvaluationFormManager.java
+++ b/src/main/java/org/olat/modules/forms/EvaluationFormManager.java
@@ -212,6 +212,8 @@ public interface EvaluationFormManager {
 	 * @return
 	 */
 	public boolean isEvaluationFormActivelyUsed(RepositoryEntryRef formEntry);
+
+	public boolean isEvaluationFormWeightActivelyUsed(RepositoryEntryRef formEntry);
 	
 	public EvaluationFormStatistic getSessionsStatistic(SessionFilter filter);
 	
diff --git a/src/main/java/org/olat/modules/forms/handler/AllHandlerPageProvider.java b/src/main/java/org/olat/modules/forms/handler/AllHandlerPageProvider.java
index 21ed46f8a85..453b7d730a3 100644
--- a/src/main/java/org/olat/modules/forms/handler/AllHandlerPageProvider.java
+++ b/src/main/java/org/olat/modules/forms/handler/AllHandlerPageProvider.java
@@ -47,7 +47,7 @@ public class AllHandlerPageProvider implements PageProvider {
 		handlers.add(new HTMLParagraphHandler());
 		handlers.add(new ImageHandler(storage));
 		handlers.add(new TableHandler());
-		handlers.add(new RubricHandler(false));
+		handlers.add(new RubricHandler(false, false));
 		handlers.add(new TextInputHandler(false));
 		handlers.add(new FileUploadHandler(false));
 		handlers.add(new SingleChoiceHandler(false));
diff --git a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java
index 582f6e4f263..3dcc60ff3e9 100644
--- a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java
+++ b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java
@@ -34,6 +34,7 @@ import java.nio.file.attribute.BasicFileAttributes;
 import java.util.Locale;
 import java.util.Map;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.gui.UserRequest;
@@ -50,7 +51,6 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.PathUtils;
@@ -283,12 +283,13 @@ public class EvaluationFormHandler implements RepositoryHandler {
 		
 		//if in use -> edition is restricted
 		boolean restrictedEdit = evaluationFormManager.isEvaluationFormActivelyUsed(re);
+		boolean restrictedEditWeight = evaluationFormManager.isEvaluationFormWeightActivelyUsed(re);
 		if(restrictedEdit) {
 			Translator translator = Util.createPackageTranslator(EvaluationFormRuntimeController.class, ureq.getLocale());
 			toolbar.setMessage(translator.translate("evaluation.form.in.use"));
 			toolbar.setMessageCssClass("o_warning");
 		}
-		return new EvaluationFormEditorController(ureq, control, formFile, storage, restrictedEdit);
+		return new EvaluationFormEditorController(ureq, control, formFile, storage, restrictedEdit, restrictedEditWeight);
 	}
 	
 	public File getFormFile(RepositoryEntry re) {
diff --git a/src/main/java/org/olat/modules/forms/handler/RubricHandler.java b/src/main/java/org/olat/modules/forms/handler/RubricHandler.java
index 746f3fdca58..c5198d3f122 100644
--- a/src/main/java/org/olat/modules/forms/handler/RubricHandler.java
+++ b/src/main/java/org/olat/modules/forms/handler/RubricHandler.java
@@ -52,9 +52,11 @@ import org.olat.modules.forms.ui.model.ExecutionIdentity;
 public class RubricHandler implements EvaluationFormElementHandler, SimpleAddPageElementHandler {
 	
 	private final boolean restrictedEdit;
+	private final boolean restrictedEditWheight;
 	
-	public RubricHandler(boolean restrictedEdit) {
+	public RubricHandler(boolean restrictedEdit, boolean restrictedEditWheight) {
 		this.restrictedEdit = restrictedEdit;
+		this.restrictedEditWheight = restrictedEditWheight;
 	}
 
 	@Override
@@ -84,7 +86,7 @@ public class RubricHandler implements EvaluationFormElementHandler, SimpleAddPag
 	@Override
 	public Controller getEditor(UserRequest ureq, WindowControl wControl, PageElement element) {
 		if(element instanceof Rubric) {
-			return new RubricEditorController(ureq, wControl, (Rubric)element, restrictedEdit);
+			return new RubricEditorController(ureq, wControl, (Rubric)element, restrictedEdit, restrictedEditWheight);
 		}
 		return null;
 	}
diff --git a/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java b/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java
index 63525f4de0c..f4bf6f7163e 100644
--- a/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java
+++ b/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java
@@ -38,6 +38,7 @@ import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.xml.XStreamHelper;
+import org.olat.course.nodes.ms.MSService;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.modules.ceditor.DataStorage;
 import org.olat.modules.forms.EvaluationFormManager;
@@ -453,6 +454,12 @@ public class EvaluationFormManagerImpl implements EvaluationFormManager {
 		return evaluationFormSessionDao.hasSessions(formEntry);
 	}
 
+	@Override
+	public boolean isEvaluationFormWeightActivelyUsed(RepositoryEntryRef formEntry) {
+		// Improve this by declaring and implementing providers
+		return evaluationFormSurveyDao.hasSurvey(formEntry, MSService.SURVEY_ORES_TYPE_NAME);
+	}
+	
 	@Override
 	public EvaluationFormStatistic getSessionsStatistic(SessionFilter filter) {
 		EvaluationFormStatistic statistic = new EvaluationFormStatistic();
diff --git a/src/main/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAO.java b/src/main/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAO.java
index 9f950f64df9..f65dca97850 100644
--- a/src/main/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAO.java
+++ b/src/main/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAO.java
@@ -33,6 +33,7 @@ import org.olat.modules.forms.EvaluationFormSurvey;
 import org.olat.modules.forms.EvaluationFormSurveyRef;
 import org.olat.modules.forms.model.jpa.EvaluationFormSurveyImpl;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryRef;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -114,6 +115,25 @@ class EvaluationFormSurveyDAO {
 		return query.getResultList();
 	}
 
+	boolean hasSurvey(RepositoryEntryRef formEntrRef, String oresTypeName) {
+		if (formEntrRef == null) return false;
+		
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("select survey.key");
+		sb.append("  from evaluationformsurvey as survey");
+		sb.and().append("survey.formEntry.key = :formEntryKey");
+		sb.and().append("survey.resName = :oresTypeName");
+		
+		List<Long> keys = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Long.class)
+				.setParameter("formEntryKey", formEntrRef.getKey())
+				.setParameter("oresTypeName", oresTypeName)
+				.setFirstResult(0)
+				.setMaxResults(1)
+				.getResultList();
+		return keys == null || keys.isEmpty() || keys.get(0) == null ? false : true;
+	}
+
 	void delete(EvaluationFormSurveyRef survey) {
 		if (survey == null) return;	
 
diff --git a/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java b/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java
index fa52c4a7300..44e49285c5c 100644
--- a/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java
@@ -71,14 +71,17 @@ public class EvaluationFormEditorController extends BasicController {
 	private final DataStorage storage;
 	private boolean changes = false;
 	private final boolean restrictedEdit;
+	private final boolean restrictedEditWeight;
 	
 	private PageEditorController pageEditCtrl;
 	
-	public EvaluationFormEditorController(UserRequest ureq, WindowControl wControl, File formFile, DataStorage storage, boolean restrictedEdit) {
+	public EvaluationFormEditorController(UserRequest ureq, WindowControl wControl, File formFile, DataStorage storage,
+			boolean restrictedEdit, boolean restrictedEditWeight) {
 		super(ureq, wControl);
 		this.formFile = formFile;
 		this.storage = storage;
 		this.restrictedEdit = restrictedEdit;
+		this.restrictedEditWeight = restrictedEditWeight;
 		if(formFile.exists()) {
 			form = (Form)XStreamHelper.readObject(FormXStream.getXStream(), formFile);
 		} else {
@@ -146,7 +149,7 @@ public class EvaluationFormEditorController extends BasicController {
 			ImageHandler imageHandler = new ImageHandler(storage);
 			handlers.add(imageHandler);
 			// handler for rubric
-			RubricHandler rubricHandler = new RubricHandler(restrictedEdit);
+			RubricHandler rubricHandler = new RubricHandler(restrictedEdit, restrictedEditWeight);
 			handlers.add(rubricHandler);
 			// handler for text input
 			TextInputHandler textInputHandler = new TextInputHandler(restrictedEdit);
diff --git a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
index 88413c8a328..ee9eee8273f 100644
--- a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
@@ -82,6 +82,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 	private final Rubric rubric;
 	private boolean editMode = false;
 	private final boolean restrictedEdit;
+	private final boolean restrictedEditWeight;
 	private RubricController rubricCtrl;
 	
 	private final String[] nameDisplayKeys = new String[] { NameDisplay.execution.name(), NameDisplay.report.name() };
@@ -116,10 +117,12 @@ public class RubricEditorController extends FormBasicController implements PageE
 	private FormLink hideEndButton;
 	private FormLayoutContainer settingsLayout;
 
-	public RubricEditorController(UserRequest ureq, WindowControl wControl, Rubric rubric, boolean restrictedEdit) {
+	public RubricEditorController(UserRequest ureq, WindowControl wControl, Rubric rubric, boolean restrictedEdit,
+			boolean restrictedEditWeight) {
 		super(ureq, wControl, "rubric_editor");
 		this.rubric = rubric;
 		this.restrictedEdit = restrictedEdit;
+		this.restrictedEditWeight = restrictedEditWeight;
 		this.showEnd = initShowEnd();
 
 		initForm(ureq);
@@ -494,7 +497,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 		TextElement weightEl = uifactory.addTextElement("weight" + count.incrementAndGet(), 4, weight, flc);
 		weightEl.setElementCssClass("o_slider_weight");
 		weightEl.setExampleKey("slider.weight", null);
-		weightEl.setEnabled(!restrictedEdit);
+		weightEl.setEnabled(!restrictedEditWeight);
 		
 		SliderRow row = new SliderRow(slider, startLabelEl, endLabelEl, weightEl, createSliderEl());
 		if(!restrictedEdit) {FormLink deleteButton = uifactory.addFormLink("del." + count.incrementAndGet(), "delete_slider", "", null, flc, Link.BUTTON | Link.NONTRANSLATED);
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_14_1_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_14_1_0.java
new file mode 100644
index 00000000000..4e2d14277e9
--- /dev/null
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_14_1_0.java
@@ -0,0 +1,102 @@
+/**
+ * <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.apache.logging.log4j.Logger;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.logging.Tracing;
+import org.olat.course.nodes.ms.MSService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 10 Jul 2019<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class OLATUpgrade_14_1_0 extends OLATUpgrade {
+
+	private static final Logger log = Tracing.createLoggerFor(OLATUpgrade_14_1_0.class);
+	
+	private static final String VERSION = "OLAT_14.1.0";
+	private static final String SET_MS_ORES_TYPE_NAME = "SET MS ORES TYPE NAME";
+	
+	@Autowired
+	private DB dbInstance;
+	
+	public OLATUpgrade_14_1_0() {
+		super();
+	}
+	
+	@Override
+	public String getVersion() {
+		return VERSION;
+	}
+
+	@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 &= migrateMsOresTypeName(upgradeManager, uhd);
+
+		uhd.setInstallationComplete(allOk);
+		upgradeManager.setUpgradesHistory(uhd, VERSION);
+		if(allOk) {
+			log.info(Tracing.M_AUDIT, "Finished OLATUpgrade_14_1_0 successfully!");
+		} else {
+			log.info(Tracing.M_AUDIT, "OLATUpgrade_14_1_0 not finished, try to restart OpenOlat!");
+		}
+		return allOk;
+	}
+	
+	
+	private boolean migrateMsOresTypeName(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		boolean allOk = true;
+		if (!uhd.getBooleanDataValue(SET_MS_ORES_TYPE_NAME)) {
+			try {
+				StringBuilder sb = new StringBuilder();
+				sb.append("update evaluationformsurvey as survey");
+				sb.append("   set survey.resName='").append(MSService.SURVEY_ORES_TYPE_NAME).append("'");
+				sb.append(" where survey.resSubident2 is not null");
+				
+				dbInstance.getCurrentEntityManager()
+						.createQuery(sb.toString())
+						.executeUpdate();
+				dbInstance.commitAndCloseSession();
+				log.info("Survey resName of ms course nodes migrated.");
+			} catch (Exception e) {
+				log.error("", e);
+				allOk = false;
+			}
+			
+			uhd.setBooleanDataValue(SET_MS_ORES_TYPE_NAME, allOk);
+			upgradeManager.setUpgradesHistory(uhd, VERSION);
+		}
+		return allOk;
+	}
+	
+}
diff --git a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
index 4a6c31514dc..4d5aad4be56 100644
--- a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
+++ b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
@@ -50,6 +50,7 @@
 				<bean id="upgrade_13_2_4" class="org.olat.upgrade.OLATUpgrade_13_2_4"/>
 				<bean id="upgrade_13_2_8" class="org.olat.upgrade.OLATUpgrade_13_2_8"/>
 				<bean id="upgrade_14_0_0" class="org.olat.upgrade.OLATUpgrade_14_0_0"/>
+				<bean id="upgrade_14_1_0" class="org.olat.upgrade.OLATUpgrade_14_1_0"/>
 			</list>
 		</property>
 	</bean>
diff --git a/src/test/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAOTest.java b/src/test/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAOTest.java
index 8b69c0a6cae..29153fb7e31 100644
--- a/src/test/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAOTest.java
+++ b/src/test/java/org/olat/modules/forms/manager/EvaluationFormSurveyDAOTest.java
@@ -20,6 +20,7 @@
 package org.olat.modules.forms.manager;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.olat.test.JunitTestHelper.random;
 
 import java.util.List;
 import java.util.UUID;
@@ -29,6 +30,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.modules.forms.EvaluationFormSurvey;
 import org.olat.modules.forms.EvaluationFormSurveyRef;
 import org.olat.repository.RepositoryEntry;
@@ -145,6 +147,22 @@ public class EvaluationFormSurveyDAOTest extends OlatTestCase {
 				);
 	}
 	
+	@Test
+	public void shouldCheckIfSurveyOfOresTypeName() {
+		RepositoryEntry formEntry = evaTestHelper.createFormEntry();
+		String resNameA = random();
+		OLATResourceable oresA = OresHelper.createOLATResourceableInstance(resNameA, Long.valueOf(1));
+		String subIdentA1 = UUID.randomUUID().toString();
+		sut.createSurvey(oresA, subIdentA1, null, formEntry, null);
+		dbInstance.commitAndCloseSession();
+		
+		boolean hasSurvey = sut.hasSurvey(formEntry, resNameA);
+		assertThat(hasSurvey).isTrue();
+		
+		hasSurvey = sut.hasSurvey(formEntry, random());
+		assertThat(hasSurvey).isFalse();
+	}
+	
 	@Test
 	public void shouldDeleteSurvey() {
 		OLATResourceable ores = JunitTestHelper.createRandomResource();
-- 
GitLab