/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.platform.questionnaire.mappers;
import java.util.HashMap;
import org.mifos.platform.questionnaire.domain.AnswerType;
import org.mifos.platform.questionnaire.domain.ChoiceTagEntity;
import org.mifos.platform.questionnaire.domain.EventSourceEntity;
import org.mifos.platform.questionnaire.domain.QuestionChoiceEntity;
import org.mifos.platform.questionnaire.domain.QuestionEntity;
import org.mifos.platform.questionnaire.domain.QuestionGroup;
import org.mifos.platform.questionnaire.domain.QuestionGroupInstance;
import org.mifos.platform.questionnaire.domain.QuestionGroupLink;
import org.mifos.platform.questionnaire.domain.QuestionGroupResponse;
import org.mifos.platform.questionnaire.domain.QuestionGroupState;
import org.mifos.platform.questionnaire.domain.QuestionState;
import org.mifos.platform.questionnaire.domain.Section;
import org.mifos.platform.questionnaire.domain.SectionLink;
import org.mifos.platform.questionnaire.domain.SectionQuestion;
import org.mifos.platform.questionnaire.domain.SectionQuestionLink;
import org.mifos.platform.questionnaire.persistence.EventSourceDao;
import org.mifos.platform.questionnaire.persistence.QuestionDao;
import org.mifos.platform.questionnaire.persistence.QuestionGroupDao;
import org.mifos.platform.questionnaire.persistence.QuestionGroupInstanceDao;
import org.mifos.platform.questionnaire.persistence.SectionDao;
import org.mifos.platform.questionnaire.persistence.SectionLinkDao;
import org.mifos.platform.questionnaire.persistence.SectionQuestionDao;
import org.mifos.platform.questionnaire.persistence.SectionQuestionLinkDao;
import org.mifos.platform.questionnaire.service.SelectionDetail;
import org.mifos.platform.questionnaire.service.dtos.ChoiceDto;
import org.mifos.platform.questionnaire.service.dtos.EventSourceDto;
import org.mifos.platform.questionnaire.service.QuestionDetail;
import org.mifos.platform.questionnaire.service.QuestionGroupDetail;
import org.mifos.platform.questionnaire.service.QuestionGroupDetails;
import org.mifos.platform.questionnaire.service.QuestionGroupInstanceDetail;
import org.mifos.platform.questionnaire.service.QuestionLinkDetail;
import org.mifos.platform.questionnaire.service.QuestionType;
import org.mifos.platform.questionnaire.service.SectionDetail;
import org.mifos.platform.questionnaire.service.SectionLinkDetail;
import org.mifos.platform.questionnaire.service.SectionQuestionDetail;
import org.mifos.platform.questionnaire.service.dtos.QuestionDto;
import org.mifos.platform.questionnaire.service.dtos.QuestionGroupDto;
import org.mifos.platform.questionnaire.service.dtos.QuestionGroupInstanceDto;
import org.mifos.platform.questionnaire.service.dtos.QuestionGroupResponseDto;
import org.mifos.platform.questionnaire.service.dtos.SectionDto;
import org.mifos.platform.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.mifos.platform.util.CollectionUtils.asMap;
import static org.mifos.platform.util.CollectionUtils.isNotEmpty;
import static org.mifos.platform.util.MapEntry.makeEntry;
@SuppressWarnings({"PMD", "UnusedDeclaration"})
public class QuestionnaireMapperImpl implements QuestionnaireMapper {
private Map<AnswerType, QuestionType> answerToQuestionType;
private Map<QuestionType, AnswerType> questionToAnswerType;
@Autowired
private EventSourceDao eventSourceDao;
@Autowired
private QuestionDao questionDao;
@Autowired
private QuestionGroupDao questionGroupDao;
@Autowired
private SectionQuestionDao sectionQuestionDao;
@Autowired
private SectionDao sectionDao;
@Autowired
private QuestionGroupInstanceDao questionGroupInstanceDao;
@Autowired
private SectionLinkDao sectionLinkDao;
@Autowired
private SectionQuestionLinkDao sectionQuestionLinkDao;
public QuestionnaireMapperImpl() {
this(null, null, null, null,null, null,null,null);
}
public QuestionnaireMapperImpl(EventSourceDao eventSourceDao, QuestionDao questionDao, QuestionGroupDao questionGroupDao,
SectionQuestionDao sectionQuestionDao, QuestionGroupInstanceDao questionGroupInstanceDao, SectionDao sectionDao, SectionLinkDao sectionLinkDao, SectionQuestionLinkDao sectionQuestionLinkDao) {
populateAnswerToQuestionTypeMap();
populateQuestionToAnswerTypeMap();
this.eventSourceDao = eventSourceDao;
this.questionDao = questionDao;
this.questionGroupDao = questionGroupDao;
this.sectionQuestionDao = sectionQuestionDao;
this.questionGroupInstanceDao = questionGroupInstanceDao;
this.sectionDao = sectionDao;
this.sectionLinkDao = sectionLinkDao;
this.sectionQuestionLinkDao = sectionQuestionLinkDao;
}
@Override
public List<QuestionDetail> mapToQuestionDetails(List<QuestionEntity> questions) {
List<QuestionDetail> questionDetails = new ArrayList<QuestionDetail>();
for (QuestionEntity question : questions) {
questionDetails.add(mapToQuestionDetail(question));
}
return questionDetails;
}
@Override
public QuestionDetail mapToQuestionDetail(QuestionEntity question) {
return mapToQuestionDetail(question, mapToQuestionType(question.getAnswerTypeAsEnum()));
}
private List<ChoiceDto> mapToQuestionChoices(List<QuestionChoiceEntity> choices) {
List<ChoiceDto> questionChoices = new LinkedList<ChoiceDto>();
for (QuestionChoiceEntity questionChoice : choices) {
questionChoices.add(mapToChoiceDetail(questionChoice));
}
return questionChoices;
}
private ChoiceDto mapToChoiceDetail(QuestionChoiceEntity questionChoice) {
ChoiceDto choiceDto = new ChoiceDto(questionChoice.getChoiceText());
mapToChoiceTags(choiceDto, questionChoice.getTags());
return choiceDto;
}
private void mapToChoiceTags(ChoiceDto choiceDto, Set<ChoiceTagEntity> choiceTagEntities) {
if (isNotEmpty(choiceTagEntities)) {
List<String> choiceTags = new ArrayList<String>();
for (ChoiceTagEntity tag : choiceTagEntities) {
choiceTags.add(tag.getTagText());
}
choiceDto.setTags(choiceTags);
}
}
@Override
public QuestionEntity mapToQuestion(QuestionDetail questionDetail) {
QuestionEntity question = getQuestion(questionDetail);
question.setQuestionId(questionDetail.getId() > 0 ? questionDetail.getId() : 0);
question.setNickname(questionDetail.getNickname());
question.setQuestionText(questionDetail.getText());
question.setAnswerType(mapToAnswerType(questionDetail.getType()));
question.setChoices(mapToChoices(questionDetail.getAnswerChoices()));
question.setQuestionState(QuestionState.getQuestionStateEnum(questionDetail.isActive(), questionDetail.isEditable()));
mapBoundsForNumericQuestionDetail(questionDetail, question);
return question;
}
private QuestionEntity getQuestion(QuestionDetail questionDetail) {
return questionDetail.isNewQuestion() ? new QuestionEntity() : questionDao.getDetails(questionDetail.getId());
}
private void mapBoundsForNumericQuestionDetail(QuestionDetail questionDetail, QuestionEntity question) {
if (questionDetail.getType() == QuestionType.NUMERIC) {
question.setNumericMin(questionDetail.getNumericMin());
question.setNumericMax(questionDetail.getNumericMax());
}
}
private List<QuestionChoiceEntity> mapToChoices(List<ChoiceDto> choices) {
List<QuestionChoiceEntity> questionChoices = new LinkedList<QuestionChoiceEntity>();
if (CollectionUtils.isNotEmpty(choices)) {
for (ChoiceDto choice : choices) {
questionChoices.add(mapToChoice(choice));
}
}
return questionChoices;
}
private QuestionChoiceEntity mapToChoice(ChoiceDto choice) {
QuestionChoiceEntity choiceEntity = new QuestionChoiceEntity(choice.getValue());
choiceEntity.setChoiceOrder(choice.getOrder());
List<String> tags = choice.getTags();
if (isNotEmpty(tags)) {
Set<ChoiceTagEntity> choiceTagEntities = new LinkedHashSet<ChoiceTagEntity>();
for (String tag : tags) {
ChoiceTagEntity choiceTagEntity = new ChoiceTagEntity();
choiceTagEntity.setTagText(tag);
choiceTagEntities.add(choiceTagEntity);
}
choiceEntity.setTags(choiceTagEntities);
}
return choiceEntity;
}
@Override
public QuestionGroup mapToQuestionGroup(QuestionGroupDetail questionGroupDetail) {
QuestionGroup questionGroup = getQuestionGroup(questionGroupDetail);
questionGroup.setTitle(questionGroupDetail.getTitle());
questionGroup.setState(QuestionGroupState.getQuestionGroupStateAsEnum(questionGroupDetail.isActive()));
questionGroup.setDateOfCreation(getCurrentDateTime());
questionGroup.setSections(mapToSections(questionGroupDetail));
questionGroup.setEventSources(mapEventSourceDtoToEntity(questionGroupDetail.getEventSources()));
questionGroup.setEditable(questionGroupDetail.isEditable());
questionGroup.setActivityId(questionGroupDetail.getActivityId());
return questionGroup;
}
private QuestionGroup getQuestionGroup(QuestionGroupDetail questionGroupDetail) {
return questionGroupDetail.isNewQuestionGroup() ? new QuestionGroup() : questionGroupDao.getDetails(questionGroupDetail.getId());
}
private Set<EventSourceEntity> mapEventSourceDtoToEntity(List<EventSourceDto> eventSourceDtos) {
Set<EventSourceEntity> eventSources = new HashSet<EventSourceEntity>();
for (EventSourceDto eventSourceDto : eventSourceDtos) {
List list = eventSourceDao.retrieveByEventAndSource(eventSourceDto.getEvent(), eventSourceDto.getSource());
for (Object obj : list) {
eventSources.add((EventSourceEntity) obj);
}
}
return eventSources;
}
private List<Section> mapToSections(QuestionGroupDetail questionGroupDetail) {
List<Section> sections = new ArrayList<Section>();
for (SectionDetail sectionDetail : questionGroupDetail.getSectionDetails()) {
sections.add(mapToSection(questionGroupDetail, sectionDetail));
}
return sections;
}
private Section mapToSection(QuestionGroupDetail questionGroupDetail, SectionDetail sectionDetail) {
Section section = getSection(questionGroupDetail, sectionDetail);
section.setQuestions(mapToSectionQuestions(sectionDetail.getQuestions(), section));
if (sectionDetail.getSequenceNumber() != null) {
section.setSequenceNumber(sectionDetail.getSequenceNumber());
}
return section;
}
private Section getSection(QuestionGroupDetail questionGroupDetail, SectionDetail sectionDetail) {
String sectionName = sectionDetail.getName();
Section section = new Section(sectionName);
if (!questionGroupDetail.isNewQuestionGroup()) {
List<Section> sections = questionGroupDao.retrieveSectionByNameAndQuestionGroupId(sectionName, questionGroupDetail.getId());
if (isNotEmpty(sections)) {
section = sections.get(0);
}
}
return section;
}
private List<SectionQuestion> mapToSectionQuestions(List<SectionQuestionDetail> sectionQuestionDetails, Section section) {
List<SectionQuestion> sectionQuestions = new ArrayList<SectionQuestion>();
for (int i = 0, sectionQuestionDetailsSize = sectionQuestionDetails.size(); i < sectionQuestionDetailsSize; i++) {
SectionQuestionDetail sectionQuestionDetail = sectionQuestionDetails.get(i);
sectionQuestions.add(mapToSectionQuestion(sectionQuestionDetail, i, section));
}
return sectionQuestions;
}
private SectionQuestion mapToSectionQuestion(SectionQuestionDetail sectionQuestionDetail, int seqNum, Section section) {
QuestionDetail questionDetail = sectionQuestionDetail.getQuestionDetail();
SectionQuestion sectionQuestion = getSectionQuestion(questionDetail, section);
sectionQuestion.setRequired(sectionQuestionDetail.isMandatory());
sectionQuestion.setShowOnPage(sectionQuestionDetail.isShowOnPage());
sectionQuestion.setSequenceNumber(sectionQuestionDetail.getSequenceNumber());
if (sectionQuestion.isNewSectionQuestion()) {
sectionQuestion.setQuestion(mapToQuestion(questionDetail));
sectionQuestion.setSequenceNumber(seqNum);
sectionQuestion.setSection(section);
}
return sectionQuestion;
}
private SectionQuestion getSectionQuestion(QuestionDetail questionDetail, Section section) {
SectionQuestion sectionQuestion = new SectionQuestion();
if (!questionDetail.isNewQuestion() && !section.isNewSection()) {
List<SectionQuestion> sectionQuestions = sectionQuestionDao.retrieveFromQuestionIdSectionId(section.getId(), questionDetail.getId());
if (isNotEmpty(sectionQuestions)) {
sectionQuestion = sectionQuestions.get(0);
}
}
return sectionQuestion;
}
@Override
public QuestionGroupDetail mapToQuestionGroupDetail(QuestionGroup questionGroup) {
List<SectionDetail> sectionDetails = mapToSectionDetails(questionGroup.getSections());
List<SectionLink> sectionLinks = new ArrayList<SectionLink>();
List<SectionQuestionLink> sectionQuestionLinks = new ArrayList<SectionQuestionLink>();
for(SectionDetail sectionDetail : sectionDetails){
for(SectionQuestionDetail sectionQuestionDetail : sectionDetail.getQuestionDetails()){
if(!sectionLinkDao.retrieveDependentSectionLinksFromQuestion(sectionQuestionDetail.getId()).isEmpty())
sectionLinks.addAll(sectionLinkDao.retrieveDependentSectionLinksFromQuestion(sectionQuestionDetail.getId()));
if(!sectionQuestionLinkDao.retrieveDependentSectionQuestionLinksFromQuestion(sectionQuestionDetail.getId()).isEmpty())
sectionQuestionLinks.addAll(sectionQuestionLinkDao.retrieveDependentSectionQuestionLinksFromQuestion(sectionQuestionDetail.getId()));
}
}
List<EventSourceDto> eventSourceDtos = mapToEventSource(questionGroup.getEventSources());
return new QuestionGroupDetail(questionGroup.getId(), questionGroup.getTitle(),
eventSourceDtos, sectionDetails, questionGroup.isEditable(),
QuestionGroupState.ACTIVE.equals(questionGroup.getState()), questionGroup.isPpi(), mapToQuestionLinkDetails(sectionQuestionLinks), mapToSectionLinkDetails(sectionLinks));
}
private List<EventSourceDto> mapToEventSource(Set<EventSourceEntity> eventSources) {
if (eventSources == null || eventSources.isEmpty()) {
return null;
}
List<EventSourceDto> eventSourceDtos = new ArrayList<EventSourceDto>();
for (EventSourceEntity eventSourceEntity : eventSources) {
eventSourceDtos.add(new EventSourceDto(eventSourceEntity.getEvent().getName(), eventSourceEntity.getSource().getEntityType(), eventSourceEntity.getDescription()));
}
return eventSourceDtos;
}
private List<SectionDetail> mapToSectionDetails(List<Section> sections) {
List<SectionDetail> sectionDetails = new ArrayList<SectionDetail>();
for (Section section : sections) {
sectionDetails.add(mapToSectionDetail(section));
}
return sectionDetails;
}
private SectionDetail mapToSectionDetail(Section section) {
SectionDetail sectionDetail = new SectionDetail();
sectionDetail.setId(section.getId());
sectionDetail.setName(section.getName());
if (section.getSequenceNumber() != null) {
sectionDetail.setSequenceNumber(section.getSequenceNumber());
}
for (SectionQuestion sectionQuestion : section.getQuestions()) {
QuestionEntity question = sectionQuestion.getQuestion();
QuestionType type = mapToQuestionType(question.getAnswerTypeAsEnum());
boolean required = sectionQuestion.isRequired();
QuestionDetail questionDetail = mapToQuestionDetail(question, type);
sectionDetail.addQuestion(mapToSectionQuestionDetail(sectionQuestion, required, sectionQuestion.isShowOnPage(), questionDetail));
}
return sectionDetail;
}
private SectionQuestionDetail mapToSectionQuestionDetail(SectionQuestion sectionQuestion, boolean required, boolean showOnPage, QuestionDetail questionDetail) {
if (sectionQuestion.getSequenceNumber() != null) {
return new SectionQuestionDetail(sectionQuestion.getId(), questionDetail, required, showOnPage, sectionQuestion.getSequenceNumber());
}
return new SectionQuestionDetail(sectionQuestion.getId(), questionDetail, required);
}
private QuestionDetail mapToQuestionDetail(QuestionEntity question, QuestionType type) {
List<ChoiceDto> answerChoices = mapToQuestionChoices(question.getChoices());
QuestionDetail questionDetail = new QuestionDetail(question.getQuestionId(), question.getQuestionText(), type, question.isActive(), question.isEditable());
questionDetail.setNickname(question.getNickname());
questionDetail.setAnswerChoices(answerChoices);
mapBoundsForNumericQuestion(question, questionDetail);
return questionDetail;
}
private void mapBoundsForNumericQuestion(QuestionEntity question, QuestionDetail questionDetail) {
if (question.getAnswerTypeAsEnum() == AnswerType.NUMBER) {
questionDetail.setNumericMin(question.getNumericMin());
questionDetail.setNumericMax(question.getNumericMax());
}
}
@Override
public List<QuestionGroupDetail> mapToQuestionGroupDetails(List<QuestionGroup> questionGroups) {
List<QuestionGroupDetail> questionGroupDetails = new ArrayList<QuestionGroupDetail>();
for (QuestionGroup questionGroup : questionGroups) {
questionGroupDetails.add(mapToQuestionGroupDetail(questionGroup));
}
return questionGroupDetails;
}
@Override
public List<EventSourceDto> mapToEventSources(List<EventSourceEntity> eventSourceEntities) {
List<EventSourceDto> eventSourceDtos = new ArrayList<EventSourceDto>();
for (EventSourceEntity eventSourceEntity : eventSourceEntities) {
eventSourceDtos.add(mapEventSource(eventSourceEntity));
}
return eventSourceDtos;
}
@Override
public List<QuestionGroupInstance> mapToQuestionGroupInstances(QuestionGroupDetails questionGroupDetails) {
List<QuestionGroupInstance> questionGroupInstances = new ArrayList<QuestionGroupInstance>();
for (QuestionGroupDetail questionGroupDetail : questionGroupDetails.getDetails()) {
questionGroupInstances.add(mapToQuestionGroupInstance(questionGroupDetails.getCreatorId(),
questionGroupDetails.getEntityId(), questionGroupDetails.getEventSourceId(), questionGroupDetail));
}
return questionGroupInstances;
}
@Override
public List<QuestionGroupInstanceDetail> mapToQuestionGroupInstanceDetails(List<QuestionGroupInstance> questionGroupInstances) {
List<QuestionGroupInstanceDetail> questionGroupInstanceDetails = new ArrayList<QuestionGroupInstanceDetail>();
for (QuestionGroupInstance questionGroupInstance : questionGroupInstances) {
questionGroupInstanceDetails.add(mapToQuestionGroupInstanceDetail(questionGroupInstance));
}
return questionGroupInstanceDetails;
}
@Override
public QuestionGroupInstanceDetail mapToQuestionGroupInstanceDetail(QuestionGroupInstance questionGroupInstance) {
QuestionGroupDetail questionGroupDetail = mapToQuestionGroupDetail(questionGroupInstance.getQuestionGroup());
QuestionGroupInstanceDetail questionGroupInstanceDetail = new QuestionGroupInstanceDetail();
questionGroupInstanceDetail.setId(questionGroupInstance.getId());
questionGroupInstanceDetail.setDateCompleted(questionGroupInstance.getDateConducted());
questionGroupInstanceDetail.setQuestionGroupDetail(questionGroupDetail);
mapQuestionResponses(questionGroupInstance.getQuestionGroupResponses(), questionGroupInstanceDetail.getQuestionGroupDetail());
return questionGroupInstanceDetail;
}
@Override
public void mapToQuestionResponse(SectionQuestionDetail sectionQuestionDetail, List<QuestionGroupResponse> questionGroupResponses) {
if (sectionQuestionDetail.isMultiSelectQuestion()) {
setMultiChoiceResponses(questionGroupResponses, sectionQuestionDetail);
} else {
setResponse(questionGroupResponses, sectionQuestionDetail);
}
}
@Override
public QuestionGroupInstanceDetail mapToEmptyQuestionGroupInstanceDetail(QuestionGroup questionGroup) {
QuestionGroupInstanceDetail questionGroupInstanceDetail = new QuestionGroupInstanceDetail();
questionGroupInstanceDetail.setId(0);
questionGroupInstanceDetail.setQuestionGroupDetail(mapToQuestionGroupDetail(questionGroup));
return questionGroupInstanceDetail;
}
@Override
public QuestionGroup mapToQuestionGroup(QuestionGroupDto questionGroupDto) {
QuestionGroup questionGroup = new QuestionGroup();
questionGroup.setEditable(questionGroupDto.isEditable());
questionGroup.setDateOfCreation(getCurrentDateTime());
questionGroup.setPpi(questionGroupDto.isPpi());
questionGroup.setEventSources(mapEventSourceDtoToEntity(questionGroupDto.getEventSourceDtos()));
questionGroup.setTitle(questionGroupDto.getTitle());
questionGroup.setState(questionGroupDto.isActive() ? QuestionGroupState.ACTIVE : QuestionGroupState.INACTIVE);
questionGroup.setSections(mapToSectionsFromDtos(questionGroupDto.getSections()));
questionGroup.setActivityId(questionGroupDto.getActivityId());
return questionGroup;
}
@Override
public QuestionGroupInstance mapToQuestionGroupInstance(QuestionGroupInstanceDto questionGroupInstanceDto) {
QuestionGroupInstance questionGroupInstance = new QuestionGroupInstance();
questionGroupInstance.setCompletedStatus(questionGroupInstanceDto.isCompleted());
questionGroupInstance.setCreatorId(questionGroupInstanceDto.getCreatorId());
questionGroupInstance.setEventSourceId(questionGroupInstanceDto.getEventSourceId());
questionGroupInstance.setDateConducted(questionGroupInstanceDto.getDateConducted());
questionGroupInstance.setEntityId(questionGroupInstanceDto.getEntityId());
questionGroupInstance.setVersionNum(questionGroupInstanceDto.getVersion());
questionGroupInstance.setQuestionGroup(questionGroupDao.getDetails(questionGroupInstanceDto.getQuestionGroupId()));
questionGroupInstance.setQuestionGroupResponses(mapToQuestionGroupResponses(questionGroupInstance, questionGroupInstanceDto.getQuestionGroupResponseDtos()));
return questionGroupInstance;
}
private List<QuestionGroupResponse> mapToQuestionGroupResponses(QuestionGroupInstance questionGroupInstance, List<QuestionGroupResponseDto> questionGroupResponseDtos) {
List<QuestionGroupResponse> questionGroupResponses = new ArrayList<QuestionGroupResponse>();
if (isNotEmpty(questionGroupResponseDtos)) {
for (QuestionGroupResponseDto questionGroupResponseDto : questionGroupResponseDtos) {
questionGroupResponses.add(mapToQuestionGroupResponse(questionGroupInstance, questionGroupResponseDto));
}
}
return questionGroupResponses;
}
private Map<Integer, SectionQuestion> sectionQuestionMap = new HashMap<Integer, SectionQuestion>();
private QuestionGroupResponse mapToQuestionGroupResponse(QuestionGroupInstance questionGroupInstance, QuestionGroupResponseDto questionGroupResponseDto) {
QuestionGroupResponse questionGroupResponse = new QuestionGroupResponse();
questionGroupResponse.setResponse(questionGroupResponseDto.getResponse());
questionGroupResponse.setQuestionGroupInstance(questionGroupInstance);
SectionQuestion sq;
if (sectionQuestionMap.containsKey(questionGroupResponseDto.getSectionQuestionId())) {
sq = sectionQuestionMap.get(questionGroupResponseDto.getSectionQuestionId());
} else {
sq = sectionQuestionDao.getDetails(questionGroupResponseDto.getSectionQuestionId());
sectionQuestionMap.put(questionGroupResponseDto.getSectionQuestionId(), sq);
}
questionGroupResponse.setSectionQuestion(sq);
return questionGroupResponse;
}
private List<Section> mapToSectionsFromDtos(List<SectionDto> sectionDtos) {
List<Section> sections = new ArrayList<Section>();
for (SectionDto sectionDto : sectionDtos) {
sections.add(mapToSection(sectionDto));
}
return sections;
}
private Section mapToSection(SectionDto sectionDto) {
Section section = new Section();
section.setName(sectionDto.getName());
section.setSequenceNumber(sectionDto.getOrder());
section.setQuestions(mapToSectionQuestionsFromDtos(sectionDto.getQuestions(), section));
return section;
}
private List<SectionQuestion> mapToSectionQuestionsFromDtos(List<QuestionDto> questions, Section section) {
List<SectionQuestion> sectionQuestions = new ArrayList<SectionQuestion>();
for (QuestionDto questionDto : questions) {
sectionQuestions.add(mapToSectionQuestion(questionDto, section));
}
return sectionQuestions;
}
private SectionQuestion mapToSectionQuestion(QuestionDto questionDto, Section section) {
SectionQuestion sectionQuestion = new SectionQuestion();
sectionQuestion.setSection(section);
sectionQuestion.setSequenceNumber(questionDto.getOrder());
sectionQuestion.setRequired(questionDto.isMandatory());
sectionQuestion.setShowOnPage(questionDto.isShowOnPage());
sectionQuestion.setQuestion(mapToQuestion(questionDto));
return sectionQuestion;
}
@Override
public QuestionEntity mapToQuestion(QuestionDto questionDto) {
QuestionEntity questionEntity = new QuestionEntity();
questionEntity.setQuestionText(questionDto.getText());
questionEntity.setNickname(questionDto.getNickname());
questionEntity.setAnswerType(mapToAnswerType(questionDto.getType()));
questionEntity.setNumericMin(questionDto.getMinValue());
questionEntity.setNumericMax(questionDto.getMaxValue());
questionEntity.setQuestionState(questionDto.isActive() ?
questionDto.isEditable() ? QuestionState.ACTIVE : QuestionState.ACTIVE_NOT_EDITABLE :
questionDto.isEditable() ? QuestionState.INACTIVE : QuestionState.INACTIVE_NOT_EDITABLE);
questionEntity.setChoices(mapToChoices(questionDto.getChoices()));
return questionEntity;
}
private Date getCurrentDateTime() {
return Calendar.getInstance().getTime();
}
private void mapQuestionResponses(List<QuestionGroupResponse> questionGroupResponses, QuestionGroupDetail questionGroupDetail) {
if (isNotEmpty(questionGroupResponses)) {
for (SectionDetail sectionDetail : questionGroupDetail.getSectionDetails()) {
for (SectionQuestionDetail sectionQuestionDetail : sectionDetail.getQuestions()) {
mapToQuestionResponse(sectionQuestionDetail, questionGroupResponses);
}
}
}
}
private void setResponse(List<QuestionGroupResponse> questionGroupResponses, SectionQuestionDetail sectionQuestionDetail) {
for (QuestionGroupResponse questionGroupResponse : questionGroupResponses) {
if (questionGroupResponse.getSectionQuestion().getId() == sectionQuestionDetail.getId()) {
sectionQuestionDetail.setValue(questionGroupResponse.getResponse());
}
}
}
private void setMultiChoiceResponses(List<QuestionGroupResponse> questionGroupResponses, SectionQuestionDetail sectionQuestionDetail) {
List<SelectionDetail> answers = new ArrayList<SelectionDetail>();
for (QuestionGroupResponse questionGroupResponse : questionGroupResponses) {
if (questionGroupResponse.getSectionQuestion().getId() == sectionQuestionDetail.getId()) {
answers.add(mapToSelectionDetail(questionGroupResponse));
}
}
sectionQuestionDetail.setSelections(answers);
}
private SelectionDetail mapToSelectionDetail(QuestionGroupResponse questionGroupResponse) {
SelectionDetail selectionDetail = new SelectionDetail();
selectionDetail.setSelectedChoice(questionGroupResponse.getResponse());
selectionDetail.setSelectedTag(questionGroupResponse.getTag());
return selectionDetail;
}
private QuestionGroupInstance mapToQuestionGroupInstance(int creatorId, int entityId, int eventSourceId, QuestionGroupDetail questionGroupDetail) {
QuestionGroupInstance questionGroupInstance = new QuestionGroupInstance();
questionGroupInstance.setDateConducted(getCurrentDateTime());
questionGroupInstance.setCompletedStatus(1);
Integer questionGroupId = questionGroupDetail.getId();
questionGroupInstance.setVersionNum(
nextQuestionGroupInstanceVersion(entityId, questionGroupId));
questionGroupInstance.setCreatorId(creatorId);
questionGroupInstance.setEventSourceId(eventSourceId);
questionGroupInstance.setEntityId(entityId);
questionGroupInstance.setQuestionGroup(questionGroupDao.getDetails(questionGroupId));
questionGroupInstance.setQuestionGroupResponses(mapToQuestionGroupResponses(questionGroupDetail, questionGroupInstance));
return questionGroupInstance;
}
private int nextQuestionGroupInstanceVersion(int entityId, Integer questionGroupId) {
int nextVersion = 0;
List questionGroupInstances = questionGroupInstanceDao.retrieveLatestQuestionGroupInstanceByQuestionGroupAndEntity(entityId, questionGroupId);
if (isNotEmpty(questionGroupInstances)) {
nextVersion = ((QuestionGroupInstance) questionGroupInstances.get(0)).getVersionNum() + 1;
}
return nextVersion;
}
private List<QuestionGroupResponse> mapToQuestionGroupResponses(QuestionGroupDetail questionGroupDetail, QuestionGroupInstance questionGroupInstance) {
List<QuestionGroupResponse> questionGroupResponses = new LinkedList<QuestionGroupResponse>();
for (SectionDetail sectionDetail : questionGroupDetail.getSectionDetails()) {
for (SectionQuestionDetail sectionQuestionDetail : sectionDetail.getQuestions()) {
SectionQuestion sectionQuestion = sectionQuestionDao.getDetails(sectionQuestionDetail.getId());
if (sectionQuestionDetail.hasAnswer()) {
mapToQuestionGroupResponse(questionGroupInstance, questionGroupResponses, sectionQuestionDetail, sectionQuestion);
}
}
}
return questionGroupResponses;
}
private void mapToQuestionGroupResponse(QuestionGroupInstance questionGroupInstance, List<QuestionGroupResponse> questionGroupResponses, SectionQuestionDetail sectionQuestionDetail, SectionQuestion sectionQuestion) {
if (sectionQuestionDetail.isMultiSelectQuestion()) {
for (SelectionDetail selectionDetail : sectionQuestionDetail.getSelections()) {
questionGroupResponses.add(mapToQuestionGroupResponse(questionGroupInstance, sectionQuestion, selectionDetail));
}
} else {
questionGroupResponses.add(mapToQuestionGroupResponse(questionGroupInstance, sectionQuestion, sectionQuestionDetail.getValue()));
}
}
private QuestionGroupResponse mapToQuestionGroupResponse(QuestionGroupInstance questionGroupInstance, SectionQuestion sectionQuestion, SelectionDetail selectionDetail) {
QuestionGroupResponse questionGroupResponse = mapToQuestionGroupResponse(questionGroupInstance, sectionQuestion, selectionDetail.getSelectedChoice());
questionGroupResponse.setTag(selectionDetail.getSelectedTag());
return questionGroupResponse;
}
private QuestionGroupResponse mapToQuestionGroupResponse(QuestionGroupInstance questionGroupInstance, SectionQuestion sectionQuestion, String value) {
QuestionGroupResponse questionGroupResponse = new QuestionGroupResponse();
questionGroupResponse.setSectionQuestion(sectionQuestion);
questionGroupResponse.setResponse(value);
questionGroupResponse.setQuestionGroupInstance(questionGroupInstance);
return questionGroupResponse;
}
private EventSourceDto mapEventSource(EventSourceEntity eventSourceEntity) {
return new EventSourceDto(eventSourceEntity.getEvent().getName(), eventSourceEntity.getSource().getEntityType(),
eventSourceEntity.getDescription());
}
private QuestionType mapToQuestionType(AnswerType answerType) {
return answerToQuestionType.get(answerType);
}
private AnswerType mapToAnswerType(QuestionType questionType) {
return questionToAnswerType.get(questionType);
}
private void populateAnswerToQuestionTypeMap() {
answerToQuestionType = CollectionUtils.asMap(makeEntry(AnswerType.INVALID, QuestionType.INVALID),
makeEntry(AnswerType.FREETEXT, QuestionType.FREETEXT),
makeEntry(AnswerType.DATE, QuestionType.DATE),
makeEntry(AnswerType.NUMBER, QuestionType.NUMERIC),
makeEntry(AnswerType.SINGLESELECT, QuestionType.SINGLE_SELECT),
makeEntry(AnswerType.CHOICE, QuestionType.SINGLE_SELECT),
makeEntry(AnswerType.SMARTSELECT, QuestionType.SMART_SELECT),
makeEntry(AnswerType.MULTISELECT, QuestionType.MULTI_SELECT),
makeEntry(AnswerType.SMARTSINGLESELECT, QuestionType.SMART_SINGLE_SELECT));
}
private void populateQuestionToAnswerTypeMap() {
questionToAnswerType = asMap(makeEntry(QuestionType.INVALID, AnswerType.INVALID),
makeEntry(QuestionType.FREETEXT, AnswerType.FREETEXT),
makeEntry(QuestionType.DATE, AnswerType.DATE),
makeEntry(QuestionType.NUMERIC, AnswerType.NUMBER),
makeEntry(QuestionType.SINGLE_SELECT, AnswerType.SINGLESELECT),
makeEntry(QuestionType.SMART_SELECT, AnswerType.SMARTSELECT),
makeEntry(QuestionType.MULTI_SELECT, AnswerType.MULTISELECT),
makeEntry(QuestionType.SMART_SINGLE_SELECT, AnswerType.SMARTSINGLESELECT));
}
public SectionQuestion getSectionQuestionById (Integer sectionQuestionId){
return sectionQuestionDao.retrieveFromSectionQuestionId(sectionQuestionId).get(0);
}
public Section getSectionById (Integer sectionId){
return sectionDao.retrieveFromSectionId(sectionId).get(0);
}
public QuestionGroupLink mapToQuestionGroupLink(QuestionLinkDetail questionLinkDetail, SectionLinkDetail sectionLinkDetail){
QuestionGroupLink questionGroupLink = new QuestionGroupLink();
if(questionLinkDetail != null){
questionGroupLink.setValue(questionLinkDetail.getValue());
questionGroupLink.setAdditionalValue(questionLinkDetail.getAdditionalValue());
questionGroupLink.setSourceSectionQuestion(getSectionQuestionById(questionLinkDetail.getSourceQuestion().getId()));
questionGroupLink.setConditionTypeId(questionLinkDetail.getLinkType());
questionGroupLink.setId(questionLinkDetail.getQuestionGroupLinkId());
} else {
questionGroupLink.setValue(sectionLinkDetail.getValue());
questionGroupLink.setAdditionalValue(sectionLinkDetail.getAdditionalValue());
questionGroupLink.setSourceSectionQuestion(getSectionQuestionById(sectionLinkDetail.getSourceQuestion().getId()));
questionGroupLink.setConditionTypeId(sectionLinkDetail.getLinkType());
questionGroupLink.setId(sectionLinkDetail.getQuestionGroupLinkId());
}
return questionGroupLink;
}
public SectionQuestionLink mapToQuestionLink(QuestionLinkDetail questionLinkDetail, QuestionGroupLink questionGroupLink) {
SectionQuestionLink sectionQuestionLink = new SectionQuestionLink();
sectionQuestionLink.setQuestionGroupLink(questionGroupLink);
sectionQuestionLink.setAffectedSectionQuestion(getSectionQuestionById(questionLinkDetail.getAffectedQuestion().getId()));
sectionQuestionLink.setId(questionLinkDetail.getLinkId());
return sectionQuestionLink;
}
public SectionLink mapToSectionLink(SectionLinkDetail sectionLinkDetail, QuestionGroupLink questionGroupLink) {
SectionLink sectionLink = new SectionLink();
sectionLink.setAffectedSection(getSectionById(sectionLinkDetail.getAffectedSection().getId()));
sectionLink.setQuestionGroupLink(questionGroupLink);
sectionLink.setId(sectionLinkDetail.getLinkId());
return sectionLink;
}
public List<QuestionLinkDetail> mapToQuestionLinkDetails(List<SectionQuestionLink> sectionQuestionLinks) {
List<QuestionLinkDetail> questionLinkDetails = new ArrayList<QuestionLinkDetail>();
for(SectionQuestionLink sectionQuestionLink : sectionQuestionLinks){
QuestionLinkDetail questionLinkDetail = new QuestionLinkDetail();
questionLinkDetail.setValue(sectionQuestionLink.getQuestionGroupLink().getValue());
questionLinkDetail.setAdditionalValue(sectionQuestionLink.getQuestionGroupLink().getAdditionalValue());
questionLinkDetail.setLinkType(sectionQuestionLink.getQuestionGroupLink().getConditionTypeId());
questionLinkDetail.setProperLinkTypeDisplay(sectionQuestionLink.getQuestionGroupLink().getConditionType());
questionLinkDetail.setLinkId(sectionQuestionLink.getId());
questionLinkDetail.setQuestionGroupLinkId(sectionQuestionLink.getQuestionGroupLink().getId());
questionLinkDetail.setState(true);
SectionQuestion sectionQuestion = sectionQuestionLink.getQuestionGroupLink().getSourceSectionQuestion();
questionLinkDetail.setSourceQuestion(mapToSectionQuestionDetail(sectionQuestion,
sectionQuestion.isRequired(), sectionQuestion.isShowOnPage(),
(mapToQuestionDetail(sectionQuestion.getQuestion(), mapToQuestionType(sectionQuestion.getQuestion().getAnswerTypeAsEnum())))));
sectionQuestion = sectionQuestionLink.getAffectedSectionQuestion();
questionLinkDetail.setAffectedQuestion(mapToSectionQuestionDetail(sectionQuestion,
sectionQuestion.isRequired(), sectionQuestion.isShowOnPage(),
(mapToQuestionDetail(sectionQuestion.getQuestion(), mapToQuestionType(sectionQuestion.getQuestion().getAnswerTypeAsEnum())))));
questionLinkDetails.add(questionLinkDetail);
}
return questionLinkDetails;
}
public List<SectionLinkDetail> mapToSectionLinkDetails(List<SectionLink> sectionLinks) {
List<SectionLinkDetail> sectionLinkDetails = new ArrayList<SectionLinkDetail>();
for(SectionLink sectionLink : sectionLinks){
SectionLinkDetail sectionLinkDetail = new SectionLinkDetail();
sectionLinkDetail.setValue(sectionLink.getQuestionGroupLink().getValue());
sectionLinkDetail.setAdditionalValue(sectionLink.getQuestionGroupLink().getAdditionalValue());
sectionLinkDetail.setLinkType(sectionLink.getQuestionGroupLink().getConditionTypeId());
sectionLinkDetail.setProperLinkTypeDisplay(sectionLink.getQuestionGroupLink().getConditionType());
sectionLinkDetail.setLinkId(sectionLink.getId());
sectionLinkDetail.setQuestionGroupLinkId(sectionLink.getQuestionGroupLink().getId());
sectionLinkDetail.setState(true);
SectionQuestion sectionQuestion = sectionLink.getQuestionGroupLink().getSourceSectionQuestion();
sectionLinkDetail.setSourceQuestion(mapToSectionQuestionDetail(sectionQuestion,
sectionQuestion.isRequired(), sectionQuestion.isShowOnPage(),
(mapToQuestionDetail(sectionQuestion.getQuestion(), mapToQuestionType(sectionQuestion.getQuestion().getAnswerTypeAsEnum())))));
sectionLinkDetail.setAffectedSection(mapToSectionDetail(sectionLink.getAffectedSection()));
sectionLinkDetails.add(sectionLinkDetail);
}
return sectionLinkDetails;
}
}