package javacodebook.server.login;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 *  Eine abstrakte Klasse, die überprüft, ob der Benutzer angemeldet
 *  ist. Davon abgeleitete Servlets führen automatisch diese Überprüfung
 *  durch. Sie müssen die Methode handleRequest() überschreiben, um eigene
 *  Aktionen auszuführen.
 */
public abstract class LoginController extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, java.io.IOException {
        User user = (User)req.getSession().getAttribute("user");

        //hier wird der Name des aufgerufenen Servlets gespeichert, um nach
        //erfolgreicher Anmeldung dahin leiten zu können
        String calledServlet = req.getServletPath().substring(1,
            req.getServletPath().length());//führender "/" weg
        req.setAttribute("called_servlet", calledServlet);

        //Login und Passwort überprüfen, wenn korrekt, Benutzer einloggen
        if("true".equals(req.getParameter("perform_login"))) {
            String login = req.getParameter("login");
            String passwd = req.getParameter("passwd");
            String passwdRep = req.getParameter("passwd_rep");
            if(!passwd.equals(passwdRep))
                showLogin(req, res);
            else {
                user = User.findUser(login, passwd);
                if(user == null)
                    showLogin(req, res);
                else {
                    req.getSession().setAttribute("user", user);
                    handleRequest(req, res);
                }
            }
        }

        //Logout durchführen, d.h. das Attribut "user" wird wieder aus der
        //Session entfernt
        else if("true".equals(req.getParameter("perform_logout"))) {
            req.getSession().removeAttribute("user");
            showLogin(req, res);
        }

        //noch kein Benutzer eingeloggt -> Formular anzeigen
        else if(user == null) {
            showLogin(req, res);
        }

        //Benutzer ist bereits eingeloggt, jetzt wird die handleRequest()-Methode
        //der entsprechenden Unterklasse ausgeführt
        else {
            handleRequest(req, res);
        }

    }

    protected void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, java.io.IOException {
        doGet(req, res);
    }

    /*
     * Diese Methode wird von Servlet-Unterklassen implementiert, die eine
     * Zugangskontrolle benötigen.
     */
    protected abstract void handleRequest(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, java.io.IOException;

    //Bequemlichkeitsmethode für die Anzeige der Login-Seite
    private void showLogin(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, java.io.IOException {
        req.getRequestDispatcher("login.jsp").forward(req, res);
    }
}
