/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or any later version.
*
* Squale is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.squaleweb.applicationlayer.action;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.squale.jraf.helper.AccessDelegateHelper;
import org.squale.jraf.spi.accessdelegate.IApplicationComponent;
import org.squale.squalecommon.datatransfertobject.component.UserDTO;
import org.squale.squalecommon.util.mail.MailException;
import org.squale.squalecommon.util.mail.MailerHelper;
import org.squale.squaleweb.applicationlayer.action.accessRights.DefaultAction;
import org.squale.squaleweb.applicationlayer.formbean.LogonBean;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm;
import org.squale.squaleweb.applicationlayer.formbean.component.ProfileForm;
import org.squale.squaleweb.applicationlayer.formbean.component.UserForm;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.LogonBeanTransformer;
import org.squale.squaleweb.transformer.UserTransformer;
import org.squale.welcom.struts.bean.WActionForm;
import org.squale.welcom.struts.transformer.WTransformerFactory;
import org.squale.welcom.struts.util.WConstants;
/**
* Administration du compte de l'utilisateur Cette action permet � un utilisateur d'obtenir la liste des informations
* rattach�es et leur modification
*/
public class ManageAccountAction
extends DefaultAction
{
/** Cl� pour r�cup�rer l'ancien email */
public static final String OLD_EMAIL_KEY = "oldEmail";
/**
* Informations sur un utilisateur
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward detail( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// On r�cup�re les informations du user connect�
LogonBean logonBeanSecurity = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
// On r�cup�re les informations de l'utilisateur et remplit le formbean
UserForm form = (UserForm) pForm;
form.setEmail(logonBeanSecurity.getEmail());
form.setMatricule(logonBeanSecurity.getMatricule());
form.setName(logonBeanSecurity.getUserName());
form.setId(logonBeanSecurity.getId());
form.setUnsubscribed(logonBeanSecurity.getUnsubscribed());
form.setApplicationsList(logonBeanSecurity.getApplicationsList());
form.setOnlyAdminApplicationsList(logonBeanSecurity.getInCreationList());
Iterator profilesEntries = logonBeanSecurity.getProfilesFullApp().entrySet().iterator();
form.setProfiles(new HashMap());
while ( profilesEntries.hasNext() )
{
Map.Entry entry = (Entry) profilesEntries.next();
ApplicationForm aForm = (ApplicationForm) entry.getKey();
String profileName = (String) entry.getValue();
ProfileForm prForm = new ProfileForm();
prForm.setName(profileName);
form.getProfiles().put(aForm, prForm);
}
forward = pMapping.findForward( "detail" );
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return ( forward );
}
/**
* Mise � jour des informations de l'utilisateur
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward update( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// R�cup�ration des informations
UserDTO user = new UserDTO();
WTransformerFactory.formToObj( UserTransformer.class, (WActionForm) pForm, user );
// Les informations sur le matricule et l'id sont en session
// pour des raisons de s�curit�
LogonBean logonBeanSecurity = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
user.setMatricule( logonBeanSecurity.getMatricule() );
user.setID( logonBeanSecurity.getId() );
// Mise � jour des informations dans la base de donn�es
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Login" );
Object[] paramIn = { user, Boolean.valueOf( logonBeanSecurity.isAdmin() ) };
user = (UserDTO) ac.execute( "createOrUpdateUser", paramIn );
// Mise � jour du formulaire
WTransformerFactory.objToForm( UserTransformer.class, (WActionForm) pForm, user );
// Mise � jour du LogonBean en cons�quence
boolean isAdmin = logonBeanSecurity.isAdmin();
logonBeanSecurity = new LogonBean();
WTransformerFactory.formToObj( LogonBeanTransformer.class, (WActionForm) pForm, new Object[] {
logonBeanSecurity, Boolean.valueOf( isAdmin ) } );
pRequest.getSession().setAttribute( WConstants.USER_KEY, logonBeanSecurity );
addConfirmationMessage( pForm, pRequest, errors );
// Renvoi vers le d�tail
forward = pMapping.findForward( "detail" );
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return ( forward );
}
/**
* Permet d'ajouter un message de confirmation ou d'erreur
*
* @param pForm le formulaire
* @param pRequest la requ�te
* @param pErrors les erreurs
*/
private void addConfirmationMessage( ActionForm pForm, HttpServletRequest pRequest, ActionMessages pErrors )
{
// On r�cup�re l'ancien email
String oldEmail = pRequest.getParameter( OLD_EMAIL_KEY );
String newMail = ( (UserForm) pForm ).getEmail();
// Si l'email a chang� et qu'il n'est pas vide
if ( newMail.length() > 0 && !newMail.equals( oldEmail ) )
{
// On va essay� d'envoyer un email de confirmation.
// Si le message n'aboutit pas, on indiquera � l'utilisateur de v�rifier son email
// L'email est quand m�me modifi� car l'erreur d'envoi peut provenir de l'outil d'envoi d'email...
try
{
String object = WebMessages.getString( pRequest, "mail.update.confirm.object" );
String content = WebMessages.getString( pRequest, "mail.update.confirm.content" );
// si l'envoie de mail produit une erreur, c'est probablement que l'adresse
// qui a �t� fourni est invalide donc on affiche le message d'avertissement
MailerHelper.getMailerProvider().sendMail( null, new String[] { newMail }, object, content );
}
catch ( MailException e )
{
ActionMessage error = new ActionMessage( "user_management.error.email" );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
saveMessages( pRequest, pErrors );
}
}
}
}