package net.sf.gazpachoquest.questionnaire.support; import java.util.List; 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.Section; import net.sf.gazpachoquest.domain.core.SectionBreadcrumb; import net.sf.gazpachoquest.services.BreadcrumbService; import net.sf.gazpachoquest.services.QuestionService; import net.sf.gazpachoquest.services.QuestionnaireDefinitionService; 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.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class PageMetadataCreatorImpl implements PageMetadataCreator { @Autowired private SectionService sectionService; @Autowired private QuestionService questionService; @Autowired @Qualifier("questionnaireDefinitionServiceImpl") private QuestionnaireDefinitionService questionnaireDefinitionService; @Autowired private BreadcrumbService breadcrumbService; @Override public PageMetadataStructure create(RandomizationStrategy randomizationStrategy, RenderingMode type, Breadcrumb breadcrumb) { int position = -1; int count = -1; if (type.equals(RenderingMode.ALL_IN_ONE)) { return PageMetadataStructure.with().count(1).number(1).build(); } if (breadcrumb instanceof SectionBreadcrumb) { Section section = ((SectionBreadcrumb) breadcrumb).getSection(); if (RandomizationStrategy.NONE.equals(randomizationStrategy)) { section = sectionService.findOne(section.getId()); position = sectionService.positionInQuestionnaireDefinition(section.getId()); count = questionnaireDefinitionService.sectionsCount(section.getQuestionnairDefinition().getId()); } else { count = breadcrumbService.countByQuestionnair(breadcrumb.getQuestionnaire().getId()); position = (Integer) breadcrumbService.findLastAndPosition(breadcrumb.getQuestionnaire().getId()).get(0)[1]; } } else if (breadcrumb instanceof QuestionBreadcrumb) { if (RandomizationStrategy.NONE.equals(randomizationStrategy)) { Question question = ((QuestionBreadcrumb) breadcrumb).getQuestion(); Section section = question.getSection(); Integer questionnairDefinitionId = section.getQuestionnairDefinition().getId(); count = questionnaireDefinitionService.questionsCount(questionnairDefinitionId); Integer sectionId = question.getSection().getId(); Integer positionInSection = questionService.findPositionInSection(question.getId()); List<Object[]> counts = questionnaireDefinitionService .questionsCountGroupBySections(questionnairDefinitionId); Integer positionInQuestionnairDefition = 0; for (Object[] objects : counts) { Integer groupId = (Integer) objects[0]; if (sectionId.equals(groupId)) { break; } positionInQuestionnairDefition += ((Long) objects[1]).intValue(); } position = positionInQuestionnairDefition + positionInSection; } else { count = breadcrumbService.countByQuestionnair(breadcrumb.getQuestionnaire().getId()); position = (Integer) breadcrumbService.findLastAndPosition(breadcrumb.getQuestionnaire().getId()).get(0)[1]; } } return PageMetadataStructure.with().count(count).number(position + 1).build(); } }