/**
* 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.
* <p>
*/
package org.olat.ims.qti.export.helper;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Element;
import org.olat.ims.qti.QTIResult;
import org.olat.ims.qti.QTIResultManager;
import org.olat.ims.qti.editor.beecom.parser.ItemParser;
/**
* @author
*/
public class ItemWithResponseLid implements QTIItemObject{
private boolean isSingle;
private String itemIdent = null;
private String itemTitle = null;
private String itemMinValue = null;
private String itemMaxValue = null;
private String itemCutValue = null;
private String positionsOfResponses = null;
private List responseColumnHeaders = new ArrayList(5);
private List responseLabelIdents = new ArrayList(5);
private List responseLabelMaterials = new ArrayList(5);
/**
* Constructor for ItemWithResponseLid.
* @param el_item
*/
public ItemWithResponseLid(Element el_item) {
this.itemTitle = el_item.attributeValue("title");
this.itemIdent = el_item.attributeValue("ident");
List responseLids= el_item.selectNodes(".//response_lid");
int i = 1;
for (Iterator itresponseLid = responseLids.iterator(); itresponseLid.hasNext();) {
Element el_responseLid = (Element) itresponseLid.next();
isSingle = el_responseLid.attributeValue("rcardinality").equals("Single");
List labels = el_responseLid.selectNodes(".//response_label");
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");
}
for (Iterator itlabel = labels.iterator(); itlabel.hasNext();) {
Element el_label = (Element) itlabel.next();
String sIdent = el_label.attributeValue("ident");
responseLabelIdents.add(sIdent);
List materials = el_label.selectNodes(".//mattext");
StringBuilder mat = new StringBuilder();
for (Iterator itmaterial = materials.iterator(); itmaterial.hasNext();) {
Element el_material = (Element) itmaterial.next();
mat.append(el_material.getText());
}
responseLabelMaterials.add(mat.length() == 0 ? "IDENT: " + sIdent : mat.toString());
responseColumnHeaders.add((isSingle ? "R" : "C") + i); // R -> Radio button, C -> Check box
i++;
}
}
}
/**
* @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 resultSet) {
for (Iterator iter = resultSet.iterator(); iter.hasNext();) {
QTIResult element = (QTIResult) iter.next();
if(element.getItemIdent().equals(itemIdent)){
resultSet.remove(element);
return element;
}
}
return null;
}
private void addTextAndTabs(List responseColumns, String s, int num){
for (int i = 0; i < num; i++) {
responseColumns.add(s);
}
}
public String getItemTitle() {
return itemTitle;
}
public List getResponseColumnHeaders() {
return responseColumnHeaders;
}
/**
*
* @see org.olat.ims.qti.export.helper.QTIItemObject#getResponseColumns(org.olat.ims.qti.QTIResult)
*/
public List getResponseColumns(QTIResult qtiresult) {
List responseColumns = new ArrayList();
positionsOfResponses = null;
if (qtiresult == null){
// item has not been choosen
addTextAndTabs(responseColumns, "", getNumColumnHeaders());
} else {
String answer = qtiresult.getAnswer();
// item submitted without choosing any checkboxes at all
boolean submittedWithoutChoosing = answer.equals("[]");
// test started and finished without submitting item
boolean finishedWithoutSubmitting = answer.equals("");
if (finishedWithoutSubmitting){
addTextAndTabs(responseColumns, "", getNumColumnHeaders());
return responseColumns;
}
String itemIdentifier = qtiresult.getItemIdent();
// special case KPRIM
if (itemIdentifier.startsWith(ItemParser.ITEM_PREFIX_KPRIM)){
List answerList = QTIResultManager.parseResponseLidAnswers(answer);
StringBuilder sb = new StringBuilder();
int pos = 0;
boolean firstAppendDone = false;
for (Iterator iter = responseLabelIdents.iterator(); iter.hasNext();) {
String labelid = (String) iter.next();
boolean foundLabelId = false;
for (Iterator iterator = answerList.iterator(); iterator.hasNext();) {
String answerid = (String) iterator.next();
if(answerid.startsWith(labelid)){
pos++;
if (answerid.endsWith("correct")){
responseColumns.add("+");
if (firstAppendDone){
sb.append(" ");
}
sb.append(String.valueOf(pos));
pos++;
}
else {
responseColumns.add("-");
if (firstAppendDone){
sb.append(" ");
}
pos++;
sb.append(String.valueOf(pos));
}
firstAppendDone = true;
foundLabelId = true;
}
}
if (!foundLabelId){
responseColumns.add(".");
if (firstAppendDone) sb.append(" ");
sb.append("0");
firstAppendDone = true;
pos = pos + 2;
}
}
positionsOfResponses = sb.toString();
}
else if (submittedWithoutChoosing){
addTextAndTabs(responseColumns, ".", getNumColumnHeaders());
positionsOfResponses = null;
}
else if (finishedWithoutSubmitting){
addTextAndTabs(responseColumns, "", getNumColumnHeaders());
}
else {
List answerList = QTIResultManager.parseResponseLidAnswers(answer);
StringBuilder sb = new StringBuilder();
int pos = 1;
boolean firstLoopDone = false;
for (Iterator iter = responseLabelIdents.iterator(); iter.hasNext();) {
String element = (String) iter.next();
if (answerList.contains(element)) {
responseColumns.add("1");
if (firstLoopDone){
sb.append(" ");
}
sb.append(String.valueOf(pos));
firstLoopDone = true;
} else {
responseColumns.add("0");
}
pos++;
}
positionsOfResponses = sb.toString();
}
}
return responseColumns;
}
public TYPE getItemType() {
return isSingle ? TYPE.R : TYPE.C;
}
public List getResponseIdentifier() {
return responseLabelIdents;
}
public List getResponseLabelMaterials() {
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 true;
}
public String getPositionsOfResponses() {
return positionsOfResponses;
}
}