/*
 * $Id: GuestLoginAction.java,v 1.27 2007/08/08 12:14:55 marbobo Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: GuestLoginAction.java,v $
 * Revision 1.27  2007/08/08 12:14:55  marbobo
 * + License-Funktionalität komplett umgeschrieben
 * + Bugfix bzgl. Beschreibungsfelder von Entitäten
 * + Bugfix mailing
 *
 * Revision 1.26  2007/07/20 14:18:03  marbobo
 * + Max. Anzahl von Benutzern die im System gleichzeitig angemeldet sein dürfen ist jetzt konfiguriebar
 *
 * Revision 1.25  2006/11/11 18:20:45  marbobo
 * + Gast-User License-Anerkennung korrigiert
 *
 * Revision 1.24  2006/11/06 11:11:20  korowa
 * "License akzeptieren" als Preloginaktion eingefügt
 *
 * Revision 1.23  2006/04/29 18:39:45  marbobo
 * + Refactoriengs und eine Ausgaben vereinheitlicht
 *
 * Revision 1.22  2006/02/27 16:16:05  marbobo
 * + Systemsichten hinzugefügt
 * + SysLinks angepasst
 * + Benutzer können falls gewünscht Dokumentqueries anlegen
 *
 * Revision 1.21  2005/11/23 14:56:14  marbobo
 * - "dynamische Gruppen zuordnen" entfernt
 *
 * Revision 1.20  2005/03/16 15:48:46  jonyp
 * getLastnameLabel for user tracking infos
 *
 * Revision 1.19  2005/03/16 15:10:12  jonyp
 * *** empty log message ***
 *
 * Revision 1.18  2004/11/10 15:02:45  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.17  2004/11/02 21:42:29  marbobo
 * + Einige Funktionen für Gast-Benutzer gesperrt
 * + WebShare.LOGIN_PAGE mit WebShare.getLoginPage() ersetzt
 *
 * Revision 1.16  2004/10/12 11:51:02  marbobo
 * + Externer-Linkaufruf-Unterstützung für Gast-Benutzer implementiert
 *
 * Revision 1.15  2004/08/18 11:13:17  marbobo
 * + Standard-Sprache angepasst (bugfix)
 *
 * Revision 1.14  2004/08/17 16:07:33  marbobo
 * + Standard-Sprache angepasst
 * + Fehlermeldungen eingebaut
 *
 * Revision 1.13  2004/03/13 20:46:14  bigmac
 * Weitere Refactorings ...
 *
 * Revision 1.12  2004/03/09 18:40:34  bigmac
 * Anpassungen an VKCSysParameterSerializer
 *
 * Revision 1.11  2004/03/08 18:23:51  bigmac
 * Anpassungen an VKCLanguageSerializer und VKCLanguagePackSerializer
 *
 * Revision 1.10  2004/03/02 17:43:09  bigmac
 * Anpassungen an VKCGroupSerializer
 *
 * Revision 1.9  2004/02/18 14:52:09  marbobo
 * /sysLink.do anpassung
 *
 * Revision 1.8  2003/12/24 10:11:53  bigmac
 * Projektweite Import-Optimierung
 *
 * Revision 1.7  2003/12/02 15:03:53  bigmac
 * Usertracking auch für Gastuser eingebaut
 *
 * Revision 1.6  2003/11/12 14:13:48  jonyp
 * changes due to sysparameters changes
 *
 * Revision 1.5  2003/10/21 09:23:43  jonyp
 * comment commented in
 *
 */
package vkc.view.action;

import java.sql.Timestamp;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import vkc.db.entities.VKCLanguage;
import vkc.db.entities.VKCLicense;
import vkc.db.entities.VKCUser;
import vkc.db.serializer.VKCLanguageSerializer;
import vkc.db.serializer.VKCLicenseSerializer;
import vkc.db.serializer.VKCSysParameterSerializer;
import vkc.exception.DBException;
import vkc.misc.VKCLogManager;
import vkc.util.ServletUtils;
import vkc.view.WebShare;
import vkc.view.bean.UserTrackingInfo;

public class GuestLoginAction extends Action {

    public final ActionForward execute(ActionMapping mapping,
    								   ActionForm form,
 								       HttpServletRequest request,
 								       HttpServletResponse response)
	throws DBException {
		if (VKCSysParameterSerializer.retrieveIntValue("LOGIN", "EnableGuestLogin", 0) == 0) {
			return new ActionForward(WebShare.getLoginPage(), true);
		}

        int maxAllowedUsers = VKCSysParameterSerializer.retrieveIntValue("LOGIN", "MaxAllowedUsers", 0);
        int activeUsersCount = WebShare.getActiveUsers().length;
        
        if (maxAllowedUsers > 0 && activeUsersCount >= maxAllowedUsers) {
            if (request.getLocale() == null) {
                VKCLanguage lang = VKCLanguageSerializer.getDefaultLanguage();
                setLocale(request, lang.getLocale());
            }

            ActionErrors errors = new ActionErrors();
            errors.add("maxAllowedUsers", new ActionError("error.maxallowedusers.exceeded"));
            request.getSession().setAttribute(Globals.ERROR_KEY, errors);

            return new ActionForward(WebShare.getLoginPage(), true);
        }

        HttpSession session = request.getSession();
        VKCUser user = VKCUser.createGuestUser();
        VKCLicense license = VKCLicenseSerializer.retrieveActiveLicense(); 
        
        if (Integer.parseInt(WebShare.getSysParameterValue("LICENSE", "EnableLicensemanagement", "0")) != 0 &&  license != null) {
            request.getSession().setAttribute(WebShare.TEMP_USER_KEY, user);
            
            return new ActionForward("/loginLicenseFrameset.do", false);
        }

        // alle Objekte aus der Session entfernen
        ServletUtils.removeSessionAttributes(session);

        if (request.getLocale() == null) {
        	VKCLanguage lang = VKCLanguageSerializer.getDefaultLanguage();
        	user.setLanguage(lang);
            setLocale(request, lang.getLocale());
        } else {
            VKCLanguage lang = VKCLanguageSerializer.getLanguageByShortName(request.getLocale().getLanguage());
            
            if (lang != null) {
                user.setLanguage(lang);
                setLocale(request, lang.getLocale());
            } else {
            	lang = VKCLanguageSerializer.getDefaultLanguage();
            	user.setLanguage(lang);
                setLocale(request, lang.getLocale());
            }
        }

        Timestamp loginTime = new Timestamp(System.currentTimeMillis());
        user.setMostRecentLogin(loginTime);
        session.setAttribute(WebShare.USER_KEY, user);
        session.setAttribute(WebShare.LOCALE_KEY, user.getLanguage().getLocale());

        String log = "User 'guest' logged on in session " + session.getId() + " with locale: " + user.getLanguage().getLocale();

        VKCLogManager.infoLog(this, log);

		UserTrackingInfo bean = new UserTrackingInfo (user.getUserId(),
		                                              user.getLastnameLabel(),
		        									  request.getSession(),
		        									  request.getRemoteAddr(),
		        									  new Date(loginTime.getTime()));

		session.setAttribute(WebShare.USER_TRACKING_KEY, bean);
        session.setAttribute(WebShare.SYSTEMVIEWTYPEID_KEY, user.getSystemViewTypeId());

        //externer Linkaufruf
        if (isSysLink(request)) {
            return new ActionForward(getSysLink(request));
        }

        return new ActionForward(WebShare.HOME_PAGE, true);
    }

    private String getSysLink(HttpServletRequest request) {
		return "/sysLink.do?linkType=" + request.getParameter("linkType") + 
				"&objectId=" + request.getParameter("objectId") + 
				(request.getParameter("loginType") != null ? "&loginType=" + request.getParameter("loginType") : "");
    }

    private boolean isSysLink(HttpServletRequest request) {
    	if (request.getParameter("linkType") != null && request.getParameter("objectId") != null) {
    		return true;
    	}
    	
        return false;
    }
}