diff --git a/src/main/java/org/olat/ims/qti21/QTI21Service.java b/src/main/java/org/olat/ims/qti21/QTI21Service.java index d0d60d7c5d6de22ebf15b7a913b4c3176acba68a..a3bbceb7aa32ace564d688d8723e3c62a7487121 100644 --- a/src/main/java/org/olat/ims/qti21/QTI21Service.java +++ b/src/main/java/org/olat/ims/qti21/QTI21Service.java @@ -80,6 +80,8 @@ public interface QTI21Service { public <E extends ResolvedAssessmentObject<?>> E loadAndResolveAssessmentObject(File resourceDirectory); + public boolean updateAssesmentObject(File resourceFile, ResolvedAssessmentObject<?> resolvedAssessmentObject); + public UserTestSession createTestSession(Identity identity, AssessmentEntry assessmentEntry, RepositoryEntry entry, String subIdent, RepositoryEntry testEntry, diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java index b89578b77128b46ee0c417237f0db414921c9dc8..60ff6c6330e1e4fc6c60f12cc6d3cbb047c57456 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java @@ -69,6 +69,7 @@ import org.w3c.dom.Document; import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; import uk.ac.ed.ph.jqtiplus.JqtiExtensionPackage; import uk.ac.ed.ph.jqtiplus.QtiConstants; +import uk.ac.ed.ph.jqtiplus.node.AssessmentObject; import uk.ac.ed.ph.jqtiplus.node.AssessmentObjectType; import uk.ac.ed.ph.jqtiplus.node.QtiNode; import uk.ac.ed.ph.jqtiplus.node.result.AbstractResult; @@ -78,7 +79,9 @@ import uk.ac.ed.ph.jqtiplus.node.result.OutcomeVariable; import uk.ac.ed.ph.jqtiplus.notification.NotificationRecorder; import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader; import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader; +import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentObject; +import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest; import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer; import uk.ac.ed.ph.jqtiplus.state.ItemSessionState; import uk.ac.ed.ph.jqtiplus.state.TestPlanNodeKey; @@ -208,6 +211,30 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa } return result; } + + @Override + public boolean updateAssesmentObject(File resourceFile, ResolvedAssessmentObject<?> resolvedAssessmentObject) { + AssessmentObject assessmentObject; + if(resolvedAssessmentObject instanceof ResolvedAssessmentItem) { + assessmentObject = ((ResolvedAssessmentItem)resolvedAssessmentObject) + .getItemLookup().getRootNodeHolder().getRootNode(); + } else if(resolvedAssessmentObject instanceof ResolvedAssessmentTest) { + assessmentObject = ((ResolvedAssessmentTest)resolvedAssessmentObject) + .getTestLookup().getRootNodeHolder().getRootNode(); + } else { + return false; + } + + try(FileOutputStream out = new FileOutputStream(resourceFile)) { + qtiSerializer().serializeJqtiObject(assessmentObject, out); + //TODO qti + assessmentTestsAndItemsCache.remove(resourceFile); + return true; + } catch(Exception e) { + log.error("", e); + return false; + } + } @Override public URI createAssessmentObjectUri(File resourceDirectory) { 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 94f5da88fa156f8153d75780d2e8d00051080391..4db2bab27e4e5d804b288b8a4e6ad98fb863f3b1 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 @@ -20,7 +20,6 @@ package org.olat.ims.qti21.ui.editor; import java.io.File; -import java.io.FileOutputStream; import java.net.URI; import java.util.List; @@ -34,6 +33,7 @@ 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.QTI21Constants; +import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.ui.AssessmentItemDisplayController; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; @@ -45,7 +45,6 @@ import uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction; import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; -import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer; /** * @@ -64,7 +63,7 @@ public class AssessmentItemEditorController extends BasicController { private AssessmentItemDisplayController displayCtrl; @Autowired - private QtiSerializer qtiSerializer; + private QTI21Service qtiService; @Autowired private AssessmentService assessmentService; @@ -150,13 +149,6 @@ public class AssessmentItemEditorController extends BasicController { private void doSaveAssessmentItem() { URI itemUri = resolvedAssessmentItem.getItemLookup().getSystemId(); File itemFile = new File(itemUri); - AssessmentItem assessmentItem = resolvedAssessmentItem.getItemLookup().getRootNodeHolder().getRootNode(); - - try(FileOutputStream out = new FileOutputStream(itemFile)) { - qtiSerializer.serializeJqtiObject(assessmentItem, out); - } catch(Exception e) { - logError("", e); - showError("serialize.error"); - } + qtiService.updateAssesmentObject(itemFile, resolvedAssessmentItem); } } \ No newline at end of file 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 a8566ecc121df807b1dc26951dfa3758a46fce81..464539964f351e3429a7a93d90862a539a5cfd5d 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 @@ -20,7 +20,6 @@ package org.olat.ims.qti21.ui.editor; import java.io.File; -import java.io.FileOutputStream; import java.net.URI; import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; @@ -55,7 +54,6 @@ import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest; import uk.ac.ed.ph.jqtiplus.node.test.TestPart; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest; -import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer; /** * Assessment test editor and composer. @@ -84,8 +82,6 @@ public class AssessmentTestComposerController extends MainLayoutBasicController @Autowired private QTI21Service qtiService; - @Autowired - private QtiSerializer qtiSerializer; public AssessmentTestComposerController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar, RepositoryEntry testEntry) { @@ -178,14 +174,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController private void doSaveAssessmentTest() { URI testURI = resolvedAssessmentTest.getTestLookup().getSystemId(); File testFile = new File(testURI); - AssessmentTest assessmentTest = resolvedAssessmentTest.getTestLookup().getRootNodeHolder().getRootNode(); - - try(FileOutputStream out = new FileOutputStream(testFile)) { - qtiSerializer.serializeJqtiObject(assessmentTest, out); - } catch(Exception e) { - logError("", e); - showError("serialize.error"); - } + qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest); } private void doUpdate(AssessmentSection section) { @@ -198,8 +187,6 @@ public class AssessmentTestComposerController extends MainLayoutBasicController menuTree.setDirty(true); } } - - } private void partEditorFactory(UserRequest ureq, TreeNode selectedNode) {