diff --git a/src/main/java/org/olat/ims/qti21/QTI21Service.java b/src/main/java/org/olat/ims/qti21/QTI21Service.java index 566f95e5da3e6a7a8c33076c847b80ac8662db2d..e4465d5d4a25617af92bdc1f26ba716e57125cdd 100644 --- a/src/main/java/org/olat/ims/qti21/QTI21Service.java +++ b/src/main/java/org/olat/ims/qti21/QTI21Service.java @@ -96,10 +96,12 @@ public interface QTI21Service { /** * Load the assessmentTest based on the imsmanifest.xml found in the resource - * directory. + * directory. Return null if the imsmanifest.xml is not found. * - * @param resourceDirectory - * @return + * @param resourceDirectory The directory where is the package + * @param replace If true updates the cache + * @param debugInfo If true writes more infos + * @return The resolved assessment test or null if the imsmanifest.xml was not found. */ public ResolvedAssessmentTest loadAndResolveAssessmentTest(File resourceDirectory, boolean replace, boolean debugInfo); 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 133f9f0986569c651e02ed4544a52990346139de..de4a1dd201112b72037bc84b19368fdbb3fa7716 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java @@ -293,6 +293,9 @@ public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, Initia @Override public ResolvedAssessmentTest loadAndResolveAssessmentTest(File resourceDirectory, boolean replace, boolean debugInfo) { URI assessmentObjectSystemId = createAssessmentObjectUri(resourceDirectory); + if(assessmentObjectSystemId == null) { + return null; + } File resourceFile = new File(assessmentObjectSystemId); if(replace) { ResolvedAssessmentTest resolvedAssessmentTest = internalLoadAndResolveAssessmentTest(resourceDirectory, assessmentObjectSystemId); @@ -367,17 +370,22 @@ public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, Initia @Override public URI createAssessmentObjectUri(final File resourceDirectory) { final String key = resourceDirectory.getAbsolutePath(); - return resourceToTestURI.computeIfAbsent(key, (directoryAbsolutPath) -> { - File manifestPath = new File(resourceDirectory, "imsmanifest.xml"); - QTI21ContentPackage cp = new QTI21ContentPackage(manifestPath.toPath()); - try { - Path testPath = cp.getTest(); - return testPath.toUri(); - } catch (IOException e) { - log.error("", e); - return null; - } - }); + try { + return resourceToTestURI.computeIfAbsent(key, (directoryAbsolutPath) -> { + File manifestPath = new File(resourceDirectory, "imsmanifest.xml"); + QTI21ContentPackage cp = new QTI21ContentPackage(manifestPath.toPath()); + try { + Path testPath = cp.getTest(); + return testPath.toUri(); + } catch (IOException e) { + log.error("", e); + return null; + } + }); + } catch (RuntimeException e) { + log.error("", e); + return null; + } } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java index 6e0716aeef503ab7a328764d4b16e4c697001790..9a27dab82be533bc34cae02734c902e715a9e5b8 100644 --- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java +++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java @@ -241,7 +241,7 @@ public class AssessmentTestDisplayController extends BasicController implements FileResourceManager frm = FileResourceManager.getInstance(); fUnzippedDirRoot = frm.unzipFileResource(testEntry.getOlatResource()); resolvedAssessmentTest = qtiService.loadAndResolveAssessmentTest(fUnzippedDirRoot, false, false); - if(resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful() == null) { + if(resolvedAssessmentTest == null || resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful() == null) { mainVC = createVelocityContainer("error"); } else { currentRequestTimestamp = ureq.getRequestTimestamp(); @@ -269,10 +269,6 @@ public class AssessmentTestDisplayController extends BasicController implements } mainPanel = putInitialPanel(mainVC); - - OLATResourceable sessionOres = OresHelper - .createOLATResourceableInstance(AssessmentTestSession.class, candidateSession.getKey()); - CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, getIdentity(), sessionOres); } private void immediateEndTestSession(UserRequest ureq) {