diff --git a/pom.xml b/pom.xml index 0a00d26ff4c8522dea966aa9e191d72c7c975e45..cda745c41ebc80c1183da0229b095ad1ec75775b 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ <version.selenium>3.13.0</version.selenium> <version.drone>2.5.1</version.drone> <activemq.version>5.15.8</activemq.version> - <qtiworks.version>1.0.15</qtiworks.version> + <qtiworks.version>1.0.17</qtiworks.version> <!-- properties for testing and Q&A --> <!-- by default no tests are executed so far (April 2011). Use appropriate profiles and properties on the command line --> @@ -1375,7 +1375,7 @@ <Implementation-Build>${buildNumber}</Implementation-Build> </manifestEntries> </archive> - <warSourceExcludes>**/*.pxm, **/*.psd, **/*.scss, **/*.sh, static/bootstrap/**, **/*.README</warSourceExcludes> + <warSourceExcludes>**/*.pxm, **/*.psd, **/*.sh, static/bootstrap/**, **/*.README</warSourceExcludes> <webResources> <resource> <directory>src/main/webapp</directory> diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java index 3e46c174faab3df35dffbcfaad251a0d4bc2523f..f80369dcb3e37644426a0df0ad49576f30a4eb2c 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java @@ -27,7 +27,8 @@ package org.olat.course.nodes.iq; import java.io.File; import java.text.DateFormat; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -222,25 +223,34 @@ public class IQRunController extends BasicController implements GenericEventList Formatter formatter = Formatter.getInstance(ureq.getLocale()); ImsRepositoryResolver resolver = new ImsRepositoryResolver(referenceTestEntry); QTIChangeLogMessage[] qtiChangeLog = resolver.getDocumentChangeLog(); + StringBuilder qtiChangelog = new StringBuilder(); if(qtiChangeLog.length>0){ + List<QTIChangeLogMessage> qtiChangeLogList = new ArrayList<>(qtiChangeLog.length); + for (int i=qtiChangeLog.length; i-->0 ; ) { + if(qtiChangeLog[i] != null) { + qtiChangeLogList.add(qtiChangeLog[i]); + } + } //there are resource changes - Arrays.sort(qtiChangeLog); - for (int i = qtiChangeLog.length-1; i >= 0 ; i--) { + Collections.sort(qtiChangeLogList); + + for (int i = qtiChangeLogList.size()-1; i >= 0 ; i--) { + QTIChangeLogMessage qtiChangeLogEntry = qtiChangeLogList.get(i); //show latest change first - if(!showAll && qtiChangeLog[i].isPublic()){ + if(!showAll && qtiChangeLogEntry.isPublic()){ //logged in person is a normal user, hence public messages only - Date msgDate = new Date(qtiChangeLog[i].getTimestmp()); + Date msgDate = new Date(qtiChangeLogEntry.getTimestmp()); qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n"); - String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage()); + String msg = StringHelper.escapeHtml(qtiChangeLogEntry.getLogMessage()); qtiChangelog.append(msg); qtiChangelog.append("\n********************************\n"); }else if (showAll){ //logged in person is an author, olat admin, owner, show all messages - Date msgDate = new Date(qtiChangeLog[i].getTimestmp()); + Date msgDate = new Date(qtiChangeLogEntry.getTimestmp()); qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n"); - String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage()); + String msg = StringHelper.escapeHtml(qtiChangeLogEntry.getLogMessage()); qtiChangelog.append(msg); qtiChangelog.append("\n********************************\n"); }//else non public messages are not shown to normal user diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java index e4623188fb651882c13fa05ccd6a51e730fd210b..6e2506ec81c14f3aea90231e5a1ccc3ffd7abf9f 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java @@ -35,6 +35,7 @@ import uk.ac.ed.ph.jqtiplus.node.item.ModalFeedback; import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction; import uk.ac.ed.ph.jqtiplus.node.result.SessionStatus; import uk.ac.ed.ph.jqtiplus.node.test.AbstractPart; +import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest; import uk.ac.ed.ph.jqtiplus.node.test.TestPart; @@ -174,9 +175,16 @@ public class AssessmentTestComponent extends AssessmentObjectComponent { } try { - URI itemSystemId = itemNode.getItemSystemId(); + AssessmentItemRef itemRef = getResolvedAssessmentTest().getItemRefsByIdentifierMap() + .get(itemNode.getKey().getIdentifier()); + if(itemRef == null) { + return false; + } ResolvedAssessmentItem resolvedAssessmentItem = getResolvedAssessmentTest() - .getResolvedAssessmentItemBySystemIdMap().get(itemSystemId); + .getResolvedAssessmentItem(itemRef); + if(resolvedAssessmentItem == null) { + return false; + } AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful(); if(assessmentItem.getAdaptive()) { return true; 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 946ad379a5aed48c1d969bba09a1bb008328725d..7ed2ce11de90ad11624fbc37c4e0980e3c52aced 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 @@ -25,7 +25,6 @@ import static org.olat.ims.qti21.ui.components.AssessmentRenderFunctions.testFee import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; -import java.net.URI; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -70,6 +69,7 @@ import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; import uk.ac.ed.ph.jqtiplus.node.item.template.declaration.TemplateDeclaration; import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration; +import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection; import uk.ac.ed.ph.jqtiplus.node.test.NavigationMode; import uk.ac.ed.ph.jqtiplus.node.test.TestFeedback; @@ -380,17 +380,23 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe private void renderTestItemBody(AssessmentRenderer renderer, StringOutput sb, AssessmentTestComponent component, TestPlanNode itemNode, URLBuilder ubu, Translator translator, RenderingRequest options) { - final ItemSessionState itemSessionState = component.getItemSessionState(itemNode.getKey()); - - URI itemSystemId = itemNode.getItemSystemId(); + + AssessmentItemRef itemRef = component.getResolvedAssessmentTest() + .getItemRefsByIdentifierMap().get(itemNode.getKey().getIdentifier()); + if(itemRef == null) { + log.error("Missing assessment item ref: " + itemNode.getKey()); + renderMissingItem(sb, translator); + return; + } ResolvedAssessmentItem resolvedAssessmentItem = component.getResolvedAssessmentTest() - .getResolvedAssessmentItemBySystemIdMap().get(itemSystemId); + .getResolvedAssessmentItem(itemRef); if(resolvedAssessmentItem == null) { - log.error("Missing assessment item: " + itemSystemId); + log.error("Missing assessment item: " + itemNode.getKey()); renderMissingItem(sb, translator); return; } - + + final ItemSessionState itemSessionState = component.getItemSessionState(itemNode.getKey()); final AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful(); sb.append("<div class='o_assessmentitem_wrapper'>");