Skip to content
Snippets Groups Projects
Commit 047b4161 authored by srosse's avatar srosse
Browse files

Merge OpenOLAT 11.3 to OpenOLAT default branch with 061d993eb0ab3cf81a1b61a50c42ba69ce5743d0

parents 435d4791 834ec82c
No related branches found
No related tags found
No related merge requests found
...@@ -256,11 +256,13 @@ public class AssessmentItemMetadata { ...@@ -256,11 +256,13 @@ public class AssessmentItemMetadata {
//qti metadata //qti metadata
QTIMetadataType qtiMetadata = metadata.getQtiMetadata(true); QTIMetadataType qtiMetadata = metadata.getQtiMetadata(true);
if(qtiMetadata.getToolName() != null) { if(qtiMetadata != null) {
editor = qtiMetadata.getToolName(); if(qtiMetadata.getToolName() != null) {
} editor = qtiMetadata.getToolName();
if(qtiMetadata.getToolVersion() != null) { }
editorVersion = qtiMetadata.getToolVersion(); if(qtiMetadata.getToolVersion() != null) {
editorVersion = qtiMetadata.getToolVersion();
}
} }
//openolat metadata //openolat metadata
......
...@@ -201,9 +201,10 @@ public class QTI21ExportProcessor { ...@@ -201,9 +201,10 @@ public class QTI21ExportProcessor {
assessmentItem.setIdentifier(QTI21QuestionType.generateNewIdentifier(assessmentItem.getIdentifier())); assessmentItem.setIdentifier(QTI21QuestionType.generateNewIdentifier(assessmentItem.getIdentifier()));
//save the item in its own container //save the item in its own container
File container = new File(directory, qitem.getKey().toString()); String container = qitem.getKey().toString();
container.mkdirs(); File containerDir = new File(directory, container);
File newItemFile = new File(container, assessmentItem.getIdentifier() + ".xml"); containerDir.mkdirs();
File newItemFile = new File(containerDir, assessmentItem.getIdentifier() + ".xml");
String newItemFilename = container + "/" + newItemFile.getName(); String newItemFilename = container + "/" + newItemFile.getName();
qtiService.persistAssessmentObject(newItemFile, assessmentItem); qtiService.persistAssessmentObject(newItemFile, assessmentItem);
......
...@@ -110,6 +110,7 @@ import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent; ...@@ -110,6 +110,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.AssessmentSectionEvent;
import org.olat.ims.qti21.ui.editor.events.AssessmentTestEvent; import org.olat.ims.qti21.ui.editor.events.AssessmentTestEvent;
import org.olat.ims.qti21.ui.editor.events.AssessmentTestPartEvent; import org.olat.ims.qti21.ui.editor.events.AssessmentTestPartEvent;
import org.olat.imscp.xml.manifest.FileType;
import org.olat.imscp.xml.manifest.ResourceType; import org.olat.imscp.xml.manifest.ResourceType;
import org.olat.modules.qpool.QuestionItemView; import org.olat.modules.qpool.QuestionItemView;
import org.olat.modules.qpool.ui.SelectItemController; import org.olat.modules.qpool.ui.SelectItemController;
...@@ -653,6 +654,9 @@ public class AssessmentTestComposerController extends MainLayoutBasicController ...@@ -653,6 +654,9 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
ManifestBuilder clonedManifestBuilder = ManifestBuilder.read(new File(unzippedDirRoot, "imsmanifest.xml")); ManifestBuilder clonedManifestBuilder = ManifestBuilder.read(new File(unzippedDirRoot, "imsmanifest.xml"));
ResourceType resource = getResourceType(clonedManifestBuilder, itemRef); ResourceType resource = getResourceType(clonedManifestBuilder, itemRef);
ManifestMetadataBuilder metadata = clonedManifestBuilder.getMetadataBuilder(resource, true); ManifestMetadataBuilder metadata = clonedManifestBuilder.getMetadataBuilder(resource, true);
if(metadata == null) {
metadata = new ManifestMetadataBuilder();// not in imsmanifest.xml?
}
File itemFile = new File(rootNode.getSystemId()); File itemFile = new File(rootNode.getSystemId());
...@@ -971,6 +975,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController ...@@ -971,6 +975,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
if(sectionPart instanceof AssessmentItemRef) { if(sectionPart instanceof AssessmentItemRef) {
AssessmentItemRef itemRef = (AssessmentItemRef)sectionPart; AssessmentItemRef itemRef = (AssessmentItemRef)sectionPart;
ResolvedAssessmentItem resolvedAssessmentItem = resolvedAssessmentTest.getResolvedAssessmentItem(itemRef); ResolvedAssessmentItem resolvedAssessmentItem = resolvedAssessmentTest.getResolvedAssessmentItem(itemRef);
checkAndFixAbsolutePath(itemRef);
AssessmentItem assessmentItem = null; AssessmentItem assessmentItem = null;
if(resolvedAssessmentItem != null) { if(resolvedAssessmentItem != null) {
...@@ -999,7 +1004,56 @@ public class AssessmentTestComposerController extends MainLayoutBasicController ...@@ -999,7 +1004,56 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
} }
} }
private void checkAndFixAbsolutePath(AssessmentItemRef itemRef) {
if(itemRef == null || itemRef.getHref() == null) return;
String href = itemRef.getHref().toString();
if(isAbsolutePath(href)) {
try {
String relativeHref = fixAbsolutePath(href);
itemRef.setHref(new URI(relativeHref));
} catch (URISyntaxException e) {
logError("", e);
}
}
}
private void checkAndFixAbsolutePath(ResourceType resource) {
if(resource == null) return;
if(isAbsolutePath(resource.getHref())) {
resource.setHref(fixAbsolutePath(resource.getHref()));
List<FileType> files = resource.getFile();
if(files != null) {
for(FileType file:files) {
if(isAbsolutePath(file.getHref())) {
file.setHref(fixAbsolutePath(file.getHref()));
}
}
}
}
}
/**
* It check if the path is absolute and in the form of a absolute within an openolat instance.
* @param href
* @return
*/
private boolean isAbsolutePath(String href) {
return href != null && href.startsWith("/") && href.contains("/bcroot/repository/") && href.contains("/_unzipped_/");
}
private String fixAbsolutePath(String href) {
int index = href.indexOf("/_unzipped_/") + ("/_unzipped_/").length();
return href.substring(index);
}
private void doSaveManifest() { private void doSaveManifest() {
List<ResourceType> resources = manifestBuilder.getResourceList();
for(ResourceType resource:resources) {
checkAndFixAbsolutePath(resource);
}
manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml")); manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml"));
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment