From c0e06a5721288f8555126f11710e109ce9fd08c5 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 11 Jul 2017 10:01:27 +0200
Subject: [PATCH] OO-2882: catch the error and show the line where it happened

---
 .../CSVToAssessmentItemConverter.java         |  7 ++++++
 .../questionimport/TextInputController.java   | 25 +++++++++++--------
 .../_i18n/LocalStrings_de.properties          |  1 +
 .../_i18n/LocalStrings_en.properties          |  3 ++-
 4 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java b/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
index 9c53d51a6f2..1f37625ad19 100644
--- a/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
+++ b/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
@@ -55,6 +55,7 @@ public class CSVToAssessmentItemConverter {
 	
 	private static final OLog log = Tracing.createLoggerFor(CSVToAssessmentItemConverter.class);
 
+	private int currentLine;
 	private int kprimPosition = 0;
 	private ImportOptions options;
 	private final QtiSerializer qtiSerializer;
@@ -70,10 +71,16 @@ public class CSVToAssessmentItemConverter {
 		return items;
 	}
 	
+	public int getCurrentLine() {
+		return currentLine;
+	}
+	
 	public void parse(String input) {
 		String[] lines = input.split("\r?\n");
 		
 		for (int i = 0; i<lines.length; i++) {
+			currentLine = i+1;
+			
 			String line = lines[i];
 			if (line.equals("")) {
 				continue;
diff --git a/src/main/java/org/olat/ims/qti21/questionimport/TextInputController.java b/src/main/java/org/olat/ims/qti21/questionimport/TextInputController.java
index 2fed63b45d7..5faaab251d8 100644
--- a/src/main/java/org/olat/ims/qti21/questionimport/TextInputController.java
+++ b/src/main/java/org/olat/ims/qti21/questionimport/TextInputController.java
@@ -51,7 +51,6 @@ public class TextInputController extends StepFormBasicController {
 	private String validatedInp;
 	private TextElement inputElement;
 	
-	private List<AssessmentItemAndMetadata> parsedItems;
 	private final AssessmentItemsPackage importedItems;
 	private final ImportOptions options;
 	
@@ -92,8 +91,18 @@ public class TextInputController extends StepFormBasicController {
 		
 		String inp = inputElement.getValue();
 		if(validatedInp == null || !validatedInp.equals(inp)) {
-			boolean errors = convertInputField();
-			allOk &= !errors;
+			CSVToAssessmentItemConverter converter = new CSVToAssessmentItemConverter(options, qtiService.qtiSerializer());
+			try {
+				converter.parse(inputElement.getValue());
+				List<AssessmentItemAndMetadata> items = converter.getItems();
+				if(items == null || items.isEmpty()) {
+					inputElement.setErrorKey("form.mandatory.hover", null);
+					allOk &= false;
+				}
+			} catch (Exception e) {
+				inputElement.setErrorKey("error.at.line", new String[] { Integer.toString(converter.getCurrentLine()) });
+				allOk &= false;
+			}
 		}
 		
 		return allOk & super.validateFormLogic(ureq);
@@ -101,16 +110,10 @@ public class TextInputController extends StepFormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		importedItems.setItems(parsedItems);
-		fireEvent(ureq, StepsEvent.ACTIVATE_NEXT);
-	}
-	
-	private boolean convertInputField() {
-		boolean importDataError = false;
 		CSVToAssessmentItemConverter converter = new CSVToAssessmentItemConverter(options, qtiService.qtiSerializer());
 		converter.parse(inputElement.getValue());
-		parsedItems = converter.getItems();
-		return importDataError;
+		importedItems.setItems(converter.getItems());
+		fireEvent(ureq, StepsEvent.ACTIVATE_NEXT);
 	}
 	
 	private static class ExampleMapper implements Mapper {
diff --git a/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_de.properties
index c4bdb8bdc07..7b90d6b01b3 100644
--- a/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_de.properties
@@ -14,3 +14,4 @@ item.type.fib=$org.olat.ims.qti.editor\:item.type.fib
 item.type.kprim=$org.olat.ims.qti.editor\:item.type.kprim
 item.type.mc=$org.olat.ims.qti.editor\:item.type.mc
 item.type.sc=$org.olat.ims.qti.editor\:item.type.sc
+error.at.line=Problem auf Zeile {0}
diff --git a/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_en.properties
index 9dd0dabfd55..0373ba6cb21 100644
--- a/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_en.properties
@@ -13,4 +13,5 @@ item.type.essay=$org.olat.ims.qti.editor\:item.type.essay
 item.type.fib=$org.olat.ims.qti.editor\:item.type.fib
 item.type.kprim=$org.olat.ims.qti.editor\:item.type.kprim
 item.type.mc=$org.olat.ims.qti.editor\:item.type.mc
-item.type.sc=$org.olat.ims.qti.editor\:item.type.sc
\ No newline at end of file
+item.type.sc=$org.olat.ims.qti.editor\:item.type.sc
+error.at.line=Issue with line {0}
\ No newline at end of file
-- 
GitLab