/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.ims.qti21.model.xml; import static org.olat.ims.qti21.QTI21Constants.MAXSCORE_IDENTIFIER; import static org.olat.ims.qti21.QTI21Constants.MINSCORE_IDENTIFIER; import java.util.ArrayList; import java.util.List; import java.util.Map; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; import uk.ac.ed.ph.jqtiplus.node.item.CorrectResponse; import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration; import uk.ac.ed.ph.jqtiplus.node.shared.BaseTypeAndCardinality; import uk.ac.ed.ph.jqtiplus.node.shared.FieldValue; import uk.ac.ed.ph.jqtiplus.node.shared.declaration.DefaultValue; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest; import uk.ac.ed.ph.jqtiplus.types.Identifier; import uk.ac.ed.ph.jqtiplus.value.Cardinality; import uk.ac.ed.ph.jqtiplus.value.DirectedPairValue; import uk.ac.ed.ph.jqtiplus.value.FloatValue; import uk.ac.ed.ph.jqtiplus.value.IdentifierValue; import uk.ac.ed.ph.jqtiplus.value.MultipleValue; import uk.ac.ed.ph.jqtiplus.value.SingleValue; import uk.ac.ed.ph.jqtiplus.value.Value; /** * * This is an helper class which extract data from the java model of QtiWorks. * * Initial date: 05.08.2016<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public interface QtiNodesExtractor { public static Double extractMaxScore(AssessmentItem assessmentItem) { return getOutcomeDeclarationDefaultFloatValue(assessmentItem.getOutcomeDeclaration(MAXSCORE_IDENTIFIER)); } public static Double extractMinScore(AssessmentItem assessmentItem) { return getOutcomeDeclarationDefaultFloatValue(assessmentItem.getOutcomeDeclaration(MINSCORE_IDENTIFIER)); } public static Double extractMaxScore(AssessmentTest assessmentTest) { return getOutcomeDeclarationDefaultFloatValue(assessmentTest.getOutcomeDeclaration(MAXSCORE_IDENTIFIER)); } public static Double extractMinScore(AssessmentTest assessmentTest) { return getOutcomeDeclarationDefaultFloatValue(assessmentTest.getOutcomeDeclaration(MINSCORE_IDENTIFIER)); } public static Double getOutcomeDeclarationDefaultFloatValue(OutcomeDeclaration outcomeDeclaration) { Double doubleValue = null; if(outcomeDeclaration != null) { DefaultValue defaultValue = outcomeDeclaration.getDefaultValue(); if(defaultValue != null) { Value evaluatedValue = defaultValue.evaluate(); if(evaluatedValue instanceof FloatValue) { doubleValue = new Double(((FloatValue)evaluatedValue).doubleValue()); } } } return doubleValue; } public static void extractIdentifiersFromCorrectResponse(CorrectResponse correctResponse, List<Identifier> correctAnswers) { BaseTypeAndCardinality responseDeclaration = correctResponse.getParent(); if(responseDeclaration.hasCardinality(Cardinality.MULTIPLE)) { Value value = FieldValue.computeValue(Cardinality.MULTIPLE, correctResponse.getFieldValues()); if(value instanceof MultipleValue) { MultipleValue multiValue = (MultipleValue)value; for(SingleValue sValue:multiValue.getAll()) { if(sValue instanceof IdentifierValue) { IdentifierValue identifierValue = (IdentifierValue)sValue; Identifier correctAnswer = identifierValue.identifierValue(); correctAnswers.add(correctAnswer); } } } } else if(responseDeclaration.hasCardinality(Cardinality.SINGLE)) { Value value = FieldValue.computeValue(Cardinality.SINGLE, correctResponse.getFieldValues()); if(value instanceof IdentifierValue) { IdentifierValue identifierValue = (IdentifierValue)value; correctAnswers.add(identifierValue.identifierValue()); } } } public static void extractIdentifiersFromCorrectResponse(CorrectResponse correctResponse, Map<Identifier,List<Identifier>> correctAnswers) { if(correctResponse != null) { List<FieldValue> values = correctResponse.getFieldValues(); for(FieldValue value:values) { SingleValue sValue = value.getSingleValue(); if(sValue instanceof DirectedPairValue) { DirectedPairValue dpValue = (DirectedPairValue)sValue; Identifier sourceId = dpValue.sourceValue(); Identifier targetId = dpValue.destValue(); List<Identifier> targetIds = correctAnswers.get(sourceId); if(targetIds == null) { targetIds = new ArrayList<>(); correctAnswers.put(sourceId, targetIds); } targetIds.add(targetId); } } } } }