/*
* Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation)
*
* This file is part of Akvo FLOW.
*
* Akvo FLOW is free software: you can redistribute it and modify it under the terms of
* the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
* either version 3 of the License or any later version.
*
* Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License included below for more details.
*
* The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
*/
package com.gallatinsystems.survey.domain;
import com.gallatinsystems.framework.domain.BaseDomain;
import javax.jdo.annotations.NotPersistent;
import javax.jdo.annotations.PersistenceCapable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* Represents a Question on a survey. A question belongs to exactly 1 questionGroup.
*/
@PersistenceCapable
public class Question extends BaseDomain {
private static final long serialVersionUID = -9123426646238761996L;
public enum Type {
FREE_TEXT, OPTION, NUMBER, GEO, PHOTO, VIDEO, SCAN, TRACK, STRENGTH, DATE, CASCADE,
GEOSHAPE, SIGNATURE, CADDISFLY
};
private Type type = null;
private String tip = null;
private String text = null;
@NotPersistent
private Map<String, Translation> translationMap;
private Boolean dependentFlag = null;
private Boolean allowMultipleFlag = null;
private Boolean allowOtherFlag = null;
private Boolean collapseable = false;
private Boolean geoLocked = null;
private Boolean requireDoubleEntry = null;
private Boolean immutable = false;
private Long dependentQuestionId;
private String dependentQuestionAnswer;
private Long cascadeResourceId;
private String caddisflyResourceUuid;
private Long metricId;
@NotPersistent
private TreeMap<Integer, QuestionOption> questionOptionMap = null;
@NotPersistent
private TreeMap<Integer, QuestionHelpMedia> questionHelpMediaMap = null;
private Long questionGroupId;
private Long surveyId;
private String questionId;
private Integer order = null;
private Boolean mandatoryFlag = null;
private String path = null;
private Boolean allowDecimal;
private Boolean allowSign;
private Double minVal;
private Double maxVal;
private Boolean allowExternalSources;
private Boolean localeNameFlag;
private Boolean localeLocationFlag;
/**
* Geoshape question options
*/
private Boolean allowPoints;
private Boolean allowLine;
private Boolean allowPolygon;
private String referenceId;
@NotPersistent
private List<ScoringRule> scoringRules = null;
/*
* ID of the question from which this question was originally copied.
* cannot be mapped or is it sourceId?
*/
private Long sourceQuestionId;
/**
* Return true of a question can be visualised on a chart. This is limited to option questions
* that do not allow the possibility for multiple selection in the responses
*
* @return true if can be charted else false.
*/
public boolean canBeCharted() {
if (!Type.OPTION.equals(type)) {
return false;
}
return true;
}
public Boolean getAllowDecimal() {
return allowDecimal;
}
public void setAllowDecimal(Boolean allowDecimal) {
this.allowDecimal = allowDecimal;
}
public Boolean getAllowSign() {
return allowSign;
}
public void setAllowSign(Boolean allowSign) {
this.allowSign = allowSign;
}
public Double getMinVal() {
return minVal;
}
public void setMinVal(Double minVal) {
this.minVal = minVal;
}
public Double getMaxVal() {
return maxVal;
}
public void setMaxVal(Double maxVal) {
this.maxVal = maxVal;
}
public Long getSurveyId() {
return surveyId;
}
public void setSurveyId(Long surveyId) {
this.surveyId = surveyId;
}
public String getReferenceId() {
return referenceId;
}
public void setReferenceId(String referenceId) {
this.referenceId = referenceId;
}
public String getDependentQuestionAnswer() {
return dependentQuestionAnswer;
}
public void setDependentQuestionAnswer(String dependentQuestionAnswer) {
this.dependentQuestionAnswer = dependentQuestionAnswer;
}
public Long getDependentQuestionId() {
return dependentQuestionId;
}
public void setDependentQuestionId(Long dependentQuestionId) {
this.dependentQuestionId = dependentQuestionId;
}
public Long getMetricId() {
return metricId;
}
public void setMetricId(Long metricId) {
this.metricId = metricId;
}
public Long getQuestionGroupId() {
return questionGroupId;
}
public void setQuestionGroupId(Long questionGroupId) {
this.questionGroupId = questionGroupId;
}
public Map<String, Translation> getTranslationMap() {
return translationMap;
}
public void setTranslationMap(Map<String, Translation> translationMap) {
this.translationMap = translationMap;
}
public void setTranslationMap(HashMap<String, Translation> transMap) {
if (transMap != null) {
translationMap = new TreeMap<String, Translation>(transMap);
}
}
public void addQuestionOption(QuestionOption questionOption) {
if (getQuestionOptionMap() == null)
setQuestionOptionMap(new TreeMap<Integer, QuestionOption>());
getQuestionOptionMap().put(
questionOption.getOrder() != null ? questionOption.getOrder()
: getQuestionOptionMap().size() + 1, questionOption);
}
public void addHelpMedia(Integer order, QuestionHelpMedia questionHelpMedia) {
if (getQuestionHelpMediaMap() == null)
setQuestionHelpMediaMap(new TreeMap<Integer, QuestionHelpMedia>());
getQuestionHelpMediaMap().put(order, questionHelpMedia);
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public Boolean getDependentFlag() {
return dependentFlag;
}
public void setDependentFlag(Boolean dependentFlag) {
this.dependentFlag = dependentFlag;
}
public Boolean getAllowMultipleFlag() {
return allowMultipleFlag;
}
public void setAllowMultipleFlag(Boolean allowMultipleFlag) {
this.allowMultipleFlag = allowMultipleFlag;
}
public Boolean getAllowOtherFlag() {
return allowOtherFlag;
}
public void setAllowOtherFlag(Boolean allowOtherFlag) {
this.allowOtherFlag = allowOtherFlag;
}
public void setQuestionOptionMap(
TreeMap<Integer, QuestionOption> questionOptionMap) {
this.questionOptionMap = questionOptionMap;
}
public TreeMap<Integer, QuestionOption> getQuestionOptionMap() {
return questionOptionMap;
}
public void setQuestionHelpMediaMap(
TreeMap<Integer, QuestionHelpMedia> questionHelpMediaMap) {
this.questionHelpMediaMap = questionHelpMediaMap;
}
public TreeMap<Integer, QuestionHelpMedia> getQuestionHelpMediaMap() {
return questionHelpMediaMap;
}
public void setOrder(Integer order) {
this.order = order;
}
public Integer getOrder() {
return order;
}
public void setMandatoryFlag(Boolean mandatoryFlag) {
this.mandatoryFlag = mandatoryFlag;
}
public Boolean getMandatoryFlag() {
return mandatoryFlag;
}
public void setPath(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public void setTip(String tip) {
this.tip = tip;
}
/**
* use helpMedia instead
*
* @return
*/
@Deprecated
public String getTip() {
return tip;
}
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void addTranslation(Translation t) {
if (translationMap == null) {
translationMap = new TreeMap<String, Translation>();
}
translationMap.put(t.getLanguageCode(), t);
}
public List<ScoringRule> getScoringRules() {
return scoringRules;
}
public void addScoringRule(ScoringRule rule) {
if (scoringRules == null) {
scoringRules = new ArrayList<ScoringRule>();
}
scoringRules.add(rule);
}
public void setScoringRules(List<ScoringRule> scoringRules) {
this.scoringRules = scoringRules;
}
public void setCollapseable(Boolean collapseable) {
this.collapseable = collapseable;
}
public Boolean getCollapseable() {
return collapseable;
}
public void setImmutable(Boolean immutable) {
this.immutable = immutable;
}
public Boolean getImmutable() {
return immutable;
}
public Boolean getAllowExternalSources() {
return allowExternalSources;
}
public void setAllowExternalSources(Boolean allowExternalSources) {
this.allowExternalSources = allowExternalSources;
}
public Boolean getGeoLocked() {
return geoLocked;
}
public Boolean getLocaleNameFlag() {
return localeNameFlag;
}
public void setLocaleNameFlag(Boolean localeNameFlag) {
this.localeNameFlag = localeNameFlag;
}
public void setGeoLocked(Boolean geoLocked) {
this.geoLocked = geoLocked;
}
public Boolean getRequireDoubleEntry() {
return requireDoubleEntry;
}
public void setRequireDoubleEntry(Boolean requireDoubleEntry) {
this.requireDoubleEntry = requireDoubleEntry;
}
public Boolean getLocaleLocationFlag() {
return localeLocationFlag;
}
public void setLocaleLocationFlag(Boolean localeLocationFlag) {
this.localeLocationFlag = localeLocationFlag;
}
/**
* Compare question entities based on Key
*
* @param q
* @return true if the Key of the two entities is the same
*/
public boolean equals(Question q) {
return key != null && q.getKey() != null && key.equals(q.getKey());
}
public String getQuestionId() {
return questionId;
}
public void setQuestionId(String questionId) {
this.questionId = questionId;
}
public Long getCascadeResourceId() {
return cascadeResourceId;
}
public void setCascadeResourceId(Long cascadeResourceId) {
this.cascadeResourceId = cascadeResourceId;
}
public void setAllowPoints(Boolean allowPoints) {
this.allowPoints = allowPoints;
}
public Boolean getAllowPoints() {
return allowPoints;
}
public void setAllowLine(Boolean allowLine) {
this.allowLine = allowLine;
}
public Boolean getAllowLine() {
return allowLine;
}
public void setAllowPolygon(Boolean allowPolygon) {
this.allowPolygon = allowPolygon;
}
public Boolean getAllowPolygon() {
return allowPolygon;
}
public Long getSourceQuestionId() {
return sourceQuestionId;
}
public void setSourceQuestionId(Long originalQuestionId) {
this.sourceQuestionId = originalQuestionId;
}
public String getCaddisflyResourceUuid() {
return caddisflyResourceUuid;
}
public void setCaddisflyResourceUuid(String caddisflyResourceUuid) {
this.caddisflyResourceUuid = caddisflyResourceUuid;
}
}