diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java index 2b5b709fc845462aa38b8983f6f58c5eab74f3c6..49e82d9ae1da79513deebef78b992a5d049e19a2 100644 --- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java @@ -140,6 +140,8 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT private static final int CURRENT_CONFIG_VERSION = 2; + private transient RepositoryEntry cachedReferenceRepositoryEntry; + public IQTESTCourseNode() { this(null); } @@ -424,12 +426,27 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT sd.setActivateableViewIdentifier(pane); status.add(sd); } + + /** + * @return A cached instance of the reference repository entry. May be not suitable + * to insert an assessment entry. + */ + public RepositoryEntry getCachedReferencedRepositoryEntry() { + RepositoryEntry cachedEntry = cachedReferenceRepositoryEntry; + if(IQEditController.matchIQReference(cachedEntry, getModuleConfiguration())) { + return cachedEntry; + } + // The method updates the cache + return getReferencedRepositoryEntry(); + } @Override public RepositoryEntry getReferencedRepositoryEntry() { // ",false" because we do not want to be strict, but just indicate whether // the reference still exists or not - return IQEditController.getIQReference(getModuleConfiguration(), false); + RepositoryEntry entry = IQEditController.getIQReference(getModuleConfiguration(), false); + cachedReferenceRepositoryEntry = entry; + return entry; } @Override diff --git a/src/main/java/org/olat/course/nodes/iq/IQEditController.java b/src/main/java/org/olat/course/nodes/iq/IQEditController.java index 5ccffae1ab861376fe2d6b877b64a839dd6ede2e..f8377a910fc7330f5eb4b966731f7c94eb039959 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQEditController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQEditController.java @@ -380,6 +380,11 @@ public class IQEditController extends ActivateableTabbableDefaultController impl moduleConfiguration.set(CONFIG_KEY_REPOSITORY_SOFTKEY, re.getSoftkey()); } + public static boolean matchIQReference(RepositoryEntry re, ModuleConfiguration moduleConfiguration) { + String repoSoftkey = (String)moduleConfiguration.get(CONFIG_KEY_REPOSITORY_SOFTKEY); + return repoSoftkey != null && re != null && repoSoftkey.equals(re.getSoftkey()); + } + /** * Remove the reference to the repository entry. * diff --git a/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java b/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java index 620b487e457d42760ba9fdfc1069a445d66918d4..001840a25e0cd60aa70f167e7e45aae53da02a40 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java +++ b/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java @@ -78,7 +78,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig { || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { maxScore = (Float) config.get(IQEditController.CONFIG_KEY_MAXSCORE); } else { - RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); + RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry(); if (testEntry != null) { if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) { AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry); @@ -107,7 +107,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig { || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { minScore = (Float) config.get(IQEditController.CONFIG_KEY_MINSCORE); } else { - RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); + RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry(); if (testEntry != null) { if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) { AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry); @@ -135,7 +135,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig { || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { mode = Mode.setByNode; } else { - RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); + RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry(); if (testEntry != null) { if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) { AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry); @@ -168,7 +168,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig { || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { cutValue = (Float) config.get(IQEditController.CONFIG_KEY_CUTVALUE); } else { - RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); + RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry(); if (testEntry != null) { if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) { AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry);