From 5083a57603a5613e646c98d34578bf43d2019d1e Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Wed, 4 Nov 2020 13:39:13 +0100
Subject: [PATCH] OO-5048: harden course and correction workflow against
 corrupted item

---
 src/main/java/org/olat/ims/qti21/model/QTI21QuestionType.java   | 2 ++
 .../java/org/olat/ims/qti21/model/xml/QtiMaxScoreEstimator.java | 2 +-
 .../qti21/ui/assessment/model/CorrectionAssessmentItemRow.java  | 2 +-
 .../olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties   | 1 +
 .../olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties   | 1 +
 .../olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties   | 1 +
 6 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/model/QTI21QuestionType.java b/src/main/java/org/olat/ims/qti21/model/QTI21QuestionType.java
index e995572c31b..7c0af812b44 100644
--- a/src/main/java/org/olat/ims/qti21/model/QTI21QuestionType.java
+++ b/src/main/java/org/olat/ims/qti21/model/QTI21QuestionType.java
@@ -117,6 +117,8 @@ public enum QTI21QuestionType {
 	}
 	
 	public static QTI21QuestionType getTypeRelax(AssessmentItem item) {
+		if(item == null) return QTI21QuestionType.unkown;
+		
 		//we have create this one
 		List<Interaction> interactions = item.getItemBody().findInteractions();
 		
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/QtiMaxScoreEstimator.java b/src/main/java/org/olat/ims/qti21/model/xml/QtiMaxScoreEstimator.java
index dacd569c758..bdad6af3b32 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/QtiMaxScoreEstimator.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/QtiMaxScoreEstimator.java
@@ -73,7 +73,7 @@ public class QtiMaxScoreEstimator {
 		} else if(sectionPart instanceof AssessmentItemRef) {
 			AssessmentItemRef itemRef = (AssessmentItemRef)sectionPart;
 			ResolvedAssessmentItem resolvedAssessmentItem = resolvedAssessmentTest.getResolvedAssessmentItem(itemRef);
-			AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractAssumingSuccessful();
+			AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful();
 			if(assessmentItem != null) {
 				Double maxScore = QtiNodesExtractor.extractMaxScore(assessmentItem);
 				visitor.add(maxScore);
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/model/CorrectionAssessmentItemRow.java b/src/main/java/org/olat/ims/qti21/ui/assessment/model/CorrectionAssessmentItemRow.java
index 7d34dcd0e81..daefe3a540a 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/model/CorrectionAssessmentItemRow.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/model/CorrectionAssessmentItemRow.java
@@ -62,7 +62,7 @@ public class CorrectionAssessmentItemRow extends CorrectionRow {
 	}
 	
 	public String getItemTitle() {
-		return item.getTitle();
+		return item == null ? "ERROR" : item.getTitle();
 	}
 	
 	public QTI21QuestionType getItemType() {
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
index 4d0a2b8518d..36ee5632d8a 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
@@ -253,6 +253,7 @@ new.sc=Single Choice
 new.section=Sektion
 new.spots=Spots hinzuf\u00FCgen
 new.testpart=Test-Part
+new.unkown=Unbekannt
 new.upload=Datei hochladen
 passed.cut.value=Automatisch durch Punkteschwelle
 passed.enabled=Bestanden / Nicht bestanden ausgegeben
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
index 72b36b944c0..54aa4c4121c 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
@@ -253,6 +253,7 @@ new.sc=Single choice
 new.section=Section
 new.spots=Add spots
 new.testpart=Test part
+new.unkown=Unknown
 new.upload=Upload file
 passed.cut.value=Using cut value
 passed.enabled=Display passed / failed
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
index 19c6c3ebe0a..6dd6b567674 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
@@ -254,6 +254,7 @@ new.sc=Choix simple
 new.section=Section
 new.spots=Ajouter un emplacement
 new.testpart=Partie de test
+new.unkown=Inconnu
 new.upload=T\u00E9l\u00E9verser un fichier
 passed.cut.value=Automatique par score \u00E0 obtenir
 passed.enabled=Afficher r\u00E9ussi / pas r\u00E9ussi
-- 
GitLab