use of org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.AbstractEntry in project OpenOLAT by OpenOLAT.
the class FIBAssessmentItemBuilder method extractEntriesSettingsFromResponseDeclaration.
/**
* We loop around the textEntryInteraction, search the responseDeclaration. responseDeclaration
* of type string are gap text, of type float are numerical.
*/
public void extractEntriesSettingsFromResponseDeclaration() {
DoubleAdder mappedScore = new DoubleAdder();
AtomicInteger countAlternatives = new AtomicInteger(0);
responseIdentifierToTextEntry = new HashMap<>();
List<Interaction> interactions = assessmentItem.getItemBody().findInteractions();
for (Interaction interaction : interactions) {
if (interaction instanceof TextEntryInteraction && interaction.getResponseIdentifier() != null) {
AbstractEntry entry = null;
TextEntryInteraction textInteraction = (TextEntryInteraction) interaction;
ResponseDeclaration responseDeclaration = assessmentItem.getResponseDeclaration(interaction.getResponseIdentifier());
if (responseDeclaration != null) {
if (responseDeclaration.hasBaseType(BaseType.STRING) && responseDeclaration.hasCardinality(Cardinality.SINGLE)) {
TextEntry textEntry = new TextEntry(textInteraction);
extractTextEntrySettingsFromResponseDeclaration(textEntry, responseDeclaration, countAlternatives, mappedScore);
String marker = "responseIdentifier=\"" + interaction.getResponseIdentifier().toString() + "\"";
question = question.replace(marker, marker + " openolatType=\"string\"");
if (StringHelper.containsNonWhitespace(textEntry.getSolution())) {
question = question.replace(marker, marker + " data-qti-solution=\"" + escapeForDataQtiSolution(textEntry.getSolution()) + "\"");
}
entry = textEntry;
} else if (responseDeclaration.hasBaseType(BaseType.FLOAT) && responseDeclaration.hasCardinality(Cardinality.SINGLE)) {
NumericalEntry numericalEntry = new NumericalEntry(textInteraction);
entry = numericalEntry;
extractNumericalEntrySettings(assessmentItem, numericalEntry, responseDeclaration, countAlternatives, mappedScore);
String marker = "responseIdentifier=\"" + interaction.getResponseIdentifier().toString() + "\"";
question = question.replace(marker, marker + " openolatType=\"float\"");
if (numericalEntry.getSolution() != null) {
question = question.replace(marker, marker + " data-qti-solution=\"" + Double.toString(numericalEntry.getSolution()) + "\"");
}
}
}
if (entry != null) {
responseIdentifierToTextEntry.put(interaction.getResponseIdentifier().toString(), entry);
}
}
}
boolean hasMapping = Math.abs(mappedScore.doubleValue() - (-1.0 * countAlternatives.get())) > 0.0001;
scoreEvaluation = hasMapping ? ScoreEvaluation.perAnswer : ScoreEvaluation.allCorrectAnswers;
}
use of org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.AbstractEntry in project openolat by klemens.
the class CorrectResponsesUtil method getCorrectTextResponses.
public static final AbstractEntry getCorrectTextResponses(AssessmentItem assessmentItem, TextEntryInteraction interaction) {
ResponseDeclaration responseDeclaration = assessmentItem.getResponseDeclaration(interaction.getResponseIdentifier());
if (responseDeclaration.hasBaseType(BaseType.STRING) && responseDeclaration.hasCardinality(Cardinality.SINGLE)) {
TextEntry textEntry = new TextEntry(interaction);
FIBAssessmentItemBuilder.extractTextEntrySettingsFromResponseDeclaration(textEntry, responseDeclaration, new AtomicInteger(), new DoubleAdder());
return textEntry;
} else if (responseDeclaration.hasBaseType(BaseType.FLOAT) && responseDeclaration.hasCardinality(Cardinality.SINGLE)) {
NumericalEntry numericalEntry = new NumericalEntry(interaction);
FIBAssessmentItemBuilder.extractNumericalEntrySettings(assessmentItem, numericalEntry, responseDeclaration, new AtomicInteger(), new DoubleAdder());
return numericalEntry;
}
return null;
}
use of org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.AbstractEntry in project openolat by klemens.
the class FIBAssessmentItemBuilder method buildItemBody.
@Override
protected void buildItemBody() {
// remove current blocks
List<Block> blocks = assessmentItem.getItemBody().getBlocks();
blocks.clear();
// add question
getHtmlHelper().appendHtml(assessmentItem.getItemBody(), question);
// transfer text entry to the interactions
List<Interaction> interactions = assessmentItem.getItemBody().findInteractions();
List<String> usedResponseIdentifiers = new ArrayList<>(interactions.size());
for (Interaction interaction : interactions) {
if (interaction instanceof TextEntryInteraction && interaction.getResponseIdentifier() != null) {
TextEntryInteraction textEntryInteraction = (TextEntryInteraction) interaction;
String responseIdentifier = interaction.getResponseIdentifier().toString();
AbstractEntry entry = responseIdentifierToTextEntry.get(responseIdentifier);
if (entry != null) {
textEntryInteraction.setPlaceholderText(entry.getPlaceholder());
textEntryInteraction.setExpectedLength(entry.getExpectedLength());
}
usedResponseIdentifiers.add(responseIdentifier);
}
}
List<String> mappedResponseIdentifiers = new ArrayList<>(responseIdentifierToTextEntry.keySet());
mappedResponseIdentifiers.removeAll(usedResponseIdentifiers);
for (String mappedResponseIdentifier : mappedResponseIdentifiers) {
responseIdentifierToTextEntry.remove(mappedResponseIdentifier);
}
}
use of org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.AbstractEntry in project openolat by klemens.
the class FIBAssessmentItemBuilder method getOrderedTextEntries.
public List<AbstractEntry> getOrderedTextEntries() {
List<Interaction> interactions = assessmentItem.getItemBody().findInteractions();
List<AbstractEntry> entries = getTextEntries();
List<AbstractEntry> orderedEntries = new ArrayList<>();
for (Interaction interaction : interactions) {
AbstractEntry entry = getTextEntry(interaction.getResponseIdentifier().toString());
if (entry != null) {
orderedEntries.add(entry);
entries.remove(entry);
}
}
if (entries.size() > 0) {
// security
orderedEntries.addAll(entries);
}
return orderedEntries;
}
use of org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.AbstractEntry in project openolat by klemens.
the class FIBScoreController method sync.
@Override
public void sync(UserRequest ureq, AssessmentItemBuilder assessmentItemBuilder) {
if (itemBuilder == assessmentItemBuilder) {
List<AbstractEntry> entries = itemBuilder.getOrderedTextEntries();
for (AbstractEntry entry : entries) {
FIBEntryWrapper wrapper = getTextEntryWrapper(entry);
if (wrapper == null) {
wrappers.add(createTextEntryWrapper(entry));
}
}
// remove removed entry
for (Iterator<FIBEntryWrapper> wrapperIt = wrappers.iterator(); wrapperIt.hasNext(); ) {
Identifier responseIdentifier = wrapperIt.next().getEntry().getResponseIdentifier();
if (itemBuilder.getTextEntry(responseIdentifier.toString()) == null) {
wrapperIt.remove();
}
}
// reorder the wrappers
Map<AbstractEntry, FIBEntryWrapper> wrapperMap = new HashMap<>();
for (FIBEntryWrapper wrapper : wrappers) {
wrapperMap.put(wrapper.getEntry(), wrapper);
}
List<FIBEntryWrapper> reorderedWrappers = new ArrayList<>();
for (AbstractEntry entry : entries) {
FIBEntryWrapper wrapper = wrapperMap.get(entry);
if (wrapper != null) {
reorderedWrappers.add(wrapper);
wrapperMap.remove(entry);
}
}
if (wrapperMap.size() > 0) {
// paranoid security
for (FIBEntryWrapper wrapper : wrapperMap.values()) {
if (!reorderedWrappers.contains(wrapper)) {
reorderedWrappers.add(wrapper);
}
}
}
wrappers.clear();
wrappers.addAll(reorderedWrappers);
}
}
Aggregations