package de.nak.notendb.action;
import java.io.Serializable;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
import de.nak.notendb.model.Dozent;
import de.nak.notendb.model.Pruefung;
import de.nak.notendb.model.Pruefungsfach;
import de.nak.notendb.model.Pruefungsleistung;
import de.nak.notendb.model.Student;
import de.nak.notendb.service.DozentService;
import de.nak.notendb.service.PruefungsfachService;
import de.nak.notendb.service.PruefungsleistungService;
import de.nak.notendb.service.StudentService;
import de.nak.notendb.util.Util;
/**
* @author Nils Foßhag
*
* Action Klasse, welche die Massenspeicherung neuer Prüfungsleistungen
* durchführt.
*/
@SuppressWarnings("serial")
public class ErfasseLeistungenAction extends ActionSupport implements
SessionAware {
// Services
private PruefungsleistungService pruefungsleistungService;
private PruefungsfachService pruefungsfachService;
private StudentService studentService;
private DozentService dozentService;
// Daten für das Folgeview
private List<NotenZeile> protokollTabelle;
private Pruefung pruefung;
private Dozent dozent;
// Vom View erwartete Attribute
private Long selektierteDozentId;
private Date datum;
private String uhrzeit;
// Diese Map enthält als Key die Id des Studenten und als Value die Note.
private HashMap<String, String> leistungenMap;
private Map<String, Object> session;
/**
* In dieser Methode wird auf Basis der eingegeben Daten eine neue Prüfung
* angelegt. Für diese Prüfung werden für jeden Studenten, für den Eingaben
* erfolgt sind Prüfungsleistungen erstellt und gespeichert.
*/
public String execute() throws Exception {
NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMANY);
dozent = dozentService.ladeDozent(selektierteDozentId);
Pruefungsfach pruefungsfach = (Pruefungsfach) session
.get("pruefungsfach");
pruefung = new Pruefung();
pruefung.setDatum(Util.setzeZeitZuDatum(uhrzeit, datum));
pruefung.setFach(pruefungsfach);
pruefung.setDozent(dozent);
List<Pruefungsleistung> zuSpeicherndePruefungsleistungen = new ArrayList<Pruefungsleistung>();
protokollTabelle = new ArrayList<NotenZeile>();
// Durchlaufen aller Einträge: Key ist jeweils die Student-Id und Value
// ist das eingetragene schriftliche Ergebnis pro Student.
if (leistungenMap != null) {
for (Map.Entry<String, String> eintrag : leistungenMap.entrySet()) {
if (!eintrag.getValue().isEmpty()
&& !eintrag.getKey().isEmpty()) {
Student student = studentService.ladeStudent(Long
.parseLong(eintrag.getKey()));
Pruefungsleistung alteLeistung = pruefungsleistungService
.ladeAktuellGueltigeLeistungZuStudentUndFach(
student.getId(), pruefungsfach.getId());
// Prüfen ob ein weiterer Versuch erfasst werden darf
if (alteLeistung != null
&& !pruefungsleistungService
.isWeitererVersuchErlaubt(alteLeistung)) {
addFieldError("leistungenMap['" + eintrag.getKey()
+ "']", getText("validation.leistung.versuch"));
return INPUT;
}
Pruefungsleistung neuePruefungsleistung = new Pruefungsleistung();
neuePruefungsleistung.setStudent(student);
neuePruefungsleistung.setPruefung(pruefung);
// Da kein Sicherheitskonzept realisiert wird wird ein
// Dummy-Erfasser gesetzt.
neuePruefungsleistung.setErfasserName("Dummy");
neuePruefungsleistung.setErgebnisNormal(formatter.parse(
eintrag.getValue()).floatValue());
zuSpeicherndePruefungsleistungen.add(neuePruefungsleistung);
protokollTabelle.add(new NotenZeile(student, alteLeistung,
neuePruefungsleistung));
}
}
pruefungsleistungService
.speichere(zuSpeicherndePruefungsleistungen);
}
return SUCCESS;
}
public Pruefung getPruefung() {
return pruefung;
}
public void setPruefung(Pruefung pruefung) {
this.pruefung = pruefung;
}
public PruefungsleistungService getPruefungsleistungService() {
return pruefungsleistungService;
}
public void setPruefungsleistungService(
PruefungsleistungService pruefungsleistungService) {
this.pruefungsleistungService = pruefungsleistungService;
}
public Long getSelektierteDozentId() {
return selektierteDozentId;
}
public void setSelektierteDozentId(Long selektierteDozentId) {
this.selektierteDozentId = selektierteDozentId;
}
public StudentService getStudentService() {
return studentService;
}
public void setStudentService(StudentService studentService) {
this.studentService = studentService;
}
public DozentService getDozentService() {
return dozentService;
}
public void setDozentService(DozentService dozentService) {
this.dozentService = dozentService;
}
public Date getDatum() {
return datum;
}
public void setDatum(Date datum) {
this.datum = datum;
}
public HashMap<String, String> getLeistungenMap() {
return leistungenMap;
}
public void setLeistungenMap(HashMap<String, String> leistungenMap) {
this.leistungenMap = leistungenMap;
}
public PruefungsfachService getPruefungsfachService() {
return pruefungsfachService;
}
public void setPruefungsfachService(
PruefungsfachService pruefungsfachService) {
this.pruefungsfachService = pruefungsfachService;
}
public Dozent getDozent() {
return dozent;
}
public void setDozent(Dozent dozent) {
this.dozent = dozent;
}
/**
* @author Nils Foßhag Diese Klasse stellt eine Hilfsklasse für das View dar
* um alte und neue Leistung pro Student gegenüberzustellen.
*/
public static class NotenZeile implements Serializable {
private Student student;
private Pruefungsleistung alteLeistung;
private Pruefungsleistung neueLeistung;
public NotenZeile(Student student, Pruefungsleistung alteLeistung,
Pruefungsleistung neueLeistung) {
this.student = student;
this.alteLeistung = alteLeistung;
this.neueLeistung = neueLeistung;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Pruefungsleistung getAlteLeistung() {
return alteLeistung;
}
public void setAlteLeistung(Pruefungsleistung alteLeistung) {
this.alteLeistung = alteLeistung;
}
public Pruefungsleistung getNeueLeistung() {
return neueLeistung;
}
public void setNeueLeistung(Pruefungsleistung neueLeistung) {
this.neueLeistung = neueLeistung;
}
}
public List<NotenZeile> getProtokollTabelle() {
return protokollTabelle;
}
public void setProtokollTabelle(List<NotenZeile> protokollTabelle) {
this.protokollTabelle = protokollTabelle;
}
public String getUhrzeit() {
return uhrzeit;
}
public void setUhrzeit(String uhrzeit) {
this.uhrzeit = uhrzeit;
}
@Override
/*
* Prüfung ob die Werte in der übergebenen Map in Ordnung sind.
*/
public void validate() {
super.validate();
// Prüfen ob Datum in der Zukunft liegt und damit für die Erfassung
// ungültig
if (datum == null) {
addFieldError("datum", getText("validation.date.required"));
} else {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(datum);
c2.setTime(new Date());
if (c1.after(c2)) {
addFieldError("datum", getText("validation.date.zukunft"));
}
}
if (leistungenMap != null) {
for (Map.Entry<String, String> eintrag : leistungenMap.entrySet()) {
if (!eintrag.getKey().isEmpty()
&& !eintrag.getValue().isEmpty()) {
NumberFormat formatter = NumberFormat
.getNumberInstance(Locale.GERMANY);
try {
Float note = formatter.parse(eintrag.getValue())
.floatValue();
if (!(note == 1.0F || note == 1.3F || note == 1.7F
|| note == 2.0F || note == 2.3F || note == 2.7F
|| note == 3.0F || note == 3.3F || note == 3.7F
|| note == 4.0F || note == 5.0F || note == 6.0F)) {
addFieldError("leistungenMap['" + eintrag.getKey()
+ "']",
this.getText("validation.note.value"));
}
} catch (ParseException e) {
addFieldError("leistungenMap['" + eintrag.getKey()
+ "']", this.getText("validation.note.type"));
}
}
}
} else {
addFieldError("speichern",
this.getText("validation.note.notpossible"));
}
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
}