diff --git a/pom.xml b/pom.xml index efbded5bf8e481802d87cf9aafc9317a6d01ab91..650dca07c00beac756f3fed48bdf93ef0618f3a2 100644 --- a/pom.xml +++ b/pom.xml @@ -2087,7 +2087,7 @@ <dependency> <groupId>org.openolat.imscp</groupId> <artifactId>manifest</artifactId> - <version>1.4.1</version> + <version>1.4.3</version> </dependency> <dependency> <groupId>com.rometools</groupId> diff --git a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemMetadata.java b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemMetadata.java index e4b529267b07240cd179b535be510af91505d2cf..1d2ca535ee4472156d70715c575f5f94b4e568d1 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemMetadata.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemMetadata.java @@ -45,6 +45,10 @@ public class AssessmentItemMetadata { private String license; private String editor; private String editorVersion; + private String topic; + private String creator; + private String assessmentType; + private String additionalInformations; private int numOfAnswerAlternatives; private BigDecimal difficulty; private BigDecimal differentiation; @@ -191,6 +195,38 @@ public class AssessmentItemMetadata { this.hasError = hasError; } + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getAssessmentType() { + return assessmentType; + } + + public void setAssessmentType(String assessmentType) { + this.assessmentType = assessmentType; + } + + public String getAdditionalInformations() { + return additionalInformations; + } + + public void setAdditionalInformations(String additionalInformations) { + this.additionalInformations = additionalInformations; + } + public void toBuilder(ManifestMetadataBuilder metadata, Locale locale) { if(getQuestionType() != null) { metadata.setOpenOLATMetadataQuestionType(getQuestionType().getPrefix()); @@ -243,19 +279,30 @@ public class AssessmentItemMetadata { if(numOfAnswerAlternatives >= 0) { metadata.setOpenOLATMetadataDistractors(numOfAnswerAlternatives); } + metadata.setOpenOLATMetadataCreator(creator); + metadata.setOpenOLATMetadataTopic(topic); + metadata.setOpenOLATMetadataAssessmentType(assessmentType); + metadata.setOpenOLATMetadataAdditionalInformations(additionalInformations); } public void fromBuilder(ManifestMetadataBuilder metadata) { // general keywords = metadata.getGeneralKeywords(); + coverage = metadata.getCoverage(); + //educational EducationalType educational = metadata.getEducational(false); if(educational != null) { level = metadata.getEducationContext(); } + typicalLearningTime = metadata.getEducationalLearningTime(); + //taxonomy taxonomyPath = metadata.getClassificationTaxonomy(); - + + //rights + license = metadata.getLicense(); + //qti metadata QTIMetadataType qtiMetadata = metadata.getQtiMetadata(true); if(qtiMetadata != null) { @@ -282,6 +329,18 @@ public class AssessmentItemMetadata { if(openolatMetadata.getDistractors() != null) { numOfAnswerAlternatives = openolatMetadata.getDistractors().intValue(); } + if(openolatMetadata.getTopic() != null) { + topic = openolatMetadata.getTopic(); + } + if(openolatMetadata.getAssessmentType() != null) { + assessmentType = openolatMetadata.getAssessmentType(); + } + if(openolatMetadata.getCreator() != null) { + creator = openolatMetadata.getCreator(); + } + if(openolatMetadata.getAdditionalInformations() != null) { + additionalInformations = openolatMetadata.getAdditionalInformations(); + } } } } \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/model/xml/ManifestMetadataBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/ManifestMetadataBuilder.java index 53141654617a6124f1ee22558df3daadc48d9c03..0490dbd5a196125a9580829195ccf50adb15724c 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/ManifestMetadataBuilder.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/ManifestMetadataBuilder.java @@ -303,21 +303,30 @@ public class ManifestMetadataBuilder { } } - public void setLicense(String license) { + public String getLicense() { RightsType rights = getRights(true); if(rights != null) { CopyrightandotherrestrictionsType type = getFromAny(CopyrightandotherrestrictionsType.class, rights.getContent()); - if(type == null) { - type = mdObjectFactory.createCopyrightandotherrestrictionsType(); - rights.getContent().add(mdObjectFactory.createCopyrightandotherrestrictions(type)); - } - SourceType sourceType = mdObjectFactory.createSourceType(); - sourceType.setLangstring(createString("https://www.openolat.org", "en")); - ValueType valueType = mdObjectFactory.createValueType(); - valueType.setLangstring(createString(license, "en")); - type.setSource(sourceType); - type.setValue(valueType); + if(type != null && type.getValue() != null && type.getValue().getLangstring() != null) { + return type.getValue().getLangstring().getValue(); + } } + return null; + } + + public void setLicense(String license) { + RightsType rights = getRights(true); + CopyrightandotherrestrictionsType type = getFromAny(CopyrightandotherrestrictionsType.class, rights.getContent()); + if(type == null) { + type = mdObjectFactory.createCopyrightandotherrestrictionsType(); + rights.getContent().add(mdObjectFactory.createCopyrightandotherrestrictions(type)); + } + SourceType sourceType = mdObjectFactory.createSourceType(); + sourceType.setLangstring(createString("https://www.openolat.org", "en")); + ValueType valueType = mdObjectFactory.createValueType(); + valueType.setLangstring(createString(license, "en")); + type.setSource(sourceType); + type.setValue(valueType); } public String getClassificationTaxonomy() { @@ -684,6 +693,33 @@ public class ManifestMetadataBuilder { } } + public String getOpenOLATMetadataCreator() { + OpenOLATMetadataType ooMetadata = getOpenOLATMetadata(false); + return ooMetadata == null ? null : ooMetadata.getCreator(); + } + + public void setOpenOLATMetadataCreator(String creator) { + getOpenOLATMetadata(true).setCreator(creator); + } + + public String getOpenOLATMetadataTopic() { + OpenOLATMetadataType ooMetadata = getOpenOLATMetadata(false); + return ooMetadata == null ? null : ooMetadata.getTopic(); + } + + public void setOpenOLATMetadataTopic(String topic) { + getOpenOLATMetadata(true).setTopic(topic); + } + + public String getOpenOLATMetadataAdditionalInformations() { + OpenOLATMetadataType ooMetadata = getOpenOLATMetadata(false); + return ooMetadata == null ? null : ooMetadata.getAdditionalInformations(); + } + + public void setOpenOLATMetadataAdditionalInformations(String informations) { + getOpenOLATMetadata(true).setAdditionalInformations(informations); + } + /** * Return the qti metadata if it exists or if specified, create * one and append it to the metadata of the resource. @@ -864,5 +900,8 @@ public class ManifestMetadataBuilder { setOpenOLATMetadataStandardDeviation(item.getStdevDifficulty()); setOpenOLATMetadataUsage(item.getUsage()); setOpenOLATMetadataAssessmentType(item.getAssessmentType()); + setOpenOLATMetadataCreator(item.getCreator()); + setOpenOLATMetadataTopic(item.getTopic()); + setOpenOLATMetadataAdditionalInformations(item.getAdditionalInformations()); } } diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java b/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java index e8b13c279f7a3b687572c7b7980936449aaa7046..cc1c8d35a2c0d38c324dcfb016bbd922d32ae4ef 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java @@ -130,9 +130,9 @@ public class QTI21ImportProcessor { List<Path> imsmanifests = visitor.getImsmanifestFiles(); for(Path imsmanifest:imsmanifests) { - InputStream in = Files.newInputStream(imsmanifest); - ManifestBuilder manifestBuilder = ManifestBuilder.read(new ShieldInputStream(in)); - List<ResourceType> resources = manifestBuilder.getResourceList(); + InputStream in = Files.newInputStream(imsmanifest); + ManifestBuilder manifestBuilder = ManifestBuilder.read(new ShieldInputStream(in)); + List<ResourceType> resources = manifestBuilder.getResourceList(); for(ResourceType resource:resources) { ManifestMetadataBuilder metadataBuilder = manifestBuilder.getMetadataBuilder(resource, true); QuestionItem qitem = processResource(resource, imsmanifest, metadataBuilder); @@ -288,12 +288,6 @@ public class QTI21ImportProcessor { QItemType defType = convertType(assessmentItem); poolItem.setType(defType); } - /*if(docInfos != null) { - processSidecarMetadata(poolItem, docInfos); - }*/ - if(metadata != null) { - //processItemMetadata(poolItem, metadata); - } questionItemDao.persist(owner, poolItem); return poolItem; } @@ -314,7 +308,7 @@ public class QTI21ImportProcessor { default: return qItemTypeDao.loadByType(QuestionType.UNKOWN.name()); } } - + //additionalInformations, assessmentType protected void processItemMetadata(QuestionItemImpl poolItem, AssessmentItemMetadata metadata) { //non heuristic set of question type String typeStr = null; @@ -351,6 +345,7 @@ public class QTI21ImportProcessor { poolItem.setTaxonomyLevel(taxonomyLevel); } + //educational String level = metadata.getLevel(); if(StringHelper.containsNonWhitespace(level)) { QTIMetadataConverter converter = new QTIMetadataConverter(qItemTypeDao, qLicenseDao, qEduContextDao, qpoolService); @@ -372,22 +367,26 @@ public class QTI21ImportProcessor { if(StringHelper.containsNonWhitespace(editorVersion)) { poolItem.setEditorVersion(editorVersion); } - - int numOfAnswerAlternatives = metadata.getNumOfAnswerAlternatives(); - if(numOfAnswerAlternatives > 0) { - poolItem.setNumOfAnswerAlternatives(numOfAnswerAlternatives); - } - - poolItem.setDifficulty(metadata.getDifficulty()); - poolItem.setDifferentiation(metadata.getDifferentiation()); - poolItem.setStdevDifficulty(metadata.getStdevDifficulty()); - + String license = metadata.getLicense(); if(StringHelper.containsNonWhitespace(license)) { QTIMetadataConverter converter = new QTIMetadataConverter(qItemTypeDao, qLicenseDao, qEduContextDao, qpoolService); QLicense qLicense = converter.toLicense(license); poolItem.setLicense(qLicense); } + + //OpenOLAT + poolItem.setDifficulty(metadata.getDifficulty()); + poolItem.setDifferentiation(metadata.getDifferentiation()); + poolItem.setStdevDifficulty(metadata.getStdevDifficulty()); + int numOfAnswerAlternatives = metadata.getNumOfAnswerAlternatives(); + if(numOfAnswerAlternatives > 0) { + poolItem.setNumOfAnswerAlternatives(numOfAnswerAlternatives); + } + poolItem.setCreator(metadata.getCreator()); + poolItem.setTopic(metadata.getTopic()); + poolItem.setAssessmentType(metadata.getAssessmentType()); + poolItem.setAdditionalInformations(metadata.getAdditionalInformations()); } public static class ImsManifestVisitor extends SimpleFileVisitor<Path> { diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21PreviewController.java b/src/main/java/org/olat/ims/qti21/pool/QTI21PreviewController.java index 8cd2eca26ba66e003de5e312651c6e2640802a67..dfdf45859aa62fb5278db95e58f97377ea47716f 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21PreviewController.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21PreviewController.java @@ -28,9 +28,7 @@ import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; -import org.olat.ims.qti21.AssessmentSessionAuditLogger; import org.olat.ims.qti21.QTI21Service; -import org.olat.ims.qti21.manager.audit.DefaultAssessmentSessionAuditLogger; import org.olat.ims.qti21.ui.editor.AssessmentItemPreviewSolutionController; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; @@ -48,7 +46,6 @@ public class QTI21PreviewController extends BasicController { private final VelocityContainer mainVC; private AssessmentItemPreviewSolutionController previewCtrl; - private AssessmentSessionAuditLogger candidateAuditLogger = new DefaultAssessmentSessionAuditLogger(); @Autowired private QTI21Service qtiService; diff --git a/src/main/java/org/olat/modules/qpool/QuestionItemShort.java b/src/main/java/org/olat/modules/qpool/QuestionItemShort.java index e7a3db11228dcf4a709711441ac5722d3701cebf..6dc3d5478855c1835ed407c539185afd5e96f4f6 100644 --- a/src/main/java/org/olat/modules/qpool/QuestionItemShort.java +++ b/src/main/java/org/olat/modules/qpool/QuestionItemShort.java @@ -54,7 +54,7 @@ public interface QuestionItemShort extends OLATResourceable, CreateInfo, Modifie */ public String getTaxonomyLevelName(); - public String getTaxonomicPath();; + public String getTaxonomicPath(); public String getTopic();