package br.usp.ime.academicdevoir.entidade;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.validation.constraints.NotNull;
import br.usp.ime.academicdevoir.dao.TagDao;
import br.usp.ime.academicdevoir.infra.TipoDeQuestao;
@Entity
public class QuestaoDeMultiplaEscolha extends Questao {
private Boolean respostaUnica = false;
/**
* @uml.property name="alternativas"
* @uml.associationEnd multiplicity="(0 -1)" elementType="java.lang.String"
*/
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "alternativasDasQuestoes")
private List<String> alternativas;
/**
* @uml.property name="resposta"
*/
@NotNull
private Integer resposta;
public Boolean getRespostaUnica() {
return respostaUnica;
}
public void setRespostaUnica(Boolean respostaUnica) {
this.respostaUnica = respostaUnica;
}
public List<String> getAlternativas() {
return alternativas;
}
public void setAlternativas(List<String> alternativas) {
this.alternativas = alternativas;
}
/**
* @return
* @uml.property name="resposta"
*/
public Integer getResposta() {
return resposta;
}
/**
* @param resposta
* @uml.property name="resposta"
*/
public void setResposta(Integer resposta) {
this.resposta = resposta;
}
public void setResposta(List<Integer> resposta) {
this.resposta = 0;
if (resposta == null) return;
for (Integer valor : resposta) {
this.resposta += valor;
}
}
public TipoDeQuestao getTipo() {
return TipoDeQuestao.MULTIPLAESCOLHA;
}
public String getRenderizacao() {
String htmlResult = "";
StringBuffer buffer = new StringBuffer();
buffer.append("<table>");
for (int i = 0, valorResposta = 1; i < alternativas.size(); i++, valorResposta *= 2) {
buffer.append("<tr><td><input type=\"radio\" name=\"resposta.valor\" value=\"");
buffer.append(valorResposta);
buffer.append("\" /></td><td>");
buffer.append(alternativas.get(i));
buffer.append("</td></tr>");
}
buffer.append("<input type=\"hidden\" name=\"idDaQuestao\" value=\"");
buffer.append(this.getId());
buffer.append("\" />");
buffer.append("</table>");
htmlResult = buffer.toString();
return htmlResult;
}
public String getRenderAlteracao(Resposta resposta) {
if (resposta == null || resposta.getValor() == null || resposta.getValor().isEmpty()) return getRenderizacao();
String htmlResult = "";
StringBuffer buffer = new StringBuffer();
buffer.append("<table>");
for (int i = 0, valorResposta = 1; i < alternativas.size(); i++, valorResposta *= 2) {
buffer.append("<tr><td><input type=\"radio\"");
if (Integer.parseInt(resposta.getValor()) == valorResposta)
buffer.append(" checked=\"checked\"");
buffer.append(" name=\"resposta.valor\" value=\"");
buffer.append(valorResposta);
buffer.append("\" /></td><td>");
buffer.append(alternativas.get(i));
buffer.append("</td></tr>");
}
buffer.append("<input type=\"hidden\" name=\"idDaQuestao\" value=\"");
buffer.append(this.getId());
buffer.append("\" />");
buffer.append("</table>");
htmlResult = buffer.toString();
return htmlResult;
}
public String getRenderCorrecao (Resposta resposta) {
int i, valorResposta;
if (resposta == null)
resposta = new Resposta();
String htmlResult = "";
StringBuffer buffer = new StringBuffer();
buffer.append("<p>");
if (resposta.getValor() != null) {
for (i = 0, valorResposta = 1; i < alternativas.size(); i++,
valorResposta *= 2)
if (Integer.parseInt(resposta.getValor()) == valorResposta)
break;
if (i < alternativas.size())
buffer.append(alternativas.get(i));
}
buffer.append("</p>");
buffer.append("<p> Comentários: ");
if (resposta.getComentario() != null)
buffer.append(resposta.getComentario());
buffer.append("</p>");
buffer.append("<p> Nota: ");
if (resposta.getNota() != null)
buffer.append(resposta.getNota());
buffer.append("</p>");
htmlResult = buffer.toString();
return htmlResult;
}
public String getAlternativasCorretas() {
int valor, resposta = this.resposta;
Boolean primeira = true;
StringBuffer alternativas = new StringBuffer();
for (int i = 1; resposta != 0; resposta /= 2, i++) {
valor = resposta % 2;
if (valor == 1) {
if (!primeira) {
if (resposta == 1) alternativas.append(" e ");
else alternativas.append(", ");
}
primeira = false;
alternativas.append(i);
}
}
return alternativas.toString();
}
public Boolean respostaDoAlunoEhCorreta(Resposta respostaAluno) {
return respostaAluno.getValor().equals(this.resposta.toString());
}
public QuestaoDeMultiplaEscolha copia(TagDao dao) {
QuestaoDeMultiplaEscolha questao = new QuestaoDeMultiplaEscolha();
questao.enunciado = this.enunciado;
questao.respostaUnica = this.respostaUnica;
questao.resposta = this.resposta;
questao.alternativas = new ArrayList<String>();
for (String alternativa : this.alternativas) {
questao.alternativas.add(alternativa);
}
questao.setTags(this.getTagsEmString(), dao);
return questao;
}
}