net.sf.sze.frontend.zeugnis.BewertungenController.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.sze.frontend.zeugnis.BewertungenController.java

Source

//BewertungenController.java
//
// Licensed under the AGPL - http://www.gnu.org/licenses/agpl-3.0.txt
// (c) SZE-Development Team
package net.sf.sze.frontend.zeugnis;

import java.util.List;

import javax.annotation.Resource;

import net.sf.sze.frontend.base.ModelAttributes;
import net.sf.sze.frontend.base.URL;
import net.sf.sze.frontend.base.URL.Common;
import net.sf.sze.model.zeugnis.Bewertung;
import net.sf.sze.model.zeugnis.DreiNiveauBewertung;
import net.sf.sze.model.zeugnis.StandardBewertung;
import net.sf.sze.model.zeugnis.ZeugnisFormular;
import net.sf.sze.model.zeugnis.ZweiNiveauBewertung;
import net.sf.sze.model.zeugnisconfig.Schulfach;
import net.sf.sze.service.api.zeugnis.BewertungErfassungsService;
import net.sf.sze.service.api.zeugnis.BewertungService;
import net.sf.sze.service.api.zeugnis.BewertungWithNeigbors;
import net.sf.sze.service.api.zeugnis.ZeugnisFormularService;
import net.sf.sze.service.api.zeugnisconfig.SchulhalbjahrService;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * Controller zur Erfassung der Bewertungen.
 *
 */
@Controller
public class BewertungenController implements ModelAttributes {

    /**
     * Die View um eine Bewertung zu editieren im Rahmen der Bewertungenerfassung.
     */
    private static final String BEWERTUNGEN_EDIT_BEWERTUNG_VIEW = "bewertungen/editBewertung";

    /**
     * The Logger for the controller.
     */
    private static final Logger LOG = LoggerFactory.getLogger(BewertungenController.class);

    /**
     * Der {@link BewertungErfassungsService}.
     */
    @Resource
    private BewertungErfassungsService bewertungErfassungsService;

    /**
     * Der {@link SchulhalbjahrService}.
     */
    @Resource
    private SchulhalbjahrService schulhalbjahrService;

    /**
     * Der {@link BewertungService}.
     */
    @Resource
    private BewertungService bewertungService;

    @Resource
    private ZeugnisFormularService zeugnisFormularService;

    /**
     * Der Validator.
     */
    @Resource
    private Validator validator;

    /**
     * Zeigt die Bewertungen des entsprechenden Faches der Klasse in dem Halbjahr.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfaches.
     * @param model das Model
     * @param redirectAttributes Fehlermeldungen.
     * @return die logische View
     */
    @RequestMapping(value = URL.BewertungenPath.LIST, method = RequestMethod.GET)
    public String showBewertungenPath(@PathVariable(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @PathVariable(URL.Session.P_KLASSEN_ID) Long klassenId,
            @RequestParam(value = URL.Session.P_SCHULFACH_ID, required = false) Long schulfachId, Model model,
            RedirectAttributes redirectAttributes) {

        final ZeugnisFormular formular = zeugnisFormularService.getZeugnisFormular(halbjahrId.longValue(),
                klassenId.longValue());
        if (formular == null) {
            redirectAttributes.addFlashAttribute("message", "Es wurden keine Bewertungen gefunden.");
            return URL.redirectWithNamedParams(URL.ZeugnisPath.START, URL.Session.P_HALBJAHR_ID, halbjahrId,
                    URL.Session.P_KLASSEN_ID, klassenId);
        }
        if (!formular.getSchulhalbjahr().isSelectable()) {
            redirectAttributes.addFlashAttribute("message", "Das Schulhalbjahr ist nicht mehr selektierbar.");
            return URL.redirectWithNamedParams(URL.ZeugnisPath.START, URL.Session.P_HALBJAHR_ID, halbjahrId,
                    URL.Session.P_KLASSEN_ID, klassenId);
        }
        final List<Schulfach> schulfaecher = bewertungErfassungsService.getActiveSchulfaecherOrderByName(formular);

        if (CollectionUtils.isEmpty(schulfaecher)) {
            redirectAttributes.addFlashAttribute("message", "Es wurden keine Bewertungen gefunden.");
            return URL.redirectWithNamedParams(URL.ZeugnisPath.START, URL.Session.P_HALBJAHR_ID, halbjahrId,
                    URL.Session.P_KLASSEN_ID, klassenId);
        }
        final Long usedSchulfachId;
        if (schulfachId == null) {
            LOG.debug("Nehme das erste Schulfach");
            usedSchulfachId = schulfaecher.get(0).getId();
        } else {
            usedSchulfachId = schulfachId;
        }

        final List<Bewertung> bewertungen = bewertungErfassungsService.getSortedBewertungen(formular,
                usedSchulfachId.longValue());

        model.addAttribute("bewertungen", bewertungen);
        model.addAttribute("schulfaecher", schulfaecher);
        model.addAttribute("zeugnisFormular", formular);
        model.addAttribute(URL.Session.P_SCHULFACH_ID, usedSchulfachId);
        return "bewertungen/listBewertungen";

    }

    /**
     * Zeigt die Bewertungen der Klasse in dem Halbjahr.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @return die logische View
     */
    @RequestMapping(value = URL.Bewertungen.LIST, method = RequestMethod.GET)
    public String showBewertungen(@RequestParam(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @RequestParam(URL.Session.P_KLASSEN_ID) Long klassenId) {
        return URL.redirectWithNamedParams(URL.BewertungenPath.LIST, URL.Session.P_HALBJAHR_ID, halbjahrId,
                URL.Session.P_KLASSEN_ID, klassenId);
    }

    /**
     * Zeigt die Bewertung zu der entsprechenden Id.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfaches.
     * @param bewertungsId die Id der Bewertung
     * @param model das Model
     * @return die logische View
     */
    @RequestMapping(value = URL.BewertungenPath.EDIT, method = RequestMethod.GET)
    public String editBewertung(@PathVariable(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @PathVariable(URL.Session.P_KLASSEN_ID) Long klassenId,
            @PathVariable(URL.Session.P_SCHULFACH_ID) Long schulfachId,
            @PathVariable(value = URL.BewertungenPath.P_BEWERTUNGS_ID) Long bewertungsId, Model model) {
        final ZeugnisFormular formular = zeugnisFormularService.getZeugnisFormular(halbjahrId.longValue(),
                klassenId.longValue());
        final BewertungWithNeigbors bewertungWithNeigbors = bewertungErfassungsService
                .getBewertungWithNeighbors(formular, schulfachId, bewertungsId);
        setEditModelValues(halbjahrId, klassenId, schulfachId, bewertungWithNeigbors.getBewertung(),
                bewertungWithNeigbors.getPrevBewertungsId(), bewertungWithNeigbors.getNextBewertungsId(), model);
        return BEWERTUNGEN_EDIT_BEWERTUNG_VIEW;
    }

    /**
     * Aktualisiert die {@link StandardBewertung}.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfachs.
     * @param prevId die Id der vorherigen Bewertung.
     * @param nextId die Id der nachfolgenden Bewertung.
     * @param bewertung die Bewertung
     * @param action die als nchstes auszufhrende Aktion.
     * @param result das Bindingresult.
     * @param model das Model
     * @param redirectAttributes Fehlermeldungen.
     * @return die logische View
     */
    @RequestMapping(value = URL.BewertungenPath.EDIT, method = RequestMethod.POST, params = "type=standard")
    public String updateStandardBewertung(@PathVariable(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @PathVariable(URL.Session.P_KLASSEN_ID) Long klassenId,
            @PathVariable(URL.Session.P_SCHULFACH_ID) Long schulfachId, @RequestParam(Common.P_PREV_ID) Long prevId,
            @RequestParam(Common.P_NEXT_ID) Long nextId,
            @RequestParam(value = Common.P_ACTION, required = false) String action,
            @ModelAttribute(BEWERTUNG) StandardBewertung bewertung, BindingResult result, Model model,
            RedirectAttributes redirectAttributes) {
        return updateBewertung(halbjahrId, klassenId, schulfachId, bewertung, prevId, nextId, action, result, model,
                redirectAttributes);
    }

    /**
     * Aktualisiert die {@link ZweiNiveauBewertung}.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfachs.
     * @param prevId die Id der vorherigen Bewertung.
     * @param nextId die Id der nachfolgenden Bewertung.
     * @param bewertung die Bewertung
     * @param action die als nchstes auszufhrende Aktion.
     * @param result das Bindingresult.
     * @param model das Model
     * @param redirectAttributes Fehlermeldungen.
     * @return die logische View
     */
    @RequestMapping(value = URL.BewertungenPath.EDIT, method = RequestMethod.POST, params = "type=2niveau")
    public String update2NiveauBewertung(@PathVariable(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @PathVariable(URL.Session.P_KLASSEN_ID) Long klassenId,
            @PathVariable(URL.Session.P_SCHULFACH_ID) Long schulfachId, @RequestParam(Common.P_PREV_ID) Long prevId,
            @RequestParam(Common.P_NEXT_ID) Long nextId,
            @RequestParam(value = Common.P_ACTION, required = false) String action,
            @ModelAttribute(BEWERTUNG) ZweiNiveauBewertung bewertung, BindingResult result, Model model,
            RedirectAttributes redirectAttributes) {
        return updateBewertung(halbjahrId, klassenId, schulfachId, bewertung, prevId, nextId, action, result, model,
                redirectAttributes);
    }

    /**
     * Aktualisiert die {@link DreiNiveauBewertung}.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfachs.
     * @param prevId die Id der vorherigen Bewertung.
     * @param nextId die Id der nachfolgenden Bewertung.
     * @param bewertung die Bewertung
     * @param action die als nchstes auszufhrende Aktion.
     * @param result das Bindingresult.
     * @param model das Model
     * @param redirectAttributes Fehlermeldungen.
     * @return die logische View
     */
    @RequestMapping(value = URL.BewertungenPath.EDIT, method = RequestMethod.POST, params = "type=3niveau")
    public String update3NiveauBewertung(@PathVariable(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @PathVariable(URL.Session.P_KLASSEN_ID) Long klassenId,
            @PathVariable(URL.Session.P_SCHULFACH_ID) Long schulfachId,
            @ModelAttribute(BEWERTUNG) DreiNiveauBewertung bewertung, @RequestParam(Common.P_PREV_ID) Long prevId,
            @RequestParam(Common.P_NEXT_ID) Long nextId,
            @RequestParam(value = Common.P_ACTION, required = false) String action, BindingResult result,
            Model model, RedirectAttributes redirectAttributes) {
        return updateBewertung(halbjahrId, klassenId, schulfachId, bewertung, prevId, nextId, action, result, model,
                redirectAttributes);
    }

    /**
     * Aktualisiert die Bewertung.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfachs
     * @param bewertung die Bewertung
     * @param action String der angibt was zu tun ist.
     * @param result das Bindingresult.
     * @param model das Model
     * @return die logische View
     */
    private String updateBewertung(Long halbjahrId, Long klassenId, Long schulfachId, Bewertung bewertung,
            Long prevId, Long nextId, String action, BindingResult result, Model model,
            RedirectAttributes redirectAttributes) {
        validator.validate(bewertung, result);

        if (result.hasErrors()) {
            LOG.info("Die Bewertung hat Fehler {}", result);
            setEditModelValues(halbjahrId, klassenId, schulfachId, bewertung, prevId, nextId, model);
            return BEWERTUNGEN_EDIT_BEWERTUNG_VIEW;
        }
        bewertungService.save(bewertung);
        final String nextUrl;
        if (StringUtils.equalsIgnoreCase(action, Common.ACTION_PREV)) {
            nextUrl = URL.redirectWithNamedParams(URL.BewertungenPath.EDIT, URL.Session.P_HALBJAHR_ID, halbjahrId,
                    URL.Session.P_KLASSEN_ID, klassenId, URL.Session.P_SCHULFACH_ID, schulfachId,
                    URL.BewertungenPath.P_BEWERTUNGS_ID, prevId);
        } else if (StringUtils.equalsIgnoreCase(action, Common.ACTION_NEXT)) {
            nextUrl = URL.redirectWithNamedParams(URL.BewertungenPath.EDIT, URL.Session.P_HALBJAHR_ID, halbjahrId,
                    URL.Session.P_KLASSEN_ID, klassenId, URL.Session.P_SCHULFACH_ID, schulfachId,
                    URL.BewertungenPath.P_BEWERTUNGS_ID, nextId);

        } else {
            redirectAttributes.addFlashAttribute(Common.P_LASTEDITED_ID, bewertung.getId());
            nextUrl = createRedirectToList(halbjahrId, klassenId, schulfachId);
        }

        return nextUrl;
    }

    /**
     * @param halbjahrId die Id des Halbjahrs.
     * @param klassenId die Id der Klassse
     * @param schulfachId die Id des Schulfachs.
     * @param model das Model
     * @param bewertungValues eine Bewertung die direkten Werte enthlt.
     */
    private void setEditModelValues(Long halbjahrId, Long klassenId, Long schulfachId, Bewertung bewertung,
            Long prevId, Long nextId, Model model) {
        final String type;
        if (bewertung instanceof DreiNiveauBewertung) {
            type = "3niveau";
        } else if (bewertung instanceof ZweiNiveauBewertung) {
            type = "2niveau";
        } else {
            type = "standard";
        }
        model.addAttribute(BEWERTUNG, bewertung);
        model.addAttribute("schulhalbjahr", schulhalbjahrService.read(halbjahrId));
        model.addAttribute(Common.P_PREV_ID, prevId);
        model.addAttribute(Common.P_NEXT_ID, nextId);
        model.addAttribute("saveUrl",
                URL.filledURLWithNamedParams(URL.BewertungenPath.EDIT, URL.Session.P_HALBJAHR_ID, halbjahrId,
                        URL.Session.P_KLASSEN_ID, klassenId, URL.Session.P_SCHULFACH_ID, schulfachId,
                        URL.BewertungenPath.P_BEWERTUNGS_ID, bewertung.getId()));
        model.addAttribute("cancelUrl",
                URL.filledURLWithNamedParams(URL.BewertungenPath.CANCEL, URL.Session.P_HALBJAHR_ID, halbjahrId,
                        URL.Session.P_KLASSEN_ID, klassenId, URL.Session.P_SCHULFACH_ID, schulfachId,
                        URL.BewertungenPath.P_BEWERTUNGS_ID, bewertung.getId()));
        model.addAttribute("type", type);
    }

    /**
     * @param halbjahrId
     * @param klassenId
     * @param schulfachId
     * @return
     */
    private String createRedirectToList(Long halbjahrId, Long klassenId, final Long schulfachId) {
        return URL.redirectWithNamedParams(
                URL.BewertungenPath.LIST + "?" + URL.Session.P_SCHULFACH_ID + "=" + schulfachId,
                URL.Session.P_HALBJAHR_ID, halbjahrId, URL.Session.P_KLASSEN_ID, klassenId);
    }

    /**
     * Bricht die Bearbeitung einer Bewertung ab.
     * @param halbjahrId die Id des Schulhalbjahres
     * @param klassenId die Id der Klasse
     * @param schulfachId die Id des Schulfachs.
     * @param redirectAttributes Fehlermeldungen.
     * @param bewertungsId die Id der Bewertung.
     * @return die logische View
     */
    @RequestMapping(value = URL.BewertungenPath.CANCEL, method = RequestMethod.GET)
    public String cancelEditBewertung(@PathVariable(URL.Session.P_HALBJAHR_ID) Long halbjahrId,
            @PathVariable(URL.Session.P_KLASSEN_ID) Long klassenId,
            @PathVariable(URL.Session.P_SCHULFACH_ID) Long schulfachId,
            @PathVariable(URL.BewertungenPath.P_BEWERTUNGS_ID) Long bewertungsId,
            RedirectAttributes redirectAttributes) {
        redirectAttributes.addFlashAttribute(Common.P_LASTEDITED_ID, bewertungsId);
        return createRedirectToList(halbjahrId, klassenId, schulfachId);
    }

}