package br.usp.ime.academicdevoir.entidade; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.SecondaryTable; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; @Entity @SecondaryTable(name = "propriedadesDaListaDeRespostas") public class ListaDeRespostas { @Id @GeneratedValue private Long id; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "id_aluno") @Fetch(FetchMode.JOIN) @Cascade(CascadeType.SAVE_UPDATE) private Aluno aluno; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "id_lista") @Fetch(FetchMode.JOIN) @Cascade(CascadeType.SAVE_UPDATE) private ListaDeExercicios listaDeExercicios; @ElementCollection @CollectionTable(name = "respostasDaLista") private List<Resposta> respostas; @Column(columnDefinition="Decimal(10,2)") private Double notaFinal; @Embedded private PropriedadesDaListaDeRespostas propriedades; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Aluno getAluno() { return aluno; } public void setAluno(Aluno aluno) { this.aluno = aluno; } public ListaDeExercicios getListaDeExercicios() { return listaDeExercicios; } public void setListaDeExercicios(ListaDeExercicios lista) { this.listaDeExercicios = lista; } public List<Resposta> getRespostas() { return respostas; } public void setRespostas(List<Resposta> respostas) { this.respostas = respostas; } public PropriedadesDaListaDeRespostas getPropriedades() { return propriedades; } public void setPropriedades(PropriedadesDaListaDeRespostas propriedades) { this.propriedades = propriedades; } public Double getNotaFinal() { return notaFinal; } public void setNotaFinal(List<Integer> pesos) { Iterator<Resposta> iRespostas = respostas.iterator(); Iterator<Integer> iPesos = pesos.iterator(); Double nota; Double notaFinal = new Double(0.0); Integer peso; Integer somaDosPesos = new Integer(0); while (iRespostas.hasNext()) { nota = iRespostas.next().getNota(); peso = iPesos.next(); if (nota != null && peso != null) { notaFinal += nota*peso; somaDosPesos += peso; } } notaFinal /= somaDosPesos; this.notaFinal =notaFinal; } public int adiciona(Resposta novaResposta) { Long id = novaResposta.getQuestao().getId(); int i = -1; for (Resposta resposta : respostas) { if (resposta.getQuestao().getId() == id) { i = respostas.indexOf(resposta); break; } } // FIXME if (i < 0) { if (novaResposta.getValor() != null && !novaResposta.getValor().isEmpty()) respostas.add(novaResposta); } else respostas.set(i, novaResposta); return i; } public void autocorrecao() { //List para os pesos das questões usados na nota final List<Integer> pesosDasQuestoes = new ArrayList<Integer>(); QuestaoDaLista questaoDaLista = null; //Para cada resposta dessa lista for (Resposta resposta : respostas) { //Pegando a questao a qual a resposta se refere Questao questao = resposta.getQuestao(); //Obtendo a Questao relacionada com a lista para obter as propriedades //QuestaoDaLista questaoDaLista = questaoDaListaDao.getQuestaoDaListaPorIds(id, questao.getId()); for (QuestaoDaLista i : listaDeExercicios.getQuestoesDaLista()) if (i.getQuestao().equals(questao)) { questaoDaLista = i; break; } //Montando o vetor de pesos para o cálculo da nota final pesosDasQuestoes.add(questaoDaLista.getPeso()); //Resultado da Comparação da Resposta (Correção): True se correta, False se errada e NULL se aberta. Boolean resultado = questao.respostaDoAlunoEhCorreta(resposta); if (resultado != null) //Verificando se a resposta está certa ou não. if(resultado == true) resposta.setNota(100.0); //#TODO Questões abertas?? Como faz?? //else if (resultado == false) resposta.setNota(0.0); Abaixo seria o NULL else resposta.setNota(0.0); } //Atribuindo a nota final à lista setNotaFinal(pesosDasQuestoes); } }