/**
* <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.qti.qpool;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.dom4j.Element;
import org.olat.core.util.StringHelper;
import org.olat.modules.qpool.QuestionItemFull;
import org.olat.modules.qpool.QuestionStatus;
import org.olat.modules.qpool.TaxonomyLevel;
import org.olat.modules.qpool.manager.QEducationalContextDAO;
import org.olat.modules.qpool.manager.QItemTypeDAO;
import org.olat.modules.qpool.manager.QLicenseDAO;
import org.olat.modules.qpool.manager.TaxonomyLevelDAO;
import org.olat.modules.qpool.model.QEducationalContext;
import org.olat.modules.qpool.model.QItemType;
import org.olat.modules.qpool.model.QLicense;
import org.olat.modules.qpool.model.QuestionItemImpl;
/**
*
* This is an helper class to convert metadata, retrieve specific type
* of metadatas...
*
* Initial date: 10.09.2014<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class QTIMetadataConverter {
private Element qtimetadata;
private QLicenseDAO licenseDao;
private QItemTypeDAO itemTypeDao;
private TaxonomyLevelDAO taxonomyLevelDao;
private QEducationalContextDAO educationalContextDao;
QTIMetadataConverter(Element qtimetadata) {
this.qtimetadata = qtimetadata;
}
QTIMetadataConverter(Element qtimetadata, QItemTypeDAO itemTypeDao, QLicenseDAO licenseDao,
TaxonomyLevelDAO taxonomyLevelDao, QEducationalContextDAO educationalContextDao) {
this.qtimetadata = qtimetadata;
this.licenseDao = licenseDao;
this.itemTypeDao = itemTypeDao;
this.taxonomyLevelDao = taxonomyLevelDao;
this.educationalContextDao = educationalContextDao;
}
public QTIMetadataConverter(QItemTypeDAO itemTypeDao, QLicenseDAO licenseDao,
TaxonomyLevelDAO taxonomyLevelDao, QEducationalContextDAO educationalContextDao) {
this.licenseDao = licenseDao;
this.itemTypeDao = itemTypeDao;
this.taxonomyLevelDao = taxonomyLevelDao;
this.educationalContextDao = educationalContextDao;
}
public QItemType toType(String itemType) {
QItemType type = itemTypeDao.loadByType(itemType);
if(type == null) {
type = itemTypeDao.create(itemType, true);
}
return type;
}
public QLicense toLicense(String license) {
QLicense qLicense = null;
if(StringHelper.containsNonWhitespace(license)) {
qLicense = licenseDao.searchLicense(license);
if(qLicense == null) {
String key = "perso-" + UUID.randomUUID().toString();
qLicense = licenseDao.create(key, license, false);
}
}
return qLicense;
}
public TaxonomyLevel toTaxonomy(String str) {
String[] path = str.split("/");
List<String> cleanedPath = new ArrayList<>(path.length);
for(String segment:path) {
if(StringHelper.containsNonWhitespace(segment)) {
cleanedPath.add(segment);
}
}
TaxonomyLevel lowerLevel = null;
if(path != null && path.length > 0) {
for(String field :cleanedPath) {
TaxonomyLevel level = taxonomyLevelDao.loadLevelBy(lowerLevel, field);
if(level == null) {
level = taxonomyLevelDao.createAndPersist(lowerLevel, field);
}
lowerLevel = level;
}
}
return lowerLevel;
}
public QEducationalContext toEducationalContext(String txt) {
QEducationalContext context = educationalContextDao.loadByLevel(txt);
if(context == null) {
context = educationalContextDao.create(txt, true);
}
return context;
}
protected void toQuestion(QuestionItemImpl fullItem) {
String addInfos = getMetadataEntry("additional_informations");
if(StringHelper.containsNonWhitespace(addInfos)) {
fullItem.setAdditionalInformations(addInfos);
}
String assessmentType = getMetadataEntry("oo_assessment_type");
if(StringHelper.containsNonWhitespace(assessmentType)) {
fullItem.setAssessmentType(assessmentType);
}
String coverage = getMetadataEntry("coverage");
if(StringHelper.containsNonWhitespace(coverage)) {
fullItem.setCoverage(coverage);
}
String description = getMetadataEntry("description");
if(description != null) {
fullItem.setDescription(description);
}
String differentiation = getMetadataEntry("oo_differentiation");
if(StringHelper.containsNonWhitespace(differentiation)) {
fullItem.setDifferentiation(toBigDecimal(differentiation));
}
String difficulty = getMetadataEntry("qmd_levelofdifficulty");
if(StringHelper.containsNonWhitespace(difficulty)) {
fullItem.setDifficulty(toBigDecimal(difficulty));
}
String vendor = getMetadataEntry("qmd_toolvendor");
if(vendor != null) {
fullItem.setEditor(vendor);
}
String editorVersion = getMetadataEntry("oo_toolvendor_version");
if(StringHelper.containsNonWhitespace(editorVersion)) {
fullItem.setEditorVersion(editorVersion);
}
String learningTime = getMetadataEntry("oo_education_learning_time");
if(StringHelper.containsNonWhitespace(learningTime)) {
fullItem.setEducationalLearningTime(learningTime);
}
String format = getMetadataEntry("format");
if(StringHelper.containsNonWhitespace(format)) {
fullItem.setFormat(format);
}
String identifier = getMetadataEntry("oo_identifier");
if(StringHelper.containsNonWhitespace(identifier)) {
fullItem.setMasterIdentifier(identifier);
}
String itemType = getMetadataEntry("type");
if(StringHelper.containsNonWhitespace(itemType)) {
fullItem.setType(toType(itemType));
}
String version = getMetadataEntry("version");
if(StringHelper.containsNonWhitespace(version)) {
fullItem.setItemVersion(version);
}
String keywords = getMetadataEntry("keywords");
if(StringHelper.containsNonWhitespace(keywords)) {
fullItem.setKeywords(keywords);
}
String language = getMetadataEntry("language");
if(StringHelper.containsNonWhitespace(language)) {
fullItem.setLanguage(language);
}
String numOfAnswers = getMetadataEntry("oo_num_of_answer_alternatives");
if(StringHelper.containsNonWhitespace(numOfAnswers)) {
fullItem.setNumOfAnswerAlternatives(toInt(numOfAnswers));
}
String status = getMetadataEntry("status");
if(StringHelper.containsNonWhitespace(status) && validStatus(status)) {
fullItem.setStatus(status);
}
String stdDevDifficulty = getMetadataEntry("oo_std_dev_difficulty");
if(StringHelper.containsNonWhitespace(stdDevDifficulty)) {
fullItem.setStdevDifficulty(toBigDecimal(stdDevDifficulty));
}
String title = getMetadataEntry("title");
if(StringHelper.containsNonWhitespace(title)) {
fullItem.setTitle(title);
}
String license = getMetadataEntry("license");
if(StringHelper.containsNonWhitespace(license)) {
fullItem.setLicense(toLicense(license));
}
String taxonomy = getMetadataEntry("oo_taxonomy");
if(StringHelper.containsNonWhitespace(taxonomy)) {
fullItem.setTaxonomyLevel(toTaxonomy(taxonomy));
}
String educationalContext = getMetadataEntry("oo_educational_context");
if(StringHelper.containsNonWhitespace(educationalContext)) {
fullItem.setEducationalContext(toEducationalContext(educationalContext));
}
}
protected void toXml(QuestionItemFull fullItem) {
addMetadataField("additional_informations", fullItem.getAdditionalInformations(), qtimetadata);
addMetadataField("oo_assessment_type", fullItem.getAssessmentType(), qtimetadata);
addMetadataField("coverage", fullItem.getCoverage(), qtimetadata);
addMetadataField("description", fullItem.getDescription(), qtimetadata);
addMetadataField("oo_differentiation", fullItem.getDifferentiation(), qtimetadata);
addMetadataField("qmd_levelofdifficulty", fullItem.getDifficulty(), qtimetadata);
addMetadataField("qmd_toolvendor", fullItem.getEditor(), qtimetadata);
addMetadataField("oo_toolvendor_version", fullItem.getEditorVersion(), qtimetadata);
addMetadataField("oo_educational_context", fullItem.getEducationalContext(), qtimetadata);
addMetadataField("oo_education_learning_time", fullItem.getEducationalLearningTime(), qtimetadata);
addMetadataField("format", fullItem.getFormat(), qtimetadata);
addMetadataField("oo_identifier", fullItem.getIdentifier(), qtimetadata);
addMetadataField("type", fullItem.getItemType(), qtimetadata);
addMetadataField("version", fullItem.getItemVersion(), qtimetadata);
addMetadataField("keywords", fullItem.getKeywords(), qtimetadata);
addMetadataField("language", fullItem.getLanguage(), qtimetadata);
addMetadataField("license", fullItem.getLicense(), qtimetadata);
addMetadataField("oo_master", fullItem.getMasterIdentifier(), qtimetadata);
addMetadataField("oo_num_of_answer_alternatives", fullItem.getNumOfAnswerAlternatives(), qtimetadata);
addMetadataField("status", fullItem.getQuestionStatus(), qtimetadata);
addMetadataField("oo_std_dev_difficulty", fullItem.getStdevDifficulty(), qtimetadata);
addMetadataField("oo_taxonomy", fullItem.getTaxonomicPath(), qtimetadata);
//fullItem.getTaxonomicLevel();
addMetadataField("title", fullItem.getTitle(), qtimetadata);
addMetadataField("oo_usage", fullItem.getUsage(), qtimetadata);
}
private void addMetadataField(String label, int entry, Element metadata) {
if(entry >= 0) {
addMetadataField(label, Integer.toString(entry), metadata);
}
}
private void addMetadataField(String label, QLicense entry, Element metadata) {
if(entry != null) {
addMetadataField(label, entry.getLicenseText(), metadata);
}
}
private void addMetadataField(String label, QEducationalContext entry, Element metadata) {
if(entry != null) {
addMetadataField(label, entry.getLevel(), metadata);
}
}
private void addMetadataField(String label, QuestionStatus entry, Element metadata) {
if(entry != null) {
addMetadataField(label, entry.name(), metadata);
}
}
private void addMetadataField(String label, BigDecimal entry, Element metadata) {
if(entry != null) {
addMetadataField(label, entry.toPlainString(), metadata);
}
}
private void addMetadataField(String label, String entry, Element metadata) {
if(entry != null) {
Element qtimetadatafield = metadata.addElement("qtimetadatafield");
qtimetadatafield.addElement("fieldlabel").setText(label);
qtimetadatafield.addElement("fieldentry").setText(entry);
}
}
private String getMetadataEntry(String label) {
String entry = null;
@SuppressWarnings("unchecked")
List<Element> qtimetadatafields = qtimetadata.elements("qtimetadatafield");
for(Element qtimetadatafield:qtimetadatafields) {
Element fieldlabel = qtimetadatafield.element("fieldlabel");
if(fieldlabel != null && label.equals(fieldlabel.getText())) {
Element fieldentry = qtimetadatafield.element("fieldentry");
if(fieldentry != null) {
entry = fieldentry.getText();
}
}
}
return entry;
}
private BigDecimal toBigDecimal(String str) {
try {
return new BigDecimal(str);
} catch (Exception e) {
return null;
}
}
private int toInt(String str) {
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
return 0;
}
}
private boolean validStatus(String str) {
try {
QuestionStatus.valueOf(str);
return true;
} catch (Exception e) {
return false;
}
}
}