From 4fc8e50661191c6954588f445f7a2a167a6db88a Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 30 Apr 2018 14:41:10 +0200
Subject: [PATCH] OO-3457: in test course element, retrieve always min. and
 max. score and cut value from the test

---
 .../archiver/ScoreAccountingHelper.java       |   9 +-
 .../olat/course/nodes/IQTESTCourseNode.java   | 103 +++++++++++++-----
 2 files changed, 81 insertions(+), 31 deletions(-)

diff --git a/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java b/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java
index a6b7cbe8d94..532cd2f2e51 100644
--- a/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java
+++ b/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java
@@ -367,10 +367,13 @@ public class ScoreAccountingHelper {
 			if(acnode instanceof STCourseNode || !acnode.hasScoreConfigured()) {
 				minVal = maxVal = cutVal = "-";
 			} else {
-				minVal = acnode.getMinScoreConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getMinScoreConfiguration());
-				maxVal = acnode.getMaxScoreConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getMaxScoreConfiguration());
+				Float minScoreConfig = acnode.getMinScoreConfiguration();
+				Float maxScoreConfig = acnode.getMaxScoreConfiguration();
+				minVal = minScoreConfig == null ? "-" : AssessmentHelper.getRoundedScore(minScoreConfig);
+				maxVal = maxScoreConfig == null ? "-" : AssessmentHelper.getRoundedScore(maxScoreConfig);
 				if (acnode.hasPassedConfigured()) {
-					cutVal = acnode.getCutValueConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getCutValueConfiguration());
+					Float cutValueConfig = acnode.getCutValueConfiguration();
+					cutVal = cutValueConfig == null ? "-" : AssessmentHelper.getRoundedScore(cutValueConfig);
 				} else {
 					cutVal = "-";
 				}
diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index ac00486f636..8525e85feb6 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -104,6 +104,7 @@ import org.olat.ims.qti21.QTI21Service;
 import org.olat.ims.qti21.manager.AssessmentTestSessionDAO;
 import org.olat.ims.qti21.manager.archive.QTI21ArchiveFormat;
 import org.olat.ims.qti21.model.QTI21StatisticSearchParams;
+import org.olat.ims.qti21.model.xml.QtiNodesExtractor;
 import org.olat.ims.qti21.resultexport.QTI21ResultsExportMediaResource;
 import org.olat.ims.qti21.ui.QTI21AssessmentDetailsController;
 import org.olat.ims.qti21.ui.statistics.QTI21StatisticResourceResult;
@@ -229,11 +230,8 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 			if(!configRef && config.getIntegerSafe(IQEditController.CONFIG_KEY_TIME_LIMIT, -1) > 0) {
 				timeLimit = true;
 			} else {
-				File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource());
-				ResolvedAssessmentTest resolvedAssessmentTest = CoreSpringFactory.getImpl(QTI21Service.class)
-						.loadAndResolveAssessmentTest(unzippedDirRoot, false, false);
-				AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
-				if(assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) {
+				AssessmentTest assessmentTest = loadAssessmentTest(testEntry);
+				if(assessmentTest != null && assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) {
 					timeLimit = true;
 				}
 			}
@@ -257,17 +255,30 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 			if(!configRef && config.getIntegerSafe(IQEditController.CONFIG_KEY_TIME_LIMIT, -1) > 0) {
 				timeLimit = config.getIntegerSafe(IQEditController.CONFIG_KEY_TIME_LIMIT, -1);
 			} else {
-				File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource());
-				ResolvedAssessmentTest resolvedAssessmentTest = CoreSpringFactory.getImpl(QTI21Service.class)
-						.loadAndResolveAssessmentTest(unzippedDirRoot, false, false);
-				AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
-				if(assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) {
+				AssessmentTest assessmentTest = loadAssessmentTest(testEntry);
+				if(assessmentTest != null && assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) {
 					timeLimit = assessmentTest.getTimeLimits().getMaximum().intValue();
 				}
 			}
 		}
 		return timeLimit;
 	}
+	
+	/**
+	 * 
+	 * @return
+	 */
+	public AssessmentTest loadAssessmentTest(RepositoryEntry testEntry) {
+		if(testEntry == null) return null;
+		
+		File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource());
+		ResolvedAssessmentTest resolvedAssessmentTest = CoreSpringFactory.getImpl(QTI21Service.class)
+				.loadAndResolveAssessmentTest(unzippedDirRoot, false, false);
+		if(resolvedAssessmentTest != null) {
+			return resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
+		}
+		return null;
+	}
 
 	/**
 	 * @see org.olat.course.nodes.CourseNode#createPreviewController(org.olat.core.gui.UserRequest,
@@ -429,36 +440,72 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 		return false;
 	}
 
-	/**
-	 * @see org.olat.course.nodes.AssessableCourseNode#getCutValueConfiguration()
-	 */
 	@Override
 	public Float getCutValueConfiguration() {
-		ModuleConfiguration config = this.getModuleConfiguration();
-		return (Float) config.get(IQEditController.CONFIG_KEY_CUTVALUE);
+		Float cutValue = null;
+		
+		ModuleConfiguration config = getModuleConfiguration();
+		// for onyx and QTI 1.2
+		if (IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))
+				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
+			cutValue = (Float) config.get(IQEditController.CONFIG_KEY_CUTVALUE);
+		} else {
+			RepositoryEntry testEntry = getReferencedRepositoryEntry();
+			AssessmentTest assessmentTest = loadAssessmentTest(testEntry);
+			if(assessmentTest != null) {
+				Double cut = QtiNodesExtractor.extractCutValue(assessmentTest);
+				if(cut != null) {
+					cutValue = Float.valueOf(cut.floatValue());
+				}
+			}
+		}
+		return cutValue;
 	}
 
-	/**
-	 * @see org.olat.course.nodes.AssessableCourseNode#getMaxScoreConfiguration()
-	 */
 	@Override
 	public Float getMaxScoreConfiguration() {
-		ModuleConfiguration config = this.getModuleConfiguration();
-		return (Float) config.get(IQEditController.CONFIG_KEY_MAXSCORE);
+		Float maxScore = null;
+
+		ModuleConfiguration config = getModuleConfiguration();
+		// for onyx and QTI 1.2
+		if (IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))
+				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
+			maxScore = (Float) config.get(IQEditController.CONFIG_KEY_MAXSCORE);
+		} else {
+			RepositoryEntry testEntry = getReferencedRepositoryEntry();
+			AssessmentTest assessmentTest = loadAssessmentTest(testEntry);
+			if(assessmentTest != null) {
+				Double max = QtiNodesExtractor.extractMaxScore(assessmentTest);
+				if(max != null) {
+					maxScore = Float.valueOf(max.floatValue());
+				}
+			}
+		}
+		
+		return maxScore;
 	}
 
-	/**
-	 * @see org.olat.course.nodes.AssessableCourseNode#getMinScoreConfiguration()
-	 */
 	@Override
 	public Float getMinScoreConfiguration() {
-		ModuleConfiguration config = this.getModuleConfiguration();
-		return (Float) config.get(IQEditController.CONFIG_KEY_MINSCORE);
+		Float minScore = null;
+		ModuleConfiguration config = getModuleConfiguration();
+		// for onyx and QTI 1.2
+		if (IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))
+				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
+			minScore = (Float) config.get(IQEditController.CONFIG_KEY_MINSCORE);
+		} else {
+			RepositoryEntry testEntry = getReferencedRepositoryEntry();
+			AssessmentTest assessmentTest = loadAssessmentTest(testEntry);
+			if(assessmentTest != null) {
+				Double min = QtiNodesExtractor.extractMinScore(assessmentTest);
+				if(min != null) {
+					minScore = Float.valueOf(min.floatValue());
+				}
+			}
+		}
+		return minScore;
 	}
 
-	/**
-	 * @see org.olat.course.nodes.AssessableCourseNode#hasCommentConfigured()
-	 */
 	@Override
 	public boolean hasCommentConfigured() {
 		// coach should be able to add comments here, visible to users
-- 
GitLab