From 0fd98544b4cdf02c1da5ca2252a4ee73fc6c9b1d Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 29 Nov 2016 11:06:13 +0100
Subject: [PATCH] OO-2392: the assessment entry of a course element doesn't
 dependent of the reference entry

---
 .../course/assessment/AssessmentManager.java   |  2 +-
 .../manager/CourseAssessmentManagerImpl.java   | 17 +++++++++++++----
 .../olat/course/nodes/BasicLTICourseNode.java  |  4 ++--
 .../olat/course/nodes/CheckListCourseNode.java |  2 +-
 .../org/olat/course/nodes/GTACourseNode.java   |  2 +-
 .../olat/course/nodes/IQTESTCourseNode.java    |  4 ++--
 .../org/olat/course/nodes/MSCourseNode.java    |  2 +-
 .../olat/course/nodes/PortfolioCourseNode.java |  2 +-
 .../course/nodes/ProjectBrokerCourseNode.java  |  2 +-
 .../org/olat/course/nodes/ScormCourseNode.java |  5 +----
 .../org/olat/course/nodes/TACourseNode.java    |  2 +-
 .../run/preview/PreviewAssessmentManager.java  |  2 +-
 .../modules/assessment/AssessmentEntry.java    |  2 ++
 .../modules/assessment/AssessmentService.java  |  7 ++-----
 .../assessment/manager/AssessmentEntryDAO.java | 15 +--------------
 .../manager/AssessmentServiceImpl.java         |  8 --------
 .../assessment/model/AssessmentEntryImpl.java  |  2 +-
 .../manager/AssessmentEntryDAOTest.java        | 18 ------------------
 18 files changed, 32 insertions(+), 66 deletions(-)

diff --git a/src/main/java/org/olat/course/assessment/AssessmentManager.java b/src/main/java/org/olat/course/assessment/AssessmentManager.java
index 1961a3a3a6f..9605ad14c3f 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentManager.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentManager.java
@@ -194,7 +194,7 @@ public interface AssessmentManager {
 	public Boolean getNodeFullyAssessed(CourseNode courseNode, Identity identity);
 	
 
-	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, String referenceSoftKey);
+	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity);
 	
 	public AssessmentEntry createAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, ScoreEvaluation scoreEvaluation);
 	
diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
index b65a7e1d520..28d14c6ab48 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
@@ -84,6 +84,10 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	private AssessmentEntry getOrCreate(Identity assessedIdentity, CourseNode courseNode) {
 		return assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), courseNode.getIdent(), courseNode.getReferencedRepositoryEntry());
 	}
+	
+	private AssessmentEntry getOrCreate(Identity assessedIdentity, String subIdent, RepositoryEntry referenceEntry) {
+		return assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), subIdent, referenceEntry);
+	}
 
 	@Override
 	public List<AssessmentEntry> getAssessmentEntries(CourseNode courseNode) {
@@ -91,8 +95,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	}
 
 	@Override
-	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, String referenceSoftKey) {
-		return assessmentService.loadAssessmentEntry(assessedIdentity, cgm.getCourseEntry(), courseNode.getIdent(), referenceSoftKey);
+	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity) {
+		return assessmentService.loadAssessmentEntry(assessedIdentity, cgm.getCourseEntry(), courseNode.getIdent());
 	}
 
 	@Override
@@ -243,8 +247,13 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		Float score = scoreEvaluation.getScore();
 		Boolean passed = scoreEvaluation.getPassed();
 		Long assessmentId = scoreEvaluation.getAssessmentID();
-
-		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, courseNode);
+		
+		String subIdent = courseNode.getIdent();
+		RepositoryEntry referenceEntry = courseNode.getReferencedRepositoryEntry();
+		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, referenceEntry);
+		if(referenceEntry != null && !referenceEntry.equals(assessmentEntry.getReferenceEntry())) {
+			assessmentEntry.setReferenceEntry(referenceEntry);
+		}
 		if(score == null) {
 			assessmentEntry.setScore(null);
 		} else {
diff --git a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
index aa5fd6a488a..e902d0c1074 100644
--- a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
@@ -333,14 +333,14 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode implements
 	@Override
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		return am.getAssessmentEntry(this, userCourseEnv.getIdentityEnvironment().getIdentity(), null);
+		return am.getAssessmentEntry(this, userCourseEnv.getIdentityEnvironment().getIdentity());
 	}
 
 	@Override
 	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		AssessmentEntry entry = am.getAssessmentEntry(this, mySelf, null);
+		AssessmentEntry entry = am.getAssessmentEntry(this, mySelf);
 		return getUserScoreEvaluation(entry) ;
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
index b766decab56..86339eecdc4 100644
--- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
@@ -189,7 +189,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf, null);
+		return am.getAssessmentEntry(this, mySelf);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java
index a93bf15b684..1689d5de0d2 100644
--- a/src/main/java/org/olat/course/nodes/GTACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java
@@ -900,7 +900,7 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Persi
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf, null);
+		return am.getAssessmentEntry(this, mySelf);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index 57515d61333..2aacca850d8 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -366,7 +366,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 		// read score from properties save score, passed and attempts information
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		AssessmentEntry entry = am.getAssessmentEntry(this, mySelf, getRepositoryEntrySoftKey());
+		AssessmentEntry entry = am.getAssessmentEntry(this, mySelf);
 		
 		Boolean passed = null;
 		Float score = null;		
@@ -405,7 +405,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
 		if(getRepositoryEntrySoftKey() != null) {
-			return am.getAssessmentEntry(this, mySelf, getRepositoryEntrySoftKey());
+			return am.getAssessmentEntry(this, mySelf);
 		}
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/MSCourseNode.java b/src/main/java/org/olat/course/nodes/MSCourseNode.java
index 47219453d63..51e4a682b82 100644
--- a/src/main/java/org/olat/course/nodes/MSCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/MSCourseNode.java
@@ -230,7 +230,7 @@ public class MSCourseNode extends AbstractAccessableCourseNode implements Persis
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf, null);
+		return am.getAssessmentEntry(this, mySelf);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
index 829117a0ca7..ea22bde3c4d 100644
--- a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
@@ -392,7 +392,7 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode implements
 		}
 		
 		if(referenceSoftkey != null) {
-			return am.getAssessmentEntry(this, mySelf, referenceSoftkey);
+			return am.getAssessmentEntry(this, mySelf);
 		}
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
index 9c87b6ce12c..15c82e36c27 100644
--- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
@@ -481,7 +481,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode implements Persis
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf, null);
+		return am.getAssessmentEntry(this, mySelf);
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/ScormCourseNode.java b/src/main/java/org/olat/course/nodes/ScormCourseNode.java
index fbfc1f5568a..3f998bcec49 100644
--- a/src/main/java/org/olat/course/nodes/ScormCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ScormCourseNode.java
@@ -383,10 +383,7 @@ public class ScormCourseNode extends AbstractAccessableCourseNode implements Per
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		if(getReferencedRepositoryEntrySoftkey() != null) {
-			return am.getAssessmentEntry(this, mySelf, getReferencedRepositoryEntrySoftkey());
-		}
-		return null;
+		return am.getAssessmentEntry(this, mySelf);//we want t
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/TACourseNode.java b/src/main/java/org/olat/course/nodes/TACourseNode.java
index 7774e076a8c..f453e4436d5 100644
--- a/src/main/java/org/olat/course/nodes/TACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/TACourseNode.java
@@ -503,7 +503,7 @@ public class TACourseNode extends GenericCourseNode implements PersistentAssessa
 	public AssessmentEntry getUserAssessmentEntry(UserCourseEnvironment userCourseEnv) {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
 		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf, null);
+		return am.getAssessmentEntry(this, mySelf);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
index 236c96e6212..5761c3930bb 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
@@ -68,7 +68,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM
 	}
 
 	@Override
-	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, String referenceSoftKey) {
+	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity) {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/modules/assessment/AssessmentEntry.java b/src/main/java/org/olat/modules/assessment/AssessmentEntry.java
index 0b04b0802a9..63b3cc86178 100644
--- a/src/main/java/org/olat/modules/assessment/AssessmentEntry.java
+++ b/src/main/java/org/olat/modules/assessment/AssessmentEntry.java
@@ -92,6 +92,8 @@ public interface AssessmentEntry extends AssessmentEntryLight {
 	 */
 	public RepositoryEntry getReferenceEntry();
 	
+	public void setReferenceEntry(RepositoryEntry entry);
+	
 	/**
 	 * @return The unique identifier for anonymous user (guest)
 	 */
diff --git a/src/main/java/org/olat/modules/assessment/AssessmentService.java b/src/main/java/org/olat/modules/assessment/AssessmentService.java
index b31f70da7e2..c63a8518dc2 100644
--- a/src/main/java/org/olat/modules/assessment/AssessmentService.java
+++ b/src/main/java/org/olat/modules/assessment/AssessmentService.java
@@ -60,17 +60,14 @@ public interface AssessmentService {
 	public AssessmentEntry getOrCreateAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
 			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry);
 	
-	public AssessmentEntry loadAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent);
-	
 	/**
-	 * The search by the reference soft key is set not is null if the value is null.
+	 * 
 	 * @param assessedIdentity
 	 * @param entry
 	 * @param subIdent
-	 * @param referenceSoftKey
 	 * @return
 	 */
-	public AssessmentEntry loadAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent, String referenceSoftKey);
+	public AssessmentEntry loadAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent);
 	
 	/**
 	 * 
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 12796aba036..27e497a7dd7 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
@@ -127,26 +127,16 @@ public class AssessmentEntryDAO {
 		return entries.isEmpty() ? null : entries.get(0);
 	}
 	
-	public AssessmentEntry loadAssessmentEntry(IdentityRef assessedIdentity, RepositoryEntryRef entry, String subIdent, String referenceSoftKey) {
+	public AssessmentEntry loadAssessmentEntry(IdentityRef assessedIdentity, RepositoryEntryRef entry, String subIdent) {
 		StringBuilder sb = new StringBuilder();
 		
 		sb.append("select data from assessmententry data");
-		if(referenceSoftKey != null) {
-			sb.append(" inner join data.referenceEntry referenceEntry");
-		}
-		
 		sb.append(" where data.repositoryEntry.key=:repositoryEntryKey and data.identity.key=:identityKey");
 		if(subIdent != null) {
 			sb.append(" and data.subIdent=:subIdent");
 		} else {
 			sb.append(" and data.subIdent is null");
 		}
-		
-		if(referenceSoftKey != null) {
-			sb.append(" and referenceEntry.softkey=:softkey");
-		} else {
-			sb.append(" and data.referenceEntry is null");
-		}
 
 		TypedQuery<AssessmentEntry> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), AssessmentEntry.class)
@@ -155,9 +145,6 @@ public class AssessmentEntryDAO {
 		if(subIdent != null) {
 			query.setParameter("subIdent", subIdent);
 		}
-		if(referenceSoftKey != null) {
-			query.setParameter("softkey", referenceSoftKey);
-		}
 		List<AssessmentEntry> entries = query.getResultList();
 		return entries.isEmpty() ? null : entries.get(0);
 	}
diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
index 90b7ca288b9..c2c654dd74e 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
@@ -71,14 +71,6 @@ public class AssessmentServiceImpl implements AssessmentService {
 		return assessmentEntryDao.loadAssessmentEntry(assessedIdentity, null, entry, subIdent);
 	}
 
-	@Override
-	public AssessmentEntry loadAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent, String referenceSoftKey) {
-		if(assessedIdentity == null || entry == null) return null;
-		return assessmentEntryDao.loadAssessmentEntry(assessedIdentity, entry, subIdent, referenceSoftKey);
-	}
-	
-	
-
 	@Override
 	public AssessmentEntry loadAssessmentEntry(Identity assessedIdentity, RepositoryEntryRef entry, String subIdent, RepositoryEntryRef referenceEntry) {
 		if(assessedIdentity == null || entry == null || referenceEntry == null) return null;
diff --git a/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java b/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java
index d86d6fc190c..91d90694fa4 100644
--- a/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java
+++ b/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java
@@ -108,7 +108,7 @@ public class AssessmentEntryImpl implements Persistable, ModifiedInfo, CreateInf
 	private String subIdent;
 	
 	@ManyToOne(targetEntity=RepositoryEntry.class,fetch=FetchType.LAZY,optional=true)
-	@JoinColumn(name="fk_reference_entry", nullable=true, insertable=true, updatable=false)
+	@JoinColumn(name="fk_reference_entry", nullable=true, insertable=true, updatable=true)
     private RepositoryEntry referenceEntry;
 
     @Column(name="a_anon_identifier", nullable=true, insertable=true, updatable=false)
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 8991294167e..a629588bc6c 100644
--- a/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
+++ b/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
@@ -148,24 +148,6 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(subIdent, reloadedAssessment.getSubIdent());
 	}
 	
-	@Test
-	public void loadAssessmentEntry_withSoftkey() {
-		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-4");
-		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
-		String subIdent = UUID.randomUUID().toString();
-		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entry);
-		dbInstance.commitAndCloseSession();
-		
-		AssessmentEntry reloadedAssessment = assessmentEntryDao
-				.loadAssessmentEntry(assessedIdentity, entry, subIdent, entry.getSoftkey());
-		Assert.assertEquals(nodeAssessment.getKey(), reloadedAssessment.getKey());
-		Assert.assertEquals(nodeAssessment, reloadedAssessment);
-		Assert.assertEquals(assessedIdentity, reloadedAssessment.getIdentity());
-		Assert.assertEquals(entry, reloadedAssessment.getRepositoryEntry());
-		Assert.assertEquals(subIdent, reloadedAssessment.getSubIdent());
-	}
-	
 	@Test
 	public void loadAssessmentEntry_specificTest() {
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-5");
-- 
GitLab