Search in sources :

Example 11 with SimpleMatchSet

use of uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet in project openolat by klemens.

the class MatchInteractionArchive method writeInteractionData.

@Override
public int writeInteractionData(AssessmentItem item, AssessmentResponse response, Interaction interaction, int itemNumber, Row dataRow, int col, OpenXMLWorkbook workbook) {
    MatchInteraction matchInteraction = (MatchInteraction) interaction;
    String stringuifiedResponse = response == null ? null : response.getStringuifiedResponse();
    if (!StringHelper.containsNonWhitespace(stringuifiedResponse)) {
        col += matchInteraction.getSimpleMatchSets().get(0).getSimpleAssociableChoices().size();
    } else {
        boolean kprim = matchInteraction.getResponseIdentifier().toString().startsWith("KPRIM_") || QTI21QuestionType.hasClass(matchInteraction, QTI21Constants.CSS_MATCH_KPRIM);
        Set<String> correctAnswers = CorrectResponsesUtil.getCorrectDirectPairResponses(item, matchInteraction, false);
        List<String> responses = CorrectResponsesUtil.parseResponses(stringuifiedResponse);
        SimpleMatchSet firstMatchSet = matchInteraction.getSimpleMatchSets().get(0);
        SimpleMatchSet secondMatchSet = matchInteraction.getSimpleMatchSets().get(1);
        for (SimpleAssociableChoice choice : firstMatchSet.getSimpleAssociableChoices()) {
            String choiceIdentifier = choice.getIdentifier().toString();
            if (kprim) {
                String markerCorrect = choiceIdentifier + " correct";
                String markerWrong = choiceIdentifier + " wrong";
                boolean isCorrectRight = correctAnswers.contains(markerCorrect);
                String rightFlag = isCorrectRight ? markerCorrect : markerWrong;
                String wrongFlag = isCorrectRight ? markerWrong : markerCorrect;
                String value = null;
                if (stringuifiedResponse.contains(markerCorrect)) {
                    value = "+";
                } else if (stringuifiedResponse.contains(markerWrong)) {
                    value = "-";
                }
                if (stringuifiedResponse.indexOf(rightFlag) >= 0) {
                    dataRow.addCell(col++, value, workbook.getStyles().getCorrectStyle());
                } else if (stringuifiedResponse.indexOf(wrongFlag) >= 0) {
                    dataRow.addCell(col++, value, null);
                } else {
                    col++;
                }
            } else {
                String aResponse = null;
                for (String r : responses) {
                    if (r.startsWith(choiceIdentifier)) {
                        aResponse = r;
                    }
                }
                if (StringHelper.containsNonWhitespace(aResponse)) {
                    boolean correct = correctAnswers.contains(aResponse);
                    String value = null;
                    for (SimpleAssociableChoice association : secondMatchSet.getSimpleAssociableChoices()) {
                        if (aResponse.endsWith(association.getIdentifier().toString())) {
                            value = getContent(association);
                            break;
                        }
                    }
                    if (correct) {
                        dataRow.addCell(col++, value, workbook.getStyles().getCorrectStyle());
                    } else {
                        dataRow.addCell(col++, value, null);
                    }
                } else {
                    col++;
                }
            }
        }
    }
    return col;
}
Also used : MatchInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction) SimpleMatchSet(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet) SimpleAssociableChoice(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleAssociableChoice)

Example 12 with SimpleMatchSet

use of uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet in project openolat by klemens.

the class AssessmentItemBuilderTest method buildAssessmentItem_kprim.

@Test
public void buildAssessmentItem_kprim() throws IOException, URISyntaxException {
    QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager());
    KPrimAssessmentItemBuilder itemBuilder = new KPrimAssessmentItemBuilder("Kprim", "New answer", qtiSerializer);
    if (build.booleanValue()) {
        itemBuilder.build();
    }
    AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem();
    ItemValidationResult itemResult = serializeAndReload(singleChoiceItem);
    AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful();
    List<Interaction> interactions = reloadedItem.getItemBody().findInteractions();
    Assert.assertNotNull(interactions);
    Assert.assertEquals(1, interactions.size());
    Assert.assertTrue(interactions.get(0) instanceof MatchInteraction);
    MatchInteraction interaction = (MatchInteraction) interactions.get(0);
    Assert.assertNotNull(interaction.getResponseIdentifier());
    ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier());
    Assert.assertNotNull(responseDeclaration);
    Assert.assertEquals(2, interaction.getSimpleMatchSets().size());
    SimpleMatchSet matchSet = interaction.getSimpleMatchSets().get(0);
    Assert.assertEquals(4, matchSet.getSimpleAssociableChoices().size());
    SimpleMatchSet correctWrongSet = interaction.getSimpleMatchSets().get(1);
    Assert.assertEquals(2, correctWrongSet.getSimpleAssociableChoices().size());
}
Also used : MatchInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction) SimpleMatchSet(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet) KPrimAssessmentItemBuilder(org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder) JqtiExtensionManager(uk.ac.ed.ph.jqtiplus.JqtiExtensionManager) QtiSerializer(uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer) TextEntryInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.TextEntryInteraction) ExtendedTextInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.ExtendedTextInteraction) HotspotInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.HotspotInteraction) Interaction(uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction) ChoiceInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction) MatchInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction) ResolvedAssessmentItem(uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem) AssessmentItem(uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem) ResponseDeclaration(uk.ac.ed.ph.jqtiplus.node.item.response.declaration.ResponseDeclaration) ItemValidationResult(uk.ac.ed.ph.jqtiplus.validation.ItemValidationResult) Test(org.junit.Test)

Example 13 with SimpleMatchSet

use of uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet in project openolat by klemens.

the class MatchScoreController method sync.

private List<MatchWrapper> sync(SimpleMatchSet matchSet, List<MatchWrapper> wrappers) {
    Map<Identifier, MatchWrapper> currentMapping = wrappers.stream().collect(Collectors.toMap(w -> w.getChoiceIdentifier(), w -> w));
    List<MatchWrapper> newWrappers = new ArrayList<>();
    List<SimpleAssociableChoice> choices = matchSet.getSimpleAssociableChoices();
    for (SimpleAssociableChoice choice : choices) {
        if (currentMapping.containsKey(choice.getIdentifier())) {
            newWrappers.add(currentMapping.get(choice.getIdentifier()));
        } else {
            newWrappers.add(createMatchWrapper(choice));
        }
    }
    return newWrappers;
}
Also used : Util(org.olat.core.util.Util) FormEvent(org.olat.core.gui.components.form.flexible.impl.FormEvent) AssessmentItemEvent(org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent) Identifier(uk.ac.ed.ph.jqtiplus.types.Identifier) HashMap(java.util.HashMap) SingleSelection(org.olat.core.gui.components.form.flexible.elements.SingleSelection) FormItem(org.olat.core.gui.components.form.flexible.FormItem) ArrayList(java.util.ArrayList) SimpleMatchSet(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet) FormItemContainer(org.olat.core.gui.components.form.flexible.FormItemContainer) ScoreBuilder(org.olat.ims.qti21.model.xml.ScoreBuilder) Map(java.util.Map) StringHelper(org.olat.core.util.StringHelper) URI(java.net.URI) AssessmentTestEditorController(org.olat.ims.qti21.ui.editor.AssessmentTestEditorController) WindowControl(org.olat.core.gui.control.WindowControl) ResourcesMapper(org.olat.ims.qti21.ui.ResourcesMapper) AssessmentItemRef(uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef) SimpleAssociableChoice(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleAssociableChoice) FlowFormItem(org.olat.ims.qti21.ui.components.FlowFormItem) Collectors(java.util.stream.Collectors) Controller(org.olat.core.gui.control.Controller) CodeHelper(org.olat.core.util.CodeHelper) File(java.io.File) TextElement(org.olat.core.gui.components.form.flexible.elements.TextElement) AssessmentHtmlBuilder(org.olat.ims.qti21.model.xml.AssessmentHtmlBuilder) MatchAssessmentItemBuilder(org.olat.ims.qti21.model.xml.interactions.MatchAssessmentItemBuilder) List(java.util.List) AssessmentItemBuilder(org.olat.ims.qti21.model.xml.AssessmentItemBuilder) DirectedPairValue(uk.ac.ed.ph.jqtiplus.value.DirectedPairValue) AssessmentHelper(org.olat.course.assessment.AssessmentHelper) SyncAssessmentItem(org.olat.ims.qti21.ui.editor.SyncAssessmentItem) UserRequest(org.olat.core.gui.UserRequest) ScoreEvaluation(org.olat.ims.qti21.model.xml.interactions.SimpleChoiceAssessmentItemBuilder.ScoreEvaluation) FormLayoutContainer(org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer) SimpleAssociableChoice(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleAssociableChoice) Identifier(uk.ac.ed.ph.jqtiplus.types.Identifier) ArrayList(java.util.ArrayList)

Example 14 with SimpleMatchSet

use of uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet in project OpenOLAT by OpenOLAT.

the class MatchInteractionArchive method writeInteractionData.

@Override
public int writeInteractionData(AssessmentItem item, AssessmentResponse response, Interaction interaction, int itemNumber, Row dataRow, int col, OpenXMLWorkbook workbook) {
    MatchInteraction matchInteraction = (MatchInteraction) interaction;
    String stringuifiedResponse = response == null ? null : response.getStringuifiedResponse();
    if (!StringHelper.containsNonWhitespace(stringuifiedResponse)) {
        col += matchInteraction.getSimpleMatchSets().get(0).getSimpleAssociableChoices().size();
    } else {
        boolean kprim = matchInteraction.getResponseIdentifier().toString().startsWith("KPRIM_") || QTI21QuestionType.hasClass(matchInteraction, QTI21Constants.CSS_MATCH_KPRIM);
        Set<String> correctAnswers = CorrectResponsesUtil.getCorrectDirectPairResponses(item, matchInteraction, false);
        List<String> responses = CorrectResponsesUtil.parseResponses(stringuifiedResponse);
        SimpleMatchSet firstMatchSet = matchInteraction.getSimpleMatchSets().get(0);
        SimpleMatchSet secondMatchSet = matchInteraction.getSimpleMatchSets().get(1);
        for (SimpleAssociableChoice choice : firstMatchSet.getSimpleAssociableChoices()) {
            String choiceIdentifier = choice.getIdentifier().toString();
            if (kprim) {
                String markerCorrect = choiceIdentifier + " correct";
                String markerWrong = choiceIdentifier + " wrong";
                boolean isCorrectRight = correctAnswers.contains(markerCorrect);
                String rightFlag = isCorrectRight ? markerCorrect : markerWrong;
                String wrongFlag = isCorrectRight ? markerWrong : markerCorrect;
                String value = null;
                if (stringuifiedResponse.contains(markerCorrect)) {
                    value = "+";
                } else if (stringuifiedResponse.contains(markerWrong)) {
                    value = "-";
                }
                if (stringuifiedResponse.indexOf(rightFlag) >= 0) {
                    dataRow.addCell(col++, value, workbook.getStyles().getCorrectStyle());
                } else if (stringuifiedResponse.indexOf(wrongFlag) >= 0) {
                    dataRow.addCell(col++, value, null);
                } else {
                    col++;
                }
            } else {
                String aResponse = null;
                for (String r : responses) {
                    if (r.startsWith(choiceIdentifier)) {
                        aResponse = r;
                    }
                }
                if (StringHelper.containsNonWhitespace(aResponse)) {
                    boolean correct = correctAnswers.contains(aResponse);
                    String value = null;
                    for (SimpleAssociableChoice association : secondMatchSet.getSimpleAssociableChoices()) {
                        if (aResponse.endsWith(association.getIdentifier().toString())) {
                            value = getContent(association);
                            break;
                        }
                    }
                    if (correct) {
                        dataRow.addCell(col++, value, workbook.getStyles().getCorrectStyle());
                    } else {
                        dataRow.addCell(col++, value, null);
                    }
                } else {
                    col++;
                }
            }
        }
    }
    return col;
}
Also used : MatchInteraction(uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction) SimpleMatchSet(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet) SimpleAssociableChoice(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleAssociableChoice)

Example 15 with SimpleMatchSet

use of uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet in project OpenOLAT by OpenOLAT.

the class KPrimStatisticsController method getKPrim.

public Series getKPrim() {
    List<KPrimStatistics> statisticResponses = qtiStatisticsManager.getKPrimStatistics(itemRef.getIdentifier().toString(), assessmentItem, interaction, resourceResult.getSearchParams());
    // TODO String mediaBaseURL = resourceResult.getMediaBaseURL();
    boolean survey = QTIType.survey.equals(resourceResult.getType());
    int numOfParticipants = resourceResult.getQTIStatisticAssessment().getNumOfParticipants();
    List<SimpleMatchSet> matchSets = interaction.getSimpleMatchSets();
    SimpleMatchSet fourMatchSet = matchSets.get(0);
    int i = 0;
    BarSeries d1 = new BarSeries("bar_green", "green", translate("answer.correct"));
    BarSeries d2 = new BarSeries("bar_red", "red", translate("answer.false"));
    BarSeries d3 = new BarSeries("bar_grey", "grey", translate("answer.noanswer"));
    List<ResponseInfos> responseInfos = new ArrayList<>();
    for (KPrimStatistics statisticResponse : statisticResponses) {
        Identifier choiceIdentifier = statisticResponse.getChoiceIdentifier();
        boolean correctRight = statisticResponse.isCorrectRight();
        double right = statisticResponse.getNumOfCorrect();
        double wrong = statisticResponse.getNumOfIncorrect();
        double notanswered = numOfParticipants - right - wrong;
        String label = Integer.toString(++i);
        d1.add(right, label);
        d2.add(wrong, label);
        d3.add(notanswered, label);
        String text = "";
        for (SimpleAssociableChoice choice : fourMatchSet.getSimpleAssociableChoices()) {
            if (choice.getIdentifier().equals(choiceIdentifier)) {
                String textFlow = assessmentHtmlBuilder.flowStaticString(choice.getFlowStatics());
                text = Formatter.formatLatexFormulas(textFlow);
            }
        }
        responseInfos.add(new ResponseInfos(label, text, null, correctRight, survey, true));
    }
    List<BarSeries> serieList = new ArrayList<>(3);
    serieList.add(d1);
    serieList.add(d2);
    serieList.add(d3);
    Series series = new Series(serieList, responseInfos, numOfParticipants, !survey);
    series.setChartType(survey ? SeriesFactory.BAR_ANSWERED : SeriesFactory.BAR_CORRECT_WRONG_NOT);
    series.setItemCss("o_mi_qtikprim");
    return series;
}
Also used : SimpleAssociableChoice(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleAssociableChoice) ArrayList(java.util.ArrayList) BarSeries(org.olat.core.gui.components.chart.BarSeries) KPrimStatistics(org.olat.ims.qti21.model.statistics.KPrimStatistics) SimpleMatchSet(uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet) Series(org.olat.ims.qti.statistics.ui.Series) BarSeries(org.olat.core.gui.components.chart.BarSeries) ResponseInfos(org.olat.ims.qti.statistics.ui.ResponseInfos) Identifier(uk.ac.ed.ph.jqtiplus.types.Identifier)

Aggregations

SimpleMatchSet (uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet)21 SimpleAssociableChoice (uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleAssociableChoice)16 MatchInteraction (uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction)12 ArrayList (java.util.ArrayList)10 ResponseDeclaration (uk.ac.ed.ph.jqtiplus.node.item.response.declaration.ResponseDeclaration)8 Identifier (uk.ac.ed.ph.jqtiplus.types.Identifier)8 HashMap (java.util.HashMap)6 DirectedPairValue (uk.ac.ed.ph.jqtiplus.value.DirectedPairValue)6 List (java.util.List)4 KPrimStatistics (org.olat.ims.qti21.model.statistics.KPrimStatistics)4 PromptGroup (uk.ac.ed.ph.jqtiplus.group.item.interaction.PromptGroup)4 AssessmentItem (uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem)4 P (uk.ac.ed.ph.jqtiplus.node.content.xhtml.text.P)3 File (java.io.File)2 URI (java.net.URI)2 HashSet (java.util.HashSet)2 Map (java.util.Map)2 Collectors (java.util.stream.Collectors)2 Test (org.junit.Test)2 UserRequest (org.olat.core.gui.UserRequest)2