/*
 * $Id: UserProfileAction.java,v 1.30 2008/02/12 09:34:07 korowa Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: UserProfileAction.java,v $
 * Revision 1.30  2008/02/12 09:34:07  korowa
 * Eine Möglichkeit für den Benutzer hinzugefügt die Emailsart auszuwählen(HTML oder Plaintext)
 *
 * Revision 1.29  2006/10/04 03:14:28  marbobo
 * + Vollständige Unterstützung für Templates implementiert
 * + Alles von Virtoweb auf ProCoBa umgestellt
 *
 * Revision 1.28  2006/09/29 21:10:10  marbobo
 * + Sucheoptimiert
 *
 * Revision 1.27  2006/09/01 07:32:05  korowa
 * Feld name in einem dynamischen Attribut für User darf vom User nicht verändert werden
 *
 * Revision 1.26  2006/08/31 12:24:34  korowa
 * Dynamische Attribute für Users eingefügt
 *
 * Revision 1.25  2006/05/18 22:50:02  marbobo
 * + Beim Menusprache-Wechsel werden jetzt auch alle 3 Frames aktualisiert
 *
 * Revision 1.24  2006/05/12 08:09:11  korowa
 * +showTree zum Userprofil hinzugefügt. Dieser parameter regelt die Anzeige des Explorerfensters beim VKC-Anmeldung. Lässt sich im Userprofil umschalten.
 *
 * Revision 1.23  2006/03/27 22:07:12  marbobo
 * + Nicht verwendete Klassen und Seiten entfern (userDeletedEntities)
 *
 * Revision 1.22  2006/02/27 16:16:20  marbobo
 * + Systemsichten hinzugefügt
 * + SysLinks angepasst
 * + Benutzer können falls gewünscht Dokumentqueries anlegen
 *
 * Revision 1.21  2005/05/12 14:11:36  korowa
 * Ergänzungen bzgl. der Speicherung der Sortierungeinstellungen in der Session
 *
 * Revision 1.20  2005/05/11 19:31:26  marbobo
 * + Einstellungen für die Sortierung gefixt
 *
 * Revision 1.19  2005/05/10 13:57:24  korowa
 * Ergänzungen bzgl. der Speicherung der Sortierungeinstellungen in der Session
 *
 * Revision 1.18  2005/05/02 15:24:51  marbobo
 * +Ergänzungen und Bugfixing bzgl. der Speicherung der Sortierungeinstellungen in der Session
 *
 * Revision 1.17  2005/04/29 10:50:55  korowa
 * Die gespeicherte im Datenbank Sortierungsarten werden jetzt am Anfang jeder Sitzung
 * geladen und aktiviert.
 *
 * Revision 1.16  2005/04/28 15:32:23  korowa
 * Die Sortierungs Methoden werden jetzt im Profil in Datenbank gespeichert
 *
 * Revision 1.15  2005/02/20 16:58:03  marbobo
 * + Beim Speichern der Entities in die Datenbank wird sichergestellt
 *    dass Unicode-Zeichen in Kodierterform (als &#xxxxx;) gespeichert werden
 *
 * Revision 1.14  2005/02/14 14:01:49  bigmac
 * Applikationsweites CSS konfigurierbar gemacht + Refactorings
 *
 * Revision 1.13  2004/12/01 16:46:41  jonyp
 * synchrinze form: added support for ldap context
 *
 * Revision 1.12  2004/11/10 15:02:49  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.11  2004/11/09 20:15:39  marbobo
 * + kleine Änderung
 *
 * Revision 1.10  2004/11/02 21:42:29  marbobo
 * + Einige Funktionen für Gast-Benutzer gesperrt
 * + WebShare.LOGIN_PAGE mit WebShare.getLoginPage() ersetzt
 *
 * Revision 1.9  2004/10/07 12:58:32  marbobo
 * + Festlegen der Startkategorie
 *
 * Revision 1.8  2004/08/07 18:17:06  marbobo
 * + Bugfix für Zeitangaben und Refactorings
 *
 * Revision 1.7  2004/08/03 14:28:17  jonyp
 * added method to show deleted files
 *
 * Revision 1.6  2004/06/27 17:23:40  marbobo
 * + Quellcode maintenance
 *
 * Revision 1.5  2004/04/29 22:31:26  marbobo
 * + Dokumentansicht anpassen
 *
 * Revision 1.4  2004/03/25 13:57:06  marbobo
 * ModifyUserPasswordAction und Form umbenannt und komplett überarbeitet
 *
 * Revision 1.3  2004/03/25 01:56:37  marbobo
 * ModifyUserExpiredDocumentsForm und Action umbenannt 
 * und Komplett neu überarbeitet
 *
 * Revision 1.2  2004/03/23 15:38:47  bigmac
 * Bestimmung der abgelaufenen Dokumente aktualisiert
 *
 * Revision 1.1  2004/03/16 00:41:43  marbobo
 * UserProfileAction und UserProfileForm auf request-scope umgestellt
 *
 * Revision 1.17  2004/03/13 20:46:16  bigmac
 * Weitere Refactorings ...
 *
 * Revision 1.1  2003/08/07 01:56:26  marbobo
 * Initial Version
 *
 */
package vkc.profile.action;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import vkc.db.entities.VKCDocument;
import vkc.db.entities.VKCDynUserAttribute;
import vkc.db.entities.VKCLanguage;
import vkc.db.entities.VKCUser;
import vkc.db.serializer.VKCDocumentSerializer;
import vkc.db.serializer.VKCProxyUserSerializer;
import vkc.db.serializer.VKCUserSerializer;
import vkc.exception.DBException;
import vkc.misc.VKCLogManager;
import vkc.profile.form.UserProfileForm;
import vkc.util.VKCStringUtils;
import vkc.view.WebShare;
import vkc.view.bean.UserDynAttr;
import vkc.view.bean.UserInfo;

/**
 * Action-Klasse zum Editieren eigenen Benutzerprofiles
 *
 * @author marbobo
 * @version $Revision: 1.30 $
 */
public final class UserProfileAction extends Action {
	private ActionForward DEFAULT_FORWARD = new ActionForward("/templates/${template.name}/userProfile/userProfile.jsp");
	private ActionForward DEFAULT_FORWARD_ANCHORPROXY = new ActionForward("/templates/${template.name}/userProfile/userProfile.jsp?anchor=proxys");

	private ActionForward INFO_FORWARD = new ActionForward("/templates/${template.name}/common/InfoPage.jsp");

	/**
	 * Hier werden die entsprechenden Aktionen eingeleitet (Benutzerdaten
	 * speichern, Benutzer Passwort ändern, usw...)
	 */
	public ActionForward execute(ActionMapping mapping, 
	        					 ActionForm f, 
	        					 HttpServletRequest request, 
	        					 HttpServletResponse response)
		throws Exception {
		VKCUser user = (VKCUser) request.getSession().getAttribute(WebShare.USER_KEY);
		
		if (user.isGuestUser()) {
			request.setAttribute(WebShare.INFO_KEY, "vkc.info.access_denied");
			
			return INFO_FORWARD;
		}

		UserProfileForm form = (UserProfileForm) f;

		//Aktionen bestimmen
		if (request.getParameter("action.change.password") != null) {
			return new ActionForward("/userPasswordChange.do");
		} else if (request.getParameter("action.save.profile") != null) {
			return handleSaveProfileAction(form, request);
		} else if (request.getParameter("action.manage.expired.documents") != null) {
			return new ActionForward("/userExpiredDocuments.do");
		} else if (request.getParameter("action.manage.document.view.settings") != null) {
			return new ActionForward("/userDocumentViewSettings.do?initialize=true");
		} else if (request.getParameter("action.proxy.remove.select.changed") != null) {
			return handleChangeSelectedProxyUserAction(form, request);
		} else if (request.getParameter("action.add.proxyUserToUser") != null) {
			return handleAddProxyUsersToUserAction(form, request);
		} else if (request.getParameter("action.remove.proxyUserFromUser") != null) {
			return handleRemoveProxyUsersFromUserAction(form, request);
		} else {
			return handleInitializeAction(form, request);
		} 
	}

	/**
	 * Diese Methode speichert alle Benutzerdaten permanent in die  Datenbank
	 * ab
	 */
	private ActionForward handleSaveProfileAction(UserProfileForm form, HttpServletRequest request) throws Exception {
		//Benutzerspezifische Variablen setzen oder initialisieren
		boolean languageChanged = false;
		VKCUser user = form.getUser();
		UserInfo oldUser = VKCUserSerializer.retrieveUserInfo(user.getUserId());
		String oldFullName = oldUser.getFullName();
		HttpSession session	= request.getSession();

		user.setTitle(VKCStringUtils.filterUnicodeChars(form.getTitle()));
		List dynaAttributes = new ArrayList(user.getDynaAttributes());
		
		//Dynamische Attribute für den User speichern
        for (int i = 0; i < form.getDynaAttributes().size(); i++) {
        	UserDynAttr bean = ( UserDynAttr )form.getDynaAttributes().get(i);
        	VKCDynUserAttribute attr = (VKCDynUserAttribute)dynaAttributes.get(i);
            attr.setValue(VKCStringUtils.filterUnicodeChars(bean.getValue()));
        }			
        
		// if user is not external, get infos from form, because they are fully displayable
		// otherwise these contents are not transferred via http (form-element is readonly), 
		// so keep them like the original one... jp of 29.11.2004
		if (user.isExternalUser()) {
			form.setFirstname(oldUser.getFirstname());
			form.setLastname(oldUser.getLastname());
			form.setEmail(oldUser.getEmail());
		}
		
		user.setFirstname(VKCStringUtils.filterUnicodeChars(form.getFirstname()));
		user.setLastname(VKCStringUtils.filterUnicodeChars(form.getLastname()));
		user.setEmail(form.getEmail());
		user.setCompany(VKCStringUtils.filterUnicodeChars(form.getCompany()));
		user.setDepartment(VKCStringUtils.filterUnicodeChars(form.getDepartment()));
		user.setStreet(VKCStringUtils.filterUnicodeChars(form.getStreet()));
		user.setZip(form.getZip());
		user.setCity(VKCStringUtils.filterUnicodeChars(form.getCity()));
		user.setFax(form.getFax());
		user.setPhone(form.getPhone());
		user.setMobile(form.getMobile());
		user.setContactURL(form.getContactURL());
		user.setHomepageURL(form.getHomepageURL());
		user.setShowEmail(form.isShowEmail());
		user.setSystemViewTypeId(form.getSelectedSystemViewTypeId());
		user.setHomeCategoryId(Integer.valueOf(form.getSelectedCategoryId()));
		
		//Einstellungen für die Sortierung in der Session und in Form abspeichern
	    user.setSearchDocumentSortMode(form.getSearchDocumentSortMode());
	    session.setAttribute("searchDocumentSortMode", user.getSearchDocumentSortMode());
		
	    user.setBestsellerDocumentSortMode(form.getBestsellerDocumentSortMode());
	    session.setAttribute("bestsellerDocumentSortMode", user.getBestsellerDocumentSortMode());
		
	    user.setLatestAdditionsDocumentSortMode(form.getLatestAdditionsDocumentSortMode());
	    session.setAttribute("latestAdditionsDocumentSortMode", user.getLatestAdditionsDocumentSortMode());
		
	    user.setCategoryViewDocumentSortMode(form.getCategoryViewDocumentSortMode());
	    session.setAttribute("categoryViewDocumentSortMode", user.getCategoryViewDocumentSortMode());
	    
	    user.setShowTree(form.getShowTree());
        
        user.setEnableHtmlNotification(form.isEnableHtmlNotification());		
		
		if (!user.getLanguageId().equals(form.getSelectedLanguageId())) {
			languageChanged = true;
		}
		
		for (int i = 0; i < form.getLanguageLabels().size(); i++) {
			VKCLanguage lang = (VKCLanguage)form.getLanguageLabels().get(i);
			
			if (lang.getLanguageId().equals(form.getSelectedLanguageId())) {
				user.setLanguageId(lang.getLanguageId());
				user.setLanguage(lang);
				break;
			}
		}

		//Speichern des Benutzerobjektes einleiten
		try {
			//Benutzerobjekt in die Datenbank abspeicher
			user.setLastChangerId(user.getUserId());
			user.setLastChanged(new Timestamp(System.currentTimeMillis()));
            VKCUserSerializer.saveUser(user);

			if (form.getEditOwnProxys()){
				// Speichern der ProxyUsers
				VKCProxyUserSerializer.saveProxyUsers(form.getProxyUsers(), form.getUser().getUserId());
			}

			//Falls Vor- oder Nachname des Benutzer sich ändert werden alle Benutzerdokumente
			//im Suchindex aktualisiert
			if (!user.isExternalUser()) {
				if (!user.getFullName().equals(oldFullName)) {
					List userDocuments = new ArrayList(VKCDocumentSerializer.getDocuments(user));
	
					for (int i = 0; i < userDocuments.size(); i++) {
						VKCDocument document = (VKCDocument) userDocuments.get(i);
	                    VKCDocumentSerializer.saveDocument(document, true, false);
					}
				}
			}

			if (languageChanged) {
				form.setLanguageChanged(true);
			}
			
			//Requestparameter setzen	
			request.getSession().removeAttribute(WebShare.USER_KEY);
			request.getSession().setAttribute(WebShare.USER_KEY, user);
			request.getSession().setAttribute(WebShare.LOCALE_KEY, user.getLanguage().getLocale());
			
			return handleInitializeAction(form, request);
		} catch (DBException ex) {
		    VKCLogManager.errorLog(this,"", ex.getMessage(), ex);

			return INFO_FORWARD;
		}
	}

	private ActionForward handleInitializeAction(UserProfileForm form, HttpServletRequest request) {
		synchronizeForm(form, request);		

		return DEFAULT_FORWARD;
	}

	private ActionForward handleChangeSelectedProxyUserAction(UserProfileForm form, HttpServletRequest request) {
		Integer id = form.getCurrentProxyUserId();
		form.setDynaValue("proxyDescription_" + id.toString(), form.getProxyDescription());
		form.setDynaValue("proxyValidFrom_" + id.toString(), form.getProxyValidFrom());
		form.setDynaValue("proxyValidUntil_" + id.toString(), form.getProxyValidUntil());
		form.setCurrentProxyUserId(form.getSelectedRemoveProxyUserIds()[0]);
		form.setProxyDescription((String)form.getDynaValue("proxyDescription_" + form.getCurrentProxyUserId().toString()));
		form.setProxyValidFrom((String)form.getDynaValue("proxyValidFrom_" + form.getCurrentProxyUserId().toString()));
		form.setProxyValidUntil((String)form.getDynaValue("proxyValidUntil_" + form.getCurrentProxyUserId().toString()));
		synchronizeForm(form, request);

		return DEFAULT_FORWARD_ANCHORPROXY;
	}

	private ActionForward handleAddProxyUsersToUserAction(UserProfileForm form, HttpServletRequest request) throws Exception {
		Integer[] addIds = form.getSelectedAddProxyUserIds();
		List addProxyUserIds = new ArrayList(Arrays.asList(form.getAddProxyUserIds()));
	
		for (int i = 0; i < addIds.length; i++) {
			if (!addProxyUserIds.contains(addIds[i])) {
				addProxyUserIds.add(addIds[i]);
			}
		}
	
		form.setAddProxyUserIds((Integer[])addProxyUserIds.toArray(new Integer[0]));
	
		synchronizeForm(form, request);

		return DEFAULT_FORWARD_ANCHORPROXY;
	}

	private ActionForward handleRemoveProxyUsersFromUserAction(UserProfileForm form, HttpServletRequest request) throws Exception {
		Integer[] removeIds = form.getSelectedRemoveProxyUserIds();
		List addProxyUserIds = new ArrayList(Arrays.asList(form.getAddProxyUserIds()));
		
		for (int i = 0; i < removeIds.length; i++) {
			if (addProxyUserIds.contains(removeIds[i])) {
				addProxyUserIds.remove(removeIds[i]);
			}
		}
		
		form.setAddProxyUserIds((Integer[])addProxyUserIds.toArray(new Integer[0]));
		
		synchronizeForm(form, request);

		return DEFAULT_FORWARD_ANCHORPROXY;
	}

	private void synchronizeForm(UserProfileForm form, HttpServletRequest request) {
		form.synchronizeForm(request);
	}
}