diff --git a/pom.xml b/pom.xml index 7f0e8a41de6c17b5bab0fe3a5570ebee9d0f6d4e..83bee19edb843e98a1f8d5c0dd58fad52310ecc9 100644 --- a/pom.xml +++ b/pom.xml @@ -1960,7 +1960,7 @@ <dependency> <groupId>org.openolat.imscp</groupId> <artifactId>manifest</artifactId> - <version>1.1-SNAPSHOT</version> + <version>1.3-SNAPSHOT</version> </dependency> <dependency> <groupId>rome</groupId> diff --git a/src/main/java/org/olat/ims/qti21/model/xml/ManifestBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/ManifestBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..5b4d604d0c65e7de15e684a3d6524bc4af215f28 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/model/xml/ManifestBuilder.java @@ -0,0 +1,357 @@ +/** + * <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.qti21.model.xml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.UUID; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; + +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.ims.qti21.model.IdentifierGenerator; +import org.olat.imscp.xml.manifest.FileType; +import org.olat.imscp.xml.manifest.ManifestMetadataType; +import org.olat.imscp.xml.manifest.ManifestType; +import org.olat.imscp.xml.manifest.MetadataType; +import org.olat.imscp.xml.manifest.ResourceType; +import org.olat.imscp.xml.manifest.ResourcesType; +import org.olat.imsmd.xml.manifest.LomType; +import org.olat.imsmd.xml.manifest.TechnicalType; +import org.olat.imsqti.xml.manifest.QTIMetadataType; +import org.olat.oo.xml.manifest.OpenOLATMetadataType; + +/** + * manifest + * -> metadata + * -> organizations + * -> resources + * -> -> resource + * -> -> -> metadata + * -> -> -> file + * -> -> -> dependency + * Initial date: 22.02.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ManifestBuilder { + + private static final OLog log = Tracing.createLoggerFor(ManifestBuilder.class); + + public static final String SCHEMA_LOCATIONS = "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://www.imsglobal.org/xsd/imsqti_metadata_v2p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/imsqti_metadata_v2p1.xsd"; + + public static final String ASSESSMENTTEST_MIMETYPE = "text/x-imsqti-test-xml"; + public static final String ASSESSMENTITEM_MIMETYPE = "text/x-imsqti-item-xml"; + + private static final org.olat.oo.xml.manifest.ObjectFactory ooObjectFactory = new org.olat.oo.xml.manifest.ObjectFactory(); + private static final org.olat.imscp.xml.manifest.ObjectFactory cpObjectFactory = new org.olat.imscp.xml.manifest.ObjectFactory(); + private static final org.olat.imsmd.xml.manifest.ObjectFactory mdObjectFactory = new org.olat.imsmd.xml.manifest.ObjectFactory(); + private static final org.olat.imsqti.xml.manifest.ObjectFactory qtiObjectFactory = new org.olat.imsqti.xml.manifest.ObjectFactory(); + + private static JAXBContext context; + static { + try { + context = JAXBContext.newInstance("org.olat.imscp.xml.manifest:org.olat.imsqti.xml.manifest:org.olat.imsmd.xml.manifest:org.olat.oo.xml.manifest"); + } catch (JAXBException e) { + log.error("", e); + } + } + + private ManifestType manifest; + + public ManifestBuilder() { + manifest = cpObjectFactory.createManifestType(); + } + + public ManifestBuilder(ManifestType manifest) { + this.manifest = manifest; + } + + /** + * Create a manifest with some metadata specific to the + * assessment test. + * + * @return + */ + public static ManifestBuilder createAssessmentTestBuilder() { + ManifestBuilder builder = new ManifestBuilder(); + //schema + ManifestMetadataType metadataType = createManifestMetadataType(); + metadataType.setSchema("QTIv2.1 Package"); + metadataType.setSchemaversion("1.0.0"); + builder.manifest.setMetadata(metadataType); + //lom technical + LomType lom = createLom(true, true); + metadataType.getAny().add(mdObjectFactory.createLom(lom)); + return builder; + } + + /** + * Create a manifest with some metadata specific to the + * assessment item. + * + * @return + */ + public static ManifestBuilder createAssessmentItemBuilder() { + ManifestBuilder builder = new ManifestBuilder(); + //schema + ManifestMetadataType metadataType = createManifestMetadataType(); + builder.manifest.setMetadata(metadataType); + //lom technical + LomType lom = createLom(false, true); + metadataType.getAny().add(mdObjectFactory.createLom(lom)); + return builder; + } + + private static ManifestMetadataType createManifestMetadataType() { + ManifestMetadataType metadataType = cpObjectFactory.createManifestMetadataType(); + metadataType.setSchema("QTIv2.1 Package"); + metadataType.setSchemaversion("1.0.0"); + return metadataType; + } + + private static LomType createLom(boolean assessmentTest, boolean assessmentItem) { + LomType lom = mdObjectFactory.createLomType(); + TechnicalType technical = mdObjectFactory.createTechnicalType(); + if(assessmentTest) { + technical.getContent().add(createTechnicalFormat(ASSESSMENTTEST_MIMETYPE)); + } + if(assessmentItem) { + technical.getContent().add(createTechnicalFormat(ASSESSMENTITEM_MIMETYPE)); + } + return lom; + } + + private static JAXBElement<String> createTechnicalFormat(String format) { + return mdObjectFactory.createFormat(format); + } + + public String appendAssessmentTest() { + String testId = "test" + UUID.randomUUID().toString(); + String testFilename = testId + ".xml"; + appendAssessmentTest(testId, testFilename); + return testFilename; + } + + public String appendAssessmentTest(String testFilename) { + String testId = "test" + UUID.randomUUID().toString(); + appendAssessmentTest(testId, testFilename); + return testFilename; + } + + private final void appendAssessmentTest(String testId, String testFilename) { + ResourceType testResourceType = cpObjectFactory.createResourceType(); + testResourceType.setIdentifier(testId); + testResourceType.setType("imsqti_test_xmlv2p1"); + testResourceType.setHref(testFilename); + getResourceList().add(testResourceType); + appendFile(testResourceType, testFilename); + } + + public String appendAssessmentItem() { + String itemId = "id" + UUID.randomUUID().toString(); + String itemFileName = itemId + ".xml"; + ResourceType itemResourceType = appendAssessmentItem(itemId, itemFileName); + appendFile(itemResourceType, itemFileName); + return itemFileName; + } + + public String appendAssessmentItem(String itemFileName) { + String itemId = IdentifierGenerator.newAsString("item"); + ResourceType itemResourceType = appendAssessmentItem(itemId, itemFileName); + appendFile(itemResourceType, itemFileName); + return itemFileName; + } + + + public void setOpenOLATMetadata(ResourceType resource, String questionType) { + OpenOLATMetadataType qtiMetadata = getOpenOLATMetadata(resource, true); + qtiMetadata.setQuestionType(questionType); + } + + /** + * Return the openolat metadata if it exists or, if specified, create + * one and append it to the metadata of the resource. + * + * @param resource The resource with the metadata + * @param create True create the qtiMetadata + * @return + */ + public OpenOLATMetadataType getOpenOLATMetadata(ResourceType resource, boolean create) { + MetadataType metadata = getMetadataTypeByResource(resource, create); + if(metadata == null) return null; + + List<Object> anyMetadataList = metadata.getAny(); + OpenOLATMetadataType ooMetadata = null; + for(Object anyMetadata:anyMetadataList) { + if(anyMetadata instanceof JAXBElement<?> + && ((JAXBElement<?>)anyMetadata).getValue() instanceof OpenOLATMetadataType) { + ooMetadata = (OpenOLATMetadataType)((JAXBElement<?>)anyMetadata).getValue(); + } + } + + if(ooMetadata == null && create) { + ooMetadata = ooObjectFactory.createOpenOLATMetadataType(); + metadata.getAny().add(ooObjectFactory.createOoMetadata(ooMetadata)); + } + return ooMetadata; + } + + public void setQtiMetadata(ResourceType resource, List<String> interactions) { + QTIMetadataType qtiMetadata = getQtiMetadata(resource, true); + + qtiMetadata.getInteractionType().clear(); + for(String interaction:interactions) { + qtiMetadata.getInteractionType().add(interaction); + } + } + + /** + * Return the qti metadata if it exists or if specified, create + * one and append it to the metadata of the resource. + * + * @param resource The resource with the metadata + * @param create True create the qtiMetadata + * @return + */ + public QTIMetadataType getQtiMetadata(ResourceType resource, boolean create) { + MetadataType metadata = getMetadataTypeByResource(resource, create); + if(metadata == null) return null; + + List<Object> anyMetadataList = metadata.getAny(); + QTIMetadataType qtiMetadata = null; + for(Object anyMetadata:anyMetadataList) { + if(anyMetadata instanceof JAXBElement<?> + && ((JAXBElement<?>)anyMetadata).getValue() instanceof QTIMetadataType) { + qtiMetadata = (QTIMetadataType)((JAXBElement<?>)anyMetadata).getValue(); + } + } + + if(qtiMetadata == null && create) { + qtiMetadata = qtiObjectFactory.createQTIMetadataType(); + metadata.getAny().add(qtiObjectFactory.createQtiMetadata(qtiMetadata)); + } + return qtiMetadata; + } + + private MetadataType getMetadataTypeByResource(ResourceType resource, boolean create) { + MetadataType metadata = resource.getMetadata(); + if(metadata == null && create) { + metadata = cpObjectFactory.createMetadataType(); + resource.setMetadata(metadata); + } + return metadata; + } + + public ResourceType getResourceTypeByIdentifier(String resourceId) { + List<ResourceType> resources = getResourceList(); + for(ResourceType resource:resources) { + if(resourceId.equals(resource.getIdentifier())) { + return resource; + } + } + return null; + } + + public ResourceType getResourceTypeByHref(String href) { + List<ResourceType> resources = getResourceList(); + for(ResourceType resource:resources) { + if(href.equals(resource.getHref())) { + return resource; + } + } + return null; + } + + private ResourceType appendAssessmentItem(String itemId, String itemFileName) { + ResourceType itemResourceType = cpObjectFactory.createResourceType(); + itemResourceType.setIdentifier(itemId); + itemResourceType.setType("imsqti_item_xmlv2p1"); + itemResourceType.setHref(itemFileName); + getResourceList().add(itemResourceType); + appendFile(itemResourceType, itemFileName); + return itemResourceType; + } + + private List<ResourceType> getResourceList() { + ResourcesType resources = manifest.getResources(); + if(resources == null) { + resources = cpObjectFactory.createResourcesType(); + manifest.setResources(resources); + } + return resources.getResource(); + } + + private void appendFile(ResourceType resource, String href) { + FileType itemFileType = cpObjectFactory.createFileType(); + itemFileType.setHref(href); + resource.getFile().add(itemFileType); + } + + public void build() { + // + } + + public final void write(File file) { + build(); + + try(OutputStream out = new FileOutputStream(file)) { + Marshaller marshaller = context.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, SCHEMA_LOCATIONS); + marshaller.marshal(cpObjectFactory.createManifest(manifest), out); + } catch (JAXBException | IOException e) { + log.error("", e); + } + } + + public final void write(OutputStream out) { + build(); + + try { + Marshaller marshaller = context.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, SCHEMA_LOCATIONS); + marshaller.marshal(manifest, out); + } catch (JAXBException e) { + log.error("", e); + } + } + + public static final ManifestBuilder read(File file) { + try(InputStream in = new FileInputStream(file )) { + ManifestType manifest = (ManifestType)((JAXBElement<?>)context + .createUnmarshaller().unmarshal(in)).getValue(); + return new ManifestBuilder(manifest); + } catch (JAXBException | IOException e) { + log.error("", e); + return null; + } + } +} diff --git a/src/main/java/org/olat/ims/qti21/model/xml/ManifestPackage.java b/src/main/java/org/olat/ims/qti21/model/xml/ManifestPackage.java deleted file mode 100644 index 48941a28b0372349ee6d6d3eb9503b6ce3c67afd..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/ims/qti21/model/xml/ManifestPackage.java +++ /dev/null @@ -1,167 +0,0 @@ -/** - * <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.qti21.model.xml; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.UUID; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; - -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.ims.qti21.model.IdentifierGenerator; -import org.olat.imscp.xml.manifest.FileType; -import org.olat.imscp.xml.manifest.ManifestMetadataType; -import org.olat.imscp.xml.manifest.ManifestType; -import org.olat.imscp.xml.manifest.ObjectFactory; -import org.olat.imscp.xml.manifest.OrganizationsType; -import org.olat.imscp.xml.manifest.ResourceType; -import org.olat.imscp.xml.manifest.ResourcesType; - -/** - * - * Initial date: 04.06.2015<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class ManifestPackage { - - private static final OLog log = Tracing.createLoggerFor(ManifestPackage.class); - private static final ObjectFactory objectFactory = new ObjectFactory(); - - public static ManifestType createEmptyManifest() { - ManifestType manifestType = objectFactory.createManifestType(); - ManifestMetadataType metadataType = objectFactory.createManifestMetadataType(); - metadataType.setSchema("QTIv2.1 Package"); - metadataType.setSchemaversion("1.0.0"); - manifestType.setMetadata(metadataType); - - OrganizationsType organisationsType = objectFactory.createOrganizationsType(); - manifestType.setOrganizations(organisationsType); - - ResourcesType resourcesType = objectFactory.createResourcesType(); - manifestType.setResources(resourcesType); - return manifestType; - } - - public static String appendAssessmentTest(ManifestType manifest) { - String testId = "test" + UUID.randomUUID().toString(); - String testFileName = testId + ".xml"; - ResourceType testResourceType = objectFactory.createResourceType(); - testResourceType.setIdentifier(testId); - testResourceType.setType("imsqti_test_xmlv2p1"); - testResourceType.setHref(testFileName); - manifest.getResources().getResource().add(testResourceType); - - appendFile(testResourceType, testFileName); - return testFileName; - } - - public static void appendAssessmentTest(String testFileName, ManifestType manifest) { - String testId = IdentifierGenerator.newAsString("test"); - - ResourceType testResourceType = objectFactory.createResourceType(); - testResourceType.setIdentifier(testId); - testResourceType.setType("imsqti_test_xmlv2p1"); - testResourceType.setHref(testFileName); - manifest.getResources().getResource().add(testResourceType); - - appendFile(testResourceType, testFileName); - } - - public static String appendAssessmentItem(ManifestType manifest) { - String itemId = "id" + UUID.randomUUID().toString(); - String itemFileName = itemId + ".xml"; - - ResourceType itemResourceType = objectFactory.createResourceType(); - itemResourceType.setIdentifier(itemId); - itemResourceType.setType("imsqti_item_xmlv2p1"); - itemResourceType.setHref(itemFileName); - manifest.getResources().getResource().add(itemResourceType); - - appendFile(itemResourceType, itemFileName); - return itemFileName; - } - - public static void appendAssessmentItem(String itemFileName, ManifestType manifest) { - String itemId = IdentifierGenerator.newAsString("item"); - - ResourceType itemResourceType = objectFactory.createResourceType(); - itemResourceType.setIdentifier(itemId); - itemResourceType.setType("imsqti_item_xmlv2p1"); - itemResourceType.setHref(itemFileName); - manifest.getResources().getResource().add(itemResourceType); - - appendFile(itemResourceType, itemFileName); - } - - public static void appendFile(ResourceType resource, String href) { - FileType itemFileType = objectFactory.createFileType(); - itemFileType.setHref(href); - resource.getFile().add(itemFileType); - } - - public static void write(ManifestType manifest, OutputStream out) { - try { - JAXBContext context = JAXBContext.newInstance("org.olat.imscp.xml.manifest"); - Marshaller marshaller = context.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/qtiv2p1_imscpv1p2_v1p0.xsd"); - - marshaller.marshal(objectFactory.createManifest(manifest), out); - } catch (JAXBException e) { - log.error("", e); - } - } - - public static void write(ManifestType manifest, File manifestFile) { - try(OutputStream out = new FileOutputStream(manifestFile)) { - JAXBContext context = JAXBContext.newInstance("org.olat.imscp.xml.manifest"); - Marshaller marshaller = context.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/qtiv2p1_imscpv1p2_v1p0.xsd"); - - marshaller.marshal(objectFactory.createManifest(manifest), out); - } catch (JAXBException | IOException e) { - log.error("", e); - } - } - - public static ManifestType read(File manifestFile) { - try { - JAXBContext context = JAXBContext.newInstance("org.olat.imscp.xml.manifest"); - Unmarshaller marshaller = context.createUnmarshaller(); - //marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - //marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/qtiv2p1_imscpv1p2_v1p0.xsd"); - - return (ManifestType)((JAXBElement<?>)marshaller.unmarshal(manifestFile)).getValue(); - } catch (JAXBException e) { - log.error("", e); - return null; - } - } -} diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java b/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java index 34bfd976ac54b8fe0421191beb2c40ee14f9b5cf..ba7cb764237c7d1702017ddc83508b636bf81eed 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java @@ -50,7 +50,7 @@ import org.olat.ims.qti21.model.xml.AssessmentItemBuilder; import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.model.xml.AssessmentTestBuilder; import org.olat.ims.qti21.model.xml.AssessmentTestFactory; -import org.olat.ims.qti21.model.xml.ManifestPackage; +import org.olat.ims.qti21.model.xml.ManifestBuilder; import org.olat.ims.qti21.model.xml.ModalFeedbackBuilder; import org.olat.ims.qti21.model.xml.interactions.ChoiceAssessmentItemBuilder.ScoreEvaluation; import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; @@ -58,7 +58,6 @@ import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; -import org.olat.imscp.xml.manifest.ManifestType; import uk.ac.ed.ph.jqtiplus.node.AssessmentObject; import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock; @@ -92,11 +91,11 @@ public class QTI12To21Converter { private final QtiSerializer qtiSerializer = new QtiSerializer(null); private final AssessmentHtmlBuilder htmlBuilder = new AssessmentHtmlBuilder(qtiSerializer); - private final ManifestType manifest; + private final ManifestBuilder manifest; public QTI12To21Converter(File unzippedDirRoot) { this.unzippedDirRoot = unzippedDirRoot; - manifest = ManifestPackage.createEmptyManifest(); + manifest = ManifestBuilder.createAssessmentTestBuilder(); } public AssessmentTest convert(QTIEditorPackage qtiEditorPackage) @@ -111,7 +110,7 @@ public class QTI12To21Converter { AssessmentTest assessmentTest = new AssessmentTest(); String assessmentTestIdentifier = IdentifierGenerator.newAssessmentTestFilename(); File testFile = new File(unzippedDirRoot, assessmentTestIdentifier + ".xml"); - ManifestPackage.appendAssessmentTest(testFile.getName(), manifest); + manifest.appendAssessmentTest(testFile.getName()); assessmentTest.setIdentifier(assessmentTestIdentifier); assessmentTest.setTitle(assessment.getTitle()); @@ -153,7 +152,7 @@ public class QTI12To21Converter { assessmentTest = assessmentTestBuilder.build(); persistAssessmentObject(testFile, assessmentTest); - ManifestPackage.write(manifest, new File(unzippedDirRoot, "imsmanifest.xml")); + manifest.write(new File(unzippedDirRoot, "imsmanifest.xml")); return assessmentTest; } @@ -211,7 +210,7 @@ public class QTI12To21Converter { itemRef.setHref(new URI(itemFile.getName())); assessmentSection.getSectionParts().add(itemRef); persistAssessmentObject(itemFile, assessmentItem); - ManifestPackage.appendAssessmentItem(itemFile.getName(), manifest); + manifest.appendAssessmentItem(itemFile.getName()); } } } diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java b/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java index 21b95efb920c8b9626ab823d0ae065a907dfeb57..045a90bc45f44a640e17929a8724c20cb285da84 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java @@ -38,8 +38,7 @@ import org.olat.core.util.io.ShieldOutputStream; import org.olat.core.util.vfs.VFSLeaf; import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.model.xml.AssessmentTestFactory; -import org.olat.ims.qti21.model.xml.ManifestPackage; -import org.olat.imscp.xml.manifest.ManifestType; +import org.olat.ims.qti21.model.xml.ManifestBuilder; import org.olat.modules.qpool.QuestionItemFull; import org.olat.modules.qpool.manager.QPoolFileStorage; @@ -119,12 +118,12 @@ public class QTI21ExportProcessor { try { QtiSerializer qtiSerializer = qtiService.qtiSerializer(); //imsmanifest - ManifestType manifest = ManifestPackage.createEmptyManifest(); + ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder(); //assessment test AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest("Assessment test from pool"); String assessmentTestFilename = assessmentTest.getIdentifier() + ".xml"; - ManifestPackage.appendAssessmentTest(assessmentTestFilename, manifest); + manifest.appendAssessmentTest(assessmentTestFilename); //make a section AssessmentSection section = assessmentTest.getTestParts().get(0).getAssessmentSections().get(0); @@ -141,7 +140,7 @@ public class QTI21ExportProcessor { //collectResources(itemEl, container, materials); FileUtils.bcopy(itemFile, new File(directory, rootFilename), ""); AssessmentTestFactory.appendAssessmentItem(section, itemFilename); - ManifestPackage.appendAssessmentItem(itemFilename, manifest); + manifest.appendAssessmentItem(itemFilename); } try(FileOutputStream out = new FileOutputStream(new File(directory, assessmentTestFilename))) { @@ -149,12 +148,8 @@ public class QTI21ExportProcessor { } catch(Exception e) { log.error("", e); } - - try(FileOutputStream out = new FileOutputStream(new File(directory, "imsmanifest.xml"))) { - ManifestPackage.write(manifest, out); - } catch(Exception e) { - log.error("", e); - } + + manifest.write(new File(directory, "imsmanifest.xml")); } catch (IOException | URISyntaxException e) { log.error("", e); } @@ -164,12 +159,12 @@ public class QTI21ExportProcessor { try { QtiSerializer qtiSerializer = qtiService.qtiSerializer(); //imsmanifest - ManifestType manifest = ManifestPackage.createEmptyManifest(); + ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder(); //assessment test AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest("Assessment test from pool"); String assessmentTestFilename = assessmentTest.getIdentifier() + ".xml"; - ManifestPackage.appendAssessmentTest(assessmentTestFilename, manifest); + manifest.appendAssessmentTest(assessmentTestFilename); //make a section AssessmentSection section = assessmentTest.getTestParts().get(0).getAssessmentSections().get(0); @@ -187,7 +182,7 @@ public class QTI21ExportProcessor { ZipUtil.addFileToZip(itemFilename, itemFile, zout); AssessmentTestFactory.appendAssessmentItem(section, itemFilename); - ManifestPackage.appendAssessmentItem(itemFilename, manifest); + manifest.appendAssessmentItem(itemFilename); } zout.putNextEntry(new ZipEntry(assessmentTestFilename)); @@ -195,7 +190,7 @@ public class QTI21ExportProcessor { zout.closeEntry(); zout.putNextEntry(new ZipEntry("imsmanifest.xml")); - ManifestPackage.write(manifest, zout); + manifest.write(new ShieldOutputStream(zout)); zout.closeEntry(); } catch (IOException | URISyntaxException e) { log.error("", e); diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java index a8e6e79e3fbb26183d2cb4c5c37dd3305a1623af..f177c4cf5d12b4ac33514a82bcc611d14d464245 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java @@ -52,13 +52,12 @@ import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.QTI21QuestionTypeDetector; import org.olat.ims.qti21.model.xml.AssessmentItemBuilder; import org.olat.ims.qti21.model.xml.AssessmentItemMetadata; -import org.olat.ims.qti21.model.xml.ManifestPackage; +import org.olat.ims.qti21.model.xml.ManifestBuilder; import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; import org.olat.ims.resources.IMSEntityResolver; -import org.olat.imscp.xml.manifest.ManifestType; import org.olat.modules.qpool.ExportFormatOptions; import org.olat.modules.qpool.ExportFormatOptions.Outcome; import org.olat.modules.qpool.QItemFactory; @@ -263,10 +262,9 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { qtiService.persistAssessmentObject(itemFile, assessmentItem); //create imsmanifest - ManifestType manifestType = ManifestPackage.createEmptyManifest(); - ManifestPackage.appendAssessmentItem(itemFile.getName(), manifestType); - ManifestPackage.write(manifestType, new File(itemFile.getParentFile(), "imsmanifest.xml")); - + ManifestBuilder manifest = ManifestBuilder.createAssessmentItemBuilder(); + manifest.appendAssessmentItem(itemFile.getName()); + manifest.write(new File(itemFile.getParentFile(), "imsmanifest.xml")); return qitem; } diff --git a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java index 2edf3e81c914dc1dfb166e04efe938be4d3191b1..49756bf0ebb1b740eec77b0357a44105ce5c3216 100644 --- a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java +++ b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java @@ -70,14 +70,13 @@ import org.olat.ims.qti21.model.IdentifierGenerator; import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.model.xml.AssessmentTestFactory; -import org.olat.ims.qti21.model.xml.ManifestPackage; +import org.olat.ims.qti21.model.xml.ManifestBuilder; import org.olat.ims.qti21.model.xml.OnyxToQtiWorksHandler; import org.olat.ims.qti21.pool.QTI21QPoolServiceProvider; import org.olat.ims.qti21.ui.AssessmentTestDisplayController; import org.olat.ims.qti21.ui.InMemoryOutcomesListener; import org.olat.ims.qti21.ui.QTI21RuntimeController; import org.olat.ims.qti21.ui.editor.AssessmentTestComposerController; -import org.olat.imscp.xml.manifest.ManifestType; import org.olat.modules.qpool.model.QItemList; import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; @@ -157,20 +156,18 @@ public class QTI21AssessmentTestHandler extends FileHandler { } public void createMinimalAssessmentTest(String displayName, File directory) { - ManifestType manifestType = ManifestPackage.createEmptyManifest(); - - QTI21Service qti21Service = CoreSpringFactory.getImpl(QTI21Service.class); + ManifestBuilder manifestBuilder = ManifestBuilder.createAssessmentTestBuilder(); //single choice File itemFile = new File(directory, IdentifierGenerator.newAsString(QTI21QuestionType.sc.getPrefix())); AssessmentItem assessmentItem = AssessmentItemFactory.createSingleChoice(); - QtiSerializer qtiSerializer = qti21Service.qtiSerializer(); - ManifestPackage.appendAssessmentItem(itemFile.getName(), manifestType); + QtiSerializer qtiSerializer = qtiService.qtiSerializer(); + manifestBuilder.appendAssessmentItem(itemFile.getName()); //test File testFile = new File(directory, IdentifierGenerator.newAssessmentTestFilename()); AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest(displayName); - ManifestPackage.appendAssessmentTest(testFile.getName(), manifestType); + manifestBuilder.appendAssessmentTest(testFile.getName()); // item -> test try { @@ -192,11 +189,7 @@ public class QTI21AssessmentTestHandler extends FileHandler { log.error("", e); } - try(FileOutputStream out = new FileOutputStream(new File(directory, "imsmanifest.xml"))) { - ManifestPackage.write(manifestType, out); - } catch(Exception e) { - log.error("", e); - } + manifestBuilder.write(new File(directory, "imsmanifest.xml")); } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java index 20560c67740e3b742548362884f13dc64cab5dd0..c57a9ed077be94622a2d3042c2c79731bb5b4243 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java @@ -223,7 +223,7 @@ public class AssessmentItemEditorController extends BasicController { AssessmentItemEvent aie = (AssessmentItemEvent)event; if(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED.equals(aie.getCommand())) { doBuildAndSaveAssessmentItem(); - fireEvent(ureq, new AssessmentItemEvent(aie.getCommand(), aie.getAssessmentItem(), itemRef)); + fireEvent(ureq, new AssessmentItemEvent(aie.getCommand(), aie.getAssessmentItem(), itemRef, aie.getQuestionType())); } } } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java index 0688483485fd1c580f0c8eaf3026b8b7803e8430..93539f6bda459a676630aa7fe3d4c1aec3ec3ba3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.List; import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; @@ -54,9 +55,10 @@ import org.olat.fileresource.FileResourceManager; import org.olat.ims.qti21.QTI21Constants; import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.model.IdentifierGenerator; +import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.AssessmentItemBuilder; import org.olat.ims.qti21.model.xml.AssessmentTestFactory; -import org.olat.ims.qti21.model.xml.ManifestPackage; +import org.olat.ims.qti21.model.xml.ManifestBuilder; import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; @@ -71,7 +73,7 @@ import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent; import org.olat.ims.qti21.ui.editor.events.AssessmentSectionEvent; import org.olat.ims.qti21.ui.editor.events.AssessmentTestEvent; import org.olat.ims.qti21.ui.editor.events.AssessmentTestPartEvent; -import org.olat.imscp.xml.manifest.ManifestType; +import org.olat.imscp.xml.manifest.ResourceType; import org.olat.modules.qpool.QuestionItemView; import org.olat.modules.qpool.ui.SelectItemController; import org.olat.modules.qpool.ui.events.QItemViewEvent; @@ -80,6 +82,7 @@ import org.olat.repository.ui.RepositoryEntryRuntimeController.ToolbarAware; import org.springframework.beans.factory.annotation.Autowired; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction; import uk.ac.ed.ph.jqtiplus.node.test.AbstractPart; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection; @@ -116,7 +119,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController private final File unzippedDirRoot; private final RepositoryEntry testEntry; - private ManifestType manifest; + private ManifestBuilder manifestBuilder; private ResolvedAssessmentTest resolvedAssessmentTest; private final boolean survey = false; @@ -149,7 +152,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController FileResourceManager frm = FileResourceManager.getInstance(); unzippedDirRoot = frm.unzipFileResource(testEntry.getOlatResource()); updateTreeModel(); - manifest = ManifestPackage.read(new File(unzippedDirRoot, "imsmanifest.xml")); + manifestBuilder = ManifestBuilder.read(new File(unzippedDirRoot, "imsmanifest.xml")); //default buttons saveLink = LinkFactory.createToolLink("serialize", translate("serialize"), this, "o_icon_save"); @@ -245,6 +248,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController } else if(event instanceof AssessmentItemEvent) { AssessmentItemEvent aie = (AssessmentItemEvent)event; if(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED.equals(aie.getCommand())) { + doUpdateManifest(aie.getAssessmentItemRef(), aie.getAssessmentItem(), aie.getQuestionType()); doUpdate(aie.getAssessmentItemRef().getIdentifier(), aie.getAssessmentItem().getTitle()); } } else if(selectQItemCtrl == source) { @@ -411,8 +415,8 @@ public class AssessmentTestComposerController extends MainLayoutBasicController File testFile = new File(testUri); qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest); - ManifestPackage.appendAssessmentItem(itemFile.getName(), manifest); - ManifestPackage.write(manifest, new File(unzippedDirRoot, "imsmanifest.xml")); + manifestBuilder.appendAssessmentItem(itemFile.getName()); + manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml")); return itemId; } @@ -500,8 +504,8 @@ public class AssessmentTestComposerController extends MainLayoutBasicController File testFile = new File(testUri); qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest); - ManifestPackage.appendAssessmentItem(itemFile.getName(), manifest); - ManifestPackage.write(manifest, new File(unzippedDirRoot, "imsmanifest.xml")); + manifestBuilder.appendAssessmentItem(itemFile.getName()); + manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml")); updateTreeModel(); @@ -534,6 +538,27 @@ public class AssessmentTestComposerController extends MainLayoutBasicController qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest); } + private void doUpdateManifest(AssessmentItemRef ref, AssessmentItem item, QTI21QuestionType questionType) { + URI itemUri = resolvedAssessmentTest.getResolvedAssessmentItem(ref).getItemLookup().getSystemId(); + File itemFile = new File(itemUri); + String relativePathToManifest = unzippedDirRoot.toPath().relativize(itemFile.toPath()).toString(); + + ResourceType resource = manifestBuilder.getResourceTypeByHref(relativePathToManifest); + if(resource != null) { + List<Interaction> interactions = item.getItemBody().findInteractions(); + List<String> interactionNames = new ArrayList<>(interactions.size()); + for(Interaction interaction:interactions) { + String interactionName = interaction.getQtiClassName(); + interactionNames.add(interactionName); + } + manifestBuilder.setQtiMetadata(resource, interactionNames); + if(questionType != null) { + manifestBuilder.setOpenOLATMetadata(resource, questionType.getPrefix()); + } + manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml")); + } + } + private void doUpdate(Identifier identifier, String newTitle) { TreeNode node = menuTree.getTreeModel() .getNodeById(identifier.toString()); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java b/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java index c3bbc66c4c4186359d0e1f65983167700e02e4ab..de710eb064b17646f3ba4e45f5df9caaa3c23cf3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java @@ -168,7 +168,7 @@ public class ChoiceScoreController extends FormBasicController { itemBuilder.clearMapping(); } - fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem())); + fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), null)); } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java b/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java index deb26732646c0543245633ea7dff78ad729d33f2..3999384c8dda2a66cc20ba0f0516510c90db13b5 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java @@ -20,6 +20,7 @@ package org.olat.ims.qti21.ui.editor.events; import org.olat.core.gui.control.Event; +import org.olat.ims.qti21.model.QTI21QuestionType; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef; @@ -38,16 +39,25 @@ public class AssessmentItemEvent extends Event { private AssessmentItem item; private AssessmentItemRef itemRef; - + + private QTI21QuestionType questionType; + public AssessmentItemEvent(String cmd, AssessmentItem item) { super(cmd); this.item = item; } + + public AssessmentItemEvent(String cmd, AssessmentItem item, QTI21QuestionType questionType) { + super(cmd); + this.item = item; + this.questionType = questionType; + } - public AssessmentItemEvent(String cmd, AssessmentItem item, AssessmentItemRef itemRef) { + public AssessmentItemEvent(String cmd, AssessmentItem item, AssessmentItemRef itemRef, QTI21QuestionType questionType) { super(cmd); this.item = item; this.itemRef = itemRef; + this.questionType = questionType; } public AssessmentItem getAssessmentItem() { @@ -57,4 +67,8 @@ public class AssessmentItemEvent extends Event { public AssessmentItemRef getAssessmentItemRef() { return itemRef; } + + public QTI21QuestionType getQuestionType() { + return questionType; + } } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java index 490dd22e47bc26c0c27bd9d475737691d8b77203..be4ed7900114ec0bcab263eef0e88ea0fc98f81e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java @@ -30,6 +30,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController; import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent; @@ -155,6 +156,6 @@ public class EssayEditorController extends FormBasicController { itemBuilder.setMinStrings(getValue(minWordsEl)); itemBuilder.setMaxStrings(getValue(maxWordsEl)); - fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem())); + fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.essay)); } } \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java index 3886d091098c5eada33050746781071ac1365dd7..d0329b8cd8f1a7a426f78d73e27da702b841aa59 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java @@ -38,6 +38,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; import org.olat.ims.qti21.QTI21Constants; +import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController; import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent; @@ -188,7 +189,7 @@ public class KPrimEditorController extends FormBasicController { choiceWrapper.setWrong(itemBuilder.isWrong(choiceIdentifier)); } - fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem())); + fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.kprim)); } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java index 42d125fb34891cab2562dfc31666bc910bb3ab9a..25599278e68081e8d91f3c2dd61eb1cc19e838c2 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java @@ -39,6 +39,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.ims.qti21.model.IdentifierGenerator; +import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController; @@ -217,7 +218,7 @@ public class MultipleChoiceEditorController extends FormBasicController { } itemBuilder.setSimpleChoices(choiceList); - fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem())); + fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.sc)); } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java index c48fdf8e328e9d4210bccb06035211e7df9550c2..380acc26509e7a75964d179601528cd30007d272 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java @@ -38,6 +38,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController; @@ -212,7 +213,7 @@ public class SingleChoiceEditorController extends FormBasicController { } itemBuilder.setSimpleChoices(choiceList); - fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem())); + fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.sc)); } @Override diff --git a/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java b/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java index 092258ff59ed339737334c69d53ca1a5f2796d29..03ac97bcecfec9c1c63edc371b2ddc2255a76756 100644 --- a/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java +++ b/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java @@ -34,8 +34,7 @@ import org.olat.ims.qti21.model.IdentifierGenerator; import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.model.xml.AssessmentTestFactory; -import org.olat.ims.qti21.model.xml.ManifestPackage; -import org.olat.imscp.xml.manifest.ManifestType; +import org.olat.ims.qti21.model.xml.ManifestBuilder; import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock; @@ -77,14 +76,14 @@ public class BigAssessmentTestPackageBuilder { String date = format.format(new Date()); File directory = new File("/HotCoffee/qti/" + date + "/"); directory.mkdirs(); - ManifestType manifestType = ManifestPackage.createEmptyManifest(); + ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder(); System.out.println(directory); //test File testFile = new File(directory, IdentifierGenerator.newAssessmentTestFilename()); AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest("Big test " + date); - ManifestPackage.appendAssessmentTest(testFile.getName(), manifestType); + manifest.appendAssessmentTest(testFile.getName()); TestPart part = assessmentTest.getTestParts().get(0); part.getAssessmentSections().clear(); @@ -124,7 +123,7 @@ public class BigAssessmentTestPackageBuilder { assessmentItem.setTitle((i+1) + "." + (j+1) + ". Question SC"); AssessmentTestFactory.appendAssessmentItem(section, itemFile.getName()); - ManifestPackage.appendAssessmentItem(itemFile.getName(), manifestType); + manifest.appendAssessmentItem(itemFile.getName()); try(FileOutputStream out = new FileOutputStream(itemFile)) { qtiSerializer.serializeJqtiObject(assessmentItem, out); @@ -140,11 +139,7 @@ public class BigAssessmentTestPackageBuilder { log.error("", e); } - try(FileOutputStream out = new FileOutputStream(new File(directory, "imsmanifest.xml"))) { - ManifestPackage.write(manifestType, out); - } catch(Exception e) { - log.error("", e); - } + manifest.write(new File(directory, "imsmanifest.xml")); } diff --git a/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java b/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java index fc846744221ff75e2df067d67373a4d77f51d028..387b0c574e88976c5dcf4273a9602622ff1da98e 100644 --- a/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java +++ b/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java @@ -26,7 +26,6 @@ import java.util.List; import org.junit.Assert; import org.junit.Test; -import org.olat.imscp.xml.manifest.ManifestType; import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ContentPackageResource; import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ImsManifestException; @@ -44,9 +43,9 @@ public class ManifestPackageTest { @Test public void makeManifest() throws XmlResourceNotFoundException, ImsManifestException, IOException { - ManifestType manifestType = ManifestPackage.createEmptyManifest(); - String testFilename = ManifestPackage.appendAssessmentTest(manifestType); - String itemFilename = ManifestPackage.appendAssessmentItem(manifestType); + ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder(); + String testFilename = manifest.appendAssessmentTest(); + String itemFilename = manifest.appendAssessmentItem(); Assert.assertNotNull(testFilename); Assert.assertNotNull(itemFilename); @@ -57,7 +56,7 @@ public class ManifestPackageTest { File manifestFile = new File(tmpDir, "imsmanifest.xml"); FileOutputStream out = new FileOutputStream(manifestFile); - ManifestPackage.write(manifestType, out); + manifest.write(out); out.flush(); out.close(); @@ -68,8 +67,8 @@ public class ManifestPackageTest { Assert.assertEquals(1, items.size()); Assert.assertEquals(1, tests.size()); - ManifestType reloadManifestType = ManifestPackage.read(manifestFile); - Assert.assertNotNull(reloadManifestType); + ManifestBuilder reloadManifest = ManifestBuilder.read(manifestFile); + Assert.assertNotNull(reloadManifest); } }