/******************************************************************************* * Copyright (c) 2014 antoniomariasanchez at gmail.com. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * antoniomaria - initial API and implementation ******************************************************************************/ package net.sf.gazpachoquest.questionnaire.support; import java.util.List; import java.util.Map; import net.sf.gazpachoquest.domain.core.Questionnaire; import net.sf.gazpachoquest.dto.QuestionDTO; import net.sf.gazpachoquest.dto.QuestionOptionDTO; import net.sf.gazpachoquest.dto.SubquestionDTO; import net.sf.gazpachoquest.dto.answers.AbstractAnswer; import net.sf.gazpachoquest.dto.answers.BooleanAnswer; import net.sf.gazpachoquest.dto.answers.MultipleAnswer; import net.sf.gazpachoquest.dto.answers.NoAnswer; import net.sf.gazpachoquest.dto.answers.NumericAnswer; import net.sf.gazpachoquest.dto.answers.TextAnswer; import net.sf.gazpachoquest.dto.support.AbstractQuestionDTO; import net.sf.gazpachoquest.services.QuestionnaireAnswersService; import net.sf.gazpachoquest.types.QuestionType; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component public class AnswersPopulatorImpl implements AnswersPopulator { @Autowired private QuestionnaireAnswersService questionnaireAnswersService; public AnswersPopulatorImpl() { super(); } @Override @Transactional(readOnly = true) public void populate(Map<String, Object> answers, List<QuestionDTO> questions) { //Map<String, Object> answers = questionnaireAnswersService.findByQuestionnaire(questionnaire); if (answers == null) { return; } for (QuestionDTO question : questions) { populateAnswers(question, answers); } } private void populateAnswers(AbstractQuestionDTO question, Map<String, Object> answers) { if (question.getType().hasSubquestions()) { QuestionDTO questionDTO = (QuestionDTO) question; for (SubquestionDTO subquestion : questionDTO.getSubquestions()) { populateAnswers(subquestion, answers); } } else { AbstractAnswer answer = null; QuestionType type = question.getType(); String questionCode = question.getCode(); if (!type.hasMultipleAnswers()) { if (QuestionType.S.equals(type) || QuestionType.L.equals(type)) { Object value = answers.get(questionCode); answer = value != null ? TextAnswer.fromValue((String) value) : NoAnswer.create(); } else if (QuestionType.N.equals(type)) { Object value = answers.get(questionCode); answer = value != null ? NumericAnswer.fromValue((Integer) value) : NoAnswer.create(); } else if (QuestionType.T.equals(type)) { Character[] value = (Character[]) answers.get(questionCode); answer = value != null ? new TextAnswer(new String(ArrayUtils.toPrimitive(value))) : NoAnswer .create(); } else { throw new IllegalStateException(type + " not supported"); } } else { List<QuestionOptionDTO> questionOptions = question.getQuestionOptions(); answer = new MultipleAnswer(); for (QuestionOptionDTO questionOptionDTO : questionOptions) { String optionCode = questionOptionDTO.getCode(); String answerCode = new StringBuilder(questionCode).append("_").append(optionCode).toString(); Object value = answers.get(answerCode); // Only checkbox are supported if (type.getAnswerType().isAssignableFrom(Boolean.class)) { ((MultipleAnswer) answer).addAnswer(BooleanAnswer.valueOf(optionCode, (Boolean) value)); } else { throw new IllegalStateException(type + " not supported"); } } } question.setAnswer(answer); } } }