diff --git a/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java b/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java index 3fa85d242bc1618322ac908441832ab75d19a993..7c92ed6a4721f5e2d440b1a361bf80b572845b4e 100644 --- a/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java +++ b/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java @@ -183,7 +183,7 @@ public class StatisticCourseNodesController extends BasicController implements A removeAsListenerAndDispose(currentCtrl); currentCtrl = null; - WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance(selectedNode.getIdent(), 0l), null); + WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstanceWithoutCheck(selectedNode.getIdent(), 0l), null); if(selectedNode instanceof StatisticResourceNode) { StatisticResourceNode node = (StatisticResourceNode)selectedNode; currentCtrl = node.getResult().getController(ureq, swControl, stackPanel, node); diff --git a/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java b/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java index 15a211e1e59ce3a566ce4645ebee41fe85b73a1b..b679d9585762a413b89ccd9da0430f40b41f3397 100644 --- a/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java +++ b/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java @@ -29,8 +29,11 @@ import org.olat.core.gui.components.tree.TreeModel; import org.olat.core.gui.components.tree.TreeNode; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.messages.MessageUIFactory; +import org.olat.core.gui.translator.Translator; import org.olat.core.id.OLATResourceable; import org.olat.core.util.CodeHelper; +import org.olat.core.util.Util; import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.nodes.CourseNodeConfiguration; @@ -89,14 +92,16 @@ public class QTIStatisticResourceResult implements StatisticResourceResult { } else { resolver = new ImsRepositoryResolver(qtiRepositoryEntry); Document doc = resolver.getQTIDocument(); - ParserManager parser = new ParserManager(); - qtiDocument = (QTIDocument) parser.parse(doc); - if (courseNode instanceof IQSURVCourseNode) { - type = QTIType.survey; - } else if (courseNode instanceof IQTESTCourseNode) { - type = QTIType.test; - } else if (courseNode instanceof IQSELFCourseNode){ - type = QTIType.self; + if(doc != null) { + ParserManager parser = new ParserManager(); + qtiDocument = (QTIDocument) parser.parse(doc); + if (courseNode instanceof IQSURVCourseNode) { + type = QTIType.survey; + } else if (courseNode instanceof IQTESTCourseNode) { + type = QTIType.test; + } else if (courseNode instanceof IQSELFCourseNode){ + type = QTIType.self; + } } } } @@ -184,7 +189,11 @@ public class QTIStatisticResourceResult implements StatisticResourceResult { private Controller createAssessmentController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, boolean printMode) { Controller ctrl; - if (type == QTIType.onyx){ + if (type == null) { + Translator translator = Util.createPackageTranslator(QTI12AssessmentStatisticsController.class, ureq.getLocale()); + String text = translator.translate("error.notfound.text"); + ctrl = MessageUIFactory.createErrorMessage(ureq, wControl, null, text); + } else if (type == QTIType.onyx){ ctrl = new QTI21OnyxAssessmentStatisticsController(ureq, wControl, this, printMode); } else { ctrl = new QTI12AssessmentStatisticsController(ureq, wControl, stackPanel, this, printMode); diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties index ffb723fc72d9a4f236033a762e4ce8ff8a03139c..124433223caa40943583f805c12763a66d009ec1 100644 --- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties @@ -83,4 +83,5 @@ fig.median=Median print=Drucken section=Sektion retrievetest.confirm.text.plural=Wollen Sie wirklich die Tests von "{0}" einziehen? -retrievetest.nothing.todo=Es gibt zurzeit kein Test dass Sie einziehen k\u00F6nnen. \ No newline at end of file +retrievetest.nothing.todo=Es gibt zurzeit kein Test dass Sie einziehen k\u00F6nnen. +error.notfound.text=Das Test-Datei konnte nicht ge\u00F6ffnet werden und die Statistiken konnten nicht angezeigt werden. \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties index fa59a3d47a2f9bb3c6bf5f62e9d3699cfc8a831a..e470ac1d094f009de8156f45839de77851d2b767 100644 --- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties @@ -42,6 +42,7 @@ chart.thisquestionwrongansweredpercent={0}% of the participants did not answer t chart.title.completiontime=Completion time chart.title.ovpassedfailed=Passed / Failed download.raw.data=Download raw data +error.notfound.text=The file with the test cannot be opened and the statistics cannot be shown. essay.warning.test=This test contains question of type essay. Please navigate to the respective question for further analysis. essay.warning.survey=This questionnaire contains question of type essay. Please navigate to the respective question for further analysis. fig.averagedur=Average completion time diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java index dac41a7fe0bb231503087a3e078e06775934b521..d84fd1341d493ace6175be2404b47077bd7d121e 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java @@ -610,6 +610,7 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa @Override public AssessmentResult getAssessmentResult(AssessmentTestSession candidateSession) { File assessmentResultFile = getAssessmentResultFile(candidateSession); + System.out.println(assessmentResultFile); ResourceLocator fileResourceLocator = new PathResourceLocator(assessmentResultFile.getParentFile().toPath()); ResourceLocator inputResourceLocator = ImsQTI21Resource.createResolvingResourceLocator(fileResourceLocator); diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java b/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java index bcb87fc28f5560e6fc1ea14718f3130d4f37f299..6738fd510c836c47b556a33210a3ccc86cea9397 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java @@ -56,6 +56,7 @@ public class QTI21AssessmentItemFactory implements QItemFactory { case fib: return "QTI 2.1 " + trans.translate("new.fib"); case numerical: return "QTI 2.1 " + trans.translate("new.fib.numerical"); case essay: return "QTI 2.1 " + trans.translate("new.essay"); + case hotspot: return "QTI 2.1 " + trans.translate("new.hotspot"); default: return type.name(); } } diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java index 1367da0a4973db838bc4521639e11d9c8a34dcb3..79b2ba00697f355e2cc159f69f1a4e7afe00577a 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java @@ -58,6 +58,7 @@ import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder; import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.EntryType; +import org.olat.ims.qti21.model.xml.interactions.HotspotAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; @@ -245,6 +246,7 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { case fib: itemBuilder = new FIBAssessmentItemBuilder(EntryType.text, qtiService.qtiSerializer()); break; case numerical: itemBuilder = new FIBAssessmentItemBuilder(EntryType.numerical, qtiService.qtiSerializer()); break; case essay: itemBuilder = new EssayAssessmentItemBuilder(qtiService.qtiSerializer()); break; + case hotspot: itemBuilder = new HotspotAssessmentItemBuilder(qtiService.qtiSerializer()); break; default: return null; }