package br.usp.ime.academicdevoir.controller;
import static br.com.caelum.vraptor.view.Results.json;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import br.usp.ime.academicdevoir.dao.ListaDeExerciciosDao;
import br.usp.ime.academicdevoir.dao.ListaDeRespostasDao;
import br.usp.ime.academicdevoir.dao.QuestaoDao;
import br.usp.ime.academicdevoir.dao.TagDao;
import br.usp.ime.academicdevoir.entidade.ListaDeExercicios;
import br.usp.ime.academicdevoir.entidade.ListaDeRespostas;
import br.usp.ime.academicdevoir.entidade.PropriedadesDaListaDeExercicios;
import br.usp.ime.academicdevoir.entidade.Questao;
import br.usp.ime.academicdevoir.entidade.QuestaoDaLista;
import br.usp.ime.academicdevoir.entidade.QuestaoDeCodigo;
import br.usp.ime.academicdevoir.entidade.QuestaoDeMultiplaEscolha;
import br.usp.ime.academicdevoir.entidade.QuestaoDeSubmissaoDeArquivo;
import br.usp.ime.academicdevoir.entidade.QuestaoDeTexto;
import br.usp.ime.academicdevoir.entidade.QuestaoDeVouF;
import br.usp.ime.academicdevoir.entidade.Resposta;
import br.usp.ime.academicdevoir.infra.Permission;
import br.usp.ime.academicdevoir.infra.Privilegio;
import br.usp.ime.academicdevoir.infra.UsuarioSession;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
@Resource
/**
* Controlador de questões.
*/
public class QuestoesController {
/**
* @uml.property name="dao"
* @uml.associationEnd multiplicity="(1 1)"
*/
private final QuestaoDao dao;
/**
* @uml.property name="result"
* @uml.associationEnd multiplicity="(1 1)"
*/
private final Result result;
private TagDao tagDao;
private ListaDeExerciciosDao listaDeExerciciosDao;
private ListaDeRespostasDao listaDeRespostasDao;;
/**
* @param turmaDao
* para interação com o banco de dados
* @param result
* para interação com o jsp da questao.
* @param usuarioSession
* para controle de permissões
*/
public QuestoesController(QuestaoDao dao, TagDao tagDao, ListaDeExerciciosDao listaDeExerciciosDao, ListaDeRespostasDao listaDeRespostasDao, Result result,
UsuarioSession usuarioSession) {
this.dao = dao;
this.tagDao = tagDao;
this.listaDeExerciciosDao = listaDeExerciciosDao;
this.listaDeRespostasDao = listaDeRespostasDao;
this.result = result;
}
@Get
@Path("/questoes/{id}")
/**
* Devolve uma questão de múltipla escolha com o id fornecido.
* @param id
* */
public void alteracao(Long id) {
switch (dao.carrega(id).getTipo()) {
case CODIGO:
result.redirectTo(QuestoesDeCodigoController.class).alteracao(id);
break;
case MULTIPLAESCOLHA:
result.redirectTo(QuestoesDeMultiplaEscolhaController.class)
.alteracao(id);
break;
case SUBMISSAODEARQUIVO:
result.redirectTo(QuestoesDeSubmissaoDeArquivoController.class)
.alteracao(id);
break;
case TEXTO:
result.redirectTo(QuestoesDeTextoController.class).alteracao(id);
break;
case VOUF:
result.redirectTo(QuestoesDeVouFController.class).alteracao(id);
break;
default:
result.redirectTo(this).lista();
break;
}
}
@Delete
@Path("/questoes/{id}")
@Permission(Privilegio.ADMINISTRADOR)
/**
* Remove uma questão do banco de dados com o id fornecido.
* @param id
*/
public void remove(Long id) {
List<BigInteger> idsDasListas = listaDeExerciciosDao.buscaListasQueContemQuestao(id);
ListaDeExercicios lista;
List<QuestaoDaLista> questoes;
List<ListaDeRespostas> listaDeListaDeRespostas;
List<Resposta> respostas;
// Remove a questão na lista de exercícios e nas listas de respostas
for (BigInteger idDaLista : idsDasListas) {
lista = listaDeExerciciosDao.carrega(idDaLista.longValue());
questoes = lista.getQuestoes();
for (QuestaoDaLista questao : questoes) {
if (questao.getQuestao().getId() == id) {
questoes.remove(questao);
break;
}
}
lista.setQuestoes(questoes);
listaDeExerciciosDao.atualiza(lista);
listaDeListaDeRespostas = lista.getRespostas();
for (ListaDeRespostas listaDeRespostas : listaDeListaDeRespostas) {
respostas = listaDeRespostas.getRespostas();
for(Resposta resposta : respostas) {
if (resposta.getQuestao().getId() == id) {
respostas.remove(resposta);
break;
}
}
listaDeRespostas.setRespostas(respostas);
listaDeRespostasDao.atualiza(listaDeRespostas);
}
}
Questao questao = dao.carrega(id);
dao.remove(questao);
result.redirectTo(this).lista();
}
@Get
@Path("/questoes/cadastro")
/**
* Permite acesso à página com formulário para cadastro de uma nova questão.
*/
public void cadastro() {
}
@Get
@Path("/questoes")
/**
* Devolve uma lista com todas as questões cadastradas no banco de dados.
*/
public void lista() {
result.include("lista", dao.listaTudo());
}
@Get
@Path("/questoes/tags/autocompletar.json")
public void autoCompletar(String term) {
result.use(json()).withoutRoot().from(tagDao.autoCompletar(term))
.serialize();
}
@Get
@Path("/questoes/buscaListas/{idDaQuestao}")
public void buscaListas(Long idDaQuestao) {
List<BigInteger> idsDasListas = listaDeExerciciosDao
.buscaListasQueContemQuestao(idDaQuestao);
List<PropriedadesDaListaDeExercicios> listas = new ArrayList<PropriedadesDaListaDeExercicios>();
PropriedadesDaListaDeExercicios propriedades;
ListaDeExercicios lista;
for (BigInteger id : idsDasListas) {
lista = listaDeExerciciosDao.carrega(id.longValue());
propriedades = lista.getPropriedades();
propriedades.setNome( new String( lista.getTurma().getNome() + " - " + propriedades.getNome()) );
listas.add(propriedades);
}
result.use(json())
.withoutRoot()
.from(listas)
.exclude("enunciado", "peso", "prazoDeEntrega", "autoCorrecao",
"visivel", "numeroMaximoDeEnvios").serialize();
}
@Get
@Path("/questoes/copia/{id}")
public void copia(Long id) {
Questao questao = dao.carrega(id).copia(tagDao);
switch (questao.getTipo()) {
case CODIGO:
result.redirectTo(QuestoesDeCodigoController.class).copia(
(QuestaoDeCodigo) questao);
break;
case MULTIPLAESCOLHA:
result.redirectTo(QuestoesDeMultiplaEscolhaController.class)
.copia((QuestaoDeMultiplaEscolha) questao);
break;
case SUBMISSAODEARQUIVO:
result.redirectTo(QuestoesDeSubmissaoDeArquivoController.class)
.copia((QuestaoDeSubmissaoDeArquivo) questao);
break;
case TEXTO:
result.redirectTo(QuestoesDeTextoController.class).copia(
(QuestaoDeTexto) questao);
break;
case VOUF:
result.redirectTo(QuestoesDeVouFController.class).copia(
(QuestaoDeVouF) questao);
break;
default:
result.redirectTo(this).lista();
break;
}
}
}