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.usp.ime.academicdevoir.dao.QuestaoDeMultiplaEscolhaDao;
import br.usp.ime.academicdevoir.dao.TagDao;
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;
/**
* @param result
* para interação com o jsp da questão.
* @param validator
* @param usuarioSession
* para controle de permissões
* @param turmaDao
* para interação com o banco de dados
*/
public QuestoesDeMultiplaEscolhaController(QuestaoDeMultiplaEscolhaDao dao,
TagDao tagDao, Result result, Validator validator,
UsuarioSession usuarioSession) {
this.dao = dao;
this.tagDao = tagDao;
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) {
questao.setTags(tags, tagDao);
questao.setResposta(resposta);
validator.validate(questao);
validator.onErrorUsePageOf(QuestoesController.class).cadastro();
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());
}
@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) {
questao.setTags(tags, tagDao);
questao.setResposta(resposta);
validator.validate(questao);
validator.onErrorUsePageOf(this).alteracao(questao.getId());
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());
}
}