From 39ec4e4f3f97ed390e176b73581b12f2d0bd357d Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 23 Feb 2016 17:34:50 +0100
Subject: [PATCH] OO-1593: allow to delete QTI resource

---
 .../manager/AssessmentTestSessionDAO.java     | 34 ++++++++++++++-----
 .../handlers/QTI21AssessmentTestHandler.java  |  5 +++
 .../manager/AssessmentEntryDAO.java           | 13 ++++---
 3 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java
index 0c9f6d6d3da..030c7efc41c 100644
--- a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java
+++ b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java
@@ -120,15 +120,33 @@ public class AssessmentTestSessionDAO {
 	}
 	
 	
-	public void deleteUserTestSessions(RepositoryEntryRef testEntry) {
-		String q = "select session from qtiassessmenttestsession session where session.testEntry.key=:testEntryKey";
-		List<AssessmentTestSession> sessions = dbInstance.getCurrentEntityManager()
-				.createQuery(q, AssessmentTestSession.class)
+	public int deleteUserTestSessions(RepositoryEntryRef testEntry) {
+		StringBuilder responseSb  = new StringBuilder();
+		responseSb.append("delete from qtiassessmentresponse response where")
+		  .append("  response.assessmentItemSession.key in (")
+		  .append("   select itemSession from qtiassessmentitemsession itemSession, qtiassessmenttestsession session ")
+		  .append("   where itemSession.assessmentTestSession.key=session.key and session.testEntry.key=:testEntryKey")
+		  .append(" )");
+		int responses = dbInstance.getCurrentEntityManager()
+				.createQuery(responseSb.toString())
 				.setParameter("testEntryKey", testEntry.getKey())
-				.getResultList();
-		for(AssessmentTestSession session:sessions) {
-			dbInstance.getCurrentEntityManager().remove(session);
-		}
+				.executeUpdate();
 		
+		StringBuilder itemSb  = new StringBuilder();
+		itemSb.append("delete from qtiassessmentitemsession itemSession")
+		  .append(" where itemSession.assessmentTestSession.key in(")
+		  .append("  select session.key from qtiassessmenttestsession session where session.testEntry.key=:testEntryKey")
+		  .append(" )");
+		int itemSessions = dbInstance.getCurrentEntityManager()
+				.createQuery(itemSb.toString())
+				.setParameter("testEntryKey", testEntry.getKey())
+				.executeUpdate();
+		
+		String q = "delete from qtiassessmenttestsession session where session.testEntry.key=:testEntryKey";
+		int sessions = dbInstance.getCurrentEntityManager()
+				.createQuery(q)
+				.setParameter("testEntryKey", testEntry.getKey())
+				.executeUpdate();
+		return itemSessions + sessions + responses;
 	}
 }
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 e031010d124..07aa44fdac4 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
@@ -78,6 +78,7 @@ import org.olat.ims.qti21.ui.AssessmentTestDisplayController;
 import org.olat.ims.qti21.ui.InMemoryOutcomesListener;
 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;
@@ -116,6 +117,9 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	private RepositoryService repositoryService;
 	@Autowired
 	private QTI21QPoolServiceProvider qpoolServiceProvider;
+	
+	@Autowired
+	private AssessmentEntryDAO assessmentEntryDAO;
 	@Autowired
 	private AssessmentTestSessionDAO assessmentTestSessionDao;
 
@@ -368,6 +372,7 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	public boolean cleanupOnDelete(RepositoryEntry entry, OLATResourceable res) {
 		boolean clean = super.cleanupOnDelete(entry, res);
 		assessmentTestSessionDao.deleteUserTestSessions(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 321db32cb7f..ac9a2f4122c 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
@@ -183,11 +183,14 @@ public class AssessmentEntryDAO {
 				.setParameter("groupKey", assessedGroup.getKey())
 				.setParameter("subIdent", subIdent)
 				.getResultList();
-
 	}
 	
-
-	
-	
-
+	public int deleteEntryForReferenceEntry(RepositoryEntry entry) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("delete from assessmententry data where data.referenceEntry.key=:referenceKey");
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString())
+				.setParameter("referenceKey", entry.getKey())
+				.executeUpdate();
+	}
 }
-- 
GitLab