diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties index ce0229688dc81390dae0fa1d9d6ead70a00e33f4..c7116fbf9a9af9d60cc5d31d580261bfab2da46e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties @@ -84,6 +84,7 @@ drawing.opacity=Deckkraft error.as.directed=Alle 4 Antwortm\u00F6glichkeiten m\u00FCssen entweder mit Richtig oder Falsch beantwortet werden. error.as.directed.kprim=Bitte beantworten Sie die Frage wie vorgegeben. error.assessment.item=Die Datei konnte nicht gelesen werden. Sie ist entweder korrupt oder mit dem falschen Format gespeichert. +error.assessment.item.missing=Die Datei der Frage konnte nicht gelesen werden. error.choice=Sie m\u00FCssen ein von den folgenden Optionen w\u00E4hlen. error.digital.certificate.noX509=Es wurde kein X509 Zertifikat gefunden. error.digital.certificate.noPrivateKey=Es wurde kein "Private key" im Zertifikat gefunden. Sie ist erforderlich. diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties index 3b9745a9781390203323843f429313964befccc4..a8cc64a710d1010c3e95d4fb5d406ff3cc6c17c6 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties @@ -84,6 +84,7 @@ drawing.opacity=Opacity error.as.directed=Please complete this interaction as directed. error.as.directed.kprim=Please complete this interaction as directed. error.assessment.item=The file cannot be interpreted. It seems corrupted or with the wrong format. +error.assessment.item.missing=The file of the question cannot be read. error.choice=You must select one of the following options error.digital.certificate.noX509=The X509 certificate could not be found in the uploaded file. error.digital.certificate.noPrivateKey=The "private key" could not be found. It is mandatory. diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java index 2042a5bf980285bec5f91a2f31a8e5319d02d5e3..22cce086e3a2de7d6c8f3046066e2ef88dbf2763 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java @@ -198,6 +198,10 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent protected void renderExploded(StringOutput sb, Translator translator) { sb.append("<div class='o_error'>").append(translator.translate("exploded.msg")).append("</div>"); } + + protected void renderMissingItem(StringOutput sb, Translator translator) { + sb.append("<div class='o_error'>").append(translator.translate("error.assessment.item.missing")).append("</div>"); + } protected void renderTerminated(StringOutput sb, Translator translator) { sb.append("<div class='o_info o_sel_assessment_test_terminated'>").append(translator.translate("terminated.msg")).append("</div>"); diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java index 3022903920f9fcde02e33c5463aea05e359baa2c..94438a7f5f99a8791f2093831b5acf3250779b30 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java @@ -336,6 +336,12 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe URI itemSystemId = itemNode.getItemSystemId(); ResolvedAssessmentItem resolvedAssessmentItem = component.getResolvedAssessmentTest() .getResolvedAssessmentItemBySystemIdMap().get(itemSystemId); + if(resolvedAssessmentItem == null) { + log.error("Missing assessment item: " + itemSystemId); + renderMissingItem(sb, translator); + return; + } + final AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful(); sb.append("<div class='o_assessmentitem_wrapper'>"); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java index 2b706a4e3dd39863a9c7c66c182b0a90d531e134..bd2159fa6e1f8ea8a288696d8360e960516407d0 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java @@ -176,7 +176,9 @@ public class AssessmentTestComposerController extends MainLayoutBasicController private final boolean survey = false; private final boolean restrictedEdit; + private boolean assessmentChanged = false; + private boolean deleteAuthorSesssion = false; private LockResult lockEntry; private LockResult activeSessionLock; @@ -410,7 +412,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController } else if(event instanceof AssessmentItemEvent) { AssessmentItemEvent aie = (AssessmentItemEvent)event; if(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED.equals(aie.getCommand())) { - assessmentChanged = true; + assessmentChanged(); doSaveAssessmentTest(null); doUpdate(aie.getAssessmentItemRef().getIdentifier(), aie.getAssessmentItem().getTitle()); doSaveManifest(); @@ -890,7 +892,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController URI testUri = resolvedAssessmentTest.getTestLookup().getSystemId(); File testFile = new File(testUri); qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest); - assessmentChanged = true; + assessmentChanged(); //reload the test updateTreeModel(false); @@ -972,7 +974,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController * @param flyingObjects A list of assessmentItems which are not part of the test but will be. */ private void doSaveAssessmentTest(Map<AssessmentItemRef,AssessmentItem> flyingObjects) { - assessmentChanged = true; + assessmentChanged(); recalculateMaxScoreAssessmentTest(flyingObjects); assessmentTestBuilder.build(); URI testURI = resolvedAssessmentTest.getTestLookup().getSystemId(); @@ -1215,7 +1217,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController private void doForceReloadFiles() { updateTreeModel(true); - assessmentChanged = true; + assessmentChanged(); } private void doConfirmDelete(UserRequest ureq) { @@ -1326,7 +1328,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController } } if(deleted) { - assessmentChanged = true; + assessmentChanged(); } logAudit(removed + " " + deleted + " removed item ref", null); @@ -1356,6 +1358,15 @@ public class AssessmentTestComposerController extends MainLayoutBasicController } testPart.getParent().getTestParts().remove(testPart); } + + private void assessmentChanged() { + assessmentChanged = true; + + if(!deleteAuthorSesssion) { + deleteAuthorSesssion = true;//delete sessions only once + qtiService.deleteAuthorAssessmentTestSession(testEntry); + } + } private ResourceType getResourceType(AssessmentItemRef itemRef) { return getResourceType(manifestBuilder, itemRef);