diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java index ab7e0a62e7a49732ffebe7246b96dbd7dcc0659f..766f907070b6cb851b875bae07e823c8ff390eb4 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java @@ -267,19 +267,19 @@ public class AssessmentItemEditorController extends BasicController { } private AssessmentItemBuilder initFIBEditors(UserRequest ureq, QTI21QuestionType preferedType, AssessmentItem item) { - FIBAssessmentItemBuilder kprimItemBuilder = new FIBAssessmentItemBuilder(item, qtiService.qtiSerializer()); - itemEditor = new FIBEditorController(ureq, getWindowControl(), preferedType, kprimItemBuilder, + FIBAssessmentItemBuilder fibItemBuilder = new FIBAssessmentItemBuilder(item, qtiService.qtiSerializer()); + itemEditor = new FIBEditorController(ureq, getWindowControl(), preferedType, fibItemBuilder, rootDirectory, rootContainer, itemFile, restrictedEdit); listenTo(itemEditor); - scoreEditor = new FIBScoreController(ureq, getWindowControl(), kprimItemBuilder, itemRef, restrictedEdit); + scoreEditor = new FIBScoreController(ureq, getWindowControl(), fibItemBuilder, itemRef, restrictedEdit); listenTo(scoreEditor); - feedbackEditor = new FeedbackEditorController(ureq, getWindowControl(), kprimItemBuilder, restrictedEdit); + feedbackEditor = new FeedbackEditorController(ureq, getWindowControl(), fibItemBuilder, restrictedEdit); listenTo(feedbackEditor); tabbedPane.addTab(translate("form.fib"), itemEditor); tabbedPane.addTab(translate("form.score"), scoreEditor); tabbedPane.addTab(translate("form.feedback"), feedbackEditor); - return kprimItemBuilder; + return fibItemBuilder; } private AssessmentItemBuilder initHotspotEditors(UserRequest ureq, AssessmentItem item) { diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java index 96a4d2595be5185963719d2e4a490b6c9f3176d9..bf3280305dfc1a7618521125a9ac8513c2d7edf6 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java @@ -20,10 +20,10 @@ package org.olat.ims.qti21.ui.editor.interactions; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -67,7 +67,7 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem private SingleSelection assessmentModeEl; private FIBAssessmentItemBuilder itemBuilder; - private final List<TextEntryWrapper> wrappers = new ArrayList<>(); + private final List<FIBEntryWrapper> wrappers = new ArrayList<>(); private int counter = 0; @@ -128,14 +128,14 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem if(itemBuilder == assessmentItemBuilder) { List<AbstractEntry> entries = itemBuilder.getOrderedTextEntries(); for(AbstractEntry entry:entries) { - TextEntryWrapper wrapper = getTextEntryWrapper(entry); + FIBEntryWrapper wrapper = getTextEntryWrapper(entry); if(wrapper == null) { wrappers.add(createTextEntryWrapper(entry)); } } //remove removed entry - for(Iterator<TextEntryWrapper> wrapperIt=wrappers.iterator(); wrapperIt.hasNext(); ) { + for(Iterator<FIBEntryWrapper> wrapperIt=wrappers.iterator(); wrapperIt.hasNext(); ) { Identifier responseIdentifier = wrapperIt.next().getEntry().getResponseIdentifier(); if(itemBuilder.getTextEntry(responseIdentifier.toString()) == null) { wrapperIt.remove(); @@ -143,11 +143,13 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem } //reorder the wrappers - Map<AbstractEntry,TextEntryWrapper> wrapperMap = wrappers.stream() - .collect(Collectors.toMap(w -> w.getEntry(), w -> w)); - List<TextEntryWrapper> reorderedWrappers = new ArrayList<>(); + Map<AbstractEntry,FIBEntryWrapper> wrapperMap = new HashMap<>(); + for(FIBEntryWrapper wrapper:wrappers) { + wrapperMap.put(wrapper.getEntry(), wrapper); + } + List<FIBEntryWrapper> reorderedWrappers = new ArrayList<>(); for(AbstractEntry entry:entries) { - TextEntryWrapper wrapper = wrapperMap.get(entry); + FIBEntryWrapper wrapper = wrapperMap.get(entry); if(wrapper != null) { reorderedWrappers.add(wrapper); wrapperMap.remove(entry); @@ -155,15 +157,19 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem } if(wrapperMap.size() > 0) {//paranoid security - reorderedWrappers.addAll(wrapperMap.values()); + for(FIBEntryWrapper wrapper:wrapperMap.values()) { + if(!reorderedWrappers.contains(wrapper)) { + reorderedWrappers.add(wrapper); + } + } } wrappers.clear(); wrappers.addAll(reorderedWrappers); } } - private TextEntryWrapper getTextEntryWrapper(AbstractEntry entry) { - for(TextEntryWrapper wrapper:wrappers) { + private FIBEntryWrapper getTextEntryWrapper(AbstractEntry entry) { + for(FIBEntryWrapper wrapper:wrappers) { if(wrapper.getEntry() == entry) { return wrapper; } @@ -171,7 +177,7 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem return null; } - private TextEntryWrapper createTextEntryWrapper(AbstractEntry entry) { + private FIBEntryWrapper createTextEntryWrapper(AbstractEntry entry) { String points = ""; Double score = entry.getScore(); if(score != null) { @@ -182,7 +188,7 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem pointEl.setDisplaySize(5); pointEl.setEnabled(!restrictedEdit); scoreCont.add(pointElId, pointEl); - return new TextEntryWrapper(entry, pointEl); + return new FIBEntryWrapper(entry, pointEl); } @Override @@ -191,7 +197,7 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem allOk &= validateDouble(maxScoreEl); if(assessmentModeEl.isOneSelected() && assessmentModeEl.isSelected(1)) { - for(TextEntryWrapper wrapper:wrappers) { + for(FIBEntryWrapper wrapper:wrappers) { allOk &= validateDouble(wrapper.getPointsEl()); } } @@ -219,7 +225,7 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem if(assessmentModeEl.isOneSelected() && assessmentModeEl.isSelected(1)) { itemBuilder.setScoreEvaluationMode(ScoreEvaluation.perAnswer); - for(TextEntryWrapper wrapper:wrappers) { + for(FIBEntryWrapper wrapper:wrappers) { String pointsStr = wrapper.getPointsEl().getValue(); Double points = new Double(pointsStr); wrapper.getEntry().setScore(points); @@ -236,16 +242,19 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem // } - public final class TextEntryWrapper { + public final class FIBEntryWrapper { - private final String summary; private final AbstractEntry entry; private final TextElement pointsEl; - public TextEntryWrapper(AbstractEntry entry, TextElement pointsEl) { + public FIBEntryWrapper(AbstractEntry entry, TextElement pointsEl) { this.entry = entry; this.pointsEl = pointsEl; pointsEl.setUserObject(this); + } + + public String getSummary() { + String summary; if(entry instanceof TextEntry) { summary = ((TextEntry)entry).getSolution(); } else if(entry instanceof NumericalEntry) { @@ -254,9 +263,6 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem } else { summary = "???"; } - } - - public String getSummary() { return summary; } @@ -267,5 +273,22 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem public AbstractEntry getEntry() { return entry; } + + @Override + public int hashCode() { + return entry.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(this == obj) { + return true; + } + if(obj instanceof FIBEntryWrapper) { + FIBEntryWrapper w = (FIBEntryWrapper)obj; + return entry == w.entry; + } + return false; + } } }