/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.ims.qti.export.helper;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Element;
import org.olat.ims.qti.QTIResult;
import org.olat.ims.qti.QTIResultManager;
/**
* @author
*/
public class ItemWithResponseStr implements QTIItemObject {
private boolean isEssay = true;
private String itemIdent = null;
private String itemTitle = null;
private String itemMinValue = null;
private String itemMaxValue = null;
private String itemCutValue = null;
// CELFI#107
private String quetionText = "";
// CELFI#107 END
private List<String> responseColumnHeaders = new ArrayList<>(5);
private List<String> responseStrIdents = new ArrayList<>(5);
// CELFI#107
private List<String> responseLabelMaterials = new ArrayList<>(5);
// CELFI#107 END
/**
* Constructor for ItemWithResponseLid.
*
* @param el_item
*/
public ItemWithResponseStr(Element el_item) {
// CELFI#107
this.itemTitle = el_item.attributeValue("title");
this.itemIdent = el_item.attributeValue("ident");
Element decvar = (Element) el_item.selectSingleNode(".//outcomes/decvar");
if (decvar != null) {
this.itemMinValue = decvar.attributeValue("minvalue");
this.itemMaxValue = decvar.attributeValue("maxvalue");
this.itemCutValue = decvar.attributeValue("cutvalue");
}
List el_presentationElements = el_item.selectNodes(".//presentation//mattext | .//presentation//response_str");
int i = 1;
boolean lastWasMattext = false;
for (Iterator itPresentations = el_presentationElements.iterator(); itPresentations.hasNext();) {
Element el_presentation = (Element) itPresentations.next();
String el_qname = el_presentation.getQualifiedName();
if (el_qname.equalsIgnoreCase("mattext")) {
this.quetionText += el_presentation.getTextTrim();
lastWasMattext = true;
} else {
responseStrIdents.add(el_presentation.attributeValue("ident"));
Element render_fib = el_presentation.element("render_fib");
if (render_fib != null) {
isEssay = (render_fib.attributeValue("rows") == null) ? false : true;
responseColumnHeaders.add((isEssay ? "A" : "B") + i); // A -> Area, B -> Blank
Element responseValue = (Element) el_item.selectSingleNode(".//varequal[@respident='" + el_presentation.attributeValue("ident") + "']");
if (responseValue != null) {
responseLabelMaterials.add(responseValue.getTextTrim());
if (lastWasMattext) {
this.quetionText += " [" + responseValue.getTextTrim() + "] ";
lastWasMattext = false;
}
} else responseLabelMaterials.add("");
} else {
responseColumnHeaders.add("unknownType");
responseLabelMaterials.add("");
}
i++;
}
}
// CELFI#107 END
}
/**
* @see org.olat.ims.qti.export.helper.QTIItemObject#getNumColumnHeaders()
*/
public int getNumColumnHeaders() {
return responseColumnHeaders.size();
}
/**
* @see org.olat.ims.qti.export.helper.QTIItemObject#extractQTIResult(java.util.List)
*/
public QTIResult extractQTIResult(List<QTIResult> resultSet) {
for (Iterator<QTIResult> iter = resultSet.iterator(); iter.hasNext();) {
QTIResult element = iter.next();
if (element.getItemIdent().equals(itemIdent)) {
resultSet.remove(element);
return element;
}
}
return null;
}
private void addTextAndTabs(List<String> responseColumns, String s, int num) {
for (int i = 0; i < num; i++) {
responseColumns.add(s);
}
}
/**
* @return itemTitle
*/
public String getItemTitle() {
return itemTitle;
}
// CELFI#107
public String getQuestionText() {
return this.quetionText;
}
public List<String> getResponseColumnHeaders() {
return responseColumnHeaders;
}
/**
* @see org.olat.ims.qti.export.helper.QTIItemObject#getResponseColumns(org.olat.ims.qti.QTIResult)
*/
public List<String> getResponseColumns(QTIResult qtiresult) {
List<String> responseColumns = new ArrayList<String>();
if (qtiresult == null) {
// item has not been choosen
addTextAndTabs(responseColumns, "", getNumColumnHeaders());
} else {
String answer = qtiresult.getAnswer();
if (answer.length() == 0) addTextAndTabs(responseColumns, ".", getNumColumnHeaders());
else {
Map<String,String> answerMap = QTIResultManager.parseResponseStrAnswers(answer);
for (Iterator<String> iter = responseStrIdents.iterator(); iter.hasNext();) {
String element = iter.next();
if (answerMap.containsKey(element)) {
responseColumns.add(answerMap.get(element));
} else {
// should not happen
}
}
}
}
return responseColumns;
}
public TYPE getItemType() {
return isEssay ? TYPE.A : TYPE.B; // A -> Area, B -> Blank
}
/**
* @see org.olat.ims.qti.export.helper.QTIItemObject#getResponseIdentifier()
*/
public List<String> getResponseIdentifier() {
return responseStrIdents;
}
public List<String> getResponseLabelMaterials() {
// CELFI#107
return responseLabelMaterials;
}
/**
* @see org.olat.ims.qti.export.helper.QTIItemObject#getItemIdent()
*/
public String getItemIdent() {
return itemIdent;
}
public String getItemMinValue() {
return itemMinValue;
}
public String getItemMaxValue() {
return itemMaxValue;
}
public String getItemCutValue() {
return itemCutValue;
}
public boolean hasPositionsOfResponses() {
return false;
}
public String getPositionsOfResponses() {
return null;
}
}