package br.usp.ime.academicdevoir.controller;
import java.util.List;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;
import br.usp.ime.academicdevoir.dao.DisciplinaDao;
import br.usp.ime.academicdevoir.dao.QuestaoDeMultiplaEscolhaDao;
import br.usp.ime.academicdevoir.dao.TagDao;
import br.usp.ime.academicdevoir.entidade.Disciplina;
import br.usp.ime.academicdevoir.entidade.QuestaoDeMultiplaEscolha;
import br.usp.ime.academicdevoir.infra.Permission;
import br.usp.ime.academicdevoir.infra.Privilegio;
import br.usp.ime.academicdevoir.infra.TipoDeQuestao;
import br.usp.ime.academicdevoir.infra.UsuarioSession;
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
@Resource
/**
* Controlador de questões de múltipla escolha.
*/
public class QuestoesDeMultiplaEscolhaController {
/**
* @uml.property name="dao"
* @uml.associationEnd multiplicity="(1 1)"
*/
private QuestaoDeMultiplaEscolhaDao dao;
/**
* @uml.property name="result"
* @uml.associationEnd multiplicity="(1 1)"
*/
private final Result result;
/**
* @uml.property name="validator"
* @uml.associationEnd multiplicity="(1 1)"
*/
private Validator validator;
private TagDao tagDao;
private DisciplinaDao disciplinaDao;
/**
* @param result
* para interação com o jsp da questão.
* @param validator
* @param usuarioSession
* para controle de permissões
* @param disciplinaDao
* @param turmaDao
* para interação com o banco de dados
*/
public QuestoesDeMultiplaEscolhaController(QuestaoDeMultiplaEscolhaDao dao,
TagDao tagDao, Result result, Validator validator,
UsuarioSession usuarioSession, DisciplinaDao disciplinaDao) {
this.dao = dao;
this.tagDao = tagDao;
this.disciplinaDao = disciplinaDao;
this.result = result;
this.validator = validator;
}
@Post
@Path("/questoes/mult")
/**
* Verifica se a questão de múltipla escolha fornecida é válida e adiciona
* no banco de dados.
* @param questao
*/
public void cadastra(final QuestaoDeMultiplaEscolha questao,
List<Integer> resposta, String tags, int numeroDeAlternativas) {
validator.checking(new Validations() {{
that(questao.getDisciplina().getId() != null, "questao.id", "questao.id.notNull");
}});
validator.validate(questao);
validator.onErrorRedirectTo(QuestoesController.class).cadastro();
for (int i=0; i<numeroDeAlternativas; i++) {
questao.getAlternativas().get(i).setQuestao(questao);
}
for (int i=numeroDeAlternativas; i<10; i++) {
questao.getAlternativas().remove(numeroDeAlternativas);
}
questao.setTags(tags, tagDao);
Disciplina disciplina = disciplinaDao.carrega(questao.getDisciplina().getId());
disciplina.setTags(tags, tagDao);
questao.setResposta(resposta);
disciplinaDao.atualizaDisciplina(disciplina);
dao.salva(questao);
result.redirectTo(this).lista();
}
@Get
@Path("/questoes/mult/{id}")
/**
* Devolve uma questão de múltipla escolha com o id fornecido.
*
* @param id
*/
public void alteracao(Long id) {
QuestaoDeMultiplaEscolha questao = dao.carrega(id);
result.include("questao", questao);
result.include("tags", questao.getTagsEmString());
result.include("numeroDeAlternativas", questao.getAlternativas().size());
int[] respostas = new int[questao.getAlternativas().size()];
if (questao.getRespostaUnica()) {
int i, j;
for (i=0, j=1;i<questao.getAlternativas().size(); i++, j=j*2)
if (questao.getResposta() == j)
respostas[i] = 1;
else
respostas[i] = 0;
}
else {
int i, j;
String binario = Integer.toBinaryString(questao.getResposta());
for (i=0, j=1;i<questao.getAlternativas().size(); i++, j=j*2)
if (i < binario.length())
if (Integer.parseInt(binario.substring(i, i+1)) == 1)
respostas[i] = 1;
else
respostas[i] = 0;
else
respostas[i] = 0;
}
result.include("respostas", respostas);
}
@Put
@Path("/questoes/mult/{questao.id}")
/**
* Verifica se a questão de múltipla escolha fornecida é válida e atualiza no banco de dados.
*
* @param questao
*/
public void altera(QuestaoDeMultiplaEscolha questao,
List<Integer> resposta, String tags, int numeroDeAlternativas) {
questao.setTags(tags, tagDao);
questao.setResposta(resposta);
validator.validate(questao);
validator.onErrorUsePageOf(this).alteracao(questao.getId());
for (int i=0; i<numeroDeAlternativas; i++) {
questao.getAlternativas().get(i).setQuestao(questao);
}
for (int i=numeroDeAlternativas; i<10; i++) {
questao.getAlternativas().remove(numeroDeAlternativas);
}
dao.atualiza(questao);
result.redirectTo(this).lista();
}
@Delete
@Path("/questoes/mult/{id}")
/**
* Remove uma questão de múltipla escolha do banco de dados com o id fornecido.
*
* @param id
*/
public void remove(Long id) {
QuestaoDeMultiplaEscolha questao = dao.carrega(id);
dao.remove(questao);
result.redirectTo(this).lista();
}
@Get
@Path("/questoes/mult")
/**
* Devolve uma lista com todas as questões de múltipla escolha cadastradas
* no banco de dados.
*/
public void lista() {
result.include("tipoDaQuestao", TipoDeQuestao.MULTIPLAESCOLHA);
result.include("lista", dao.listaTudo());
}
public void copia(QuestaoDeMultiplaEscolha questao) {
dao.salva(questao);
result.redirectTo(this).alteracao(questao.getId());
}
}