diff --git a/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java b/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java index ba27c05f3356150ad9aae01d09ae149655999f23..4eb32848240a4cbafed8fad837442e10d24324cd 100644 --- a/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java +++ b/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java @@ -35,6 +35,7 @@ import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.apache.logging.log4j.Logger; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.media.MediaResource; @@ -43,7 +44,6 @@ import org.olat.core.id.Identity; import org.olat.core.id.User; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; @@ -68,9 +68,9 @@ import org.olat.ims.qti21.AssessmentItemSession; import org.olat.ims.qti21.AssessmentResponse; import org.olat.ims.qti21.AssessmentTestSession; import org.olat.ims.qti21.QTI21Service; +import org.olat.ims.qti21.manager.AssessmentItemSessionDAO; import org.olat.ims.qti21.manager.AssessmentResponseDAO; import org.olat.ims.qti21.manager.AssessmentTestSessionDAO; -import org.olat.ims.qti21.manager.QTI21ServiceImpl; import org.olat.ims.qti21.manager.archive.interactions.AssociateInteractionArchive; import org.olat.ims.qti21.manager.archive.interactions.ChoiceInteractionArchive; import org.olat.ims.qti21.manager.archive.interactions.DefaultInteractionArchive; @@ -97,6 +97,7 @@ import org.olat.modules.assessment.AssessmentEntry; import org.olat.repository.RepositoryEntry; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; +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.AssociateInteraction; @@ -154,12 +155,20 @@ public class QTI21ArchiveFormat { private List<AbstractInfos> elementInfos; private final Map<String, InteractionArchive> interactionArchiveMap = new HashMap<>(); - private final QTI21Service qtiService; - private final UserManager userManager; - private final AssessmentResponseDAO responseDao; - private final AssessmentTestSessionDAO testSessionDao; + @Autowired + private QTI21Service qtiService; + @Autowired + private UserManager userManager; + @Autowired + private AssessmentResponseDAO responseDao; + @Autowired + private AssessmentTestSessionDAO testSessionDao; + @Autowired + private AssessmentItemSessionDAO itemSessionDao; public QTI21ArchiveFormat(Locale locale, QTI21StatisticSearchParams searchParams) { + CoreSpringFactory.autowireObject(this); + this.searchParams = searchParams; if(searchParams.getArchiveOptions() == null || searchParams.getArchiveOptions().getExportFormat() == null) { exportConfig = new ExportFormat(true, true, true, true, true); @@ -167,11 +176,6 @@ public class QTI21ArchiveFormat { exportConfig = searchParams.getArchiveOptions().getExportFormat(); } - userManager = CoreSpringFactory.getImpl(UserManager.class); - qtiService = CoreSpringFactory.getImpl(QTI21ServiceImpl.class); - responseDao = CoreSpringFactory.getImpl(AssessmentResponseDAO.class); - testSessionDao = CoreSpringFactory.getImpl(AssessmentTestSessionDAO.class); - userPropertyHandlers = userManager.getUserPropertyHandlersFor(QTIArchiver.TEST_USER_PROPERTIES, true); translator = Util.createPackageTranslator(QTI21RuntimeController.class, locale); @@ -469,11 +473,16 @@ public class QTI21ArchiveFormat { AssessmentTestSession testSession = sessions.get(i); SessionResponses sessionResponses = new SessionResponses(testSession); List<AssessmentResponse> responses = responseDao.getResponses(testSession); - for(AssessmentResponse response:responses) { AssessmentItemSession itemSession = response.getAssessmentItemSession(); sessionResponses.addResponse(itemSession, response); } + + List<AssessmentItemSession> itemSessions = itemSessionDao.getAssessmentItemSessions(testSession); + for(AssessmentItemSession itemSession:itemSessions) { + sessionResponses.addItemSession(itemSession); + } + writeDataRow(i + 1, sessionResponses, exportSheet, workbook); DBFactory.getInstance().commitAndCloseSession(); } @@ -726,11 +735,13 @@ public class QTI21ArchiveFormat { public void addResponse(AssessmentItemSession itemSession, AssessmentResponse response) { String itemIdentifier = itemSession.getAssessmentItemIdentifier(); - if(!itemSessionsMap.containsKey(itemIdentifier)) { - itemSessionsMap.put(itemIdentifier, itemSession); - responsesMap.put(itemIdentifier, new ArrayList<>(5)); - } - responsesMap.get(itemIdentifier).add(response); + itemSessionsMap.putIfAbsent(itemIdentifier, itemSession); + responsesMap.computeIfAbsent(itemIdentifier, id -> new ArrayList<>(5)) + .add(response); + } + + public void addItemSession(AssessmentItemSession itemSession) { + itemSessionsMap.put(itemSession.getAssessmentItemIdentifier(), itemSession); } public AssessmentItemSession getItemSession(String itemIdentifier) {