Package org.olat.ims.qti.export

Source Code of org.olat.ims.qti.export.QTIExportFormatterCSVType2

/**
* 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;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.olat.core.logging.OLATRuntimeException;
import org.olat.core.util.Formatter;
import org.olat.ims.qti.editor.beecom.parser.ItemParser;
import org.olat.ims.qti.export.helper.IdentityAnonymizerCallback;
import org.olat.ims.qti.export.helper.QTIItemObject;

/**
* Initial Date: May 23, 2006 <br>
*
* @author Alexander Schneider
*/
public class QTIExportFormatterCSVType2 extends QTIExportFormatter{
  private String fileNamePrefix = "SELF_";
  private int type = 2;
  // Delimiters and file name suffix for the export file
  private String sep; // fields separated by
  private String emb; // fields embedded by
  private String esc; // fields escaped by
  private String car; // carriage return
  // Author can export the mattext without HTML tags
  // especially used for the results export of matrix questions created by QANT
  private boolean tagless;
 
  protected int row_counter = 1;
  protected int loop_counter = 0;
  protected Long keyBefore = null;


  /**
   *
   * @param locale
   * @param type
   * @param anonymizerCallback
   * @param delimiter
   * @param Map qtiExportFormatConfig with (QTIExportItemXYZ.class,IQTIExportItemFormatConfig)
   */
 
  public QTIExportFormatterCSVType2(Locale locale, IdentityAnonymizerCallback anonymizerCallback, String sep, String emb, String esc, String car, boolean tagless) {
    super(locale, anonymizerCallback);
    this.sep = sep;
    this.emb = emb;
    this.esc = esc;
    this.car = car;
    this.tagless = tagless;
  }
 
  public void openReport() {
    if (qtiItemObjectList == null){
      throw new OLATRuntimeException(null,"Can not format report when qtiItemObjectList is null", null);
    }
   
    if (mapWithExportItemConfigs == null){
      // while deleting a selftest node the formatter has no config consiting of user input
      setDefaultQTIItemConfigs();
    }
   
    QTIExportItemFactory qeif = new QTIExportItemFactory(mapWithExportItemConfigs);
   
    // // // Preparing HeaderRow 1 and HeaderRow2
    StringBuilder hR1 = new StringBuilder();
    StringBuilder hR2 = new StringBuilder();
   
    int i = 1;
    for (Iterator iter = qtiItemObjectList.iterator(); iter.hasNext();) {
      QTIItemObject item = (QTIItemObject) iter.next();
     
      if(displayItem(qeif.getExportItemConfig(item))){
        hR1.append(emb);
        hR1.append(escape(item.getItemTitle()));
        hR1.append(emb);
       
        if (qeif.getExportItemConfig(item).hasResponseCols()){
          List responseColumnHeaders = item.getResponseColumnHeaders();
          for (Iterator iterator = responseColumnHeaders.iterator(); iterator.hasNext();) {
            // HeaderRow1
            hR1.append(sep);           
            // HeaderRow2
            String columnHeader = (String) iterator.next();
            hR2.append(i);
            hR2.append("_");
            hR2.append(columnHeader);
            hR2.append(sep);
          }
        }
       
        if(qeif.getExportItemConfig(item).hasPositionsOfResponsesCol()){
          // HeaderRow1
          hR1.append(sep);
          // HeaderRow2
          hR2.append(i);
          hR2.append("_");
          hR2.append(translator.translate("item.positions"));
          hR2.append(sep);
        }
       
        if (qeif.getExportItemConfig(item).hasPointCol()){
          // HeaderRow1
          hR1.append(sep);
          // HeaderRow2
          hR2.append(i);
          hR2.append("_");
          hR2.append(translator.translate("item.score"));
          hR2.append(sep);
        }
       
        if (qeif.getExportItemConfig(item).hasTimeCols()){
          // HeaderRow1
          hR1.append(sep+sep);
          // HeaderRow2
          hR2.append(i);
          hR2.append("_");
          hR2.append(translator.translate("item.start"));
          hR2.append(sep);
         
          hR2.append(i);
          hR2.append("_");
          hR2.append(translator.translate("item.duration"));
          hR2.append(sep);
        }
        i++;
      }
    }
    // // // HeaderRow1Intro
    sb.append(createHeaderRow1Intro());
   
    // // // HeaderRow1
    sb.append(hR1.toString());
    sb.append(car);
   
    // // // HeaderRow2Intro
    sb.append(createHeaderRow2Intro());
   
    // // // HeaderRow2
    sb.append(hR2.toString());
    sb.append(car);
  }

  public void openResultSet(QTIExportSet set) {
    String instUsrIdent = set.getInstitutionalUserIdentifier();
    if (instUsrIdent == null){
      instUsrIdent = translator.translate("column.field.notavailable");
    }
    float assessPoints = set.getScore();
     
    Long key = set.getIdentity().getKey();
    if (!key.equals(keyBefore)){
      loop_counter++;
      keyBefore = key;
    }
    if (anonymizerCallback == null)
      sb.append(row_counter);
    else
      sb.append(anonymizerCallback.getAnonymizedUserName(set.getIdentity()));
    sb.append(sep);
    sb.append(loop_counter);
    sb.append(sep);
    sb.append(assessPoints);
    sb.append(sep);
   
    // datatime
    Date  date = set.getLastModified();
    sb.append(Formatter.formatDatetime(date));
    sb.append(sep);
   
    Long assessDuration = set.getDuration();
    // since there are resultsets created before alter table adding the field duration
    if (assessDuration != null) {
      sb.append(Math.round(assessDuration.longValue()/1000));
    }
    else {
      sb.append("n/a");
    }
    sb.append(sep);
  }

  public void visit(QTIExportItem eItem) {
    List responseColumns = eItem.getResponseColumns();
    QTIExportItemFormatConfig itemFormatConfig = eItem.getConfig();
   
    if(displayItem(itemFormatConfig)){ 
      if (itemFormatConfig.hasResponseCols()){
        for (Iterator iter = responseColumns.iterator(); iter.hasNext();) {
          String responseColumn = (String) iter.next();
          sb.append(emb);
          sb.append(escape(responseColumn));
          sb.append(emb);
          sb.append(sep);
        }
      }
     
      if (itemFormatConfig.hasPositionsOfResponsesCol()){
        sb.append(eItem.getPositionsOfResponses());
        sb.append(sep);
      }
     
      if (eItem.hasResult()){
        if (itemFormatConfig.hasPointCol()){
            // points
            sb.append(eItem.getScore());
            sb.append(sep);
        }
          if (itemFormatConfig.hasTimeCols()){
            // startdatetime
            if(eItem.getTimeStamp().getTime() > 0){
                sb.append(Formatter.formatDatetime(eItem.getTimeStamp()));
            }
            else {
                sb.append("n/a");
            }
            sb.append(sep);
           
            //column duration
            Long itemDuration = eItem.getDuration();
        if(itemDuration != null){
            sb.append(itemDuration.longValue()/1000);
        }
        else {
            sb.append("n/a");
        }
        sb.append(sep);
          }
      }
      else {
        // points
        if (itemFormatConfig.hasPointCol()) sb.append(sep);
        // startdatetime, column duration
          if (itemFormatConfig.hasTimeCols()) sb.append(sep+sep);
      }
    }
  }

  public void closeResultSet(){
    sb.append(car);
    row_counter++;
  }
 
  public void closeReport() {
    if (qtiItemObjectList == null){
      throw new OLATRuntimeException(null,"Can not format report when qtiItemObjectList is null", null);
    }
    String legend = translator.translate("legend");
    sb.append(car+car);
    sb.append(legend);
    sb.append(car+car);
    int y = 1;
    for (Iterator iter = qtiItemObjectList.iterator(); iter.hasNext();) {
      QTIItemObject element = (QTIItemObject) iter.next();
     
      sb.append(element.getItemIdent());
      sb.append(sep);
      sb.append(emb);
      sb.append(escape(element.getItemTitle()));
      sb.append(emb);
      sb.append(car);
     
      sb.append(sep+sep);
      sb.append("minValue");sb.append(sep);
      sb.append(element.getItemMinValue());
      sb.append(car);
     
      sb.append(sep+sep);
      sb.append("maxValue");sb.append(sep);
      sb.append(element.getItemMaxValue());
      sb.append(car);
     
      sb.append(sep+sep);
      sb.append("cutValue");sb.append(sep);
      sb.append(element.getItemCutValue());
      sb.append(car);
     
      List responseLabelMaterials = element.getResponseLabelMaterials();
     
      for (int i = 0; i < element.getResponseIdentifier().size() ; i++) {
        sb.append(sep+sep);
        sb.append(y);
        sb.append("_");
        sb.append(element.getItemType());
        sb.append(i+1);
        sb.append(sep);
        sb.append(element.getResponseIdentifier().get(i));
        sb.append(sep);
       
        if(responseLabelMaterials != null){
          String s = (String)responseLabelMaterials.get(i);
          if(tagless){
            s = s.replaceAll("\\<.*?\\>", "");
          }
          sb.append(Formatter.stripTabsAndReturns(s));
        }
        sb.append(car);
      }
      y++;
    }
   
    sb.append(car+car);
    sb.append("SCQ");sb.append(sep);sb.append("Single Choice Question");
    sb.append(car);
    sb.append("MCQ");sb.append(sep);sb.append("Multiple Choice Question");
    sb.append(car);
    sb.append("FIB");sb.append(sep);sb.append("Fill in the blank");
    sb.append(car);
    sb.append("ESS");sb.append(sep);sb.append("Essay");
    sb.append(car);
    sb.append("KPR");sb.append(sep);sb.append("Kprim (K-Type)");
   
    sb.append(car+car);
    sb.append("R:");sb.append(sep);sb.append("Radio button (SCQ)");
    sb.append(car);
    sb.append("C:");sb.append(sep);sb.append("Check box (MCQ or KPR)");
    sb.append(car);
    sb.append("B:");sb.append(sep);sb.append("Blank (FIB)");
    sb.append(car);
    sb.append("A:");sb.append(sep);sb.append("Area (ESS)");
   
    sb.append(car+car);
    sb.append("nx_Ry");sb.append(sep);sb.append("Radio Button y of SCQ x, e.g. 1_R1");
    sb.append(car);
    sb.append("x_Cy");sb.append(sep);sb.append("Check Box y of MCQ x or two Radio Buttons y of KPR x, e.g. 3_C2");
    sb.append(car);
    sb.append("x_By");sb.append(sep);sb.append("Blank y of FIB x, e.g. 17_B2");
    sb.append(car);
    sb.append("x_Ay");sb.append(sep);sb.append("Area y of ESS x, e.g. 4_A1");
   
    sb.append(car+car);
    sb.append("Kprim:");sb.append(sep);
    sb.append("'+' = yes");sb.append(sep);
    sb.append("'-' = no");sb.append(sep);
    sb.append("'.' = no answer");  sb.append(sep);
  }
 
  public String getReport(){
    return sb.toString();
  }
 
 
  private String createHeaderRow1Intro(){
    return sep+sep+sep+sep+sep;
  }
 
  /**
   * Creates header line for all types
   * @param theType
   * @return header line for download
   */
  private String createHeaderRow2Intro() {
   
    StringBuilder hr2Intro = new StringBuilder();

    // header for personalized download (iqtest)
    String sequentialNumber = translator.translate("column.header.seqnum");
   
    String num = translator.translate("column.header.number");
    String assessPoint = translator.translate("column.header.assesspoints");
    String date = translator.translate("column.header.date");
    String duration = translator.translate("column.header.duration");
   
    hr2Intro.append(sequentialNumber);
    hr2Intro.append(sep);
    hr2Intro.append(num);
    hr2Intro.append(sep);
    hr2Intro.append(assessPoint);
    hr2Intro.append(sep);
    hr2Intro.append(date);
    hr2Intro.append(sep);
    hr2Intro.append(duration);
    hr2Intro.append(sep);
    return hr2Intro.toString();
  }

  public void setKeyBefore(Long keyBefore) {
    this.keyBefore = keyBefore;
  }

  public String getFileNamePrefix() {
      return fileNamePrefix;
  }

  /* (non-Javadoc)
   * @see org.olat.ims.qti.export.QTIExportFormatter#getType()
   */
  public int getType() {
      return this.type;
  }
 
  private boolean displayItem(QTIExportItemFormatConfig c){
    return !(!c.hasResponseCols()&& !c.hasPointCol() && !c.hasTimeCols() && ! c.hasPositionsOfResponsesCol());
  }
 
  private String escape(String s){
    return s.replaceAll(emb, esc+emb);
  }
 
  private void setDefaultQTIItemConfigs(){
    Map itConfigs = new HashMap();
   
    for (Iterator iter = qtiItemObjectList.iterator(); iter.hasNext();) {
      QTIItemObject item = (QTIItemObject) iter.next();
      if (item.getItemIdent().startsWith(ItemParser.ITEM_PREFIX_SCQ)){
        if (itConfigs.get(QTIExportSCQItemFormatConfig.class) == null){
          QTIExportSCQItemFormatConfig confSCQ = new QTIExportSCQItemFormatConfig(true, false, false, false);
          itConfigs.put(QTIExportSCQItemFormatConfig.class, confSCQ);
        }
      }
      else if (item.getItemIdent().startsWith(ItemParser.ITEM_PREFIX_MCQ)){
        if (itConfigs.get(QTIExportMCQItemFormatConfig.class) == null){
          QTIExportMCQItemFormatConfig confMCQ = new QTIExportMCQItemFormatConfig(true, false, false, false);
          itConfigs.put(QTIExportMCQItemFormatConfig.class, confMCQ );
        }
      }
      else if (item.getItemIdent().startsWith(ItemParser.ITEM_PREFIX_KPRIM)){
        if (itConfigs.get(QTIExportKPRIMItemFormatConfig.class) == null){
          QTIExportKPRIMItemFormatConfig confKPRIM = new QTIExportKPRIMItemFormatConfig(true, false, false, false);
          itConfigs.put(QTIExportKPRIMItemFormatConfig.class, confKPRIM);
        }
      }
      else if (item.getItemIdent().startsWith(ItemParser.ITEM_PREFIX_ESSAY)){
        if (itConfigs.get(QTIExportEssayItemFormatConfig.class) == null){
          QTIExportEssayItemFormatConfig confEssay = new QTIExportEssayItemFormatConfig(true, false);
          itConfigs.put(QTIExportEssayItemFormatConfig.class, confEssay);
        }
      }
      else if (item.getItemIdent().startsWith(ItemParser.ITEM_PREFIX_FIB)){
        if (itConfigs.get(QTIExportFIBItemFormatConfig.class) == null){
          QTIExportFIBItemFormatConfig confFIB = new QTIExportFIBItemFormatConfig(true, false, false);
          itConfigs.put(QTIExportFIBItemFormatConfig.class, confFIB);
        }
      }     
      //if cannot find the type via the ItemParser, look for the QTIItemObject type
      else if (item.getItemType().equals(QTIItemObject.TYPE.A)){
        QTIExportEssayItemFormatConfig confEssay = new QTIExportEssayItemFormatConfig(true, false);
        itConfigs.put(QTIExportEssayItemFormatConfig.class, confEssay);
     
      else if (item.getItemType().equals(QTIItemObject.TYPE.R)){
        QTIExportSCQItemFormatConfig confSCQ = new QTIExportSCQItemFormatConfig(true, false, false, false);
        itConfigs.put(QTIExportSCQItemFormatConfig.class, confSCQ);
      }
      else if (item.getItemType().equals(QTIItemObject.TYPE.C)){
        QTIExportMCQItemFormatConfig confMCQ = new QTIExportMCQItemFormatConfig(true, false, false, false);
        itConfigs.put(QTIExportMCQItemFormatConfig.class, confMCQ);
      }
      else if (item.getItemType().equals(QTIItemObject.TYPE.B)){
        QTIExportFIBItemFormatConfig confFIB = new QTIExportFIBItemFormatConfig(true, false, false);
        itConfigs.put(QTIExportFIBItemFormatConfig.class, confFIB);
      }     
      else{
        throw new OLATRuntimeException(null,"Can not resolve QTIItem type='" + item.getItemType() + "'", null);
      }
    }
    mapWithExportItemConfigs =  itConfigs;
  }
}
TOP

Related Classes of org.olat.ims.qti.export.QTIExportFormatterCSVType2

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.