From 6d9ca0d7e8aa3a19e20daaf7f377682c70937a93 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Wed, 8 Aug 2018 16:46:20 +0200
Subject: [PATCH] OO-3303: Add references between evaluation form resource and
 quality data collection to avoid deletion of used evaluation form resources

---
 .../quality/manager/QualityServiceImpl.java   | 20 ++++++++++++++++
 .../ui/_i18n/LocalStrings_en.properties       |  2 +-
 .../_i18n/LocalStrings_de.properties          |  1 +
 .../_i18n/LocalStrings_en.properties          |  1 +
 .../ui/author/AuthorListController.java       | 11 ++++++++-
 .../ConfirmDeletePermanentlyController.java   |  2 +-
 .../ui/author/_content/references.html        | 17 ++++++++++----
 .../resource/references/ReferenceManager.java | 23 +++++++++++++++++--
 8 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java
index d63ab78aaf0..9af3287041e 100644
--- a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java
+++ b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java
@@ -63,6 +63,9 @@ import org.olat.modules.quality.QualityReminderType;
 import org.olat.modules.quality.QualityService;
 import org.olat.modules.taxonomy.TaxonomyLevelRef;
 import org.olat.repository.RepositoryEntry;
+import org.olat.resource.OLATResourceManager;
+import org.olat.resource.references.Reference;
+import org.olat.resource.references.ReferenceManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -97,11 +100,17 @@ public class QualityServiceImpl implements QualityService, OrganisationDataDelet
 	private QualityMailing qualityMailing;
 	@Autowired
 	private EvaluationFormManager evaluationFormManager;
+	@Autowired
+	private OLATResourceManager resourceManager;
+	@Autowired
+	private ReferenceManager referenceManager;
 	
 	@Override
 	public QualityDataCollection createDataCollection(RepositoryEntry formEntry) {
 		QualityDataCollection dataCollection = dataCollectionDao.createDataCollection();
 		evaluationFormManager.createSurvey(dataCollection, null, formEntry);
+		resourceManager.findOrPersistResourceable(dataCollection);
+		referenceManager.addReference(dataCollection, formEntry.getOlatResource(), null);
 		return dataCollection;
 	}
 
@@ -167,6 +176,8 @@ public class QualityServiceImpl implements QualityService, OrganisationDataDelet
 		}
 		EvaluationFormSurvey survey = evaluationFormManager.loadSurvey(dataCollection, null);
 		evaluationFormManager.deleteSurvey(survey);
+		deleteReferences(dataCollection);
+		resourceManager.deleteOLATResourceable(dataCollection);
 		dataCollectionDao.deleteDataCollection(dataCollection);
 		log.info("Quality management data collection deleted: " + dataCollection.toString());
 	}
@@ -186,7 +197,16 @@ public class QualityServiceImpl implements QualityService, OrganisationDataDelet
 	@Override
 	public void updateFormEntry(QualityDataCollection dataCollection, RepositoryEntry formEntry) {
 		EvaluationFormSurvey survey = evaluationFormManager.loadSurvey(dataCollection, null);
+		deleteReferences(dataCollection);
+		
 		evaluationFormManager.updateSurveyForm(survey, formEntry);
+		referenceManager.addReference(dataCollection, formEntry.getOlatResource(), null);
+	}
+
+	private void deleteReferences(QualityDataCollectionLight dataCollection) {
+		for (Reference reference : referenceManager.getReferences(dataCollection)) {
+			referenceManager.delete(reference);
+		}
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties
index 6af5ec5b19e..63c6537da77 100644
--- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties
@@ -2,7 +2,7 @@ admin.config.title=Configuration quality management
 admin.enabled=Quality management
 admin.menu.title.alt=$\:admin.menu.title
 admin.menu.title=Quality management
-breadcrumb.data.collections=$\:goto.data.collections.title
+breadcrumb.data.collections=$\:goto.data.collection.title
 breadcrumb.executor.participations=$\:goto.executor.participation.title
 breadcrumb.root=Quality management
 data.collection.configuration=Configuration
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
index a191175aa5a..d879fb9d2e0 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
@@ -285,6 +285,7 @@ details.read.only.acknowledge=Best\u00E4tigung
 details.read.only.acknowledge.error=Bitte best\u00E4tigen.
 details.read.only.acknowledge.msg=Alle Kursbausteine inklusive Tests, Foren etc. befinden sich im Lesemodus und k\u00F6nnen nicht mehr bearbeitet werden.
 details.referenceinfo=Referenzen
+details.referenceinfo.data.collections=Anzahl Datenerhebungen: {0}
 details.referenceinfo.txt=Wird in folgenden Kursen eingesetzt\:
 details.referenceinfoheader=Information zur Verwendung
 details.summaryprop=Zusammenfassung Einstellungen
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
index 8964c2980de..05958ea60f0 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
@@ -281,6 +281,7 @@ details.read.only.acknowledge=Confirmation
 details.read.only.acknowledge.error=Please confirm.
 details.read.only.acknowledge.msg=All course elements inclusive tests... will be in read only mode and cannot be edited anymore.
 details.referenceinfo=References
+details.referenceinfo.data.collections=Number of data collections: {0}
 details.referenceinfo.txt=Used in the following courses\:
 details.referenceinfoheader=Information on usage
 details.summaryprop=Summary of settings
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
index d8b81fd250d..44d9c1d5c88 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
@@ -92,6 +92,7 @@ import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CorruptedCourseException;
 import org.olat.course.CourseModule;
+import org.olat.modules.quality.QualityDataCollectionLight;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryEntryRef;
@@ -110,6 +111,7 @@ import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams.OrderBy;
 import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams.ResourceUsage;
 import org.olat.repository.ui.RepositoyUIFactory;
 import org.olat.repository.ui.author.AuthoringEntryDataModel.Cols;
+import org.olat.resource.references.Reference;
 import org.olat.resource.references.ReferenceManager;
 import org.olat.user.UserManager;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -782,7 +784,7 @@ public class AuthorListController extends FormBasicController implements Activat
 	
 	private void doSearch(UserRequest ureq, SearchEvent se) {
 		if(se.getTypes() != null && se.getTypes().size() > 0) {
-			searchParams.setResourceTypes(new ArrayList<String>(se.getTypes()));
+			searchParams.setResourceTypes(new ArrayList<>(se.getTypes()));
 		} else {
 			searchParams.setResourceTypes(null);
 		}
@@ -1185,6 +1187,13 @@ public class AuthorListController extends FormBasicController implements Activat
 			}
 			mainVC.contextPut("referenceLinks", refLinks);
 			
+			List<Reference> references = referenceManager.getReferencesTo(entry.getOlatResource(),
+					QualityDataCollectionLight.RESOURCEABLE_TYPE_NAME);
+			if (!references.isEmpty()) {
+				mainVC.contextPut("qualityDataCollections", translate("details.referenceinfo.data.collections",
+						new String[] { String.valueOf(references.size()) }));
+			}
+			
 			putInitialPanel(mainVC);
 		}
 
diff --git a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java
index be6ff8ca048..bd37f5f3a52 100644
--- a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java
+++ b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java
@@ -235,7 +235,7 @@ public class ConfirmDeletePermanentlyController extends FormBasicController {
 	
 	private void doCompleteDelete(UserRequest ureq) {
 		List<ErrorList> errorList = new ArrayList<>();
-		boolean allOk = deleteEntries(ureq, rows, errorList) ;
+		boolean allOk = deleteEntries(ureq, rows, errorList);
 		
 		if(allOk && deleteReferencesEl.isVisible() && deleteReferencesEl.isEnabled()
 				&& deleteReferencesEl.isOneSelected() && deleteReferencesEl.isSelected(0)) {
diff --git a/src/main/java/org/olat/repository/ui/author/_content/references.html b/src/main/java/org/olat/repository/ui/author/_content/references.html
index f0015f49fe1..3bacd22ac28 100644
--- a/src/main/java/org/olat/repository/ui/author/_content/references.html
+++ b/src/main/java/org/olat/repository/ui/author/_content/references.html
@@ -1,6 +1,13 @@
-$r.translate("details.referenceinfo.txt")
-<ul class="o_dropdown list-unstyled">
-#foreach($referenceLink in $referenceLinks)
-	<li>$r.render($referenceLink)</li>
+#if(!$referenceLinks.isEmpty())
+	$r.translate("details.referenceinfo.txt")
+	<ul class="o_dropdown list-unstyled">
+	#foreach($referenceLink in $referenceLinks)
+		<li>$r.render($referenceLink)</li>
+	#end
+	</ul>
 #end
-</ul>
\ No newline at end of file
+<div class="o_block_small_top">
+	#if($r.isNotNull($qualityDataCollections))
+		$qualityDataCollections
+	#end
+</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/resource/references/ReferenceManager.java b/src/main/java/org/olat/resource/references/ReferenceManager.java
index 827086e1155..8574178638e 100644
--- a/src/main/java/org/olat/resource/references/ReferenceManager.java
+++ b/src/main/java/org/olat/resource/references/ReferenceManager.java
@@ -108,7 +108,7 @@ public class ReferenceManager {
 	public List<Reference> getReferences(OLATResourceable source) {
 		Long sourceKey = getResourceKey(source);
 		if (sourceKey == null) {
-			return new ArrayList<Reference> (0);
+			return new ArrayList<>(0);
 		}
 		return dbInstance.getCurrentEntityManager()
 				.createNamedQuery("referencesBySourceId", Reference.class)
@@ -125,7 +125,7 @@ public class ReferenceManager {
 	public List<Reference> getReferencesTo(OLATResourceable target) {
 		Long targetKey = getResourceKey(target);
 		if (targetKey == null) {
-			return new ArrayList<Reference>(0);
+			return new ArrayList<>(0);
 		}
 		return dbInstance.getCurrentEntityManager()
 				.createNamedQuery("referencesByTargetId", Reference.class)
@@ -133,6 +133,25 @@ public class ReferenceManager {
 				.getResultList();
 	}
 	
+	public List<Reference> getReferencesTo(OLATResourceable target, String sourceResName) {
+		Long targetKey = getResourceKey(target);
+		if (targetKey == null) {
+			return new ArrayList<>(0);
+		}
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append("select v");
+		sb.append("  from references as v");
+		sb.append(" where v.target.key = :targetKey");
+		sb.append("   and v.source.resName = :resName");
+		
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Reference.class)
+				.setParameter("targetKey", targetKey)
+				.setParameter("resName", sourceResName)
+				.getResultList();
+	}
+	
 	public List<RepositoryEntry> getRepositoryReferencesTo(OLATResourceable target) {
 		Long targetKey = getResourceKey(target);
 		StringBuilder sb = new StringBuilder();
-- 
GitLab