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 25fcb8f48f122fb36d3ede73b2dc468bb6b953eb..5e5c00cd71c66ecd744208b2634796fab1b703e1 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 @@ -70,9 +70,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; @@ -99,6 +99,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; @@ -156,13 +157,22 @@ 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; - private final CourseAssessmentService courseAssessmentService; + @Autowired + private QTI21Service qtiService; + @Autowired + private UserManager userManager; + @Autowired + private AssessmentResponseDAO responseDao; + @Autowired + private AssessmentTestSessionDAO testSessionDao; + @Autowired + private AssessmentItemSessionDAO itemSessionDao; + @Autowired + private CourseAssessmentService courseAssessmentService; 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); @@ -170,12 +180,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); - courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class); - userPropertyHandlers = userManager.getUserPropertyHandlersFor(QTIArchiver.TEST_USER_PROPERTIES, true); translator = Util.createPackageTranslator(QTI21RuntimeController.class, locale); @@ -471,11 +475,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) {