package br.usp.ime.academicdevoir.controller;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import java.util.ArrayList;
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.componete.Lista;
import br.usp.ime.academicdevoir.dao.ListaDeExerciciosDao;
import br.usp.ime.academicdevoir.dao.ListaDeRespostasDao;
import br.usp.ime.academicdevoir.dao.ProfessorDao;
import br.usp.ime.academicdevoir.dao.QuestaoDao;
import br.usp.ime.academicdevoir.dao.TurmaDao;
import br.usp.ime.academicdevoir.entidade.Aluno;
import br.usp.ime.academicdevoir.entidade.AutoCorrecao;
import br.usp.ime.academicdevoir.entidade.EstadoDaListaDeRespostas;
import br.usp.ime.academicdevoir.entidade.ListaDeExercicios;
import br.usp.ime.academicdevoir.entidade.ListaDeRespostas;
import br.usp.ime.academicdevoir.entidade.ListaGerada;
import br.usp.ime.academicdevoir.entidade.Professor;
import br.usp.ime.academicdevoir.entidade.PropriedadesDaListaDeExercicios;
import br.usp.ime.academicdevoir.entidade.PropriedadesDaListaDeRespostas;
import br.usp.ime.academicdevoir.entidade.Questao;
import br.usp.ime.academicdevoir.entidade.QuestaoDaLista;
import br.usp.ime.academicdevoir.entidade.Resposta;
import br.usp.ime.academicdevoir.entidade.Turma;
import br.usp.ime.academicdevoir.entidade.Usuario;
import br.usp.ime.academicdevoir.infra.Constantes;
import br.usp.ime.academicdevoir.infra.Permission;
import br.usp.ime.academicdevoir.infra.Privilegio;
import br.usp.ime.academicdevoir.infra.UsuarioSession;
import br.usp.ime.academicdevoir.infra.VerificadorDePrazos;
@Resource
/**
* Controlador de listas de exercicios.
*/
public class ListasDeExerciciosController {
private final Result result;
private final ListaDeExerciciosDao dao;
private final ListaDeRespostasDao listaDeRespostasDao;
private final QuestaoDao questaoDao;
private final ProfessorDao professorDao;
private final TurmaDao turmaDao;
private final Validator validator;
private final UsuarioSession usuarioSession;
private final Lista lista;
public ListasDeExerciciosController(Result result,
ListaDeExerciciosDao dao, ListaDeRespostasDao listaDeRespostasDao,
QuestaoDao questaoDao, ProfessorDao professorDao,
TurmaDao turmaDao, Validator validator,
UsuarioSession usuarioSession, Lista lista) {
this.result = result;
this.dao = dao;
this.listaDeRespostasDao = listaDeRespostasDao;
this.questaoDao = questaoDao;
this.professorDao = professorDao;
this.turmaDao = turmaDao;
this.validator = validator;
this.usuarioSession = usuarioSession;
this.lista = lista;
}
@Post
@Path("/listasDeExercicios")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Verifica se a lista de exercícios fornecida é válida e adiciona no banco de dados.
*
* @param listaDeExercicios
* @param prazoDeEntrega
* @param idDasTurmas
*/
public void cadastra(final PropriedadesDaListaDeExercicios propriedades,
final List<Integer> prazoDeEntrega, final Long idDaTurma, String data1) {
String[] dias = data1.split("/");
prazoDeEntrega.add(0, Integer.parseInt(dias[0]));
prazoDeEntrega.add(1, Integer.parseInt(dias[1]));
prazoDeEntrega.add(2, Integer.parseInt(dias[2]));
if (propriedades.getGeracaoAutomatica() == null) {
propriedades.setGeracaoAutomatica(false);
}
validator.checking(new Validations() {
{
that(!propriedades.getNome().isEmpty(), "propriedade.nome",
"propriedade.nome.notEmpty");
that(idDaTurma, is(notNullValue()), "turma.id",
"turma.id.notNull");
}
});
propriedades.comPrazoDeEntrega(prazoDeEntrega);
validator.validate(propriedades);
validator.onErrorForwardTo(this).cadastro();
ListaDeExercicios listaDeExercicios = new ListaDeExercicios();
Turma turma = turmaDao.carrega(idDaTurma);
listaDeExercicios.setTurma(turma);
listaDeExercicios.setPropriedades(propriedades);
dao.salva(listaDeExercicios);
result.redirectTo(this).verLista(listaDeExercicios.getId());
}
@Get
@Path("/listasDeExercicios/{id}")
/**
* Devolve uma lista de exercícios com o id fornecido.
*
* @param id
* */
public void verLista(Long id) {
Usuario u = usuarioSession.getUsuario();
if (!(u.getPrivilegio() == Privilegio.ADMINISTRADOR || u
.getPrivilegio() == Privilegio.PROFESSOR)) {
result.redirectTo(LoginController.class).acessoNegado();
return;
}
ListaDeExercicios listaDeExercicios = dao.carrega(id);
Professor professor = professorDao.carrega(usuarioSession.getUsuario()
.getId());
result.include("listaDeExercicios", listaDeExercicios);
result.include("prazo", listaDeExercicios.getPropriedades()
.getPrazoDeEntregaFormatado());
result.include("turmasDoProfessor", professor.getTurmas());
result.include("numeroDeQuestoes", listaDeExercicios.getQuestoesDaLista()
.size());
}
@Get
@Path("/listasDeExercicios/resolver/{id}")
@Permission({ Privilegio.ALUNO, Privilegio.MONITOR })
/**
* Devolve uma lista de exercícios com o id fornecido.
*
* @param id
* */
public void resolverLista(Long id) {
ListaDeExercicios listaDeExercicios = dao.carrega(id);
Aluno aluno = (Aluno) usuarioSession.getUsuario();
ListaGerada listaGerada = null;
if(listaDeExercicios.getPropriedades().getGeracaoAutomatica()){
listaGerada = lista.gerar(listaDeExercicios, aluno);
}
ListaDeRespostas listaDeRespostas = listaDeRespostasDao
.getRespostasDoAluno(id, aluno);
if (listaDeRespostas == null) {
PropriedadesDaListaDeRespostas propriedades = new PropriedadesDaListaDeRespostas();
propriedades.setEstado(EstadoDaListaDeRespostas.SALVA);
propriedades.setNumeroDeEnvios(0);
listaDeRespostas = new ListaDeRespostas();
listaDeRespostas.setPropriedades(propriedades);
listaDeRespostas.setListaDeExercicios(listaDeExercicios);
listaDeRespostas.setAluno(aluno);
listaDeRespostas.setPropriedades(propriedades);
if (!VerificadorDePrazos.estaNoPrazo(listaDeExercicios
.getPropriedades().getPrazoDeEntrega())) {
listaDeRespostas.getPropriedades().setEstado(
EstadoDaListaDeRespostas.FINALIZADA);
listaDeRespostas.setRespostas(new ArrayList<Resposta>());
listaDeRespostasDao.salva(listaDeRespostas);
result.redirectTo(this).autoCorrecaoRespostas(
listaDeRespostas.getId());
return;
}
}
else if (listaDeRespostas.getRespostas() != null
&& listaDeRespostas.getRespostas().size() > 0) {
result.redirectTo(this).alterarRespostas(listaDeRespostas);
return;
}
listaDeRespostas.setRespostas(new ArrayList<Resposta>());
listaDeRespostasDao.salva(listaDeRespostas);
if (listaDeExercicios.getPropriedades() != null)
result.include("prazo", listaDeExercicios.getPropriedades()
.getPrazoDeEntregaFormatado());
if(listaDeExercicios.getPropriedades().getGeracaoAutomatica())
result.include("questoes", listaGerada.getQuestoes());
else
result.include("questoes", listaDeExercicios.getQuestoesDaLista());
if (listaDeExercicios.getQuestoesDaLista() != null)
result.include("numeroDeQuestoes", listaDeExercicios.getQuestoesDaLista()
.size());
result.include("listaDeRespostas", listaDeRespostas);
}
@Get
@Path("/respostas/alterar/{listaDeRespostas.id}")
@Permission({ Privilegio.ALUNO, Privilegio.MONITOR })
public void alterarRespostas(ListaDeRespostas listaDeRespostas) {
listaDeRespostas = listaDeRespostasDao
.carrega(listaDeRespostas.getId());
Aluno aluno = (Aluno) usuarioSession.getUsuario();
List<Questao> questoes;
ListaGerada listaGerada;
ListaDeExercicios listaDeExercicios = listaDeRespostas
.getListaDeExercicios();
if (listaDeRespostas.getPropriedades().getEstado() == EstadoDaListaDeRespostas.SALVA
&& !VerificadorDePrazos.estaNoPrazo(listaDeRespostas
.getListaDeExercicios().getPropriedades()
.getPrazoDeEntrega())) {
listaDeRespostas.getPropriedades().setEstado(
EstadoDaListaDeRespostas.FINALIZADA);
listaDeRespostasDao.atualiza(listaDeRespostas);
result.redirectTo(ListasDeExerciciosController.class)
.autoCorrecaoRespostas(listaDeRespostas.getId());
return;
}
if (listaDeRespostas.getPropriedades().getEstado() == EstadoDaListaDeRespostas.CORRIGIDA
|| listaDeRespostas.getPropriedades().getEstado() == EstadoDaListaDeRespostas.FINALIZADA) {
result.redirectTo(ListasDeExerciciosController.class).verCorrecao(
listaDeRespostas);
return;
}
List<String> renders = new ArrayList<String>();
if(listaDeExercicios.getPropriedades().getGeracaoAutomatica()){
listaGerada = lista.gerar(listaDeExercicios, aluno);
questoes = listaGerada.getQuestoes();
}
else{
questoes = listaDeExercicios.getQuestoes();
}
List<Resposta> respostas = listaDeRespostas.getRespostas();
boolean achouResposta;
for (Questao questao : questoes) {
achouResposta = false;
for (Resposta resposta : respostas) {
if (resposta.getQuestao().getId() == questao.getId()) {
renders.add(resposta.getQuestao().getRenderAlteracao(
resposta));
respostas.remove(resposta);
achouResposta = true;
break;
}
}
if (achouResposta)
continue;
renders.add(questao.getRenderizacao());
}
result.include("renderizacao", renders);
result.include("listaDeRespostas", listaDeRespostas);
result.include("questoes", questoes);
result.include("listaDeExercicios", listaDeExercicios);
result.include("numeroDeQuestoes", questoes.size());
result.include("VerificadorDePrazos", VerificadorDePrazos.class);
}
@Get
@Path("/respostas/verCorrecao/{listaDeRespostas.id}")
public void verCorrecao(ListaDeRespostas listaDeRespostas) {
listaDeRespostas = listaDeRespostasDao
.carrega(listaDeRespostas.getId());
ListaDeExercicios listaDeExercicios = listaDeRespostas
.getListaDeExercicios();
List<String> renders = new ArrayList<String>();
List<QuestaoDaLista> questoes = listaDeExercicios.getQuestoesDaLista();
List<Resposta> respostas = listaDeRespostas.getRespostas();
boolean achouResposta;
for (QuestaoDaLista questaoDaLista : questoes) {
achouResposta = false;
for (Resposta resposta : respostas) {
if (resposta.getQuestao().getId() == questaoDaLista
.getQuestao().getId()) {
renders.add(renderCorrecao(resposta));
respostas.remove(resposta);
achouResposta = true;
break;
}
}
if (achouResposta)
continue;
renders.add(questaoDaLista.getQuestao().getRenderCorrecao(
new Resposta()));
}
result.include("renderizacao", renders);
result.include("listaDeRespostas", listaDeRespostas);
result.include("listaDeExercicios", listaDeExercicios);
result.include("numeroDeQuestoes", questoes.size());
}
public String renderCorrecao(Resposta resposta) {
if (resposta == null)
resposta = new Resposta();
String htmlResult = "";
StringBuffer buffer = new StringBuffer();
buffer.append("<p>");
if (resposta.getValor() != null)
buffer.append("Resposta: " + resposta.getValor());
buffer.append("</p>");
buffer.append("<p> Comentários:<br/> ");
if (resposta.getQuestao().getComentario() != null) {
buffer.append(resposta.getQuestao().getComentario());
}
buffer.append("</p>");
buffer.append("<p> Nota: ");
if (resposta.getNota() != null)
buffer.append(resposta.getNota());
buffer.append("</p>");
htmlResult = buffer.toString();
return htmlResult;
}
@Get
@Path("/listasDeExercicios/altera/{id}")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Retorna uma lista de exercícios com o id fornecido.
*
* @param id
* @return ListaDeExercicios
* */
public void alteracao(Long id) {
ListaDeExercicios listaDeExercicios = dao.carrega(id);
result.include("listaDeExercicios", listaDeExercicios);
result.include("prazo", listaDeExercicios.getPropriedades()
.getPrazoPrazoDeEntregaEmLista());
}
@Put
@Path("/listasDeExercicios/{listaDeExercicios.id}")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Verifica se a lista de exercícios fornecida é válida e atualiza no banco de dados.
*
* @param listaDeExercicios
* @param prazoDeEntrega
*/
public void altera(ListaDeExercicios listaDeExercicios,
PropriedadesDaListaDeExercicios propriedades,
List<Integer> prazoDeEntrega) {
ListaDeExercicios listaDoBD = dao.carrega(listaDeExercicios.getId());
propriedades.setPrazoDeEntrega(prazoDeEntrega);
listaDoBD.setPropriedades(propriedades);
validator.validate(listaDeExercicios);
validator.onErrorUsePageOf(ListasDeExerciciosController.class)
.alteracao(listaDeExercicios.getId());
dao.atualiza(listaDoBD);
result.redirectTo(this).verLista(listaDoBD.getId());
}
@Delete
@Path("/listasDeExercicios/{id}")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Remove uma lista de exercícios do banco de dados com o id fornecido.
*
* @param id
*/
public void remove(Long id) {
ListaDeExercicios lista = dao.carrega(id);
dao.remove(lista);
result.redirectTo(this).lista();
}
@Put
@Path("/listasDeExercicios/{listaDeExercicios.id}/questoes/inclui")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Inclui a questão com o id fornecido na lista de exercícios.
*
* @param listaDeExercicios
* @param idDaQuestao
*/
public void incluiQuestao(ListaDeExercicios listaDeExercicios,
Long idDaQuestao, Integer pesoDaQuestao) {
QuestaoDaLista novaQuestao = new QuestaoDaLista();
novaQuestao.setPeso(pesoDaQuestao);
Questao questao = (Questao) questaoDao.carrega(idDaQuestao);
novaQuestao.setQuestao(questao);
dao.recarrega(listaDeExercicios);
List<QuestaoDaLista> questoes = listaDeExercicios.getQuestoesDaLista();
novaQuestao.setOrdem(questoes.size());
questoes.add(novaQuestao);
listaDeExercicios.setQuestoes(questoes);
dao.atualiza(listaDeExercicios);
result.redirectTo(this).verLista(listaDeExercicios.getId());
}
// @Put
// @Path("/listasDeExercicios/{id}/questoes/{indice}")
// @Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
// /**
// * Altera a questão com o indice fornecido (na lista de exercícios com o
// id fornecido)
// * para a questão com id fornecido.
// *
// * @param id
// * @param indice
// * @param idDaNovaQuestao
// * @param ordemDaQuestao
// */
// public void trocaQuestao(Long id, Integer indice, Long idDaNovaQuestao,
// Integer ordemDaQuestao) {
//
// ListaDeExercicios listaDeExercicios = dao.carrega(id);
// List<QuestaoDaLista> questoesDaLista = listaDeExercicios.getQuestoes();
// QuestaoDaLista questaoDaLista = listaDeExercicios.getQuestoes().get(
// indice.intValue());
// Questao questao = (Questao) questaoDao.carrega(idDaNovaQuestao);
//
// questaoDaLista.setQuestao(questao);
// questaoDaLista.setOrdem(ordemDaQuestao);
// questoesDaLista.set(indice.intValue(), questaoDaLista);
// listaDeExercicios.setQuestoes(questoesDaLista);
//
// dao.atualiza(listaDeExercicios);
// result.redirectTo(this).verLista(listaDeExercicios.getId());
// }
@Delete
@Path("/listasDeExercicios/{id}/questoes/{indice}")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Remove a questão com o indice fornecido na lista de exercícios com o id fornecido.
*
* @param id
* @param indice
*/
public void removeQuestao(Long id, Integer indice) {
ListaDeExercicios listaDeExercicios = dao.carrega(id);
List<QuestaoDaLista> questoes = listaDeExercicios.getQuestoesDaLista();
questoes.remove(indice.intValue());
listaDeExercicios.setQuestoes(questoes);
dao.atualiza(listaDeExercicios);
result.redirectTo(this).verLista(listaDeExercicios.getId());
}
@Get
@Path("/listasDeExercicios/cadastro")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Permite acesso à página com formulário para cadastro de uma nova lista de exercícios.
*/
public void cadastro() {
Professor professor = professorDao.carrega(usuarioSession.getUsuario()
.getId());
result.include("turmasDoProfessor", professor.getTurmas());
}
@Get
@Path("/listasDeExercicios")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Devolve uma lista com todas as listas de exercícios cadastradas no banco de dados.
*/
public void lista() {
result.include("listaDeListas", dao.listaTudo());
}
@Get
@Path("/listasDeExercicios/listasTurma/{idTurma}")
/**
* Devolve uma lista com todas as listas de exercícios de uma determinada turma.
*/
public void listasTurma(Long idTurma) {
Turma turma = turmaDao.carrega(idTurma);
result.include("listaDeListas", dao.listasDeTurma(turma));
}
@Get
@Path("/respostas/autocorrecao/{id}")
/**
* Corrige todas as respostas da lista de exercícios com o id fornecido.
*
* @param id
* */
public void autoCorrecaoRespostas(Long id) {
// Carrega a lista de exercícios com esse id
ListaDeRespostas listaDeRespostas = listaDeRespostasDao.carrega(id);
AutoCorrecao autoCorrecao = listaDeRespostas.getListaDeExercicios()
.getPropriedades().getAutoCorrecao();
if (listaDeRespostas.getPropriedades().getEstado() == EstadoDaListaDeRespostas.SALVA
&& !VerificadorDePrazos.estaNoPrazo(listaDeRespostas
.getListaDeExercicios().getPropriedades()
.getPrazoDeEntrega())) {
listaDeRespostas.getPropriedades().setEstado(
EstadoDaListaDeRespostas.FINALIZADA);
listaDeRespostasDao.atualiza(listaDeRespostas);
}
// Não corrige se autocorreção estiver desativada para esse lista
if (autoCorrecao == AutoCorrecao.ATIVADA) {
listaDeRespostas.autocorrecao();
listaDeRespostasDao.atualiza(listaDeRespostas);
// Redireciona para o menu de listas
result.redirectTo(this).verCorrecao(listaDeRespostas);
}
else
result.redirectTo(this).listasTurma(
listaDeRespostas.getListaDeExercicios().getTurma().getId());
}
@Get
@Path("/listasDeExercicios/autocorrecao/{id}")
/**
* Corrige todas as respostas da lista de exercícios com o id fornecido.
*
* @param id
* */
public void autoCorrecaoLista(Long id) {
// Carrega a lista de exercícios com esse id
ListaDeExercicios listaDeExercicios = dao.carrega(id);
// Carrega as propriedades da lista de exercícios
PropriedadesDaListaDeExercicios propriedades = listaDeExercicios
.getPropriedades();
// Não corrige se autocorreção estiver desativada para esse lista
if (propriedades.getAutoCorrecao() == AutoCorrecao.DESATIVADA) {
result.redirectTo(this).lista();
return;
}
// Pegando todas as listas de respostas. Cada elemento corresponde a
// Lista de um aluno
List<ListaDeRespostas> listasDeRespostas = listaDeRespostasDao
.listaRespostasDaLista(listaDeExercicios);
// Para cada Lista de Resposta (Aluno)
for (ListaDeRespostas listaDeRespostas : listasDeRespostas) {
listaDeRespostas.autocorrecao();
listaDeRespostas.getPropriedades().setEstado(
EstadoDaListaDeRespostas.CORRIGIDA);
listaDeRespostasDao.atualiza(listaDeRespostas);
}
// Redireciona para o menu de listas
result.redirectTo(this).lista();
}
@Get
@Path("/listasDeExercicios/{id}/inclusaoQuestoes")
@Permission({ Privilegio.ADMINISTRADOR, Privilegio.PROFESSOR })
/**
* Devolve a lista de questões que poderão ser inseridas na lista com o id fornecido.
*
* @param id
* */
public void inclusaoQuestoes(Long id, Integer proxPagina, String filtro) {
List<Questao> listaDeQuestoesPaginadas;
Integer primeiroReg, ultimaPagina;
Usuario u = usuarioSession.getUsuario();
if (!(u.getPrivilegio() == Privilegio.ADMINISTRADOR || u
.getPrivilegio() == Privilegio.PROFESSOR)) {
result.redirectTo(LoginController.class).acessoNegado();
return;
}
primeiroReg = (proxPagina - 1) * Constantes.NUM_REGISTROS_PAGINA;
listaDeQuestoesPaginadas = questaoDao.listaPaginada(primeiroReg,
Constantes.NUM_REGISTROS_PAGINA, filtro, id);
ultimaPagina = questaoDao.tamanhoDaLista(filtro, id)
/ Constantes.NUM_REGISTROS_PAGINA;
if (listaDeQuestoesPaginadas.size() % Constantes.NUM_REGISTROS_PAGINA != 0)
ultimaPagina++;
result.include("idDaListaDeExercicios", id);
result.include("listaDeQuestoes", listaDeQuestoesPaginadas);
result.include("pagina", proxPagina);
result.include("ultimaPagina", ultimaPagina);
result.include("filtroAtual", filtro);
}
@Get
@Path("/listasDeExercicios/trocaOrdem/{id}")
public void trocaOrdem(Long id, List<Integer> novaOrdem) {
ListaDeExercicios lista = dao.carrega(id);
List<QuestaoDaLista> questoes = lista.getQuestoesDaLista();
Integer ordem;
QuestaoDaLista questao;
for (int i = 0; i < questoes.size(); i++) {
ordem = novaOrdem.get(i);
questao = questoes.get(i);
questao.setOrdem(ordem);
questoes.set(i, questao);
}
lista.setQuestoes(questoes);
dao.atualiza(lista);
result.redirectTo(ListasDeExerciciosController.class).verLista(id);
}
}