package net.sf.gazpachoquest.questionnaire.resolver; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import net.sf.gazpachoquest.domain.core.Breadcrumb; import net.sf.gazpachoquest.domain.core.Question; import net.sf.gazpachoquest.domain.core.QuestionBreadcrumb; import net.sf.gazpachoquest.domain.core.Questionnaire; import net.sf.gazpachoquest.domain.core.QuestionnaireDefinition; import net.sf.gazpachoquest.domain.core.Section; import net.sf.gazpachoquest.domain.core.Section.Builder; import net.sf.gazpachoquest.domain.core.SectionBreadcrumb; import net.sf.gazpachoquest.qbe.SearchParameters; import net.sf.gazpachoquest.questionnaire.support.PageStructure; import net.sf.gazpachoquest.services.BreadcrumbService; import net.sf.gazpachoquest.services.SectionService; import net.sf.gazpachoquest.types.RandomizationStrategy; import net.sf.gazpachoquest.types.RenderingMode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component("AllInOneResolver") public class AllInOneResolver extends AbstractResolver<SectionBreadcrumb> implements PageResolver { public AllInOneResolver() { super(RenderingMode.ALL_IN_ONE); } @Autowired private BreadcrumbService breadcrumbService; @Autowired private SectionService sectionService; @Override protected List<SectionBreadcrumb> makeBreadcrumbs(QuestionnaireDefinition questionnaireDefinition, Questionnaire questionnaire) { List<SectionBreadcrumb> breadcrumbs = new ArrayList<>(); SectionBreadcrumb breadcrumb = null; Integer questionnairDefinitionId = questionnaireDefinition.getId(); RandomizationStrategy randomizationStrategy = questionnaireDefinition.getRandomizationStrategy(); if (RandomizationStrategy.SECTIONS_RANDOMIZATION.equals(randomizationStrategy)) { List<Section> sections = sectionService.findByExample( Section.with() .questionnaireDefinition( QuestionnaireDefinition.with().id(questionnairDefinitionId).build()).build(), new SearchParameters()); Collections.shuffle(sections); for (Section section : sections) { breadcrumb = SectionBreadcrumb.with().questionnaire(questionnaire).section(section).last(Boolean.TRUE) .renderingMode(RenderingMode.ALL_IN_ONE).build(); breadcrumbs.add(breadcrumb); } populateQuestionsBreadcrumbs(breadcrumbs, QUESTION_NUMBER_START_COUNTER); } else if (RandomizationStrategy.QUESTIONS_RANDOMIZATION.equals(randomizationStrategy)) { // Container section breadcrumb = SectionBreadcrumb.with().questionnaire(questionnaire).last(Boolean.TRUE) .renderingMode(RenderingMode.ALL_IN_ONE).build(); List<Question> questions = questionnaireDefinitionService.getQuestions(questionnairDefinitionId); shuffle(questions); Integer questionNumberCounter = QUESTION_NUMBER_START_COUNTER; for (Question question : questions) { breadcrumb.addBreadcrumb((QuestionBreadcrumb.with().question(question).last(Boolean.TRUE).questionNumber(questionNumberCounter++).build())); } breadcrumbs.add(breadcrumb); } else { List<Section> sections = sectionService.findByExample( Section.with() .questionnaireDefinition( QuestionnaireDefinition.with().id(questionnairDefinitionId).build()).build(), new SearchParameters()); for (Section section : sections) { breadcrumb = SectionBreadcrumb.with().questionnaire(questionnaire).section(section).last(Boolean.TRUE) .renderingMode(RenderingMode.ALL_IN_ONE).build(); breadcrumbs.add(breadcrumb); } populateQuestionsBreadcrumbs(breadcrumbs, QUESTION_NUMBER_START_COUNTER); } return breadcrumbs; } @Override protected SectionBreadcrumb findPreviousBreadcrumb(QuestionnaireDefinition questionnaireDefinition, Questionnaire questionnaire, SectionBreadcrumb lastBreadcrumb, Integer lastBreadcrumbPosition) { return null; } @Override protected SectionBreadcrumb findNextBreadcrumb(QuestionnaireDefinition questionnaireDefinition, Questionnaire questionnaire, Map<String, Object> answers, SectionBreadcrumb lastBreadcrumb, Integer lastBreadcrumbPosition) { return null; } @Override protected PageStructure createPageStructure(RandomizationStrategy randomizationStrategy, List<SectionBreadcrumb> breadcrumbs, Map<String, Object> answers) { PageStructure nextPage = super.createPageStructure(randomizationStrategy, breadcrumbs, answers); for (Breadcrumb breadcrumb : breadcrumbs) { SectionBreadcrumb sectionBreadcrumb = (SectionBreadcrumb) breadcrumb; Builder builder = Section.with(); if (!randomizationStrategy.equals(RandomizationStrategy.QUESTIONS_RANDOMIZATION)) { builder.id(sectionBreadcrumb.getSection().getId()); } Section section = builder.build(); for (QuestionBreadcrumb questionBreadcrumb : sectionBreadcrumb.getBreadcrumbs()) { section.addQuestion(Question.with().id(questionBreadcrumb.getQuestion().getId()) .number(questionBreadcrumb.getQuestionNumber()).build()); } nextPage.addSection(section); } return nextPage; } }