From a2e83c0d69edcf88a753d8ed8add3dda9874d92d Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 29 Nov 2016 12:37:06 +0100
Subject: [PATCH] OO-2390: remove the reference in service, only remove the
 reference, not the assessment entry

---
 .../handlers/QTI21AssessmentTestHandler.java     |  4 ----
 .../assessment/manager/AssessmentEntryDAO.java   |  4 ++--
 .../manager/RepositoryServiceImpl.java           |  2 ++
 .../manager/AssessmentEntryDAOTest.java          | 16 +++++++++++-----
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
index ab1be66993c..6010b463379 100644
--- a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
+++ b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
@@ -86,7 +86,6 @@ import org.olat.ims.qti21.ui.AssessmentTestDisplayController;
 import org.olat.ims.qti21.ui.QTI21AssessmentDetailsController;
 import org.olat.ims.qti21.ui.QTI21RuntimeController;
 import org.olat.ims.qti21.ui.editor.AssessmentTestComposerController;
-import org.olat.modules.assessment.manager.AssessmentEntryDAO;
 import org.olat.modules.qpool.model.QItemList;
 import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
@@ -127,8 +126,6 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	@Autowired
 	private QTI21QPoolServiceProvider qpoolServiceProvider;
 	
-	@Autowired
-	private AssessmentEntryDAO assessmentEntryDAO;
 	@Autowired
 	private AssessmentTestSessionDAO assessmentTestSessionDao;
 
@@ -462,7 +459,6 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	public boolean cleanupOnDelete(RepositoryEntry entry, OLATResourceable res) {
 		boolean clean = super.cleanupOnDelete(entry, res);
 		assessmentTestSessionDao.deleteAllUserTestSessions(entry);
-		assessmentEntryDAO.deleteEntryForReferenceEntry(entry);
 		return clean;
 	}
 
diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
index 27e497a7dd7..b4192c06797 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
@@ -272,9 +272,9 @@ public class AssessmentEntryDAO {
 	 * @param entry
 	 * @return
 	 */
-	public int deleteEntryForReferenceEntry(RepositoryEntryRef entry) {
+	public int removeEntryForReferenceEntry(RepositoryEntryRef entry) {
 		StringBuilder sb = new StringBuilder();
-		sb.append("delete from assessmententry data where data.referenceEntry.key=:referenceKey");
+		sb.append("update assessmententry data set data.referenceEntry.key=null where data.referenceEntry.key=:referenceKey");
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString())
 				.setParameter("referenceKey", entry.getKey())
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index f0367c455e0..fa679279453 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -365,6 +365,8 @@ public class RepositoryServiceImpl implements RepositoryService {
 		handler.cleanupOnDelete(entry, resource);
 		dbInstance.commit();
 		
+		//nullify the reference
+		assessmentEntryDao.removeEntryForReferenceEntry(entry);
 		assessmentEntryDao.deleteEntryForRepositoryEntry(entry);
 		dbInstance.commit();
 
diff --git a/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java b/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
index a629588bc6c..54dba540b74 100644
--- a/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
+++ b/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
@@ -340,7 +340,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 	}
 	
 	@Test
-	public void deleteEntryForReferenceEntry() {
+	public void removeEntryForReferenceEntry() {
 		Identity assessedIdentity1 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-18");
 		Identity assessedIdentity2 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-19");
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
@@ -358,18 +358,24 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// delete by reference
-		assessmentEntryDao.deleteEntryForReferenceEntry(refEntry);
+		int affectedRows = assessmentEntryDao.removeEntryForReferenceEntry(refEntry);
 		dbInstance.commitAndCloseSession();
+		Assert.assertEquals(3, affectedRows);
 
 		//check
 		AssessmentEntry deletedAssessmentEntry1 = assessmentEntryDao.loadAssessmentEntryById(nodeAssessment1.getKey());
-		Assert.assertNull(deletedAssessmentEntry1);
+		Assert.assertNotNull(deletedAssessmentEntry1);
+		Assert.assertNull(deletedAssessmentEntry1.getReferenceEntry());
 		AssessmentEntry deletedAssessmentEntry2 = assessmentEntryDao.loadAssessmentEntryById(nodeAssessment2.getKey());
-		Assert.assertNull(deletedAssessmentEntry2);
+		Assert.assertNotNull(deletedAssessmentEntry2);
+		Assert.assertNull(deletedAssessmentEntry2.getReferenceEntry());
 		AssessmentEntry deletedAssessmentEntry3 = assessmentEntryDao.loadAssessmentEntryById(nodeAssessment3.getKey());
 		Assert.assertNotNull(deletedAssessmentEntry3);
+		Assert.assertNotNull(deletedAssessmentEntry3.getReferenceEntry());
+		Assert.assertEquals(entry, deletedAssessmentEntry3.getReferenceEntry());
 		AssessmentEntry deletedAssessmentEntry4 = assessmentEntryDao.loadAssessmentEntryById(nodeAssessment4.getKey());
-		Assert.assertNull(deletedAssessmentEntry4);
+		Assert.assertNotNull(deletedAssessmentEntry4);
+		Assert.assertNull(deletedAssessmentEntry4.getReferenceEntry());
 	}
 	
 	@Test
-- 
GitLab